Skip to content

Commit f4434f2

Browse files
Allow filter by type with GeocodeQuery::data (#5)
1 parent 69de6ef commit f4434f2

5 files changed

+71
-2
lines changed

Addok.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@
2929
*/
3030
final class Addok extends AbstractHttpProvider implements Provider
3131
{
32+
const TYPE_HOUSENUMBER = 'housenumber';
33+
const TYPE_STREET = 'street';
34+
const TYPE_LOCALITY = 'locality';
35+
const TYPE_MUNICIPALITY = 'municipality';
36+
3237
/**
3338
* @var string
3439
*/
@@ -83,6 +88,11 @@ public function geocodeQuery(GeocodeQuery $query): Collection
8388
}
8489

8590
$url = sprintf($this->getGeocodeEndpointUrl(), urlencode($address), $query->getLimit());
91+
92+
if ($type = $query->getData('type', null)) {
93+
$url .= sprintf('&type=%s', $type);
94+
}
95+
8696
$json = $this->executeQuery($url);
8797

8898
// no result
@@ -95,11 +105,11 @@ public function geocodeQuery(GeocodeQuery $query): Collection
95105
$coordinates = $feature->geometry->coordinates;
96106

97107
switch ($feature->properties->type) {
98-
case 'housenumber':
108+
case self::TYPE_HOUSENUMBER:
99109
$streetName = !empty($feature->properties->street) ? $feature->properties->street : null;
100110
$number = !empty($feature->properties->housenumber) ? $feature->properties->housenumber : null;
101111
break;
102-
case 'street':
112+
case self::TYPE_STREET:
103113
$streetName = !empty($feature->properties->name) ? $feature->properties->name : null;
104114
$number = null;
105115
break;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
s:725:"{"type": "FeatureCollection", "version": "draft", "features": [{"type": "Feature", "geometry": {"type": "Point", "coordinates": [2.292863, 48.871176]}, "properties": {"label": "20 Avenue Kl\u00e9ber 75016 Paris", "score": 0.9618679689140964, "housenumber": "20", "id": "75116_5159_00020", "type": "housenumber", "x": 648129.93, "y": 6863693.35, "importance": 0.5805476580550619, "name": "20 Avenue Kl\u00e9ber", "postcode": "75016", "citycode": "75116", "city": "Paris", "district": "Paris 16e Arrondissement", "context": "75, Paris, \u00cele-de-France", "street": "Avenue Kl\u00e9ber"}}], "attribution": "BAN", "licence": "ETALAB-2.0", "query": "20 avenue Kl\u00e9ber, Paris", "filters": {"type": "housenumber"}, "limit": 5}";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
s:649:"{"type": "FeatureCollection", "version": "draft", "features": [{"type": "Feature", "geometry": {"type": "Point", "coordinates": [2.294412, 48.872517]}, "properties": {"label": "Avenue Kl\u00e9ber 75016 Paris", "score": 0.8319978390439665, "id": "75116_5159", "type": "street", "x": 648244.9, "y": 6863841.43, "importance": 0.5805476580550619, "name": "Avenue Kl\u00e9ber", "postcode": "75016", "citycode": "75116", "city": "Paris", "district": "Paris 16e Arrondissement", "context": "75, Paris, \u00cele-de-France"}}], "attribution": "BAN", "licence": "ETALAB-2.0", "query": "20 avenue Kl\u00e9ber, Paris", "filters": {"type": "street"}, "limit": 5}";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
s:641:"{"type": "FeatureCollection", "version": "draft", "features": [{"type": "Feature", "geometry": {"type": "Point", "coordinates": [2.294253, 48.871759]}, "properties": {"label": "Metro Kleber 75016 Paris", "score": 0.472357479403607, "type": "locality", "importance": 0.5805476580550619, "id": "75116_s271", "name": "Metro Kleber", "postcode": "75016", "citycode": "75116", "x": 648232.46, "y": 6863757.25, "city": "Paris", "district": "Paris 16e Arrondissement", "context": "75, Paris, \u00cele-de-France"}}], "attribution": "BAN", "licence": "ETALAB-2.0", "query": "20 avenue Kl\u00e9ber, Paris", "filters": {"type": "locality"}, "limit": 5}";

Tests/AddokTest.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,60 @@ public function testGeocodeOnlyCityQuery()
107107
$this->assertEquals('77100', $result->getPostalCode());
108108
$this->assertEquals('Meaux', $result->getLocality());
109109
}
110+
111+
public function testGeocodeHouseNumberTypeQuery()
112+
{
113+
$provider = Addok::withBANServer($this->getHttpClient(), 'Geocoder PHP/Addok Provider/Addok Test');
114+
$results = $provider->geocodeQuery(
115+
GeocodeQuery::create('20 avenue Kléber, Paris')->withData('type', Addok::TYPE_HOUSENUMBER)
116+
);
117+
118+
$this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
119+
120+
/** @var \Geocoder\Model\Address $result */
121+
$result = $results->first();
122+
$this->assertInstanceOf('\Geocoder\Model\Address', $result);
123+
$this->assertEquals('20', $result->getStreetNumber());
124+
$this->assertEquals('Avenue Kléber', $result->getStreetName());
125+
$this->assertEquals('75016', $result->getPostalCode());
126+
$this->assertEquals('Paris', $result->getLocality());
127+
}
128+
129+
public function testGeocodeStreetTypeQuery()
130+
{
131+
$provider = Addok::withBANServer($this->getHttpClient(), 'Geocoder PHP/Addok Provider/Addok Test');
132+
$results = $provider->geocodeQuery(
133+
GeocodeQuery::create('20 avenue Kléber, Paris')->withData('type', Addok::TYPE_STREET)
134+
);
135+
136+
$this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
137+
138+
/** @var \Geocoder\Model\Address $result */
139+
$result = $results->first();
140+
$this->assertInstanceOf('\Geocoder\Model\Address', $result);
141+
$this->assertNull($result->getStreetNumber());
142+
$this->assertEquals('Avenue Kléber', $result->getStreetName());
143+
$this->assertEquals('75016', $result->getPostalCode());
144+
$this->assertEquals('Paris', $result->getLocality());
145+
}
146+
147+
public function testGeocodeLocalityQuery()
148+
{
149+
$provider = Addok::withBANServer($this->getHttpClient(), 'Geocoder PHP/Addok Provider/Addok Test');
150+
$results = $provider->geocodeQuery(
151+
GeocodeQuery::create('20 avenue Kléber, Paris')->withData('type', Addok::TYPE_LOCALITY)
152+
);
153+
154+
$this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
155+
156+
/** @var \Geocoder\Model\Address $result */
157+
$result = $results->first();
158+
$this->assertInstanceOf('\Geocoder\Model\Address', $result);
159+
$this->assertNull($result->getStreetNumber());
160+
$this->assertNull($result->getStreetName());
161+
$this->assertEquals(48.871759, $result->getCoordinates()->getLatitude(), '', 0.00001);
162+
$this->assertEquals(2.294253, $result->getCoordinates()->getLongitude(), '', 0.00001);
163+
$this->assertEquals('75016', $result->getPostalCode());
164+
$this->assertEquals('Paris', $result->getLocality());
165+
}
110166
}

0 commit comments

Comments
 (0)