]> git.openstreetmap.org Git - nominatim.git/commitdiff
first draft
authorSarah Hoffmann <lonvia@denofr.de>
Fri, 15 May 2020 15:36:37 +0000 (17:36 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Sun, 17 May 2020 14:46:45 +0000 (16:46 +0200)
lib/AddressDetails.php
lib/ClassTypes.php

index 3322c6b2da8d985f6473a2cecba540cd53d5dd14..a721f4c5ea689b66c6aa208c99c0458c00911653 100644 (file)
@@ -61,7 +61,7 @@ class AddressDetails
         return join(', ', $aParts);
     }
 
-    public function getAddressNames()
+    public function getAddressNames($sCountry = null)
     {
         $aAddress = array();
         $aFallback = array();
@@ -72,10 +72,11 @@ class AddressDetails
             }
 
             $bFallback = false;
-            $aTypeLabel = ClassTypes\getInfo($aLine);
+            $sTypeLabel = ClassTypes\getSimpleLabel($aLine);
 
-            if ($aTypeLabel === false) {
-                $aTypeLabel = ClassTypes\getFallbackInfo($aLine);
+            if ($sTypeLabel === false) {
+                $aTypeLabel = ClassTypes\getFallbackLabel($aLine['rank_address'],
+                                                          $sCountry);
                 $bFallback = true;
             }
 
@@ -87,16 +88,13 @@ class AddressDetails
             }
 
             if (isset($sName)) {
-                $sTypeLabel = strtolower(isset($aTypeLabel['simplelabel']) ? $aTypeLabel['simplelabel'] : $aTypeLabel['label']);
-                $sTypeLabel = str_replace(' ', '_', $sTypeLabel);
+                $sTypeLabel = strtolower(str_replace(' ', '_', $sTypeLabel));
                 if (!isset($aAddress[$sTypeLabel])
-                    || isset($aFallback[$sTypeLabel])
+                    || (isset($aFallback[$sTypeLabel]) && $aFallback[$sTypeLabel])
                     || $aLine['class'] == 'place'
                 ) {
                     $aAddress[$sTypeLabel] = $sName;
-                    if ($bFallback) {
-                        $aFallback[$sTypeLabel] = $bFallback;
-                    }
+                    $aFallback[$sTypeLabel] = $bFallback;
                 }
             }
         }
index a7c2cd4f8e25159d1d9a15a31d76511ef55202ab..5afbf258b42f788749c58272ee0128edec537437 100644 (file)
@@ -2,6 +2,119 @@
 
 namespace Nominatim\ClassTypes;
 
+/**
+ * Create a simplfied label for the given place.
+ *
+ * @param array[] $aPlace  Information about the place to label.
+ *
+ * A simplified label groups various object types together under a common
+ * label.
+ */
+function getSimpleLabel($aPlace)
+{
+    static $aRoadLabels = array (
+                              'motorway_junction' => 'Junction',
+                              'motorway' => 'Road',
+                              'trunk' => 'Road',
+                              'primary' => 'Road',
+                              'secondary' => 'Road',
+                              'tertiary' => 'Road',
+                              'residential' => 'Road',
+                              'unclassified' => 'Road',
+                              'living_street' => 'Road',
+                              'service' => 'Road',
+                              'track' => 'Road',
+                              'byway' => 'Road',
+                              'steps' => 'Footway',
+                              'motorway_link' => 'Road',
+                              'trunk_link' => 'Road',
+                              'primary_link' => 'Road',
+                              'secondary_link' => 'Road',
+                              'tertiary_link' => 'Road',
+                              'construction' => 'Road'
+            );
+
+    if ($aPlace['class'] == 'highway' and isset($aRoadLabels[$aPlace['type']])) {
+        return $aRoadLabels[$aPlace['type']];
+    }
+
+    return getLabel($aPlace);
+}
+
+/**
+ * Create a label for the given place.
+ *
+ * @param array[] $aPlace  Information about the place to label.
+ */
+function getLabel($aPlace, $sCountry = null)
+{
+    if ($aPlace['class'] == 'boundary'
+        && $aPlace['type'] == 'administrative')
+        && !isset($aPlace['place_type'])
+    ) {
+        return getBoundaryLabel((int)($aPlace['admin_level'] ?? 15,
+                                $aPlace['country_code'] ?? null)
+    }
+
+    return ucwords(str_replace('_', ' ', $aPlace['place_type'] ?? $aPlace['type']));
+}
+
+/**
+ * Return a generic simple label to be used for the given address rank
+ * in the given country.
+ *
+ * @param int    $iRankAddress  Address rank of the object to be labeled.
+ * @param string $sCountry      Country code of the country where the object is
+ *                              in. May be null, in which case a world-wide
+ *                              fallback is used.
+ *
+ * @return string
+ */
+function getFallbackLabel($iRankAddress, $sCountry = null)
+{
+    return getBoundaryLabel((int)($iRankAddress / 2), $sCountry,
+                           'address'.$iRankAddress);
+}
+
+/**
+ * Return a simple label for an administrative boundary for the given country.
+ *
+ * @param int $iAdminLevel   Content of admin_level tag.
+ * @param string $sCountry   Country code of the country where the object is
+ *                           in. May be null, in which case a world-wide
+ *                           fallback is used.
+ * @param string $sFallback  String to return if no explicit string is listed.
+ *
+ * @return string
+ */
+function getBoundaryLabel($iAdminLevel, $sCountry, $sFallback = 'Administrative')
+{
+    static $aBoundaryList = array (
+                             'default' => array (
+                                           1 => 'Continent',
+                                           2 => 'Country',
+                                           3 => 'Region',
+                                           4 => 'State',
+                                           5 => 'State District',
+                                           6 => 'County',
+                                           7 => 'Municipality',
+                                           8 => 'City',
+                                           9 => 'City District'
+                                           10 => 'Suburb',
+                                           11 => 'Neighbourhood'
+                                           )
+            );
+
+    if (isset($aBoundaryList[$sCountry])
+        && isset($aBoundaryList[$sCountry][$iAdminLevel])
+    ) {
+        return $aBoundaryList[$sCountry][$iAdminLevel];
+    }
+
+    return $aBoundaryList['default'][$iAdminLevel] ?? $sFallback;
+}
+
+
 function getInfo($aPlace)
 {
     $aClassType = getList();
@@ -73,9 +186,11 @@ function getListWithImportance()
     return $aOrders;
 }
 
+
+
 function getList()
 {
-    return array(
+    static $aPropertyCache = array(
             'boundary:administrative:1' => array('label' => 'Continent', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
             'boundary:administrative:2' => array('label' => 'Country', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
             'place:country' => array('label' => 'Country', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defzoom' => 6, 'defdiameter' => 15),
@@ -379,4 +494,6 @@ function getList()
             'railway:abandoned' => array('label' => 'Abandoned', 'frequency' => 641),
             'railway:disused' => array('label' => 'Disused', 'frequency' => 72),
            );
+
+    return $aPropertyCache;
 }