Skip to content

Commit e68be47

Browse files
committed
feat: [Photon] support multiple layers
1 parent da3e634 commit e68be47

5 files changed

+42
-2
lines changed

src/Provider/Photon/Photon.php

+14-2
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ public function geocodeQuery(GeocodeQuery $query): Collection
6868
.'/api?'
6969
.http_build_query([
7070
'q' => $address,
71-
'layer' => $query->getData('layer'),
7271
'limit' => $query->getLimit(),
7372
'lang' => $query->getLocale(),
7473
'lat' => $query->getData('lat'),
7574
'lon' => $query->getData('lon'),
7675
]);
76+
$url .= $this->buildLayerFilterQuery($query->getData('layer'));
7777
$osmTagFilters = $this->buildOsmTagFilterQuery($query->getData('osm_tag'));
7878
if (!empty($osmTagFilters)) {
7979
$url .= $osmTagFilters;
@@ -109,11 +109,11 @@ public function reverseQuery(ReverseQuery $query): Collection
109109
.http_build_query([
110110
'lat' => $latitude,
111111
'lon' => $longitude,
112-
'layer' => $query->getData('layer'),
113112
'radius' => $query->getData('radius'),
114113
'limit' => $query->getLimit(),
115114
'lang' => $query->getLocale(),
116115
]);
116+
$url .= $this->buildLayerFilterQuery($query->getData('layer'));
117117
$osmTagFilters = $this->buildOsmTagFilterQuery($query->getData('osm_tag'));
118118
if (!empty($osmTagFilters)) {
119119
$url .= $osmTagFilters;
@@ -177,6 +177,18 @@ public function getName(): string
177177
return 'photon';
178178
}
179179

180+
private function buildLayerFilterQuery(mixed $layers): string
181+
{
182+
if (!is_iterable($layers)) {
183+
$layers = [$layers];
184+
}
185+
186+
return implode('', array_map(
187+
static fn ($layer) => sprintf('&layer=%s', $layer),
188+
array_filter(iterator_to_array($layers), is_scalar(...)),
189+
));
190+
}
191+
180192
/**
181193
* @param string|array<int, string>|null $filters
182194
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
s:359:"{"features":[{"geometry":{"coordinates":[21.2392122,49.0000074],"type":"Point"},"type":"Feature","properties":{"osm_type":"R","osm_id":388255,"extent":[20.870461,49.185185,21.485864,48.810739],"country":"Slovensko","osm_key":"place","countrycode":"SK","osm_value":"city","name":"Prešov","state":"Prešovský kraj","type":"city"}}],"type":"FeatureCollection"}";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
s:703:"{"features":[{"geometry":{"coordinates":[21.2392122,49.0000074],"type":"Point"},"type":"Feature","properties":{"osm_type":"R","osm_id":388255,"extent":[20.870461,49.185185,21.485864,48.810739],"country":"Slovensko","osm_key":"place","countrycode":"SK","osm_value":"city","name":"Prešov","state":"Prešovský kraj","type":"city"}},{"geometry":{"coordinates":[21.2392122,49.0000074],"type":"Point"},"type":"Feature","properties":{"osm_type":"R","osm_id":2320257,"extent":[21.1569866,49.0468381,21.3354271,48.9449997],"country":"Slovensko","osm_key":"place","city":"Prešov","countrycode":"SK","osm_value":"city","name":"Prešov","state":"Prešovský kraj","type":"district"}}],"type":"FeatureCollection"}";

src/Provider/Photon/Tests/PhotonTest.php

+26
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,32 @@ public function testReverseQueryWithLayerCityAndRadiusFilter(): void
213213
$this->assertEquals('Berlin', $result->getLocality());
214214
}
215215

216+
public function testReverseQueryWithMultipleLayers(): void
217+
{
218+
$provider = Photon::withKomootServer($this->getHttpClient());
219+
$reverseQuery = ReverseQuery::fromCoordinates(49.001831, 21.239311)
220+
->withData('layer', 'city')
221+
->withLimit(2);
222+
223+
$results = $provider->reverseQuery($reverseQuery);
224+
$this->assertInstanceOf(AddressCollection::class, $results);
225+
$this->assertCount(1, $results);
226+
$result0 = $results->get(0);
227+
$this->assertInstanceOf(PhotonAddress::class, $result0);
228+
$this->assertEquals('city', $result0->getType());
229+
230+
$reverseQuery = $reverseQuery->withData('layer', ['city', 'district']);
231+
$results = $provider->reverseQuery($reverseQuery);
232+
$this->assertInstanceOf(AddressCollection::class, $results);
233+
$this->assertCount(2, $results);
234+
$result0 = $results->get(0);
235+
$this->assertInstanceOf(PhotonAddress::class, $result0);
236+
$this->assertEquals('city', $result0->getType());
237+
$result1 = $results->get(1);
238+
$this->assertInstanceOf(PhotonAddress::class, $result1);
239+
$this->assertEquals('district', $result1->getType());
240+
}
241+
216242
public function testGeocodeQueryWithBbox(): void
217243
{
218244
// Germany

0 commit comments

Comments
 (0)