mirror of
https://github.com/osm-search/Nominatim.git
synced 2024-12-25 05:52:32 +03:00
simplify very large polygons non used in addresses
Polygons with rank_address = 0 are only used in search and (rarely) for reverse lookup. Geometries do not need to be precise for that because topology does not matter. OSM has some very large polygons of natural features with sizes of more than 10MB. Simplify these polygons to keep the database and indexes smaller.
This commit is contained in:
parent
dc1baaa0af
commit
56201feb28
@ -296,7 +296,9 @@ BEGIN
|
|||||||
extratags = NEW.extratags,
|
extratags = NEW.extratags,
|
||||||
admin_level = NEW.admin_level,
|
admin_level = NEW.admin_level,
|
||||||
indexed_status = 2,
|
indexed_status = 2,
|
||||||
geometry = NEW.geometry
|
geometry = CASE WHEN existingplacex.rank_address = 0
|
||||||
|
THEN simplify_large_polygons(NEW.geometry)
|
||||||
|
ELSE NEW.geometry END
|
||||||
WHERE place_id = existingplacex.place_id;
|
WHERE place_id = existingplacex.place_id;
|
||||||
|
|
||||||
-- Invalidate linked places: they potentially get a new name and addresses.
|
-- Invalidate linked places: they potentially get a new name and addresses.
|
||||||
|
@ -678,6 +678,12 @@ BEGIN
|
|||||||
NEW.country_code := NULL;
|
NEW.country_code := NULL;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
|
-- Simplify polygons with a very large memory footprint when they
|
||||||
|
-- do not take part in address computation.
|
||||||
|
IF NEW.rank_address = 0 THEN
|
||||||
|
NEW.geometry := simplify_large_polygons(NEW.geometry);
|
||||||
|
END IF;
|
||||||
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
{% if debug %}RAISE WARNING 'placex_insert:END: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;{% endif %}
|
{% if debug %}RAISE WARNING 'placex_insert:END: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;{% endif %}
|
||||||
|
@ -416,6 +416,20 @@ END;
|
|||||||
$$
|
$$
|
||||||
LANGUAGE plpgsql IMMUTABLE;
|
LANGUAGE plpgsql IMMUTABLE;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION simplify_large_polygons(geometry GEOMETRY)
|
||||||
|
RETURNS GEOMETRY
|
||||||
|
AS $$
|
||||||
|
BEGIN
|
||||||
|
IF ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')
|
||||||
|
and ST_MemSize(geometry) > 3000000
|
||||||
|
THEN
|
||||||
|
geometry := ST_SimplifyPreserveTopology(geometry, 0.0001);
|
||||||
|
END IF;
|
||||||
|
RETURN geometry;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE plpgsql IMMUTABLE;
|
||||||
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION place_force_delete(placeid BIGINT)
|
CREATE OR REPLACE FUNCTION place_force_delete(placeid BIGINT)
|
||||||
RETURNS BOOLEAN
|
RETURNS BOOLEAN
|
||||||
|
Loading…
Reference in New Issue
Block a user