public function Geocoding() { //take addresses not yet scraped in the past or incorrectly scraped, geocode scraping, save to cities table $addressesWithoutGeolocation = Address::whereNull('city_id')->get(); $GeoScraped = new GoogleMapsScraper(); foreach ($addressesWithoutGeolocation as $address) { $gmaps_output = $GeoScraped->Geocode($address->raw_input); //get gmaps_status $dataArray['gmaps_status'] = null; $dataArray = parent::ExtractWithXpath($gmaps_output, $this->GeoPatterns, 'text', 'first', 'xml'); //get address_components in array $componentsArray = array(); $componentsArray = parent::ExtractWithXpath($gmaps_output, $this->AddressComponentsPattern, 'html', 'multiple', 'xml'); $cityArray['city_name'] = null; $countryArray['country_code'] = null; $countryArray['country_name'] = null; //search country component in every address component, once found extract name and code foreach ($componentsArray as $AddressComponent) { if (preg_match("|type>country<|", $AddressComponent)) { $AddressComponent = '<result>' . $AddressComponent . '</result>'; //get country_code, country_name $countryArray = parent::ExtractWithXpath($AddressComponent, $this->CountryPatterns, 'text', 'first', 'xml'); } elseif (preg_match("|type>natural_feature<|", $AddressComponent)) { $AddressComponent = '<result>' . $AddressComponent . '</result>'; //get country_code, country_name $cityArray = parent::ExtractWithXpath($AddressComponent, $this->IslandPatterns, 'text', 'first', 'xml'); } elseif (preg_match("|type>locality<|", $AddressComponent)) { $AddressComponent = '<result>' . $AddressComponent . '</result>'; //get country_code, country_name $cityArray = parent::ExtractWithXpath($AddressComponent, $this->CityPatterns, 'text', 'first', 'xml'); } } if (empty($cityArray['city_name']) and !empty($cityArray['island'])) { $cityArray['city_name'] = $cityArray['island']; } if (empty($countryArray['country_code'])) { $countryArray['country_code'] = 'xx'; } //if city doesn't exist, save it to cities $city = City::firstOrNew(['city_name' => $cityArray['city_name'], 'country_code' => strtolower($countryArray['country_code'])]); $city->gmaps_status = $dataArray['gmaps_status']; $city->gmaps_output = $gmaps_output; $city->country_name = $countryArray['country_name']; //city_slug $slug = new SlugClass(); $city->city_slug = $slug->slugify($cityArray['city_name']); $city->save(); //save foreign key in addresses $address->city_id = $city->id; $address->save(); } }