/** * @param string $address * @param array $params * @return \Geocoder\Model\AddressCollection */ public function geocode($address, array $params = []) { $file = Inflector::slug($address) . '.txt'; $testFiles = ROOT . DS . 'tests' . DS . 'test_files' . DS . 'Geocoder' . DS; $testFile = $testFiles . $file; if (!file_exists($testFile)) { if (getenv('CI')) { throw new Exception('Should not happen on CI.'); } $addresses = parent::geocode($address, $params); file_put_contents($testFile, serialize($addresses)); } $addresses = file_get_contents($testFile); $addresses = unserialize($addresses); return $addresses; }
/** * Uses the Geocode class to query * * @param string $address * @return \Geocoder\Model\Address|null */ protected function _execute($address) { $this->_Geocoder = new Geocoder($this->_config); if ($this->config('cache')) { $GeocodedAddresses = TableRegistry::get('Geo.GeocodedAddresses'); $result = $GeocodedAddresses->find()->where(['address' => $address])->first(); if ($result) { return $result->data ?: null; } } try { $addresses = $this->_Geocoder->geocode($address); } catch (InconclusiveException $e) { $addresses = null; } catch (NotAccurateEnoughException $e) { $addresses = null; } $result = null; if ($addresses && $addresses->count() > 0) { $result = $addresses->first(); } if ($this->config('cache')) { $addressEntity = $GeocodedAddresses->newEntity(['address' => $address]); if ($result) { $formatter = new StringFormatter(); $addressEntity->formatted_address = $formatter->format($result, '%S %n, %z %L'); $addressEntity->lat = $result->getLatitude(); $addressEntity->lng = $result->getLongitude(); $addressEntity->country = $result->getCountry()->getCode(); $addressEntity->data = $result; } if (!$GeocodedAddresses->save($addressEntity, ['atomic' => false])) { throw new RuntimeException('Could not store geocoding cache data'); } } return $result; }