]> git.openstreetmap.org Git - nominatim.git/commitdiff
Fix address link for boundaries in details
authorSarah Hoffmann <lonvia@denofr.de>
Sun, 29 Mar 2020 15:40:56 +0000 (17:40 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Sun, 29 Mar 2020 15:40:56 +0000 (17:40 +0200)
Removes the special casing for boundaries with a place
type in get_addressdata(). Instead the place type is now
returned as an extra field, so that the caller has to
handle the situation.

This fixes the details link next to the address in the details
view, which previously would go to a place class instead of the
original boundary class.

lib/template/details-html.php
sql/functions/address_lookup.sql

index c043e9b706f7a595c888ae4729e464105783676d..43ec12668ec26a26e0748b24cdce344f1230866c 100644 (file)
 
         echo '<tr class="' . ($bNotUsed?'notused':'') . '">'."\n";
         echo '  <td class="name">'.(trim($aAddressLine['localname'])!==null?$aAddressLine['localname']:'<span class="noname">No Name</span>')."</td>\n";
 
         echo '<tr class="' . ($bNotUsed?'notused':'') . '">'."\n";
         echo '  <td class="name">'.(trim($aAddressLine['localname'])!==null?$aAddressLine['localname']:'<span class="noname">No Name</span>')."</td>\n";
-        echo '  <td>' . $aAddressLine['class'].':'.$aAddressLine['type'] . "</td>\n";
+        echo '  <td>' . $aAddressLine['class'].':'.$aAddressLine['type'];
+        if ($aAddressLine['type'] == 'administrative'
+            && isset($aAddressLine['place_type']))
+        {
+            echo '('.$aAddressLine['place_type'].')';
+        }
+        echo "</td>\n";
         echo '  <td>' . osmLink($aAddressLine) . "</td>\n";
         echo '  <td>' . (isset($aAddressLine['rank_address']) ? $aAddressLine['rank_address'] : '') . "</td>\n";
         echo '  <td>' . ($aAddressLine['admin_level'] < 15 ? $aAddressLine['admin_level'] : '') . "</td>\n";
         echo '  <td>' . osmLink($aAddressLine) . "</td>\n";
         echo '  <td>' . (isset($aAddressLine['rank_address']) ? $aAddressLine['rank_address'] : '') . "</td>\n";
         echo '  <td>' . ($aAddressLine['admin_level'] < 15 ? $aAddressLine['admin_level'] : '') . "</td>\n";
index 8436fdb190913d99d45400e1e225fd17d7db72ab..1e423cd3cbcff8f430ce62ecaa4a0dc5a4cf9a3d 100644 (file)
@@ -8,6 +8,7 @@ CREATE TYPE addressline as (
   name HSTORE,
   class TEXT,
   type TEXT,
   name HSTORE,
   class TEXT,
   type TEXT,
+  place_type TEXT,
   admin_level INTEGER,
   fromarea BOOLEAN,
   isaddress BOOLEAN,
   admin_level INTEGER,
   fromarea BOOLEAN,
   isaddress BOOLEAN,
@@ -193,7 +194,7 @@ BEGIN
       searchcountrycode := NULL;
     END IF;
     countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
       searchcountrycode := NULL;
     END IF;
     countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
-                           location.name, location.class, location.type,
+                           location.name, location.class, location.type, NULL,
                            location.admin_level, true, location.isaddress,
                            location.rank_address, location.distance)::addressline;
     RETURN NEXT countrylocation;
                            location.admin_level, true, location.isaddress,
                            location.rank_address, location.distance)::addressline;
     RETURN NEXT countrylocation;
@@ -201,10 +202,8 @@ BEGIN
   END LOOP;
 
   FOR location IN
   END LOOP;
 
   FOR location IN
-    SELECT placex.place_id, osm_type, osm_id, name,
-           CASE WHEN extratags ? 'place' or extratags ? 'linked_place'
-                THEN 'place' ELSE class END as class,
-           coalesce(extratags->'place', extratags->'linked_place', type) as type,
+    SELECT placex.place_id, osm_type, osm_id, name, class, type,
+           coalesce(extratags->'place', extratags->'linked_place') as place_type,
            admin_level, fromarea, isaddress,
            CASE WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
            distance, country_code, postcode
            admin_level, fromarea, isaddress,
            CASE WHEN rank_address = 11 THEN 5 ELSE rank_address END as rank_address,
            distance, country_code, postcode
@@ -229,6 +228,7 @@ BEGIN
     END IF;
     countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
                            location.name, location.class, location.type,
     END IF;
     countrylocation := ROW(location.place_id, location.osm_type, location.osm_id,
                            location.name, location.class, location.type,
+                           location.place_type,
                            location.admin_level, location.fromarea,
                            location.isaddress, location.rank_address,
                            location.distance)::addressline;
                            location.admin_level, location.fromarea,
                            location.isaddress, location.rank_address,
                            location.distance)::addressline;
@@ -242,7 +242,7 @@ BEGIN
       WHERE country_code = searchcountrycode LIMIT 1 INTO countryname;
 --RAISE WARNING '% % %',found,searchcountrycode,countryname;
     IF countryname IS NOT NULL THEN
       WHERE country_code = searchcountrycode LIMIT 1 INTO countryname;
 --RAISE WARNING '% % %',found,searchcountrycode,countryname;
     IF countryname IS NOT NULL THEN
-      location := ROW(null, null, null, countryname, 'place', 'country',
+      location := ROW(null, null, null, countryname, 'place', 'country', NULL,
                       null, true, true, 4, 0)::addressline;
       RETURN NEXT location;
     END IF;
                       null, true, true, 4, 0)::addressline;
       RETURN NEXT location;
     END IF;
@@ -251,25 +251,25 @@ BEGIN
   -- Finally add some artificial rows.
   IF searchcountrycode IS NOT NULL THEN
     location := ROW(null, null, null, hstore('ref', searchcountrycode),
   -- Finally add some artificial rows.
   IF searchcountrycode IS NOT NULL THEN
     location := ROW(null, null, null, hstore('ref', searchcountrycode),
-                    'place', 'country_code', null, true, false, 4, 0)::addressline;
+                    'place', 'country_code', null, null, true, false, 4, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
   IF searchhousename IS NOT NULL THEN
     location := ROW(in_place_id, null, null, searchhousename, searchclass,
     RETURN NEXT location;
   END IF;
 
   IF searchhousename IS NOT NULL THEN
     location := ROW(in_place_id, null, null, searchhousename, searchclass,
-                    searchtype, null, true, true, 29, 0)::addressline;
+                    searchtype, null, null, true, true, 29, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
   IF searchhousenumber IS NOT NULL THEN
     location := ROW(in_place_id, null, null, hstore('ref', searchhousenumber),
     RETURN NEXT location;
   END IF;
 
   IF searchhousenumber IS NOT NULL THEN
     location := ROW(in_place_id, null, null, hstore('ref', searchhousenumber),
-                    'place', 'house_number', null, true, true, 28, 0)::addressline;
+                    'place', 'house_number', null, null, true, true, 28, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
   IF searchpostcode IS NOT NULL THEN
     location := ROW(null, null, null, hstore('ref', searchpostcode), 'place',
     RETURN NEXT location;
   END IF;
 
   IF searchpostcode IS NOT NULL THEN
     location := ROW(null, null, null, hstore('ref', searchpostcode), 'place',
-                    'postcode', null, false, postcode_isaddress, 5, 0)::addressline;
+                    'postcode', null, null, false, postcode_isaddress, 5, 0)::addressline;
     RETURN NEXT location;
   END IF;
 
     RETURN NEXT location;
   END IF;