diff --git a/src/Provider/Photon/Photon.php b/src/Provider/Photon/Photon.php index cdeea8978..564b8a36f 100644 --- a/src/Provider/Photon/Photon.php +++ b/src/Provider/Photon/Photon.php @@ -71,6 +71,10 @@ public function geocodeQuery(GeocodeQuery $query): Collection 'limit' => $query->getLimit(), 'lang' => $query->getLocale(), ]); + $osmTagFilters = $this->buildOsmTagFilterQuery($query->getData('osm_tag')); + if (!empty($osmTagFilters)) { + $url .= $osmTagFilters; + } $json = $this->executeQuery($url); @@ -98,8 +102,13 @@ public function reverseQuery(ReverseQuery $query): Collection .http_build_query([ 'lat' => $latitude, 'lon' => $longitude, + 'limit' => $query->getLimit(), 'lang' => $query->getLocale(), ]); + $osmTagFilters = $this->buildOsmTagFilterQuery($query->getData('osm_tag')); + if (!empty($osmTagFilters)) { + $url .= $osmTagFilters; + } $json = $this->executeQuery($url); @@ -158,6 +167,25 @@ public function getName(): string return 'photon'; } + /** + * @param string|array|null $filters + */ + private function buildOsmTagFilterQuery($filters): string + { + $query = ''; + if (null === $filters) { + return $query; + } + if (is_string($filters)) { + return '&osm_tag='.urlencode($filters); + } + foreach ($filters as $filter) { + $query .= '&osm_tag='.urlencode($filter); + } + + return $query; + } + private function executeQuery(string $url): \stdClass { $content = $this->getUrlContents($url); diff --git a/src/Provider/Photon/Readme.md b/src/Provider/Photon/Readme.md index bfd981ad5..c684245f7 100644 --- a/src/Provider/Photon/Readme.md +++ b/src/Provider/Photon/Readme.md @@ -10,13 +10,56 @@ This is the photon provider from the PHP Geocoder. This is a **READ ONLY** repository. See the [main repo](https://github.com/geocoder-php/Geocoder) for information and documentation. -### Install - +## Install ```bash composer require geocoder-php/photon-provider ``` -### Contribute +## API Documentation +https://photon.komoot.io +https://github.com/komoot/photon + +## Usage + +### Basic usage +You can use your own photon instance : +```php +// New instance of the provider : +$provider = new Geocoder\Provider\Photon\Photon($httpClient, 'https://your-photon-root-url'); +// Run geocode or reverse query +$query = $provider->geocodeQuery(\Geocoder\Query\GeocodeQuery::create('Paris')); +$reverseQuery = $provider->reverseQuery(\Geocoder\Query\ReverseQuery::fromCoordinates(48.86036 ,2.33852)); +``` + +### OSM Tag Feature +You can search for location data based on osm tag filters. + +For example, you can filter a geocode query to only include results of type 'place'. You can even restrict it to only have places of type 'city'. +In the reverse geocoding context you can search for the 3 pharmacies closest to a location. + +To see what you can do with this feature, check [the official photon documentation](https://github.com/komoot/photon#filter-results-by-tags-and-values) + +Below is an example to query the 3 pharmacies closest to a location : +```php +$provider = new Geocoder\Provider\Photon\Photon($httpClient, 'https://your-photon-root-url'); +$reverseQuery = \Geocoder\Query\ReverseQuery::fromCoordinates(52.51644, 13.38890) + ->withData('osm_tag', 'amenity:pharmacy') + ->withLimit(3); + +$results = $provider->reverseQuery($reverseQuery); +``` + +You can combine multiple osm tag filters : +```php +$provider = new Geocoder\Provider\Photon\Photon($httpClient, 'https://your-photon-root-url'); +$reverseQuery = \Geocoder\Query\GeocodeQuery::create('Paris') + ->withData('osm_tag', ['tourism:museum', 'tourism:gallery']) + ->withLimit(5); +// Here we get 5 tourism results in Paris which are either museum or art gallery +$results = $provider->reverseQuery($reverseQuery); +``` + -Contributions are very welcome! Send a pull request to the [main repository](https://github.com/geocoder-php/Geocoder) or +## Contribute +Contributions are very welcome! Send a pull request to the [main repository](https://github.com/geocoder-php/Geocoder) or report any issues you find on the [issue tracker](https://github.com/geocoder-php/Geocoder/issues). diff --git a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_36b7f4cab09652077420062dc53bc340e8b2b22d b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_36b7f4cab09652077420062dc53bc340e8b2b22d deleted file mode 100644 index 45e7c2303..000000000 --- a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_36b7f4cab09652077420062dc53bc340e8b2b22d +++ /dev/null @@ -1 +0,0 @@ -s:455:"{"features":[{"geometry":{"coordinates":[-77.036931,38.900368],"type":"Point"},"type":"Feature","properties":{"osm_id":5076279021,"country":"United States of America","city":"Washington","countrycode":"US","postcode":"20012","locality":"Golden Triangle","type":"house","osm_type":"N","osm_key":"man_made","housenumber":"800","street":"Black Lives Matter Plaza Northwest","osm_value":"surveillance","state":"Washington, D.C."}}],"type":"FeatureCollection"}"; \ No newline at end of file diff --git a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_3c362ba852ee2323f9f25ca02c28cc5238959dbc b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_3c362ba852ee2323f9f25ca02c28cc5238959dbc new file mode 100644 index 000000000..4bf2c6c13 --- /dev/null +++ b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_3c362ba852ee2323f9f25ca02c28cc5238959dbc @@ -0,0 +1 @@ +s:1219:"{"features":[{"geometry":{"coordinates":[13.3879579,52.5185603],"type":"Point"},"type":"Feature","properties":{"osm_id":380498298,"country":"Deutschland","city":"Berlin","countrycode":"DE","postcode":"10117","locality":"Dorotheenstadt","type":"house","osm_type":"N","osm_key":"amenity","housenumber":"151","street":"Friedrichstraße","district":"Mitte","osm_value":"pharmacy","name":"Dorotheenstadt Apotheke"}},{"geometry":{"coordinates":[13.3874475,52.5196854],"type":"Point"},"type":"Feature","properties":{"osm_id":3331787468,"country":"Deutschland","city":"Berlin","countrycode":"DE","postcode":"10117","locality":"Dorotheenstadt","type":"house","osm_type":"N","osm_key":"amenity","housenumber":"25","street":"Georgenstraße","district":"Mitte","osm_value":"pharmacy","name":"Aschenbachs Apotheke"}},{"geometry":{"coordinates":[13.3903812,52.5122639],"type":"Point"},"type":"Feature","properties":{"osm_id":956306643,"country":"Deutschland","city":"Berlin","countrycode":"DE","postcode":"10117","locality":"Dorotheenstadt","type":"house","osm_type":"N","osm_key":"amenity","housenumber":"68","street":"Friedrichstraße","district":"Mitte","osm_value":"pharmacy","name":"Apotheke Q205"}}],"type":"FeatureCollection"}"; \ No newline at end of file diff --git a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_61baba2ee6bc4ba2e6688559d40d4e58e1ddd7c1 b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_61baba2ee6bc4ba2e6688559d40d4e58e1ddd7c1 deleted file mode 100644 index 916081189..000000000 --- a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_61baba2ee6bc4ba2e6688559d40d4e58e1ddd7c1 +++ /dev/null @@ -1 +0,0 @@ -s:2279:"{"features":[{"geometry":{"coordinates":[-0.1285993,51.5010484],"type":"Point"},"type":"Feature","properties":{"osm_id":2806295309,"country":"United Kingdom","city":"London","countrycode":"GB","postcode":"SW1P 3AE","locality":"Westminster","county":"Greater London","type":"house","osm_type":"N","osm_key":"office","housenumber":"8\u201310","street":"Great George Street","district":"Millbank","osm_value":"warmonger","name":"Finmeccanica UK Ltd","state":"England"}},{"geometry":{"coordinates":[-0.12770820958562096,51.50344025],"type":"Point"},"type":"Feature","properties":{"osm_id":1879842,"extent":[-0.1278356,51.5036483,-0.1273038,51.5032573],"country":"United Kingdom","countrycode":"GB","postcode":"SW1A 2AA","locality":"Westminster","county":"Greater London","type":"house","osm_type":"R","osm_key":"tourism","housenumber":"10","street":"Downing Street","district":"Covent Garden","osm_value":"attraction","name":"Prime Minister\u2019s Office","state":"England"}},{"geometry":{"coordinates":[-0.2765595,51.6136283],"type":"Point"},"type":"Feature","properties":{"osm_id":7179640410,"country":"United Kingdom","city":"Edgware, London","countrycode":"GB","postcode":"HA8 7JJ","county":"Greater London","type":"house","osm_type":"N","osm_key":"amenity","housenumber":"103","street":"Station Road","district":"Mill Hill","osm_value":"bank","name":"HSBC UK","state":"England"}},{"geometry":{"coordinates":[-0.1050314,51.5149368],"type":"Point"},"type":"Feature","properties":{"osm_id":6878399378,"country":"United Kingdom","city":"City of London","countrycode":"GB","postcode":"EC4A 4AD","locality":"Blackfriars","county":"Greater London","type":"house","osm_type":"N","osm_key":"office","housenumber":"10","street":"Saint Bride Street","osm_value":"company","name":"techUK","state":"England"}},{"geometry":{"coordinates":[-0.0469504,51.6429794],"type":"Point"},"type":"Feature","properties":{"osm_id":2444967088,"country":"United Kingdom","city":"London Borough of Enfield","countrycode":"GB","postcode":"EN3 4ES","locality":"Enfield Highway","county":"Greater London","type":"house","osm_type":"N","osm_key":"shop","housenumber":"106","street":"High Street","district":"Ponders End","osm_value":"car_parts","name":"UK Garage","state":"England"}}],"type":"FeatureCollection"}"; \ No newline at end of file diff --git a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_98f80bc58862d177a1c6507d33f5c83a88ab1ffd b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_723a82c29164f0fc32d4c774f86c4569afdd804b similarity index 100% rename from src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_98f80bc58862d177a1c6507d33f5c83a88ab1ffd rename to src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_723a82c29164f0fc32d4c774f86c4569afdd804b diff --git a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_77590bd663047da83d48c67d9101f04a82e48976 b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_77590bd663047da83d48c67d9101f04a82e48976 new file mode 100644 index 000000000..b9e1d963f --- /dev/null +++ b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_77590bd663047da83d48c67d9101f04a82e48976 @@ -0,0 +1 @@ +s:2127:"{"features":[{"geometry":{"coordinates":[-77.0372192,38.9002248],"type":"Point"},"type":"Feature","properties":{"osm_type":"W","osm_id":1049842804,"extent":[-77.0372192,38.9002248,-77.0370581,38.9002243],"country":"United States","osm_key":"highway","city":"Washington","countrycode":"US","osm_value":"secondary","postcode":"20006","name":"H Street Northwest","state":"District of Columbia","type":"street"}},{"geometry":{"coordinates":[-77.0366811,38.9002231],"type":"Point"},"type":"Feature","properties":{"osm_type":"W","osm_id":589539534,"extent":[-77.0370581,38.9002243,-77.0365521,38.9002187],"country":"United States","osm_key":"highway","city":"Washington","countrycode":"US","osm_value":"secondary","postcode":"20006","name":"H Street Northwest","state":"District of Columbia","type":"street"}},{"geometry":{"coordinates":[-77.03689992471391,38.90050395],"type":"Point"},"type":"Feature","properties":{"osm_id":55326891,"extent":[-77.0371738,38.9006934,-77.0367231,38.9003173],"country":"United States","city":"Washington","countrycode":"US","postcode":"20006","locality":"Golden Triangle","type":"house","osm_type":"W","osm_key":"tourism","housenumber":"800","street":"Black Lives Matter Plaza Northwest","osm_value":"hotel","name":"Hay-Adams Hotel","state":"District of Columbia"}},{"geometry":{"coordinates":[-77.0374769,38.9003895],"type":"Point"},"type":"Feature","properties":{"osm_type":"N","osm_id":367142942,"country":"United States","osm_key":"building","city":"Washington","street":"H Street Northwest","countrycode":"US","osm_value":"public","postcode":"20006","name":"United States Chamber of Commerce Building","state":"District of Columbia","type":"house"}},{"geometry":{"coordinates":[-77.0364753,38.9003613],"type":"Point"},"type":"Feature","properties":{"osm_id":4957653991,"country":"United States","city":"Washington","countrycode":"US","postcode":"20062","locality":"Golden Triangle","type":"house","osm_type":"N","osm_key":"tourism","street":"Black Lives Matter Plaza Northwest","osm_value":"information","name":"16th Street Meridian","state":"District of Columbia"}}],"type":"FeatureCollection"}"; \ No newline at end of file diff --git a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_8cd3447834c3ae8316dda602714b4ca4959eae65 b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_8cd3447834c3ae8316dda602714b4ca4959eae65 new file mode 100644 index 000000000..6e057cd72 --- /dev/null +++ b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_8cd3447834c3ae8316dda602714b4ca4959eae65 @@ -0,0 +1 @@ +s:2187:"{"features":[{"geometry":{"coordinates":[2.2978602225671843,48.8643133],"type":"Point"},"type":"Feature","properties":{"osm_id":79219308,"extent":[2.2971088,48.8647083,2.2984772,48.8639024],"country":"France","city":"Paris","countrycode":"FR","postcode":"75116","locality":"Quartier de Chaillot","type":"house","osm_type":"W","osm_key":"tourism","street":"Rue Gaston de Saint-Paul","district":"Paris","osm_value":"museum","name":"Musée d'Art Moderne de Paris","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3518758,48.850724],"type":"Point"},"type":"Feature","properties":{"osm_id":237003117,"country":"France","city":"Paris","countrycode":"FR","postcode":"75005","locality":"Quartier Saint-Victor","type":"house","osm_type":"N","osm_key":"tourism","street":"Quai de la Tournelle","district":"Paris","osm_value":"museum","name":"Musée de l'Assistance Publique Hôpitaux de Paris","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3450724,48.8640506],"type":"Point"},"type":"Feature","properties":{"osm_id":3087374948,"country":"France","city":"Paris","countrycode":"FR","postcode":"75001","locality":"Les Halles","type":"house","osm_type":"N","osm_key":"tourism","street":"Rue du Jour","district":"Paris","osm_value":"museum","name":"Musée du Barreau de Paris","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3153496472839956,48.866042],"type":"Point"},"type":"Feature","properties":{"osm_id":2778854,"extent":[2.3143339,48.866628,2.3156049,48.8654594],"country":"France","city":"Paris","countrycode":"FR","postcode":"75008","locality":"Quartier des Champs-Élysées","type":"house","osm_type":"R","osm_key":"tourism","street":"Avenue Winston Churchill","district":"Paris","osm_value":"museum","name":"Petit Palais","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3453019,48.8625016],"type":"Point"},"type":"Feature","properties":{"osm_id":1028569468,"country":"France","city":"Paris","countrycode":"FR","postcode":"75001","locality":"Les Halles","type":"house","osm_type":"N","osm_key":"tourism","street":"Rue du Cinéma","district":"Paris","osm_value":"museum","name":"Salle des collections","state":"Île-de-France"}}],"type":"FeatureCollection"}"; \ No newline at end of file diff --git a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_f02c930445a15eb88482c0cc3c22a782c9ee6005 b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_f02c930445a15eb88482c0cc3c22a782c9ee6005 new file mode 100644 index 000000000..d23d4a4ec --- /dev/null +++ b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_f02c930445a15eb88482c0cc3c22a782c9ee6005 @@ -0,0 +1 @@ +s:4208:"{"features":[{"geometry":{"coordinates":[2.2978602225671843,48.8643133],"type":"Point"},"type":"Feature","properties":{"osm_id":79219308,"extent":[2.2971088,48.8647083,2.2984772,48.8639024],"country":"France","city":"Paris","countrycode":"FR","postcode":"75116","locality":"Chaillot","type":"house","osm_type":"W","osm_key":"tourism","street":"Rue Gaston de Saint-Paul","district":"Paris","osm_value":"museum","name":"Musée d'Art Moderne de Paris","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3153496472839956,48.866042],"type":"Point"},"type":"Feature","properties":{"osm_id":2778854,"extent":[2.3143339,48.866628,2.3156049,48.8654594],"country":"France","city":"Paris","countrycode":"FR","postcode":"75008","locality":"Quartier des Champs-Élysées","type":"house","osm_type":"R","osm_key":"tourism","street":"Avenue Winston Churchill","district":"Paris","osm_value":"museum","name":"Musée des beaux-arts de la Ville de Paris","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3518758,48.850724],"type":"Point"},"type":"Feature","properties":{"osm_id":237003117,"country":"France","city":"Paris","countrycode":"FR","postcode":"75005","locality":"Quartier Saint-Victor","type":"house","osm_type":"N","osm_key":"tourism","street":"Quai de la Tournelle","district":"Paris","osm_value":"museum","name":"Musée de l'Assistance Publique Hôpitaux de Paris","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3450724,48.8640506],"type":"Point"},"type":"Feature","properties":{"osm_id":3087374948,"country":"France","city":"Paris","countrycode":"FR","postcode":"75001","locality":"Les Halles","type":"house","osm_type":"N","osm_key":"tourism","street":"Rue du Jour","district":"Paris","osm_value":"museum","name":"Musée du Barreau de Paris","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3453019,48.8625016],"type":"Point"},"type":"Feature","properties":{"osm_id":1028569468,"country":"France","city":"Paris 1er Arrondissement","countrycode":"FR","postcode":"75001","locality":"Les Halles","type":"house","osm_type":"N","osm_key":"tourism","street":"Rue du cinéma","district":"Paris","osm_value":"museum","name":"Salle des collections","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3587471,48.865943],"type":"Point"},"type":"Feature","properties":{"osm_id":5275610309,"country":"France","city":"Paris","countrycode":"FR","postcode":"75003","locality":"Quartier des Arts-et-Métiers","type":"house","osm_type":"N","osm_key":"tourism","street":"Rue de Turbigo","district":"Paris","osm_value":"gallery","name":"Paris-B","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3314642,48.881227],"type":"Point"},"type":"Feature","properties":{"osm_id":10677716841,"country":"France","city":"Paris","countrycode":"FR","postcode":"75009","locality":"Quartier Saint-Georges","type":"house","osm_type":"N","osm_key":"tourism","street":"Rue Blanche","district":"Paris","osm_value":"gallery","name":"Mu Gallery Paris","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3736064,48.8623128],"type":"Point"},"type":"Feature","properties":{"osm_id":10130759032,"country":"France","city":"Paris","countrycode":"FR","postcode":"75011","locality":"Quartier Saint-Ambroise","type":"house","osm_type":"N","osm_key":"tourism","street":"Rue Saint-Sébastien","district":"Paris","osm_value":"gallery","name":"Paris-New York","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3644211,48.8602831],"type":"Point"},"type":"Feature","properties":{"osm_id":3210924575,"country":"France","city":"Paris","countrycode":"FR","postcode":"75003","locality":"Quartier des Archives","type":"house","osm_type":"N","osm_key":"tourism","street":"Rue Debelleyme","district":"Le Marais","osm_value":"gallery","name":"lecœur-paris.com","state":"Île-de-France"}},{"geometry":{"coordinates":[2.3525427,48.86361],"type":"Point"},"type":"Feature","properties":{"osm_id":10744217145,"country":"France","city":"Paris","countrycode":"FR","postcode":"75003","locality":"Quartier Sainte-Avoye","type":"house","osm_type":"N","osm_key":"tourism","street":"Rue Saint-Martin","district":"Paris","osm_value":"gallery","name":"Galerie Paris Horizon","state":"Île-de-France"}}],"type":"FeatureCollection"}"; \ No newline at end of file diff --git a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_fb4e33e538bd52319d02f18862965a0c30d78dfd b/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_fb4e33e538bd52319d02f18862965a0c30d78dfd deleted file mode 100644 index c3b709ce4..000000000 --- a/src/Provider/Photon/Tests/.cached_responses/photon.komoot.io_fb4e33e538bd52319d02f18862965a0c30d78dfd +++ /dev/null @@ -1 +0,0 @@ -s:246:"{"features":[{"geometry":{"coordinates":[0,0],"type":"Point"},"type":"Feature","properties":{"osm_id":3815077900,"osm_type":"N","osm_key":"man_made","osm_value":"monitoring_station","name":"Soul Buoy","type":"house"}}],"type":"FeatureCollection"}"; \ No newline at end of file diff --git a/src/Provider/Photon/Tests/PhotonTest.php b/src/Provider/Photon/Tests/PhotonTest.php index 513688d44..1148341d7 100644 --- a/src/Provider/Photon/Tests/PhotonTest.php +++ b/src/Provider/Photon/Tests/PhotonTest.php @@ -13,6 +13,7 @@ namespace Geocoder\Provider\Photon\Tests; use Geocoder\IntegrationTest\BaseTestCase; +use Geocoder\Provider\Photon\Model\PhotonAddress; use Geocoder\Provider\Photon\Photon; use Geocoder\Query\GeocodeQuery; use Geocoder\Query\ReverseQuery; @@ -59,7 +60,7 @@ public function testGeocodeQuery(): void $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results); $this->assertCount(1, $results); - /** @var \Geocoder\Provider\Photon\Model\PhotonAddress $result */ + /** @var PhotonAddress $result */ $result = $results->first(); $this->assertInstanceOf('\Geocoder\Model\Address', $result); $this->assertEqualsWithDelta(48.8631927, $result->getCoordinates()->getLatitude(), 0.00001); @@ -88,21 +89,62 @@ public function testGeocodeQueryWithNamedResult(): void $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results); $this->assertCount(1, $results); - /** @var \Geocoder\Provider\Photon\Model\PhotonAddress $result */ + /** @var PhotonAddress $result */ $result = $results->first(); $this->assertEquals('The Sherlock Holmes Museum and shop', $result->getName()); } + public function testGeocodeQueryWithOsmTagFilter(): void + { + $provider = Photon::withKomootServer($this->getHttpClient()); + $query = GeocodeQuery::create('Paris') + ->withData('osm_tag', 'tourism:museum') + ->withLimit(5); + $results = $provider->geocodeQuery($query); + + $this->assertCount(5, $results); + foreach ($results as $result) { + $this->assertInstanceOf(PhotonAddress::class, $result); + $this->assertEquals('tourism', $result->getOSMTag()->key); + $this->assertEquals('museum', $result->getOSMTag()->value); + } + } + + public function testGeocodeQueryWithMultipleOsmTagFilter(): void + { + $provider = Photon::withKomootServer($this->getHttpClient()); + $query = GeocodeQuery::create('Paris') + ->withData('osm_tag', ['tourism:museum', 'tourism:gallery']) + ->withLimit(10); + $results = $provider->geocodeQuery($query); + + $this->assertCount(10, $results); + $countMuseums = $countGalleries = 0; + foreach ($results as $result) { + $this->assertInstanceOf(PhotonAddress::class, $result); + $this->assertEquals('tourism', $result->getOSMTag()->key); + $this->assertContains($result->getOSMTag()->value, ['museum', 'gallery']); + if ('museum' === $result->getOSMTag()->value) { + ++$countMuseums; + } elseif ('gallery' === $result->getOSMTag()->value) { + ++$countGalleries; + } + } + $this->assertGreaterThan(0, $countMuseums); + $this->assertGreaterThan(0, $countGalleries); + } + public function testReverseQuery(): void { $provider = Photon::withKomootServer($this->getHttpClient()); - $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(52, 10)); + $reverseQuery = ReverseQuery::fromCoordinates(52, 10)->withLimit(1); + $results = $provider->reverseQuery($reverseQuery); $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results); $this->assertCount(1, $results); - /** @var \Geocoder\Provider\Photon\Model\PhotonAddress $result */ + /** @var PhotonAddress $result */ $result = $results->first(); $this->assertInstanceOf('\Geocoder\Model\Address', $result); $this->assertEqualsWithDelta(51.9982968, $result->getCoordinates()->getLatitude(), 0.00001); @@ -120,4 +162,20 @@ public function testReverseQuery(): void $this->assertEquals('Landkreis Hildesheim', $result->getCounty()); $this->assertEquals('Sehlem', $result->getDistrict()); } + + public function testReverseQueryWithOsmTagFilter(): void + { + $provider = Photon::withKomootServer($this->getHttpClient()); + $reverseQuery = ReverseQuery::fromCoordinates(52.51644, 13.38890) + ->withData('osm_tag', 'amenity:pharmacy') + ->withLimit(3); + $results = $provider->reverseQuery($reverseQuery); + + $this->assertCount(3, $results); + foreach ($results as $result) { + $this->assertInstanceOf(PhotonAddress::class, $result); + $this->assertEquals('amenity', $result->getOSMTag()->key); + $this->assertEquals('pharmacy', $result->getOSMTag()->value); + } + } }