From 694dfb64f091154db8f65087a4d4bce713e9d828 Mon Sep 17 00:00:00 2001 From: Wikub Date: Sun, 15 Mar 2026 18:50:42 +0100 Subject: [PATCH 1/2] add admin levels to geocoding results --- Addok.php | 34 ++++++++++++++++++++++++++++++++++ Tests/AddokTest.php | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/Addok.php b/Addok.php index 8e56db6..92f2a07 100644 --- a/Addok.php +++ b/Addok.php @@ -128,6 +128,7 @@ public function geocodeQuery(GeocodeQuery $query): Collection 'streetName' => $streetName, 'locality' => $locality, 'postalCode' => $postalCode, + 'adminLevels' => $this->getAdminLevels($feature->properties), ]); } @@ -165,6 +166,7 @@ public function reverseQuery(ReverseQuery $query): Collection 'streetName' => $streetName, 'locality' => $municipality, 'postalCode' => $postalCode, + 'adminLevels' => $this->getAdminLevels($feature->properties), ]); } @@ -195,4 +197,36 @@ private function executeQuery(string $url): \stdClass return $json; } + + /** + * @param \stdClass $properties + * + * @return array> + */ + private function getAdminLevels(\stdClass $properties): array + { + $adminLevels = []; + + $context = !empty($properties->context) ? $properties->context : null; + if ($context) { + $contextParts = explode(',', $context); + $departmentCode = trim($contextParts[0] ?? ''); + $departementLabel = trim($contextParts[1] ?? ''); + $regionLabel = trim($contextParts[2] ?? ''); + + $adminLevels[] = ['level' => 2, 'name' => $regionLabel]; + $adminLevels[] = ['level' => 3, 'name' => $departementLabel, 'code' => $departmentCode]; + } + + $cityCode = !empty($properties->citycode) ? $properties->citycode : null; + $municipality = !empty($properties->city) ? $properties->city : null; + if ($cityCode && $municipality) { + $adminLevels[] = ['level' => 4, 'name' => $municipality, 'code' => $cityCode]; + } + + $district = !empty($properties->district) ? $properties->district : null; + $adminLevels[] = ['level' => 5, 'name' => $district]; + + return $adminLevels; + } } diff --git a/Tests/AddokTest.php b/Tests/AddokTest.php index 7fdd008..832985d 100644 --- a/Tests/AddokTest.php +++ b/Tests/AddokTest.php @@ -65,6 +65,12 @@ public function testReverseQuery() $this->assertEquals('Quai de la Tourelle', $result->getStreetName()); $this->assertEquals('95000', $result->getPostalCode()); $this->assertEquals('Cergy', $result->getLocality()); + $this->assertCount(3, $result->getAdminLevels()); + $this->assertEquals('Île-de-France', $result->getAdminLevels()->get(2)->getName()); + $this->assertEquals('Val-d\'Oise', $result->getAdminLevels()->get(3)->getName()); + $this->assertEquals('95', $result->getAdminLevels()->get(3)->getCode()); + $this->assertEquals('Cergy', $result->getAdminLevels()->get(4)->getName()); + $this->assertEquals('95127', $result->getAdminLevels()->get(4)->getCode()); } public function testGeocodeQuery() @@ -84,6 +90,12 @@ public function testGeocodeQuery() $this->assertEquals('Quai de la Tourelle', $result->getStreetName()); $this->assertEquals('95000', $result->getPostalCode()); $this->assertEquals('Cergy', $result->getLocality()); + $this->assertCount(3, $result->getAdminLevels()); + $this->assertEquals('Île-de-France', $result->getAdminLevels()->get(2)->getName()); + $this->assertEquals('Val-d\'Oise', $result->getAdminLevels()->get(3)->getName()); + $this->assertEquals('95', $result->getAdminLevels()->get(3)->getCode()); + $this->assertEquals('Cergy', $result->getAdminLevels()->get(4)->getName()); + $this->assertEquals('95127', $result->getAdminLevels()->get(4)->getCode()); } public function testGeocodeOnlyCityQuery() @@ -102,6 +114,12 @@ public function testGeocodeOnlyCityQuery() $this->assertNull($result->getStreetName()); $this->assertEquals('38000', $result->getPostalCode()); $this->assertEquals('Grenoble', $result->getLocality()); + $this->assertCount(3, $result->getAdminLevels()); + $this->assertEquals('Auvergne-Rhône-Alpes', $result->getAdminLevels()->get(2)->getName()); + $this->assertEquals('Isère', $result->getAdminLevels()->get(3)->getName()); + $this->assertEquals('38', $result->getAdminLevels()->get(3)->getCode()); + $this->assertEquals('Grenoble', $result->getAdminLevels()->get(4)->getName()); + $this->assertEquals('38185', $result->getAdminLevels()->get(4)->getCode()); } public function testGeocodeHouseNumberTypeQuery() @@ -120,6 +138,13 @@ public function testGeocodeHouseNumberTypeQuery() $this->assertEquals('Avenue Kléber', $result->getStreetName()); $this->assertEquals('75016', $result->getPostalCode()); $this->assertEquals('Paris', $result->getLocality()); + $this->assertCount(4, $result->getAdminLevels()); + $this->assertEquals('Île-de-France', $result->getAdminLevels()->get(2)->getName()); + $this->assertEquals('Paris', $result->getAdminLevels()->get(3)->getName()); + $this->assertEquals('75', $result->getAdminLevels()->get(3)->getCode()); + $this->assertEquals('Paris', $result->getAdminLevels()->get(4)->getName()); + $this->assertEquals('75116', $result->getAdminLevels()->get(4)->getCode()); + $this->assertEquals('Paris 16e Arrondissement', $result->getAdminLevels()->get(5)->getName()); } public function testGeocodeStreetTypeQuery() @@ -138,6 +163,13 @@ public function testGeocodeStreetTypeQuery() $this->assertEquals('Avenue Kléber', $result->getStreetName()); $this->assertEquals('75016', $result->getPostalCode()); $this->assertEquals('Paris', $result->getLocality()); + $this->assertCount(4, $result->getAdminLevels()); + $this->assertEquals('Île-de-France', $result->getAdminLevels()->get(2)->getName()); + $this->assertEquals('Paris', $result->getAdminLevels()->get(3)->getName()); + $this->assertEquals('75', $result->getAdminLevels()->get(3)->getCode()); + $this->assertEquals('Paris', $result->getAdminLevels()->get(4)->getName()); + $this->assertEquals('75116', $result->getAdminLevels()->get(4)->getCode()); + $this->assertEquals('Paris 16e Arrondissement', $result->getAdminLevels()->get(5)->getName()); } public function testGeocodeLocalityQuery() From 8bb9b6181b6da9d95cc86e2d5850659f13d2cc57 Mon Sep 17 00:00:00 2001 From: Wikub Date: Mon, 16 Mar 2026 18:54:13 +0100 Subject: [PATCH 2/2] clean up whitespace in Addok.php --- Addok.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Addok.php b/Addok.php index 92f2a07..7363592 100644 --- a/Addok.php +++ b/Addok.php @@ -210,9 +210,9 @@ private function getAdminLevels(\stdClass $properties): array $context = !empty($properties->context) ? $properties->context : null; if ($context) { $contextParts = explode(',', $context); - $departmentCode = trim($contextParts[0] ?? ''); + $departmentCode = trim($contextParts[0] ?? ''); $departementLabel = trim($contextParts[1] ?? ''); - $regionLabel = trim($contextParts[2] ?? ''); + $regionLabel = trim($contextParts[2] ?? ''); $adminLevels[] = ['level' => 2, 'name' => $regionLabel]; $adminLevels[] = ['level' => 3, 'name' => $departementLabel, 'code' => $departmentCode];