From 101f04bbf2ca012a174beec21f1cfeb45b0272c0 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Sun, 29 Mar 2020 17:40:56 +0200 Subject: [PATCH 1/3] Fix address link for boundaries in details 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 | 8 +++++++- sql/functions/address_lookup.sql | 20 ++++++++++---------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/template/details-html.php b/lib/template/details-html.php index c043e9b7..43ec1266 100644 --- a/lib/template/details-html.php +++ b/lib/template/details-html.php @@ -70,7 +70,13 @@ echo ''."\n"; echo ' '.(trim($aAddressLine['localname'])!==null?$aAddressLine['localname']:'No Name')."\n"; - echo ' ' . $aAddressLine['class'].':'.$aAddressLine['type'] . "\n"; + echo ' ' . $aAddressLine['class'].':'.$aAddressLine['type']; + if ($aAddressLine['type'] == 'administrative' + && isset($aAddressLine['place_type'])) + { + echo '('.$aAddressLine['place_type'].')'; + } + echo "\n"; echo ' ' . osmLink($aAddressLine) . "\n"; echo ' ' . (isset($aAddressLine['rank_address']) ? $aAddressLine['rank_address'] : '') . "\n"; echo ' ' . ($aAddressLine['admin_level'] < 15 ? $aAddressLine['admin_level'] : '') . "\n"; diff --git a/sql/functions/address_lookup.sql b/sql/functions/address_lookup.sql index 8436fdb1..1e423cd3 100644 --- a/sql/functions/address_lookup.sql +++ b/sql/functions/address_lookup.sql @@ -8,6 +8,7 @@ CREATE TYPE addressline as ( name HSTORE, class TEXT, type TEXT, + place_type TEXT, 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, - 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; @@ -201,10 +202,8 @@ BEGIN 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 @@ -229,6 +228,7 @@ BEGIN 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; @@ -242,7 +242,7 @@ BEGIN 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; @@ -251,25 +251,25 @@ BEGIN -- 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, - 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), - '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', - 'postcode', null, false, postcode_isaddress, 5, 0)::addressline; + 'postcode', null, null, false, postcode_isaddress, 5, 0)::addressline; RETURN NEXT location; END IF; From 60c4c9ef2cd4e0070dbb8a7a4455f582a0502563 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Sun, 29 Mar 2020 20:49:35 +0200 Subject: [PATCH 2/3] rather use new place_type in getAddressNames() If for a boundary the place_type is defined, handle the address part like a place node. This is the same behaviour as before when class/type where patched earlier. --- lib/ClassTypes.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/ClassTypes.php b/lib/ClassTypes.php index d46847f1..91066a1f 100644 --- a/lib/ClassTypes.php +++ b/lib/ClassTypes.php @@ -6,6 +6,13 @@ function getInfo($aPlace) { $aClassType = getList(); + if ($aPlace['type'] == 'administrative' && isset($aPlace['place_type'])) { + $sName = 'place:'.$aPlace['place_type']; + if (isset($aClassType[$sName])) { + return $aClassType[$sName]; + } + } + if (isset($aPlace['admin_level'])) { $sName = $aPlace['class'].':'.$aPlace['type'].':'.$aPlace['admin_level']; if (isset($aClassType[$sName])) { From 98750922ebfca3f50ffb98ce64e33cb15ba57cf5 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Sun, 29 Mar 2020 21:06:39 +0200 Subject: [PATCH 3/3] also emit place_type in json version of details --- lib/template/details-json.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/template/details-json.php b/lib/template/details-json.php index 4afb1b0b..955441ad 100644 --- a/lib/template/details-json.php +++ b/lib/template/details-json.php @@ -47,6 +47,7 @@ $funcMapAddressLine = function ($aFull) { 'place_id' => isset($aFull['place_id']) ? (int) $aFull['place_id'] : null, 'osm_id' => isset($aFull['osm_id']) ? (int) $aFull['osm_id'] : null, 'osm_type' => isset($aFull['osm_type']) ? $aFull['osm_type'] : null, + 'place_type' => isset($aFull['place_type']) ? $aFull['place_type'] : null, 'class' => $aFull['class'], 'type' => $aFull['type'], 'admin_level' => isset($aFull['admin_level']) ? (int) $aFull['admin_level'] : null,