Skip to content

Commit

Permalink
Allow filter by type with GeocodeQuery::data (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
AntoineLemaire authored Feb 9, 2020
1 parent 69de6ef commit f4434f2
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 2 deletions.
14 changes: 12 additions & 2 deletions Addok.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@
*/
final class Addok extends AbstractHttpProvider implements Provider
{
const TYPE_HOUSENUMBER = 'housenumber';
const TYPE_STREET = 'street';
const TYPE_LOCALITY = 'locality';
const TYPE_MUNICIPALITY = 'municipality';

/**
* @var string
*/
Expand Down Expand Up @@ -83,6 +88,11 @@ public function geocodeQuery(GeocodeQuery $query): Collection
}

$url = sprintf($this->getGeocodeEndpointUrl(), urlencode($address), $query->getLimit());

if ($type = $query->getData('type', null)) {
$url .= sprintf('&type=%s', $type);
}

$json = $this->executeQuery($url);

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

switch ($feature->properties->type) {
case 'housenumber':
case self::TYPE_HOUSENUMBER:
$streetName = !empty($feature->properties->street) ? $feature->properties->street : null;
$number = !empty($feature->properties->housenumber) ? $feature->properties->housenumber : null;
break;
case 'street':
case self::TYPE_STREET:
$streetName = !empty($feature->properties->name) ? $feature->properties->name : null;
$number = null;
break;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +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}";
Original file line number Diff line number Diff line change
@@ -0,0 +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}";
Original file line number Diff line number Diff line change
@@ -0,0 +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}";
56 changes: 56 additions & 0 deletions Tests/AddokTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,60 @@ public function testGeocodeOnlyCityQuery()
$this->assertEquals('77100', $result->getPostalCode());
$this->assertEquals('Meaux', $result->getLocality());
}

public function testGeocodeHouseNumberTypeQuery()
{
$provider = Addok::withBANServer($this->getHttpClient(), 'Geocoder PHP/Addok Provider/Addok Test');
$results = $provider->geocodeQuery(
GeocodeQuery::create('20 avenue Kléber, Paris')->withData('type', Addok::TYPE_HOUSENUMBER)
);

$this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);

/** @var \Geocoder\Model\Address $result */
$result = $results->first();
$this->assertInstanceOf('\Geocoder\Model\Address', $result);
$this->assertEquals('20', $result->getStreetNumber());
$this->assertEquals('Avenue Kléber', $result->getStreetName());
$this->assertEquals('75016', $result->getPostalCode());
$this->assertEquals('Paris', $result->getLocality());
}

public function testGeocodeStreetTypeQuery()
{
$provider = Addok::withBANServer($this->getHttpClient(), 'Geocoder PHP/Addok Provider/Addok Test');
$results = $provider->geocodeQuery(
GeocodeQuery::create('20 avenue Kléber, Paris')->withData('type', Addok::TYPE_STREET)
);

$this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);

/** @var \Geocoder\Model\Address $result */
$result = $results->first();
$this->assertInstanceOf('\Geocoder\Model\Address', $result);
$this->assertNull($result->getStreetNumber());
$this->assertEquals('Avenue Kléber', $result->getStreetName());
$this->assertEquals('75016', $result->getPostalCode());
$this->assertEquals('Paris', $result->getLocality());
}

public function testGeocodeLocalityQuery()
{
$provider = Addok::withBANServer($this->getHttpClient(), 'Geocoder PHP/Addok Provider/Addok Test');
$results = $provider->geocodeQuery(
GeocodeQuery::create('20 avenue Kléber, Paris')->withData('type', Addok::TYPE_LOCALITY)
);

$this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);

/** @var \Geocoder\Model\Address $result */
$result = $results->first();
$this->assertInstanceOf('\Geocoder\Model\Address', $result);
$this->assertNull($result->getStreetNumber());
$this->assertNull($result->getStreetName());
$this->assertEquals(48.871759, $result->getCoordinates()->getLatitude(), '', 0.00001);
$this->assertEquals(2.294253, $result->getCoordinates()->getLongitude(), '', 0.00001);
$this->assertEquals('75016', $result->getPostalCode());
$this->assertEquals('Paris', $result->getLocality());
}
}

0 comments on commit f4434f2

Please sign in to comment.