From b8ec3fecd1338c1a7fffddd2b14c6bc5b3fc5cd9 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Sat, 20 May 2017 12:05:56 +0200 Subject: [PATCH 1/3] Adding precision for Yandex --- src/Provider/Yandex/Model/YandexAddress.php | 44 ++++++++++++++ src/Provider/Yandex/Yandex.php | 66 +++++++++++---------- 2 files changed, 78 insertions(+), 32 deletions(-) create mode 100644 src/Provider/Yandex/Model/YandexAddress.php diff --git a/src/Provider/Yandex/Model/YandexAddress.php b/src/Provider/Yandex/Model/YandexAddress.php new file mode 100644 index 000000000..07919a18b --- /dev/null +++ b/src/Provider/Yandex/Model/YandexAddress.php @@ -0,0 +1,44 @@ + + */ +class YandexAddress extends Address +{ + /** + * @var string|null + */ + private $precision; + + /** + * @return null|string + */ + public function getPrecision() + { + return $this->precision; + } + + /** + * @param null|string $precision + * + * @return YandexAddress + */ + public function setPrecision($precision) + { + $this->precision = $precision; + + return $this; + } +} diff --git a/src/Provider/Yandex/Yandex.php b/src/Provider/Yandex/Yandex.php index 83df97304..fab805e48 100644 --- a/src/Provider/Yandex/Yandex.php +++ b/src/Provider/Yandex/Yandex.php @@ -12,6 +12,8 @@ use Geocoder\Exception\UnsupportedOperation; use Geocoder\Model\AddressCollection; +use Geocoder\Model\LocationBuilder; +use Geocoder\Provider\Yandex\Model\YandexAddress; use Geocoder\Query\GeocodeQuery; use Geocoder\Query\ReverseQuery; use Geocoder\Provider\AbstractHttpProvider; @@ -116,10 +118,11 @@ private function executeQuery($query, $locale, $limit) $data = $json['response']['GeoObjectCollection']['featureMember']; - $results = []; + $locations = []; foreach ($data as $item) { + $builder = new LocationBuilder(); $bounds = null; - $details = ['pos' => ' ']; + $flatArray = ['pos' => ' ']; array_walk_recursive( $item['GeoObject'], @@ -127,46 +130,45 @@ private function executeQuery($query, $locale, $limit) /** * @param string $value */ - function ($value, $key) use (&$details) { - $details[$key] = $value; + function ($value, $key) use (&$flatArray) { + $flatArray[$key] = $value; } ); - if (!empty($details['lowerCorner'])) { - $coordinates = explode(' ', $details['lowerCorner']); - $bounds['south'] = (float) $coordinates[1]; - $bounds['west'] = (float) $coordinates[0]; + if (!empty($flatArray['lowerCorner']) && !empty($flatArray['upperCorner'])) { + $lowerCorner = explode(' ', $flatArray['lowerCorner']); + $upperCorner = explode(' ', $flatArray['upperCorner']); + $builder->setBounds( + (float) $lowerCorner[1], + (float) $lowerCorner[0], + (float) $upperCorner[1], + (float) $upperCorner[0] + ); } - if (!empty($details['upperCorner'])) { - $coordinates = explode(' ', $details['upperCorner']); - $bounds['north'] = (float) $coordinates[1]; - $bounds['east'] = (float) $coordinates[0]; - } - - $coordinates = explode(' ', $details['pos']); + $coordinates = explode(' ', $flatArray['pos']); + $builder->setCoordinates((float) $coordinates[1], (float) $coordinates[0]); - $adminLevels = []; - foreach (['AdministrativeAreaName', 'SubAdministrativeAreaName'] as $i => $detail) { - if (isset($details[$detail])) { - $adminLevels[] = ['name' => $details[$detail], 'level' => $i + 1]; + foreach (['AdministrativeAreaName', 'SubAdministrativeAreaName'] as $i => $name) { + if (isset($flatArray[$name])) { + $builder->addAdminLevel($i + 1, $flatArray[$name], null); } } - $results[] = array_merge($this->getDefaults(), [ - 'latitude' => (float) $coordinates[1], - 'longitude' => (float) $coordinates[0], - 'bounds' => $bounds, - 'streetNumber' => isset($details['PremiseNumber']) ? $details['PremiseNumber'] : null, - 'streetName' => isset($details['ThoroughfareName']) ? $details['ThoroughfareName'] : null, - 'subLocality' => isset($details['DependentLocalityName']) ? $details['DependentLocalityName'] : null, - 'locality' => isset($details['LocalityName']) ? $details['LocalityName'] : null, - 'adminLevels' => $adminLevels, - 'country' => isset($details['CountryName']) ? $details['CountryName'] : null, - 'countryCode' => isset($details['CountryNameCode']) ? $details['CountryNameCode'] : null, - ]); + $builder->setStreetNumber(isset($flatArray['PremiseNumber']) ? $flatArray['PremiseNumber'] : null); + $builder->setStreetName(isset($flatArray['ThoroughfareName']) ? $flatArray['ThoroughfareName'] : null); + $builder->setSubLocality(isset($flatArray['DependentLocalityName']) ? $flatArray['DependentLocalityName'] : null); + $builder->setLocality(isset($flatArray['LocalityName']) ? $flatArray['LocalityName'] : null); + $builder->setCountry(isset($flatArray['CountryName']) ? $flatArray['CountryName'] : null); + $builder->setCountryCode(isset($flatArray['CountryNameCode']) ? $flatArray['CountryNameCode'] : null); + + /** @var YandexAddress $location */ + $location = $builder->build(YandexAddress::class); + $location->setPrecision(isset($flatArray['precision']) ? $flatArray['precision'] : null); + $locations[] = $location; + } - return $this->returnResults($results); + return new AddressCollection($locations); } } From 6b369a9f233fa335a7e1f293a242a63faa39f948 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Sat, 20 May 2017 12:19:26 +0200 Subject: [PATCH 2/3] Allow you to get the name of the location --- src/Provider/Yandex/Model/YandexAddress.php | 27 +++++++++++++++++++++ src/Provider/Yandex/Tests/YandexTest.php | 10 ++++++++ src/Provider/Yandex/Yandex.php | 1 + 3 files changed, 38 insertions(+) diff --git a/src/Provider/Yandex/Model/YandexAddress.php b/src/Provider/Yandex/Model/YandexAddress.php index 07919a18b..f439fde8b 100644 --- a/src/Provider/Yandex/Model/YandexAddress.php +++ b/src/Provider/Yandex/Model/YandexAddress.php @@ -22,6 +22,13 @@ class YandexAddress extends Address */ private $precision; + /** + * The name of this location. + * + * @var string|null + */ + private $name; + /** * @return null|string */ @@ -41,4 +48,24 @@ public function setPrecision($precision) return $this; } + + /** + * @return null|string + */ + public function getName() + { + return $this->name; + } + + /** + * @param null|string $name + * + * @return YandexAddress + */ + public function setName($name) + { + $this->name = $name; + + return $this; + } } diff --git a/src/Provider/Yandex/Tests/YandexTest.php b/src/Provider/Yandex/Tests/YandexTest.php index 20603ba91..a9b58fcf4 100644 --- a/src/Provider/Yandex/Tests/YandexTest.php +++ b/src/Provider/Yandex/Tests/YandexTest.php @@ -444,4 +444,14 @@ public function testReverseWithRealCoordinatesWithTRLocaleAndLocalityToponym() $this->assertNull($result->getAdminLevels()->get(1)->getCode()); $this->assertNull($result->getTimezone()); } + + public function testReverseMetroStationToGetName() + { + $provider = new Yandex($this->getAdapter(), 'metro'); + $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(60.036843, 30.324285)); + + $first = $results->first(); + $this->assertEquals('метро Озерки', $first->getName()); + + } } diff --git a/src/Provider/Yandex/Yandex.php b/src/Provider/Yandex/Yandex.php index fab805e48..1fe060ef1 100644 --- a/src/Provider/Yandex/Yandex.php +++ b/src/Provider/Yandex/Yandex.php @@ -165,6 +165,7 @@ function ($value, $key) use (&$flatArray) { /** @var YandexAddress $location */ $location = $builder->build(YandexAddress::class); $location->setPrecision(isset($flatArray['precision']) ? $flatArray['precision'] : null); + $location->setName(isset($flatArray['name']) ? $flatArray['name'] : null); $locations[] = $location; } From db29b23b6f1b0c1618fdb9247678e7a91be2c3a2 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Sat, 20 May 2017 12:20:54 +0200 Subject: [PATCH 3/3] cs --- src/Provider/Yandex/Tests/YandexTest.php | 1 - src/Provider/Yandex/Yandex.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Provider/Yandex/Tests/YandexTest.php b/src/Provider/Yandex/Tests/YandexTest.php index a9b58fcf4..47693efcf 100644 --- a/src/Provider/Yandex/Tests/YandexTest.php +++ b/src/Provider/Yandex/Tests/YandexTest.php @@ -452,6 +452,5 @@ public function testReverseMetroStationToGetName() $first = $results->first(); $this->assertEquals('метро Озерки', $first->getName()); - } } diff --git a/src/Provider/Yandex/Yandex.php b/src/Provider/Yandex/Yandex.php index 1fe060ef1..d9de777a3 100644 --- a/src/Provider/Yandex/Yandex.php +++ b/src/Provider/Yandex/Yandex.php @@ -167,7 +167,6 @@ function ($value, $key) use (&$flatArray) { $location->setPrecision(isset($flatArray['precision']) ? $flatArray['precision'] : null); $location->setName(isset($flatArray['name']) ? $flatArray['name'] : null); $locations[] = $location; - } return new AddressCollection($locations);