diff --git a/lib/ClassTypes.php b/lib/ClassTypes.php index 4b94d865..971f5b93 100644 --- a/lib/ClassTypes.php +++ b/lib/ClassTypes.php @@ -17,7 +17,7 @@ function getLabelTag($aPlace, $sCountry = null) if (isset($aPlace['place_type'])) { $sLabel = $aPlace['place_type']; } elseif ($aPlace['class'] == 'boundary' && $aPlace['type'] == 'administrative') { - $sLabel = getBoundaryLabel($iRank, $sCountry); + $sLabel = getBoundaryLabel($iRank/2, $sCountry); } elseif ($iRank < 26) { $sLabel = $aPlace['type']; } elseif ($iRank < 28) { @@ -32,7 +32,7 @@ function getLabelTag($aPlace, $sCountry = null) $sLabel = $aPlace['class']; } - return strtolower(str_replace('_', ' ', $sLabel)); + return strtolower(str_replace(' ', '_', $sLabel)); } /** @@ -47,11 +47,11 @@ function getLabel($aPlace, $sCountry = null) } if ($aPlace['class'] == 'boundary' && $aPlace['type'] == 'administrative') { - return getBoundaryLabel((int)($aPlace['admin_level'] ?? 15, $sCountry ?? null); + return getBoundaryLabel(($aPlace['rank_address'] ?? 30)/2, $sCountry ?? null); } // Return a label only for 'important' class/type combinations - if (isset(getImportance($aPlace)) { + if (getImportance($aPlace) !== null) { return ucwords(str_replace('_', ' ', $aPlace['type'])); } @@ -82,7 +82,7 @@ function getBoundaryLabel($iAdminLevel, $sCountry, $sFallback = 'Administrative' 6 => 'County', 7 => 'Municipality', 8 => 'City', - 9 => 'City District' + 9 => 'City District', 10 => 'Suburb', 11 => 'Neighbourhood' ) @@ -108,7 +108,7 @@ function getBoundaryLabel($iAdminLevel, $sCountry, $sFallback = 'Administrative' function getDefRadius($aPlace) { $aSpecialRadius = array( - 'place:continent' => 25 + 'place:continent' => 25, 'place:country' => 7, 'place:state' => 2.6, 'place:province' => 2.6, @@ -246,7 +246,10 @@ function getIcon($aPlace) */ function getImportance($aPlace) { - static $aWithImportance = array_flip(array( + static $aWithImportance = null; + + if ($aWithImportance === null) { + $aWithImportance = array_flip(array( 'place:country', 'place:state', 'place:province', @@ -526,7 +529,8 @@ function getImportance($aPlace) 'railway:disused_station', 'railway:abandoned', 'railway:disused' - ); + )); + } $sClassPlace = $aPlace['class'].':'.$aPlace['type']; diff --git a/test/php/Nominatim/AddressDetailsTest.php b/test/php/Nominatim/AddressDetailsTest.php index e7b3a3f8..4678911c 100644 --- a/test/php/Nominatim/AddressDetailsTest.php +++ b/test/php/Nominatim/AddressDetailsTest.php @@ -70,7 +70,7 @@ class AddressDetailsTest extends \PHPUnit\Framework\TestCase { $oAD = new AddressDetails($this->oDbStub, 194663412, 10, 'en'); $expected = array( - 'attraction' => '10 Downing Street', + 'tourism' => '10 Downing Street', 'house_number' => '10', 'road' => 'Downing Street', 'neighbourhood' => 'St. James\'s', diff --git a/test/php/Nominatim/ClassTypesTest.php b/test/php/Nominatim/ClassTypesTest.php index cec3b82a..814e7cff 100644 --- a/test/php/Nominatim/ClassTypesTest.php +++ b/test/php/Nominatim/ClassTypesTest.php @@ -6,89 +6,88 @@ require_once(CONST_BasePath.'/lib/ClassTypes.php'); class ClassTypesTest extends \PHPUnit\Framework\TestCase { - public function testGetInfo() + public function testGetLabelTag() { - // 1) Admin level set - // city Dublin - // https://nominatim.openstreetmap.org/details.php?osmtype=R&osmid=1109531 - $aPlace = array( - 'admin_level' => 7, - 'class' => 'boundary', - 'type' => 'administrative', - 'rank_address' => 14 - ); + $aPlace = array('class' => 'boundary', 'type' => 'administrative', + 'rank_address' => '4', 'place_type' => 'city'); + $this->assertEquals('city', ClassTypes\getLabelTag($aPlace)); - $this->assertEquals('Municipality', ClassTypes\getInfo($aPlace)['label']); - $this->assertEquals('Municipality', ClassTypes\getFallbackInfo($aPlace)['label']); - $this->assertEquals('Municipality', ClassTypes\getProperty($aPlace, 'label')); + $aPlace = array('class' => 'boundary', 'type' => 'administrative', + 'rank_address' => '10'); + $this->assertEquals('state_district', ClassTypes\getLabelTag($aPlace)); - // 2) No admin level - // Eiffel Tower - // https://nominatim.openstreetmap.org/details.php?osmtype=W&osmid=5013364 - $aPlace = array( - 'class' => 'tourism', - 'type' => 'attraction', - 'rank_address' => 29 - ); - $this->assertEquals('Attraction', ClassTypes\getInfo($aPlace)['label']); - $this->assertEquals(array('simplelabel' => 'address29'), ClassTypes\getFallbackInfo($aPlace)); - $this->assertEquals('Attraction', ClassTypes\getProperty($aPlace, 'label')); + $aPlace = array('class' => 'boundary', 'type' => 'administrative'); + $this->assertEquals('administrative', ClassTypes\getLabelTag($aPlace)); - // 3) Unknown type - // La Maison du Toutou, Paris - // https://nominatim.openstreetmap.org/details.php?osmtype=W&osmid=164011651 - $aPlace = array( - 'class' => 'shop', - 'type' => 'pet_grooming', - 'rank_address' => 29 - ); - $this->assertEquals(false, ClassTypes\getInfo($aPlace)); - $this->assertEquals(array('simplelabel' => 'address29'), ClassTypes\getFallbackInfo($aPlace)); - $this->assertEquals(false, ClassTypes\getProperty($aPlace, 'label')); - $this->assertEquals('mydefault', ClassTypes\getProperty($aPlace, 'label', 'mydefault')); + $aPlace = array('class' => 'place', 'type' => 'hamlet', + 'rank_address' => '20'); + $this->assertEquals('hamlet', ClassTypes\getLabelTag($aPlace)); + + $aPlace = array('class' => 'highway', 'type' => 'residential', + 'rank_address' => '26'); + $this->assertEquals('road', ClassTypes\getLabelTag($aPlace)); + + $aPlace = array('class' => 'place', 'type' => 'house_number', + 'rank_address' => '30'); + $this->assertEquals('house_number', ClassTypes\getLabelTag($aPlace)); + + $aPlace = array('class' => 'amenity', 'type' => 'prison', + 'rank_address' => '30'); + $this->assertEquals('amenity', ClassTypes\getLabelTag($aPlace)); } - public function testGetClassTypesWithImportance() + public function testGetLabel() { - $aClasses = ClassTypes\getListWithImportance(); + $aPlace = array('class' => 'boundary', 'type' => 'administrative', + 'rank_address' => '4', 'place_type' => 'city'); + $this->assertEquals('City', ClassTypes\getLabel($aPlace)); - $this->assertGreaterThan( - 200, - count($aClasses) - ); + $aPlace = array('class' => 'boundary', 'type' => 'administrative', + 'rank_address' => '10'); + $this->assertEquals('State District', ClassTypes\getLabel($aPlace)); - $this->assertEquals( - array( - 'label' => 'Country', - 'frequency' => 0, - 'icon' => 'poi_boundary_administrative', - 'defzoom' => 6, - 'defdiameter' => 15, - 'importance' => 3 - ), - $aClasses['place:country'] - ); + $aPlace = array('class' => 'boundary', 'type' => 'administrative'); + $this->assertEquals('Administrative', ClassTypes\getLabel($aPlace)); + + $aPlace = array('class' => 'amenity', 'type' => 'prison'); + $this->assertEquals('Prison', ClassTypes\getLabel($aPlace)); + + $aPlace = array('class' => 'amenity', 'type' => 'foobar'); + $this->assertNull(ClassTypes\getLabel($aPlace)); } + public function testGetBoundaryLabel() + { + $this->assertEquals('City', ClassTypes\getBoundaryLabel(8, null)); + $this->assertEquals('Administrative', ClassTypes\getBoundaryLabel(18, null)); + $this->assertEquals('None', ClassTypes\getBoundaryLabel(18, null, 'None')); + $this->assertEquals('State', ClassTypes\getBoundaryLabel(4, 'de', 'None')); + } - public function testGetResultDiameter() + public function testGetDefRadius() { $aResult = array('class' => '', 'type' => ''); - $this->assertEquals( - 0.0001, - ClassTypes\getProperty($aResult, 'defdiameter', 0.0001) - ); + $this->assertEquals(0.00005, ClassTypes\getDefRadius($aResult)); $aResult = array('class' => 'place', 'type' => 'country'); - $this->assertEquals( - 15, - ClassTypes\getProperty($aResult, 'defdiameter', 0.0001) - ); + $this->assertEquals(7, ClassTypes\getDefRadius($aResult)); + } - $aResult = array('class' => 'boundary', 'type' => 'administrative', 'admin_level' => 6); - $this->assertEquals( - 0.32, - ClassTypes\getProperty($aResult, 'defdiameter', 0.0001) - ); + public function testGetIcon() + { + $aResult = array('class' => '', 'type' => ''); + $this->assertNull(ClassTypes\getIcon($aResult)); + + $aResult = array('class' => 'place', 'type' => 'airport'); + $this->assertEquals('transport_airport2', ClassTypes\getIcon($aResult)); + } + + public function testGetImportance() + { + $aResult = array('class' => '', 'type' => ''); + $this->assertNull(ClassTypes\getImportance($aResult)); + + $aResult = array('class' => 'place', 'type' => 'airport'); + $this->assertGreaterThan(0, ClassTypes\getImportance($aResult)); } }