Merge pull request #2685 from lonvia/show-inherited-housenumber

Keep address parts inherited from surrounding buildings after indexing
This commit is contained in:
Sarah Hoffmann
2022-04-29 12:15:33 +02:00
committed by GitHub
2 changed files with 34 additions and 36 deletions

View File

@@ -28,35 +28,38 @@ DECLARE
result prepare_update_info; result prepare_update_info;
extra_names HSTORE; extra_names HSTORE;
BEGIN BEGIN
IF not p.address ? '_inherited' THEN
result.address := p.address;
END IF;
-- For POI nodes, check if the address should be derived from a surrounding -- For POI nodes, check if the address should be derived from a surrounding
-- building. -- building.
IF p.rank_search < 30 OR p.osm_type != 'N' THEN IF p.rank_search = 30 AND p.osm_type = 'N' THEN
result.address := p.address; IF p.address is null THEN
ELSEIF p.address is null THEN -- The additional && condition works around the misguided query
-- The additional && condition works around the misguided query -- planner of postgis 3.0.
-- planner of postgis 3.0. SELECT placex.address || hstore('_inherited', '') INTO result.address
SELECT placex.address || hstore('_inherited', '') INTO result.address FROM placex
FROM placex WHERE ST_Covers(geometry, p.centroid)
WHERE ST_Covers(geometry, p.centroid) and geometry && p.centroid
and geometry && p.centroid and placex.address is not null
and placex.address is not null and (placex.address ? 'housenumber' or placex.address ? 'street' or placex.address ? 'place')
and (placex.address ? 'housenumber' or placex.address ? 'street' or placex.address ? 'place') and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')
and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') LIMIT 1;
LIMIT 1; ELSE
ELSE -- See if we can inherit addtional address tags from an interpolation.
result.address := p.address; -- These will become permanent.
-- See if we can inherit addtional address tags from an interpolation. FOR location IN
-- These will become permanent. SELECT (address - 'interpolation'::text - 'housenumber'::text) as address
FOR location IN FROM place, planet_osm_ways w
SELECT (address - 'interpolation'::text - 'housenumber'::text) as address WHERE place.osm_type = 'W' and place.address ? 'interpolation'
FROM place, planet_osm_ways w and place.geometry && p.geometry
WHERE place.osm_type = 'W' and place.address ? 'interpolation' and place.osm_id = w.id
and place.geometry && p.geometry and p.osm_id = any(w.nodes)
and place.osm_id = w.id LOOP
and p.osm_id = any(w.nodes) result.address := location.address || result.address;
LOOP END LOOP;
result.address := location.address || result.address; END IF;
END LOOP;
END IF; END IF;
-- remove internal and derived names -- remove internal and derived names
@@ -984,15 +987,6 @@ BEGIN
{% endif %} {% endif %}
NEW.token_info := token_strip_info(NEW.token_info); NEW.token_info := token_strip_info(NEW.token_info);
-- If the address was inherited from a surrounding building,
-- do not add it permanently to the table.
IF NEW.address ? '_inherited' THEN
IF NEW.address ? '_unlisted_place' THEN
NEW.address := hstore('_unlisted_place', NEW.address->'_unlisted_place');
ELSE
NEW.address := null;
END IF;
END IF;
RETURN NEW; RETURN NEW;
END IF; END IF;

View File

@@ -376,6 +376,10 @@ Feature: Parenting of objects
| N1 | W3 | 3 | | N1 | W3 | 3 |
| N2 | W3 | 3 | | N2 | W3 | 3 |
| N3 | W3 | 3 | | N3 | W3 | 3 |
When sending geocodejson search query "3, foo" with address
Then results contain
| housenumber |
| 3 |
Scenario: POIs don't inherit from streets Scenario: POIs don't inherit from streets
Given the scene building-on-street-corner Given the scene building-on-street-corner