Merge branch 'master' into zlw-park-cleanup

pull/1491/head
Brian Sperlongano 2023-12-23 18:39:10 -05:00
commit 3128fa445c
51 zmienionych plików z 4012 dodań i 1544 usunięć

Wyświetl plik

@ -1,6 +1,6 @@
# Introduction # Introduction
Thank you for considering contributing to OpenMapTiles. It's people like you that make OpenMapTiles such a great project. Talk to us at the OSM Slack **#openmaptiles** channel ([join](https://osmus-slack.herokuapp.com/)). Thank you for considering contributing to OpenMapTiles. It's people like you that make OpenMapTiles such a great project. Talk to us at the OSM Slack **#openmaptiles** channel ([join](https://slack.openstreetmap.us/)).
Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests. Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests.

Wyświetl plik

@ -25,13 +25,23 @@ export TPORT
STYLE_FILE := build/style/style.json STYLE_FILE := build/style/style.json
STYLE_HEADER_FILE := style/style-header.json STYLE_HEADER_FILE := style/style-header.json
# Support newer `docker compose` syntax in addition to `docker-compose`
ifeq (, $(shell which docker-compose))
DOCKER_COMPOSE_COMMAND := docker compose
$(info Using docker compose V2 (docker compose))
else
DOCKER_COMPOSE_COMMAND := docker-compose
$(info Using docker compose V1 (docker-compose))
endif
# Allow a custom docker-compose project name # Allow a custom docker-compose project name
DC_PROJECT := $(or $(DC_PROJECT),$(shell (. .env; echo $${DC_PROJECT}))) DC_PROJECT := $(or $(DC_PROJECT),$(shell (. .env; echo $${DC_PROJECT})))
ifeq ($(DC_PROJECT),) ifeq ($(DC_PROJECT),)
DC_PROJECT := $(notdir $(shell pwd)) DC_PROJECT := $(notdir $(shell pwd))
DOCKER_COMPOSE := docker-compose DOCKER_COMPOSE := $(DOCKER_COMPOSE_COMMAND)
else else
DOCKER_COMPOSE := docker-compose --project-name $(DC_PROJECT) DOCKER_COMPOSE := $(DOCKER_COMPOSE_COMMAND) --project-name $(DC_PROJECT)
endif endif
# Make some operations quieter (e.g. inside the test script) # Make some operations quieter (e.g. inside the test script)
@ -489,7 +499,7 @@ start-tileserver: init-dirs build-style download-fonts
@echo "* " @echo "* "
@echo "***********************************************************" @echo "***********************************************************"
@echo " " @echo " "
docker pull maptiler/tileserver-gl $(DOCKER_COMPOSE_COMMAND) pull tileserver-gl
@echo " " @echo " "
@echo "***********************************************************" @echo "***********************************************************"
@echo "* " @echo "* "
@ -606,9 +616,9 @@ else
@echo "Refreshing docker images... Use NO_REFRESH=1 to skip." @echo "Refreshing docker images... Use NO_REFRESH=1 to skip."
ifneq ($(USE_PRELOADED_IMAGE),) ifneq ($(USE_PRELOADED_IMAGE),)
POSTGIS_IMAGE=openmaptiles/postgis-preloaded \ POSTGIS_IMAGE=openmaptiles/postgis-preloaded \
docker-compose pull --ignore-pull-failures $(QUIET_FLAG) openmaptiles-tools generate-vectortiles postgres $(DOCKER_COMPOSE_COMMAND) pull --ignore-pull-failures $(QUIET_FLAG) openmaptiles-tools generate-vectortiles postgres
else else
docker-compose pull --ignore-pull-failures $(QUIET_FLAG) openmaptiles-tools generate-vectortiles postgres import-data $(DOCKER_COMPOSE_COMMAND) pull --ignore-pull-failures $(QUIET_FLAG) openmaptiles-tools generate-vectortiles postgres import-data
endif endif
endif endif
@ -633,7 +643,7 @@ test-perf-null: init-dirs
.PHONY: build-test-pbf .PHONY: build-test-pbf
build-test-pbf: init-dirs build-test-pbf: init-dirs
docker-compose run $(DC_OPTS) openmaptiles-tools /tileset/.github/workflows/build-test-data.sh $(DOCKER_COMPOSE_COMMAND) run $(DC_OPTS) openmaptiles-tools /tileset/.github/workflows/build-test-data.sh
.PHONY: debug .PHONY: debug
debug: ## Use this target when developing Makefile itself to verify loaded environment variables debug: ## Use this target when developing Makefile itself to verify loaded environment variables
@ -675,11 +685,13 @@ test-sql: clean refresh-docker-images destroy-db start-db-nowait build/import-te
awk '1{print; fflush()} $$0~".*ERROR" {txt=$$0} END{ if(txt){print "\n*** ERROR detected, aborting:"; print txt; exit(1)} }' awk '1{print; fflush()} $$0~".*ERROR" {txt=$$0} END{ if(txt){print "\n*** ERROR detected, aborting:"; print txt; exit(1)} }'
@echo "Test SQL output for Import Test Data" @echo "Test SQL output for Import Test Data"
$(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) openmaptiles-tools sh -c 'pgwait && psql.sh < tests/test-post-import.sql' $(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) openmaptiles-tools sh -c 'pgwait && psql.sh < tests/test-post-import.sql' 2>&1 | \
awk -v s="ERROR:" '1{print; fflush()} $$0~s{print "*** ERROR detected, aborting"; exit(1)}'
@echo "Run UPDATE process on test data..." @echo "Run UPDATE process on test data..."
sed -ir "s/^[#]*\s*DIFF_MODE=.*/DIFF_MODE=true/" .env sed -ir "s/^[#]*\s*DIFF_MODE=.*/DIFF_MODE=true/" .env
$(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) openmaptiles-tools sh -c 'pgwait && import-diff' $(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) openmaptiles-tools sh -c 'pgwait && import-diff'
@echo "Test SQL output for Update Test Data" @echo "Test SQL output for Update Test Data"
$(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) openmaptiles-tools sh -c 'pgwait && psql.sh < tests/test-post-update.sql' $(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) openmaptiles-tools sh -c 'pgwait && psql.sh < tests/test-post-update.sql' 2>&1 | \
awk -v s="ERROR:" '1{print; fflush()} $$0~s{print "*** ERROR detected, aborting"; exit(1)}'

Wyświetl plik

@ -11,7 +11,8 @@ Please keep in mind that OpenMapTiles schema should display general topographic
- :link: Data for download: https://www.maptiler.com/data/ - :link: Data for download: https://www.maptiler.com/data/
- :link: Hosting https://www.maptiler.com/cloud/ - :link: Hosting https://www.maptiler.com/cloud/
- :link: Create own layer https://github.com/openmaptiles/openmaptiles-skiing - :link: Create own layer https://github.com/openmaptiles/openmaptiles-skiing
- :link: Discuss at the #openmaptiles channel at [OSM Slack](https://osmus-slack.herokuapp.com/) - :link: Practical usage of OpenMapTiles https://github.com/maptiler/foss4g-workshop
- :link: Discuss at the #openmaptiles channel at [OSM Slack](https://slack.openstreetmap.us/)
## Styles ## Styles
@ -102,7 +103,7 @@ Now start up the database container.
make start-db make start-db
``` ```
Import external data from [OpenStreetMapData](http://osmdata.openstreetmap.de/), [Natural Earth](http://www.naturalearthdata.com/) and [OpenStreetMap Lake Labels](https://github.com/lukasmartinelli/osm-lakelines). Natural Earth country boundaries are used in the few lowest zoom levels. Import external data from [OpenStreetMapData](http://osmdata.openstreetmap.de/), [Natural Earth](http://www.naturalearthdata.com/) and [OpenStreetMap Lake Labels](https://github.com/openmaptiles/osm-lakelines). Natural Earth country boundaries are used in the few lowest zoom levels.
```bash ```bash
make import-data make import-data

37
integrity.sh 100755
Wyświetl plik

@ -0,0 +1,37 @@
#!/bin/sh
# A script to run the "integrity" continuous integration script.
area=monaco
echo MIN_ZOOM=0 >> .env
echo MAX_ZOOM=14 >> .env
./quickstart.sh $area
export TEST_MODE=yes
make generate-devdoc
area=europe/monaco
echo DIFF_MODE=true >> .env
# Cleanup
rm -fr data build cache
# Create data/$area.repl.json
make download-geofabrik area=$area
# Download 2+ month old data
export old_date=$(date --date="$(date +%Y-%m-15) -2 month" +'%y%m01')
echo Downloading $old_date extract of $area
docker-compose run --rm --user=$(id -u):$(id -g) openmaptiles-tools sh -c "wget -O data/$area.osm.pbf http://download.geofabrik.de/$area-$old_date.osm.pbf"
# Initial import and tile generation
./quickstart.sh $area
sleep 2
echo Downloading updates
# Loop to recover from potential "ERROR 429: Too Many Requests"
docker-compose run --rm --user=$(id -u):$(id -g) openmaptiles-tools sh -c "
while ! osmupdate --keep-tempfiles --base-url=$(sed -n 's/ *\"replication_url\": //p' data/$area.repl.json) data/$area.osm.pbf data/changes.osc.gz ; do
sleep 2;
echo Sleeping...;
sleep 630;
done"
echo Downloading updates completed
echo Importing updates
make import-diff
echo Generating new tiles
make generate-tiles-pg

Wyświetl plik

@ -12,7 +12,7 @@ CREATE SCHEMA IF NOT EXISTS aerodrome_label;
CREATE TABLE IF NOT EXISTS aerodrome_label.osm_ids CREATE TABLE IF NOT EXISTS aerodrome_label.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
-- etldoc: osm_aerodrome_label_point -> osm_aerodrome_label_point -- etldoc: osm_aerodrome_label_point -> osm_aerodrome_label_point
@ -48,11 +48,7 @@ SELECT update_aerodrome_label_point(true);
CREATE OR REPLACE FUNCTION aerodrome_label.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION aerodrome_label.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO aerodrome_label.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO aerodrome_label.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO aerodrome_label.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -77,6 +73,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh aerodrome_label'; RAISE LOG 'Refresh aerodrome_label';
-- Analyze tracking and source tables before performing update
ANALYZE aerodrome_label.osm_ids;
ANALYZE osm_aerodrome_label_point;
PERFORM update_aerodrome_label_point(false); PERFORM update_aerodrome_label_point(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM aerodrome_label.osm_ids; DELETE FROM aerodrome_label.osm_ids;
@ -89,13 +90,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_aerodrome_label_point ON osm_aerodrome_label_point
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE aerodrome_label.store(); EXECUTE PROCEDURE aerodrome_label.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_aerodrome_label_point ON osm_aerodrome_label_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE aerodrome_label.flag(); EXECUTE PROCEDURE aerodrome_label.flag();

Wyświetl plik

@ -180,7 +180,7 @@ CREATE MATERIALIZED VIEW osm_border_disp_linestring_gen_z1 AS
SELECT ST_Simplify(geometry, ZRes(2)) AS geometry, adm0_l, adm0_r, admin_level, TRUE AS disputed, name, claimed_by, maritime SELECT ST_Simplify(geometry, ZRes(2)) AS geometry, adm0_l, adm0_r, admin_level, TRUE AS disputed, name, claimed_by, maritime
FROM osm_border_disp_linestring_gen_z2 FROM osm_border_disp_linestring_gen_z2
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ; ) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_border_disp_linestring_gen_z2_idx ON osm_border_disp_linestring_gen_z2 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_disp_linestring_gen_z1_idx ON osm_border_disp_linestring_gen_z1 USING gist (geometry);
-- ne_10m_admin_0_boundary_lines_land -- ne_10m_admin_0_boundary_lines_land
-- etldoc: ne_10m_admin_0_boundary_lines_land -> ne_10m_admin_0_boundary_lines_land_gen_z4 -- etldoc: ne_10m_admin_0_boundary_lines_land -> ne_10m_admin_0_boundary_lines_land_gen_z4
@ -348,7 +348,8 @@ FROM ne_110m_admin_0_boundary_lines_land_gen_z0
-- etldoc: ne_50m_admin_0_boundary_lines_land_gen_z1 -> boundary_z1 -- etldoc: ne_50m_admin_0_boundary_lines_land_gen_z1 -> boundary_z1
-- etldoc: ne_10m_admin_1_states_provinces_lines_gen_z1 -> boundary_z1 -- etldoc: ne_10m_admin_1_states_provinces_lines_gen_z1 -> boundary_z1
-- etldoc: osm_border_disp_linestring_gen_z1 -> boundary_z1 -- etldoc: osm_border_disp_linestring_gen_z1 -> boundary_z1
CREATE OR REPLACE VIEW boundary_z1 AS DROP MATERIALIZED VIEW IF EXISTS boundary_z1 CASCADE;
CREATE MATERIALIZED VIEW boundary_z1 AS
( (
SELECT geometry, SELECT geometry,
admin_level, admin_level,
@ -380,12 +381,14 @@ SELECT geometry,
maritime maritime
FROM osm_border_disp_linestring_gen_z1 FROM osm_border_disp_linestring_gen_z1
); );
CREATE INDEX IF NOT EXISTS boundary_z1_idx ON boundary_z1 USING gist (geometry);
-- etldoc: ne_50m_admin_0_boundary_lines_land_gen_z2 -> boundary_z2 -- etldoc: ne_50m_admin_0_boundary_lines_land_gen_z2 -> boundary_z2
-- etldoc: ne_10m_admin_1_states_provinces_lines_gen_z2 -> boundary_z2 -- etldoc: ne_10m_admin_1_states_provinces_lines_gen_z2 -> boundary_z2
-- etldoc: osm_border_disp_linestring_gen_z2 -> boundary_z2 -- etldoc: osm_border_disp_linestring_gen_z2 -> boundary_z2
CREATE OR REPLACE VIEW boundary_z2 AS DROP MATERIALIZED VIEW IF EXISTS boundary_z2 CASCADE;
CREATE MATERIALIZED VIEW boundary_z2 AS
( (
SELECT geometry, SELECT geometry,
admin_level, admin_level,
@ -417,11 +420,13 @@ SELECT geometry,
maritime maritime
FROM osm_border_disp_linestring_gen_z2 FROM osm_border_disp_linestring_gen_z2
); );
CREATE INDEX IF NOT EXISTS boundary_z2_idx ON boundary_z2 USING gist (geometry);
-- etldoc: ne_50m_admin_0_boundary_lines_land_gen_z3 -> boundary_z3 -- etldoc: ne_50m_admin_0_boundary_lines_land_gen_z3 -> boundary_z3
-- etldoc: ne_10m_admin_1_states_provinces_lines_gen_z3 -> boundary_z3 -- etldoc: ne_10m_admin_1_states_provinces_lines_gen_z3 -> boundary_z3
-- etldoc: osm_border_disp_linestring_gen_z3 -> boundary_z3 -- etldoc: osm_border_disp_linestring_gen_z3 -> boundary_z3
CREATE OR REPLACE VIEW boundary_z3 AS DROP MATERIALIZED VIEW IF EXISTS boundary_z3 CASCADE;
CREATE MATERIALIZED VIEW boundary_z3 AS
( (
SELECT geometry, SELECT geometry,
admin_level, admin_level,
@ -453,11 +458,13 @@ SELECT geometry,
maritime maritime
FROM osm_border_disp_linestring_gen_z3 FROM osm_border_disp_linestring_gen_z3
); );
CREATE INDEX IF NOT EXISTS boundary_z3_idx ON boundary_z3 USING gist (geometry);
-- etldoc: ne_10m_admin_0_boundary_lines_land_gen_z4 -> boundary_z4 -- etldoc: ne_10m_admin_0_boundary_lines_land_gen_z4 -> boundary_z4
-- etldoc: ne_10m_admin_1_states_provinces_lines_gen_z4 -> boundary_z4 -- etldoc: ne_10m_admin_1_states_provinces_lines_gen_z4 -> boundary_z4
-- etldoc: osm_border_linestring_gen_z4 -> boundary_z4 -- etldoc: osm_border_linestring_gen_z4 -> boundary_z4
CREATE OR REPLACE VIEW boundary_z4 AS DROP MATERIALIZED VIEW IF EXISTS boundary_z4 CASCADE;
CREATE MATERIALIZED VIEW boundary_z4 AS
( (
SELECT geometry, SELECT geometry,
admin_level, admin_level,
@ -489,6 +496,7 @@ SELECT geometry,
maritime maritime
FROM osm_border_linestring_gen_z4 FROM osm_border_linestring_gen_z4
); );
CREATE INDEX IF NOT EXISTS boundary_z4_idx ON boundary_z4 USING gist (geometry);
-- etldoc: osm_border_linestring_gen_z5 -> boundary_z5 -- etldoc: osm_border_linestring_gen_z5 -> boundary_z5
CREATE OR REPLACE VIEW boundary_z5 AS CREATE OR REPLACE VIEW boundary_z5 AS

Wyświetl plik

@ -14,7 +14,7 @@ SELECT
-- etldoc: osm_housenumber_point -> layer_housenumber:z14_ -- etldoc: osm_housenumber_point -> layer_housenumber:z14_
osm_id, osm_id,
geometry, geometry,
housenumber display_housenumber(housenumber)
FROM ( FROM (
SELECT SELECT
osm_id, osm_id,

Wyświetl plik

@ -7,12 +7,14 @@ layer:
buffer_size: 8 buffer_size: 8
srs: +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over srs: +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over
fields: fields:
housenumber: Value of the [`addr:housenumber`](http://wiki.openstreetmap.org/wiki/Key:addr) tag. housenumber: Value of the [`addr:housenumber`](http://wiki.openstreetmap.org/wiki/Key:addr) tag.
If there are multiple values separated by semi-colons, the first and last value separated by a dash.
datasource: datasource:
geometry_field: geometry geometry_field: geometry
srid: 900913 srid: 900913
query: (SELECT geometry, housenumber FROM layer_housenumber(!bbox!, z(!scale_denominator!))) AS t query: (SELECT geometry, housenumber FROM layer_housenumber(!bbox!, z(!scale_denominator!))) AS t
schema: schema:
- ./housenumber_display.sql
- ./housenumber_centroid.sql - ./housenumber_centroid.sql
- ./housenumber.sql - ./housenumber.sql
datasources: datasources:

Wyświetl plik

@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS housenumber;
CREATE TABLE IF NOT EXISTS housenumber.osm_ids CREATE TABLE IF NOT EXISTS housenumber.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
-- etldoc: osm_housenumber_point -> osm_housenumber_point -- etldoc: osm_housenumber_point -> osm_housenumber_point
@ -41,11 +41,7 @@ SELECT convert_housenumber_point(true);
CREATE OR REPLACE FUNCTION housenumber.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION housenumber.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO housenumber.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO housenumber.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO housenumber.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -70,6 +66,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh housenumber'; RAISE LOG 'Refresh housenumber';
-- Analyze tracking and source tables before performing update
ANALYZE housenumber.osm_ids;
ANALYZE osm_housenumber_point;
PERFORM convert_housenumber_point(false); PERFORM convert_housenumber_point(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM housenumber.osm_ids; DELETE FROM housenumber.osm_ids;
@ -82,13 +83,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_housenumber_point ON osm_housenumber_point
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE housenumber.store(); EXECUTE PROCEDURE housenumber.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_housenumber_point ON osm_housenumber_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE housenumber.flag(); EXECUTE PROCEDURE housenumber.flag();

Wyświetl plik

@ -0,0 +1,20 @@
CREATE OR REPLACE FUNCTION display_housenumber_nonnumeric(raw_housenumber text)
RETURNS text AS $$
-- Find the position of the semicolon in the input string
-- and extract the first and last value
SELECT substring(raw_housenumber from 1 for position(';' in raw_housenumber) - 1)
|| ''
|| substring(raw_housenumber from position(';' in raw_housenumber) + 1);
$$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION display_housenumber(raw_housenumber text)
RETURNS text AS $$
SELECT CASE
WHEN raw_housenumber !~ ';' THEN raw_housenumber
WHEN raw_housenumber ~ '[^0-9;]' THEN display_housenumber_nonnumeric(raw_housenumber)
ELSE
(SELECT min(value)::text || '' || max(value)::text
FROM unnest(string_to_array(raw_housenumber, ';')::int[]) AS value)
END
$$ LANGUAGE SQL IMMUTABLE;

Wyświetl plik

@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS mountain_linestring;
CREATE TABLE IF NOT EXISTS mountain_linestring.osm_ids CREATE TABLE IF NOT EXISTS mountain_linestring.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
-- etldoc: osm_mountain_linestring -> osm_mountain_linestring -- etldoc: osm_mountain_linestring -> osm_mountain_linestring
@ -26,11 +26,7 @@ SELECT update_osm_mountain_linestring(true);
CREATE OR REPLACE FUNCTION mountain_linestring.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION mountain_linestring.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO mountain_linestring.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO mountain_linestring.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO mountain_linestring.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -55,6 +51,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh mountain_linestring'; RAISE LOG 'Refresh mountain_linestring';
-- Analyze tracking and source tables before performing update
ANALYZE mountain_linestring.osm_ids;
ANALYZE osm_mountain_linestring;
PERFORM update_osm_mountain_linestring(false); PERFORM update_osm_mountain_linestring(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM mountain_linestring.osm_ids; DELETE FROM mountain_linestring.osm_ids;
@ -67,13 +68,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_mountain_linestring ON osm_mountain_linestring
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE mountain_linestring.store(); EXECUTE PROCEDURE mountain_linestring.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_mountain_linestring ON osm_mountain_linestring
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE mountain_linestring.flag(); EXECUTE PROCEDURE mountain_linestring.flag();

Wyświetl plik

@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS mountain_peak_point;
CREATE TABLE IF NOT EXISTS mountain_peak_point.osm_ids CREATE TABLE IF NOT EXISTS mountain_peak_point.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
-- etldoc: osm_peak_point -> osm_peak_point -- etldoc: osm_peak_point -> osm_peak_point
@ -26,11 +26,7 @@ SELECT update_osm_peak_point(true);
CREATE OR REPLACE FUNCTION mountain_peak_point.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION mountain_peak_point.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO mountain_peak_point.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO mountain_peak_point.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO mountain_peak_point.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -55,6 +51,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh mountain_peak_point'; RAISE LOG 'Refresh mountain_peak_point';
-- Analyze tracking and source tables before performing update
ANALYZE mountain_peak_point.osm_ids;
ANALYZE osm_peak_point;
PERFORM update_osm_peak_point(false); PERFORM update_osm_peak_point(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM mountain_peak_point.osm_ids; DELETE FROM mountain_peak_point.osm_ids;
@ -67,13 +68,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_peak_point ON osm_peak_point
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE mountain_peak_point.store(); EXECUTE PROCEDURE mountain_peak_point.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_peak_point ON osm_peak_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE mountain_peak_point.flag(); EXECUTE PROCEDURE mountain_peak_point.flag();

Wyświetl plik

@ -93,6 +93,9 @@ tables:
- name: historic - name: historic
key: historic key: historic
type: string type: string
- name: seamark_type
key: seamark:type
type: string
- name: area - name: area
type: area type: area
mapping: mapping:
@ -101,6 +104,7 @@ tables:
boundary: boundary:
- national_park - national_park
- protected_area - protected_area
- aboriginal_lands
historic: historic:
- archaeological_site - archaeological_site
- battlefield - battlefield

Wyświetl plik

@ -26,7 +26,7 @@ SELECT osm_id,
FROM ( FROM (
SELECT osm_id, SELECT osm_id,
geometry, geometry,
park_class(boundary, leisure, landuse, historic) AS class, park_class(boundary, leisure, landuse, historic, seamark_type) AS class,
name, name,
name_en, name_en,
name_de, name_de,
@ -42,7 +42,7 @@ FROM (
NULL AS tags, NULL AS tags,
NULL AS leisure, NULL AS leisure,
NULL AS landuse, NULL AS landuse,
NULL AS boundary, CASE WHEN boundary='aboriginal_lands' THEN boundary END AS boundary,
NULL AS historic NULL AS historic
FROM osm_park_polygon_dissolve_z4 FROM osm_park_polygon_dissolve_z4
WHERE zoom_level = 4 WHERE zoom_level = 4
@ -208,7 +208,7 @@ FROM (
name_de, name_de,
tags, tags,
row_number() OVER ( row_number() OVER (
PARTITION BY LabelGrid(geometry_point, 100 * pixel_width) PARTITION BY LabelGrid(geometry_point, 100 * pixel_width), boundary
ORDER BY ORDER BY
(CASE WHEN boundary = 'national_park' THEN TRUE ELSE FALSE END) DESC, (CASE WHEN boundary = 'national_park' THEN TRUE ELSE FALSE END) DESC,
(COALESCE(NULLIF(tags->'wikipedia', ''), NULLIF(tags->'wikidata', '')) IS NOT NULL) DESC, (COALESCE(NULLIF(tags->'wikipedia', ''), NULLIF(tags->'wikidata', '')) IS NOT NULL) DESC,
@ -226,6 +226,7 @@ FROM (
landuse, landuse,
boundary, boundary,
historic, historic,
seamark_type,
area area
FROM osm_park_polygon_gen_z5 FROM osm_park_polygon_gen_z5
WHERE zoom_level = 5 WHERE zoom_level = 5
@ -244,6 +245,7 @@ FROM (
landuse, landuse,
boundary, boundary,
historic, historic,
seamark_type,
area area
FROM osm_park_polygon_gen_z6 FROM osm_park_polygon_gen_z6
WHERE zoom_level = 6 WHERE zoom_level = 6
@ -262,6 +264,7 @@ FROM (
landuse, landuse,
boundary, boundary,
historic, historic,
seamark_type,
area area
FROM osm_park_polygon_gen_z7 FROM osm_park_polygon_gen_z7
WHERE zoom_level = 7 WHERE zoom_level = 7
@ -280,6 +283,7 @@ FROM (
landuse, landuse,
boundary, boundary,
historic, historic,
seamark_type,
area area
FROM osm_park_polygon_gen_z8 FROM osm_park_polygon_gen_z8
WHERE zoom_level = 8 WHERE zoom_level = 8
@ -298,6 +302,7 @@ FROM (
landuse, landuse,
boundary, boundary,
historic, historic,
seamark_type,
area area
FROM osm_park_polygon_gen_z9 FROM osm_park_polygon_gen_z9
WHERE zoom_level = 9 WHERE zoom_level = 9
@ -316,6 +321,7 @@ FROM (
landuse, landuse,
boundary, boundary,
historic, historic,
seamark_type,
area area
FROM osm_park_polygon_gen_z10 FROM osm_park_polygon_gen_z10
WHERE zoom_level = 10 WHERE zoom_level = 10
@ -334,6 +340,7 @@ FROM (
landuse, landuse,
boundary, boundary,
historic, historic,
seamark_type,
area area
FROM osm_park_polygon_gen_z11 FROM osm_park_polygon_gen_z11
WHERE zoom_level = 11 WHERE zoom_level = 11
@ -352,6 +359,7 @@ FROM (
landuse, landuse,
boundary, boundary,
historic, historic,
seamark_type,
area area
FROM osm_park_polygon_gen_z12 FROM osm_park_polygon_gen_z12
WHERE zoom_level = 12 WHERE zoom_level = 12
@ -370,6 +378,7 @@ FROM (
landuse, landuse,
boundary, boundary,
historic, historic,
seamark_type,
area area
FROM osm_park_polygon_gen_z13 FROM osm_park_polygon_gen_z13
WHERE zoom_level = 13 WHERE zoom_level = 13
@ -388,6 +397,7 @@ FROM (
landuse, landuse,
boundary, boundary,
historic, historic,
seamark_type,
area area
FROM osm_park_polygon FROM osm_park_polygon
WHERE zoom_level >= 14 WHERE zoom_level >= 14

Wyświetl plik

@ -1,17 +1,22 @@
layer: layer:
id: "park" id: "park"
description: | description: |
The park layer contains parks from OpenStreetMap tagged with The park layer contains large area features from OpenStreetMap tagged with
[`boundary=national_park`](http://wiki.openstreetmap.org/wiki/Tag:boundary%3Dnational_park), [`boundary=national_park`](http://wiki.openstreetmap.org/wiki/Tag:boundary%3Dnational_park),
[`boundary=protected_area`](http://wiki.openstreetmap.org/wiki/Tag:boundary%3Dprotected_area), [`boundary=protected_area`](http://wiki.openstreetmap.org/wiki/Tag:boundary%3Dprotected_area),
[`leisure=nature_reserve`](http://wiki.openstreetmap.org/wiki/Tag:leisure%3Dnature_reserve), [`leisure=nature_reserve`](http://wiki.openstreetmap.org/wiki/Tag:leisure%3Dnature_reserve),
or select values of [`historic=*`](http://wiki.openstreetmap.org/wiki/Key:historic). or select values of [`historic=*`](http://wiki.openstreetmap.org/wiki/Key:historic).
This layer also includes boundaries for indigenous lands tagged with
[`boundary=aboriginal_lands`](https://wiki.openstreetmap.org/wiki/Tag:boundary%3Daboriginal_lands).
Indigenous boundaries are not parks, but they are included in this layer for technical reasons related to data processing.
These boundaries represent areas with special legal and administrative status for indigenous peoples.
buffer_size: 4 buffer_size: 4
fields: fields:
class: class:
description: | description: |
Use the **class** to differentiate between different parks. Use the **class** to differentiate between different large areas.
The class for `boundary=protected_area` parks is one of: `national_park`, `nature_reserve`, `recreation_ground`, or `historic`. The class for `boundary=protected_area` parks is one of: `national_park`, `nature_reserve`, `recreation_ground`, or `historic`.
The class for `boundary=aboriginal_lands` is `aboriginal_lands`.
name: The OSM [`name`](http://wiki.openstreetmap.org/wiki/Key:name) value of the park (point features only). name: The OSM [`name`](http://wiki.openstreetmap.org/wiki/Key:name) value of the park (point features only).
name_en: English name `name:en` if available, otherwise `name` (point features only). name_en: English name `name:en` if available, otherwise `name` (point features only).
name_de: German name `name:de` if available, otherwise `name` or `name:en` (point features only). name_de: German name `name:de` if available, otherwise `name` or `name:en` (point features only).

Wyświetl plik

@ -24,14 +24,16 @@ DROP MATERIALIZED VIEW IF EXISTS osm_park_polygon_dissolve_z4 CASCADE;
CREATE MATERIALIZED VIEW osm_park_polygon_dissolve_z4 AS CREATE MATERIALIZED VIEW osm_park_polygon_dissolve_z4 AS
( (
SELECT min(osm_id) AS osm_id, SELECT min(osm_id) AS osm_id,
ST_Union(geometry) AS geometry ST_Union(geometry) AS geometry,
boundary
FROM ( FROM (
SELECT ST_ClusterDBSCAN(geometry, 0, 1) OVER() AS cluster, SELECT ST_ClusterDBSCAN(geometry, 0, 1) OVER() AS cluster,
osm_id, osm_id,
geometry geometry,
boundary
FROM osm_park_polygon_gen_z4 FROM osm_park_polygon_gen_z4
) park_cluster ) park_cluster
GROUP BY cluster GROUP BY boundary, cluster
); );
CREATE UNIQUE INDEX IF NOT EXISTS osm_park_polygon_dissolve_idx ON osm_park_polygon_dissolve_z4 (osm_id); CREATE UNIQUE INDEX IF NOT EXISTS osm_park_polygon_dissolve_idx ON osm_park_polygon_dissolve_z4 (osm_id);
@ -46,6 +48,8 @@ DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z7;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z6; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z6;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z5; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z5;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z4; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z4;
DROP TRIGGER IF EXISTS trigger_flag ON osm_park_polygon;
DROP TRIGGER IF EXISTS trigger_refresh ON park_polygon.updates;
-- etldoc: osm_park_polygon -> osm_park_polygon -- etldoc: osm_park_polygon -> osm_park_polygon
-- etldoc: osm_park_polygon_gen_z13 -> osm_park_polygon_gen_z13 -- etldoc: osm_park_polygon_gen_z13 -> osm_park_polygon_gen_z13
@ -119,6 +123,42 @@ CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z5_point_geom_idx ON osm_park_po
CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z4_polygon_geom_idx ON osm_park_polygon_gen_z4 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z4_polygon_geom_idx ON osm_park_polygon_gen_z4 USING gist (geometry);
CREATE INDEX IF NOT EXISTS osm_park_polygon_dissolve_z4_polygon_geom_idx ON osm_park_polygon_dissolve_z4 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_park_polygon_dissolve_z4_polygon_geom_idx ON osm_park_polygon_dissolve_z4 USING gist (geometry);
CREATE SCHEMA IF NOT EXISTS park_polygon;
CREATE TABLE IF NOT EXISTS park_polygon.updates
(
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION park_polygon.flag() RETURNS trigger AS
$$
BEGIN
INSERT INTO park_polygon.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION park_polygon.refresh() RETURNS trigger AS
$$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN
RAISE LOG 'Refresh park_polygon';
-- Analyze tracking and source tables before performing update
ANALYZE osm_park_polygon_gen_z4;
REFRESH MATERIALIZED VIEW osm_park_polygon_dissolve_z4;
-- noinspection SqlWithoutWhere
DELETE FROM park_polygon.updates;
RAISE LOG 'Refresh park_polygon done in %', age(clock_timestamp(), t);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION update_osm_park_polygon_row() CREATE OR REPLACE FUNCTION update_osm_park_polygon_row()
RETURNS trigger RETURNS trigger
AS AS
@ -206,3 +246,15 @@ CREATE TRIGGER update_row
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_dissolved_polygon_row(); EXECUTE PROCEDURE update_osm_park_dissolved_polygon_row();
CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE
ON osm_park_polygon
FOR EACH STATEMENT
EXECUTE PROCEDURE park_polygon.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT
ON park_polygon.updates
INITIALLY DEFERRED
FOR EACH ROW
EXECUTE PROCEDURE park_polygon.refresh();

Wyświetl plik

@ -8,7 +8,7 @@ CREATE SCHEMA IF NOT EXISTS place_city;
CREATE TABLE IF NOT EXISTS place_city.osm_ids CREATE TABLE IF NOT EXISTS place_city.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
CREATE OR REPLACE FUNCTION update_osm_city_point(full_update boolean) RETURNS void AS CREATE OR REPLACE FUNCTION update_osm_city_point(full_update boolean) RETURNS void AS
@ -49,18 +49,12 @@ $$ LANGUAGE SQL;
SELECT update_osm_city_point(true); SELECT update_osm_city_point(true);
CREATE INDEX IF NOT EXISTS osm_city_point_rank_idx ON osm_city_point ("rank");
-- Handle updates -- Handle updates
CREATE OR REPLACE FUNCTION place_city.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_city.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO place_city.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO place_city.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_city.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -85,6 +79,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_city rank'; RAISE LOG 'Refresh place_city rank';
-- Analyze tracking and source tables before performing update
ANALYZE place_city.osm_ids;
ANALYZE osm_city_point;
PERFORM update_osm_city_point(false); PERFORM update_osm_city_point(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_city.osm_ids; DELETE FROM place_city.osm_ids;
@ -97,13 +96,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_city_point ON osm_city_point
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_city.store(); EXECUTE PROCEDURE place_city.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_city_point ON osm_city_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_city.flag(); EXECUTE PROCEDURE place_city.flag();

Wyświetl plik

@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS place_continent_point;
CREATE TABLE IF NOT EXISTS place_continent_point.osm_ids CREATE TABLE IF NOT EXISTS place_continent_point.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
-- etldoc: osm_continent_point -> osm_continent_point -- etldoc: osm_continent_point -> osm_continent_point
@ -26,11 +26,7 @@ SELECT update_osm_continent_point(true);
CREATE OR REPLACE FUNCTION place_continent_point.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_continent_point.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO place_continent_point.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO place_continent_point.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_continent_point.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -55,6 +51,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_continent_point'; RAISE LOG 'Refresh place_continent_point';
-- Analyze tracking and source tables before performing update
ANALYZE place_continent_point.osm_ids;
ANALYZE osm_continent_point;
PERFORM update_osm_continent_point(false); PERFORM update_osm_continent_point(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_continent_point.osm_ids; DELETE FROM place_continent_point.osm_ids;
@ -67,13 +68,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_continent_point ON osm_continent_point
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_continent_point.store(); EXECUTE PROCEDURE place_continent_point.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_continent_point ON osm_continent_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_continent_point.flag(); EXECUTE PROCEDURE place_continent_point.flag();

Wyświetl plik

@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS place_country;
CREATE TABLE IF NOT EXISTS place_country.osm_ids CREATE TABLE IF NOT EXISTS place_country.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
-- etldoc: ne_10m_admin_0_countries -> osm_country_point -- etldoc: ne_10m_admin_0_countries -> osm_country_point
@ -98,18 +98,12 @@ $$ LANGUAGE SQL;
SELECT update_osm_country_point(true); SELECT update_osm_country_point(true);
CREATE INDEX IF NOT EXISTS osm_country_point_rank_idx ON osm_country_point ("rank");
-- Handle updates -- Handle updates
CREATE OR REPLACE FUNCTION place_country.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_country.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO place_country.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO place_country.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_country.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -134,6 +128,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_country rank'; RAISE LOG 'Refresh place_country rank';
-- Analyze tracking and source tables before performing update
ANALYZE place_country.osm_ids;
ANALYZE osm_country_point;
PERFORM update_osm_country_point(false); PERFORM update_osm_country_point(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_country.osm_ids; DELETE FROM place_country.osm_ids;
@ -146,13 +145,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_country_point ON osm_country_point
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_country.store(); EXECUTE PROCEDURE place_country.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_country_point ON osm_country_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_country.flag(); EXECUTE PROCEDURE place_country.flag();

Wyświetl plik

@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS place_island_point;
CREATE TABLE IF NOT EXISTS place_island_point.osm_ids CREATE TABLE IF NOT EXISTS place_island_point.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
-- etldoc: osm_island_point -> osm_island_point -- etldoc: osm_island_point -> osm_island_point
@ -26,11 +26,7 @@ SELECT update_osm_island_point(true);
CREATE OR REPLACE FUNCTION place_island_point.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_island_point.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO place_island_point.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO place_island_point.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_island_point.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -55,6 +51,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_island_point'; RAISE LOG 'Refresh place_island_point';
-- Analyze tracking and source tables before performing update
ANALYZE place_island_point.osm_ids;
ANALYZE osm_island_point;
PERFORM update_osm_island_point(false); PERFORM update_osm_island_point(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_island_point.osm_ids; DELETE FROM place_island_point.osm_ids;
@ -67,13 +68,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_island_point ON osm_island_point
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_island_point.store(); EXECUTE PROCEDURE place_island_point.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_island_point ON osm_island_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_island_point.flag(); EXECUTE PROCEDURE place_island_point.flag();

Wyświetl plik

@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS place_island_polygon;
CREATE TABLE IF NOT EXISTS place_island_polygon.osm_ids CREATE TABLE IF NOT EXISTS place_island_polygon.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
-- etldoc: osm_island_polygon -> osm_island_polygon -- etldoc: osm_island_polygon -> osm_island_polygon
@ -33,11 +33,7 @@ SELECT update_osm_island_polygon(true);
CREATE OR REPLACE FUNCTION place_island_polygon.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_island_polygon.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO place_island_polygon.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO place_island_polygon.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_island_polygon.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -62,6 +58,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_island_polygon'; RAISE LOG 'Refresh place_island_polygon';
-- Analyze tracking and source tables before performing update
ANALYZE place_island_polygon.osm_ids;
ANALYZE osm_island_polygon;
PERFORM update_osm_island_polygon(false); PERFORM update_osm_island_polygon(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_island_polygon.osm_ids; DELETE FROM place_island_polygon.osm_ids;
@ -74,13 +75,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_island_polygon ON osm_island_polygon
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_island_polygon.store(); EXECUTE PROCEDURE place_island_polygon.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_island_polygon ON osm_island_polygon
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_island_polygon.flag(); EXECUTE PROCEDURE place_island_polygon.flag();

Wyświetl plik

@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS place_state;
CREATE TABLE IF NOT EXISTS place_state.osm_ids CREATE TABLE IF NOT EXISTS place_state.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
-- etldoc: ne_10m_admin_1_states_provinces -> osm_state_point -- etldoc: ne_10m_admin_1_states_provinces -> osm_state_point
@ -60,18 +60,12 @@ $$ LANGUAGE SQL;
SELECT update_osm_state_point(true); SELECT update_osm_state_point(true);
CREATE INDEX IF NOT EXISTS osm_state_point_rank_idx ON osm_state_point ("rank");
-- Handle updates -- Handle updates
CREATE OR REPLACE FUNCTION place_state.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_state.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO place_state.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO place_state.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_state.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -96,6 +90,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_state rank'; RAISE LOG 'Refresh place_state rank';
-- Analyze tracking and source tables before performing update
ANALYZE place_state.osm_ids;
ANALYZE osm_state_point;
PERFORM update_osm_state_point(false); PERFORM update_osm_state_point(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_state.osm_ids; DELETE FROM place_state.osm_ids;
@ -108,13 +107,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_state_point ON osm_state_point
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_state.store(); EXECUTE PROCEDURE place_state.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_state_point ON osm_state_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_state.flag(); EXECUTE PROCEDURE place_state.flag();

Wyświetl plik

@ -18,6 +18,7 @@ def_poi_mapping_amenity: &poi_mapping_amenity
- biergarten - biergarten
- bus_station - bus_station
- cafe - cafe
- charging_station
- cinema - cinema
- clinic - clinic
- college - college
@ -118,7 +119,66 @@ def_poi_mapping_leisure: &poi_mapping_leisure
# office values , see http://taginfo.openstreetmap.org/keys/office#values # office values , see http://taginfo.openstreetmap.org/keys/office#values
def_poi_mapping_office: &poi_mapping_office def_poi_mapping_office: &poi_mapping_office
- accountant
- advertising_agency
- architect
- association
- bail_bond_agent
- charity
- company
- construction_company
- consulting
- cooperative
- courier
- coworking
- diplomatic - diplomatic
- educational_institution
- employment_agency
- energy_supplier
- engineer
- estate_agent
- financial
- financial_advisor
- forestry
- foundation
- geodesist
- government
- graphic_design
- guide
- harbour_master
- health_insurance
- insurance
- interior_design
- it
- lawyer
- logistics
- marketing
- moving_company
- newspaper
- ngo
- notary
- physician
- political_party
- private_investigator
- property_management
- publisher
- quango
- religion
- research
- security
- surveyor
- tax_advisor
- taxi
- telecommunication
- therapist
- translator
- travel_agent
- tutoring
- union
- university
- water_utility
- web_design
- wedding_planner
# railway values , see http://taginfo.openstreetmap.org/keys/railway#values # railway values , see http://taginfo.openstreetmap.org/keys/railway#values
def_poi_mapping_railway: &poi_mapping_railway def_poi_mapping_railway: &poi_mapping_railway
@ -193,6 +253,7 @@ def_poi_mapping_shop: &poi_mapping_shop
- newsagent - newsagent
- optician - optician
- outdoor - outdoor
- paint
- perfume - perfume
- perfumery - perfumery
- pet - pet

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 1.4 MiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.7 MiB

Wyświetl plik

@ -21,10 +21,20 @@ layer:
'coffee', 'computer', 'convenience', 'copyshop', 'cosmetics', 'garden_centre', 'doityourself', 'coffee', 'computer', 'convenience', 'copyshop', 'cosmetics', 'garden_centre', 'doityourself',
'erotic', 'electronics', 'fabric', 'florist', 'frozen_food', 'furniture', 'video_games', 'video', 'erotic', 'electronics', 'fabric', 'florist', 'frozen_food', 'furniture', 'video_games', 'video',
'general', 'gift', 'hardware', 'hearing_aids', 'hifi', 'ice_cream', 'interior_decoration', 'general', 'gift', 'hardware', 'hearing_aids', 'hifi', 'ice_cream', 'interior_decoration',
'jewelry', 'kiosk', 'locksmith', 'lamps', 'mall', 'massage', 'motorcycle', 'mobile_phone', 'jewelry', 'kiosk', 'locksmith', 'lamps', 'mall', 'massage', 'motorcycle', 'mobile_phone',
'newsagent', 'optician', 'outdoor', 'perfumery', 'perfume', 'pet', 'photo', 'second_hand', 'newsagent', 'optician', 'outdoor', 'paint', 'perfumery', 'perfume', 'pet', 'photo', 'second_hand',
'shoes', 'sports', 'stationery', 'tailor', 'tattoo', 'ticket', 'tobacco', 'toys', 'travel_agency', 'shoes', 'sports', 'stationery', 'tailor', 'tattoo', 'ticket', 'tobacco', 'toys', 'travel_agency',
'watches', 'weapons', 'wholesale'] 'watches', 'weapons', 'wholesale']
office:
subclass: ['accountant', 'advertising_agency', 'architect', 'association', 'bail_bond_agent', 'charity',
'company', 'construction_company', 'consulting', 'cooperative', 'courier', 'coworking', 'diplomatic',
'educational_institution', 'employment_agency', 'energy_supplier', 'engineer', 'estate_agent', 'financial',
'financial_advisor', 'forestry', 'foundation', 'geodesist', 'government', 'graphic_design', 'guide',
'harbour_master', 'health_insurance', 'insurance', 'interior_design', 'it', 'lawyer', 'logistics', 'marketing',
'moving_company', 'newspaper', 'ngo', 'notary', 'physician', 'political_party', 'private_investigator',
'property_management', 'publisher', 'quango', 'religion', 'research', 'security', 'surveyor', 'tax_advisor',
'taxi', 'telecommunication', 'therapist', 'translator', 'travel_agent', 'tutoring', 'union', 'university',
'water_utility', 'web_design', 'wedding_planner']
town_hall: town_hall:
subclass: ['townhall', 'public_building', 'courthouse', 'community_centre'] subclass: ['townhall', 'public_building', 'courthouse', 'community_centre']
golf: golf:
@ -96,6 +106,8 @@ layer:
subclass: ['castle', 'ruins'] subclass: ['castle', 'ruins']
atm: atm:
subclass: ['atm'] subclass: ['atm']
fuel:
subclass: ['fuel', 'charging_station']
subclass: subclass:
description: | description: |
Original value of either the Original value of either the

Wyświetl plik

@ -743,7 +743,27 @@
] ]
] ]
}, },
"icon-image": "{subclass}", "icon-image": [
"coalesce",
[
"image",
[
"get",
"subclass"
]
],
[
"image",
[
"get",
"class"
]
],
[
"image",
""
]
],
"text-field": "{name:latin}\n{name:nonlatin}", "text-field": "{name:latin}\n{name:nonlatin}",
"visibility": "visible", "visibility": "visible",
"text-anchor": "top", "text-anchor": "top",
@ -778,7 +798,8 @@
"information", "information",
"cinema", "cinema",
"theatre", "theatre",
"fire_station" "fire_station",
"office"
], ],
[ [
"!=", "!=",
@ -976,7 +997,8 @@
"class", "class",
"car", "car",
"bicycle_parking", "bicycle_parking",
"fuel" "fuel",
"charging_station"
] ]
], ],
"order": 170 "order": 170

Wyświetl plik

@ -1,18 +1,28 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_poi_point; DROP TRIGGER IF EXISTS trigger_flag ON osm_poi_point;
DROP TRIGGER IF EXISTS trigger_refresh ON poi_point.updates; DROP TRIGGER IF EXISTS trigger_refresh ON poi_point.updates;
DROP TRIGGER IF EXISTS trigger_store ON osm_poi_point;
CREATE SCHEMA IF NOT EXISTS poi_point;
CREATE TABLE IF NOT EXISTS poi_point.osm_ids
(
osm_id bigint PRIMARY KEY
);
-- etldoc: osm_poi_point -> osm_poi_point -- etldoc: osm_poi_point -> osm_poi_point
CREATE OR REPLACE FUNCTION update_osm_poi_point() RETURNS void AS CREATE OR REPLACE FUNCTION update_osm_poi_point(full_update bool) RETURNS void AS
$$ $$
BEGIN BEGIN
UPDATE osm_poi_point UPDATE osm_poi_point
SET subclass = 'subway' SET subclass = 'subway'
WHERE station = 'subway' WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_point.osm_ids))
AND station = 'subway'
AND subclass = 'station'; AND subclass = 'station';
UPDATE osm_poi_point UPDATE osm_poi_point
SET subclass = 'halt' SET subclass = 'halt'
WHERE funicular = 'yes' WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_point.osm_ids))
AND funicular = 'yes'
AND subclass = 'station'; AND subclass = 'station';
-- ATM without name -- ATM without name
@ -23,7 +33,8 @@ BEGIN
COALESCE(tags -> 'operator', tags -> 'network'), COALESCE(tags -> 'operator', tags -> 'network'),
tags || hstore('name', COALESCE(tags -> 'operator', tags -> 'network')) tags || hstore('name', COALESCE(tags -> 'operator', tags -> 'network'))
) )
WHERE subclass = 'atm' WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_point.osm_ids))
AND subclass = 'atm'
AND name = '' AND name = ''
AND COALESCE(tags -> 'operator', tags -> 'network') IS NOT NULL; AND COALESCE(tags -> 'operator', tags -> 'network') IS NOT NULL;
@ -32,22 +43,24 @@ BEGIN
-- (using name for parcel lockers is discouraged, see osm wiki) -- (using name for parcel lockers is discouraged, see osm wiki)
UPDATE osm_poi_point UPDATE osm_poi_point
SET (name, tags) = ( SET (name, tags) = (
CONCAT(COALESCE(tags -> 'brand', tags -> 'operator'), concat(' ', tags -> 'ref')), TRIM(CONCAT(COALESCE(tags -> 'brand', tags -> 'operator'), concat(' ', tags -> 'ref'))),
tags || hstore('name', CONCAT(COALESCE(tags -> 'brand', tags -> 'operator'), concat(' ', tags -> 'ref'))) tags || hstore('name', TRIM(CONCAT(COALESCE(tags -> 'brand', tags -> 'operator'), concat(' ', tags -> 'ref'))))
) )
WHERE subclass = 'parcel_locker' WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_point.osm_ids))
AND subclass IN ('parcel_locker', 'charging_station')
AND name = '' AND name = ''
AND COALESCE(tags -> 'brand', tags -> 'operator') IS NOT NULL; AND COALESCE(tags -> 'brand', tags -> 'operator') IS NOT NULL;
UPDATE osm_poi_point UPDATE osm_poi_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_point.osm_ids))
AND COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL
AND tags != update_tags(tags, geometry); AND tags != update_tags(tags, geometry);
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
SELECT update_osm_poi_point(); SELECT update_osm_poi_point(TRUE);
-- etldoc: osm_poi_stop_rank -> osm_poi_point -- etldoc: osm_poi_stop_rank -> osm_poi_point
CREATE OR REPLACE FUNCTION update_osm_poi_point_agg() RETURNS void AS CREATE OR REPLACE FUNCTION update_osm_poi_point_agg() RETURNS void AS
@ -91,7 +104,13 @@ SELECT update_osm_poi_point_agg();
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS poi_point; CREATE OR REPLACE FUNCTION poi_point.store() RETURNS trigger AS
$$
BEGIN
INSERT INTO poi_point.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS poi_point.updates CREATE TABLE IF NOT EXISTS poi_point.updates
( (
@ -113,11 +132,18 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh poi_point'; RAISE LOG 'Refresh poi_point';
PERFORM update_osm_poi_point();
-- Analyze tracking and source tables before performing update
ANALYZE poi_point.osm_ids;
ANALYZE osm_poi_point;
PERFORM update_osm_poi_point(FALSE);
REFRESH MATERIALIZED VIEW osm_poi_stop_centroid; REFRESH MATERIALIZED VIEW osm_poi_stop_centroid;
REFRESH MATERIALIZED VIEW osm_poi_stop_rank; REFRESH MATERIALIZED VIEW osm_poi_stop_rank;
PERFORM update_osm_poi_point_agg(); PERFORM update_osm_poi_point_agg();
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM poi_point.osm_ids;
-- noinspection SqlWithoutWhere
DELETE FROM poi_point.updates; DELETE FROM poi_point.updates;
RAISE LOG 'Refresh poi_point done in %', age(clock_timestamp(), t); RAISE LOG 'Refresh poi_point done in %', age(clock_timestamp(), t);
@ -125,8 +151,14 @@ BEGIN
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE
ON osm_poi_point
FOR EACH ROW
EXECUTE PROCEDURE poi_point.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_poi_point ON osm_poi_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE poi_point.flag(); EXECUTE PROCEDURE poi_point.flag();

Wyświetl plik

@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS poi_polygon;
CREATE TABLE IF NOT EXISTS poi_polygon.osm_ids CREATE TABLE IF NOT EXISTS poi_polygon.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
-- etldoc: osm_poi_polygon -> osm_poi_polygon -- etldoc: osm_poi_polygon -> osm_poi_polygon
@ -36,6 +36,19 @@ $$
AND funicular = 'yes' AND funicular = 'yes'
AND subclass = 'station'; AND subclass = 'station';
-- Parcel locker and charging_station without name
-- use either brand or operator and add ref if present
-- (using name for parcel lockers is discouraged, see osm wiki)
UPDATE osm_poi_polygon
SET (name, tags) = (
TRIM(CONCAT(COALESCE(tags -> 'brand', tags -> 'operator'), concat(' ', tags -> 'ref'))),
tags || hstore('name', TRIM(CONCAT(COALESCE(tags -> 'brand', tags -> 'operator'), concat(' ', tags -> 'ref'))))
)
WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_polygon.osm_ids))
AND subclass IN ('parcel_locker', 'charging_station')
AND name = ''
AND COALESCE(tags -> 'brand', tags -> 'operator') IS NOT NULL;
UPDATE osm_poi_polygon UPDATE osm_poi_polygon
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_polygon.osm_ids)) WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_polygon.osm_ids))
@ -51,11 +64,7 @@ SELECT update_poi_polygon(true);
CREATE OR REPLACE FUNCTION poi_polygon.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION poi_polygon.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO poi_polygon.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO poi_polygon.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO poi_polygon.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -80,6 +89,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh poi_polygon'; RAISE LOG 'Refresh poi_polygon';
-- Analyze tracking and source tables before performing update
ANALYZE poi_polygon.osm_ids;
ANALYZE osm_poi_polygon;
PERFORM update_poi_polygon(false); PERFORM update_poi_polygon(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM poi_polygon.osm_ids; DELETE FROM poi_polygon.osm_ids;
@ -92,13 +106,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_poi_polygon ON osm_poi_polygon
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE poi_polygon.store(); EXECUTE PROCEDURE poi_polygon.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_poi_polygon ON osm_poi_polygon
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE poi_polygon.flag(); EXECUTE PROCEDURE poi_polygon.flag();

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 686 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 772 KiB

Wyświetl plik

@ -31,6 +31,48 @@ generalized_tables:
sql_filter: ST_IsValid(geometry) sql_filter: ST_IsValid(geometry)
tolerance: ZRES13 tolerance: ZRES13
# etldoc: osm_shipway_linestring_gen_z5 -> osm_shipway_linestring_gen_z4
shipway_linestring_gen_z4:
source: shipway_linestring_gen_z5
sql_filter: ST_Length(geometry)>2*ZRES0
tolerance: ZRES5
# etldoc: osm_shipway_linestring_gen_z6 -> osm_shipway_linestring_gen_z5
shipway_linestring_gen_z5:
source: shipway_linestring_gen_z6
sql_filter: ST_Length(geometry)>ZRES0
tolerance: ZRES6
# etldoc: osm_shipway_linestring_gen_z7 -> osm_shipway_linestring_gen_z6
shipway_linestring_gen_z6:
source: shipway_linestring_gen_z7
sql_filter: ST_Length(geometry)>ZRES1
tolerance: ZRES7
# etldoc: osm_shipway_linestring_gen_z8 -> osm_shipway_linestring_gen_z7
shipway_linestring_gen_z7:
source: shipway_linestring_gen_z8
sql_filter: ST_Length(geometry)>ZRES2
tolerance: ZRES8
# etldoc: osm_shipway_linestring_gen_z9 -> osm_shipway_linestring_gen_z8
shipway_linestring_gen_z8:
source: shipway_linestring_gen_z9
sql_filter: ST_Length(geometry)>ZRES3
tolerance: ZRES9
# etldoc: osm_shipway_linestring_gen_z10 -> osm_shipway_linestring_gen_z9
shipway_linestring_gen_z9:
source: shipway_linestring_gen_z10
sql_filter: ST_Length(geometry)>ZRES4
tolerance: ZRES10
# etldoc: osm_shipway_linestring_gen_z11 -> osm_shipway_linestring_gen_z10
shipway_linestring_gen_z10:
source: shipway_linestring_gen_z11
sql_filter: ST_Length(geometry)>ZRES5
tolerance: ZRES11
# etldoc: osm_shipway_linestring_gen_z12 -> osm_shipway_linestring_gen_z11 # etldoc: osm_shipway_linestring_gen_z12 -> osm_shipway_linestring_gen_z11
shipway_linestring_gen_z11: shipway_linestring_gen_z11:
source: shipway_linestring_gen_z12 source: shipway_linestring_gen_z12
@ -279,7 +321,6 @@ tables:
- *bridge - *bridge
- *ramp - *ramp
- *ford - *ford
- *oneway
- *area - *area
- *service - *service
- *usage - *usage
@ -357,7 +398,6 @@ tables:
- *bridge - *bridge
- *ramp - *ramp
- *ford - *ford
- *oneway
- *area - *area
- *service - *service
- *usage - *usage

Wyświetl plik

@ -32,15 +32,3 @@ $$
'us-interstate'); 'us-interstate');
$$ LANGUAGE sql IMMUTABLE $$ LANGUAGE sql IMMUTABLE
PARALLEL SAFE; PARALLEL SAFE;
DO
$$
BEGIN
BEGIN
ALTER TABLE osm_route_member
ADD COLUMN network_type route_network_type;
EXCEPTION
WHEN duplicate_column THEN RAISE NOTICE 'column network_type already exists in network_type.';
END;
END;
$$;

Wyświetl plik

@ -5,13 +5,13 @@
"type": "line", "type": "line",
"source": "openmaptiles", "source": "openmaptiles",
"source-layer": "transportation", "source-layer": "transportation",
"minzoom": 10, "minzoom": 4,
"layout": { "layout": {
"line-join": "round", "line-join": "round",
"visibility": "visible" "visibility": "visible"
}, },
"paint": { "paint": {
"line-color": "#7d7df8", "line-color": "#66f",
"line-width": { "line-width": {
"stops": [ "stops": [
[ [
@ -25,8 +25,8 @@
] ]
}, },
"line-dasharray": [ "line-dasharray": [
2, 6,
2 6
] ]
}, },
"filter": [ "filter": [
@ -5607,7 +5607,7 @@
"stops": [ "stops": [
[ [
8, 8,
" #787878" "#787878"
], ],
[ [
14, 14,

Wyświetl plik

@ -483,7 +483,7 @@ FROM (
is_ford, is_ford,
NULL::boolean AS expressway, NULL::boolean AS expressway,
is_ramp, is_ramp,
is_oneway, NULL::int AS is_oneway,
NULL AS man_made, NULL AS man_made,
layer, layer,
NULL::int AS level, NULL::int AS level,
@ -518,7 +518,7 @@ FROM (
is_ford, is_ford,
NULL::boolean AS expressway, NULL::boolean AS expressway,
is_ramp, is_ramp,
is_oneway, NULL::int AS is_oneway,
NULL AS man_made, NULL AS man_made,
layer, layer,
NULL::int AS level, NULL::int AS level,
@ -553,7 +553,7 @@ FROM (
is_ford, is_ford,
NULL::boolean AS expressway, NULL::boolean AS expressway,
is_ramp, is_ramp,
is_oneway, NULL::int AS is_oneway,
NULL AS man_made, NULL AS man_made,
layer, layer,
NULL::int AS level, NULL::int AS level,
@ -589,7 +589,7 @@ FROM (
is_ford, is_ford,
NULL::boolean AS expressway, NULL::boolean AS expressway,
is_ramp, is_ramp,
is_oneway, NULL::int AS is_oneway,
NULL AS man_made, NULL AS man_made,
layer, layer,
NULL::int AS level, NULL::int AS level,
@ -625,7 +625,7 @@ FROM (
is_ford, is_ford,
NULL::boolean AS expressway, NULL::boolean AS expressway,
is_ramp, is_ramp,
is_oneway, NULL::int AS is_oneway,
NULL AS man_made, NULL AS man_made,
layer, layer,
NULL::int AS level, NULL::int AS level,
@ -659,7 +659,7 @@ FROM (
is_ford, is_ford,
NULL::boolean AS expressway, NULL::boolean AS expressway,
is_ramp, is_ramp,
is_oneway, NULL::int AS is_oneway,
NULL AS man_made, NULL AS man_made,
layer, layer,
NULL::int AS level, NULL::int AS level,
@ -674,6 +674,237 @@ FROM (
WHERE zoom_level >= 13 WHERE zoom_level >= 13
UNION ALL UNION ALL
-- etldoc: osm_shipway_linestring_gen_z4 -> layer_transportation:z4
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS network,
NULL AS railway,
NULL AS aerialway,
shipway,
NULL AS public_transport,
service_value(service) AS service,
NULL::text AS access,
NULL::boolean AS toll,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS expressway,
is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
NULL AS bicycle,
NULL AS foot,
NULL AS horse,
NULL AS mtb_scale,
NULL AS surface,
z_order
FROM osm_shipway_linestring_gen_z4
WHERE zoom_level = 4
UNION ALL
-- etldoc: osm_shipway_linestring_gen_z5 -> layer_transportation:z5
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS network,
NULL AS railway,
NULL AS aerialway,
shipway,
NULL AS public_transport,
service_value(service) AS service,
NULL::text AS access,
NULL::boolean AS toll,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS expressway,
is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
NULL AS bicycle,
NULL AS foot,
NULL AS horse,
NULL AS mtb_scale,
NULL AS surface,
z_order
FROM osm_shipway_linestring_gen_z5
WHERE zoom_level = 5
UNION ALL
-- etldoc: osm_shipway_linestring_gen_z6 -> layer_transportation:z6
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS network,
NULL AS railway,
NULL AS aerialway,
shipway,
NULL AS public_transport,
service_value(service) AS service,
NULL::text AS access,
NULL::boolean AS toll,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS expressway,
is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
NULL AS bicycle,
NULL AS foot,
NULL AS horse,
NULL AS mtb_scale,
NULL AS surface,
z_order
FROM osm_shipway_linestring_gen_z6
WHERE zoom_level = 6
UNION ALL
-- etldoc: osm_shipway_linestring_gen_z7 -> layer_transportation:z7
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS network,
NULL AS railway,
NULL AS aerialway,
shipway,
NULL AS public_transport,
service_value(service) AS service,
NULL::text AS access,
NULL::boolean AS toll,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS expressway,
is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
NULL AS bicycle,
NULL AS foot,
NULL AS horse,
NULL AS mtb_scale,
NULL AS surface,
z_order
FROM osm_shipway_linestring_gen_z7
WHERE zoom_level = 7
UNION ALL
-- etldoc: osm_shipway_linestring_gen_z8 -> layer_transportation:z8
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS network,
NULL AS railway,
NULL AS aerialway,
shipway,
NULL AS public_transport,
service_value(service) AS service,
NULL::text AS access,
NULL::boolean AS toll,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS expressway,
is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
NULL AS bicycle,
NULL AS foot,
NULL AS horse,
NULL AS mtb_scale,
NULL AS surface,
z_order
FROM osm_shipway_linestring_gen_z8
WHERE zoom_level = 8
UNION ALL
-- etldoc: osm_shipway_linestring_gen_z9 -> layer_transportation:z9
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS network,
NULL AS railway,
NULL AS aerialway,
shipway,
NULL AS public_transport,
service_value(service) AS service,
NULL::text AS access,
NULL::boolean AS toll,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS expressway,
is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
NULL AS bicycle,
NULL AS foot,
NULL AS horse,
NULL AS mtb_scale,
NULL AS surface,
z_order
FROM osm_shipway_linestring_gen_z9
WHERE zoom_level = 9
UNION ALL
-- etldoc: osm_shipway_linestring_gen_z10 -> layer_transportation:z10
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS network,
NULL AS railway,
NULL AS aerialway,
shipway,
NULL AS public_transport,
service_value(service) AS service,
NULL::text AS access,
NULL::boolean AS toll,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS expressway,
is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
NULL AS bicycle,
NULL AS foot,
NULL AS horse,
NULL AS mtb_scale,
NULL AS surface,
z_order
FROM osm_shipway_linestring_gen_z10
WHERE zoom_level = 10
UNION ALL
-- etldoc: osm_shipway_linestring_gen_z11 -> layer_transportation:z11 -- etldoc: osm_shipway_linestring_gen_z11 -> layer_transportation:z11
SELECT osm_id, SELECT osm_id,
geometry, geometry,
@ -692,7 +923,7 @@ FROM (
is_ford, is_ford,
NULL::boolean AS expressway, NULL::boolean AS expressway,
is_ramp, is_ramp,
is_oneway, NULL::int AS is_oneway,
NULL AS man_made, NULL AS man_made,
layer, layer,
NULL::int AS level, NULL::int AS level,
@ -725,7 +956,7 @@ FROM (
is_ford, is_ford,
NULL::boolean AS expressway, NULL::boolean AS expressway,
is_ramp, is_ramp,
is_oneway, NULL::int AS is_oneway,
NULL AS man_made, NULL AS man_made,
layer, layer,
NULL::int AS level, NULL::int AS level,
@ -759,7 +990,7 @@ FROM (
is_ford, is_ford,
NULL::boolean AS expressway, NULL::boolean AS expressway,
is_ramp, is_ramp,
is_oneway, NULL::int AS is_oneway,
NULL AS man_made, NULL AS man_made,
layer, layer,
NULL::int AS level, NULL::int AS level,

Wyświetl plik

@ -1,3 +1,5 @@
DROP TRIGGER IF EXISTS trigger_store_transportation_highway_linestring ON osm_highway_linestring;
-- Create bounding windows for country-specific processing -- Create bounding windows for country-specific processing
-- etldoc: ne_10m_admin_0_countries -> ne_10m_admin_0_gb_buffer -- etldoc: ne_10m_admin_0_countries -> ne_10m_admin_0_gb_buffer
@ -16,12 +18,11 @@ WHERE iso_a2 = 'IE';
-- etldoc: osm_highway_linestring -> gbr_route_members_view -- etldoc: osm_highway_linestring -> gbr_route_members_view
-- etldoc: ne_10m_admin_0_gb_buffer -> gbr_route_members_view -- etldoc: ne_10m_admin_0_gb_buffer -> gbr_route_members_view
CREATE OR REPLACE VIEW gbr_route_members_view AS CREATE OR REPLACE VIEW gbr_route_members_view AS
SELECT 0, SELECT osm_id AS member,
osm_id, substring(ref FROM E'^[ABM][0-9ABM()]+') AS ref,
substring(ref FROM E'^[ABM][0-9ABM()]+'),
-- See https://wiki.openstreetmap.org/wiki/Roads_in_the_United_Kingdom -- See https://wiki.openstreetmap.org/wiki/Roads_in_the_United_Kingdom
CASE WHEN highway = 'motorway' THEN 'omt-gb-motorway' CASE WHEN highway = 'motorway' THEN 'omt-gb-motorway'
WHEN highway = 'trunk' THEN 'omt-gb-trunk' WHEN highway = 'trunk' THEN 'omt-gb-trunk'
WHEN highway IN ('primary','secondary') THEN 'omt-gb-primary' END AS network WHEN highway IN ('primary','secondary') THEN 'omt-gb-primary' END AS network
FROM osm_highway_linestring FROM osm_highway_linestring
WHERE length(ref) > 1 WHERE length(ref) > 1
@ -32,12 +33,11 @@ WHERE length(ref) > 1
-- etldoc: osm_highway_linestring -> ire_route_members_view -- etldoc: osm_highway_linestring -> ire_route_members_view
-- etldoc: ne_10m_admin_0_ie_buffer -> ire_route_members_view -- etldoc: ne_10m_admin_0_ie_buffer -> ire_route_members_view
CREATE OR REPLACE VIEW ire_route_members_view AS CREATE OR REPLACE VIEW ire_route_members_view AS
SELECT 0, SELECT osm_id AS member,
osm_id, substring(ref FROM E'^[MNRL][0-9]+') AS ref,
substring(ref FROM E'^[MNRL][0-9]+'),
-- See https://wiki.openstreetmap.org/wiki/Ireland/Roads -- See https://wiki.openstreetmap.org/wiki/Ireland/Roads
CASE WHEN highway = 'motorway' THEN 'omt-ie-motorway' CASE WHEN highway = 'motorway' THEN 'omt-ie-motorway'
WHEN highway IN ('trunk','primary') THEN 'omt-ie-national' WHEN highway IN ('trunk','primary') THEN 'omt-ie-national'
ELSE 'omt-ie-regional' END AS network ELSE 'omt-ie-regional' END AS network
FROM osm_highway_linestring FROM osm_highway_linestring
WHERE length(ref) > 1 WHERE length(ref) > 1
@ -45,23 +45,6 @@ WHERE length(ref) > 1
AND highway IN ('motorway', 'trunk', 'primary', 'secondary', 'unclassified') AND highway IN ('motorway', 'trunk', 'primary', 'secondary', 'unclassified')
; ;
-- Create GBR/IRE relations (so we can use it in the same way as other relations)
-- etldoc: osm_route_member -> osm_route_member
DELETE
FROM osm_route_member
WHERE network IN ('omt-gb-motorway', 'omt-gb-trunk', 'omt-gb-primary',
'omt-ie-motorway', 'omt-ie-national', 'omt-ie-national');
-- etldoc: gbr_route_members_view -> osm_route_member
INSERT INTO osm_route_member (osm_id, member, ref, network)
SELECT *
FROM gbr_route_members_view;
-- etldoc: ire_route_members_view -> osm_route_member
INSERT INTO osm_route_member (osm_id, member, ref, network)
SELECT *
FROM ire_route_members_view;
CREATE OR REPLACE FUNCTION osm_route_member_network_type(network text, ref text) RETURNS route_network_type AS CREATE OR REPLACE FUNCTION osm_route_member_network_type(network text, ref text) RETURNS route_network_type AS
$$ $$
SELECT CASE SELECT CASE
@ -75,7 +58,7 @@ SELECT CASE
CASE CASE
WHEN ref LIKE '4__' THEN 'ca-provincial-arterial'::route_network_type WHEN ref LIKE '4__' THEN 'ca-provincial-arterial'::route_network_type
WHEN ref = 'QEW' THEN 'ca-provincial-arterial'::route_network_type WHEN ref = 'QEW' THEN 'ca-provincial-arterial'::route_network_type
ELSE 'ca-provincial-arterial'::route_network_type ELSE 'ca-provincial'::route_network_type
END END
WHEN network = 'CA:MB:PTH' AND ref = '75' THEN 'ca-provincial-arterial'::route_network_type WHEN network = 'CA:MB:PTH' AND ref = '75' THEN 'ca-provincial-arterial'::route_network_type
WHEN network = 'CA:AB:primary' AND ref IN ('2','3','4') THEN 'ca-provincial-arterial'::route_network_type WHEN network = 'CA:AB:primary' AND ref IN ('2','3','4') THEN 'ca-provincial-arterial'::route_network_type
@ -91,104 +74,145 @@ SELECT CASE
$$ LANGUAGE sql IMMUTABLE $$ LANGUAGE sql IMMUTABLE
PARALLEL SAFE; PARALLEL SAFE;
-- etldoc: osm_route_member -> osm_route_member CREATE TABLE IF NOT EXISTS transportation_route_member_coalesced
-- see http://wiki.openstreetmap.org/wiki/Relation:route#Road_routes (
UPDATE osm_route_member member bigint,
SET network_type = osm_route_member_network_type(network, ref) network varchar,
WHERE network != '' ref varchar,
AND network_type IS DISTINCT FROM osm_route_member_network_type(network, ref) osm_id bigint not null,
; role varchar,
type smallint,
name varchar,
osmc_symbol varchar,
colour varchar,
network_type route_network_type,
concurrency_index integer,
rank integer,
PRIMARY KEY (member, network, ref)
);
CREATE OR REPLACE FUNCTION update_osm_route_member() RETURNS void AS CREATE OR REPLACE FUNCTION update_osm_route_member(full_update bool) RETURNS void AS
$$ $$
BEGIN BEGIN
-- Analyze tracking and source tables before performing update
ANALYZE transportation_name.network_changes;
ANALYZE osm_highway_linestring;
ANALYZE osm_route_member;
DELETE DELETE
FROM osm_route_member AS r FROM transportation_route_member_coalesced
USING USING transportation_name.network_changes c
transportation_name.network_changes AS c WHERE c.is_old IS TRUE AND transportation_route_member_coalesced.member = c.osm_id;
WHERE network IN ('omt-gb-motorway', 'omt-gb-trunk', 'omt-gb-primary',
'omt-ie-motorway', 'omt-ie-national', 'omt-ie-regional')
AND r.osm_id = c.osm_id;
INSERT INTO osm_route_member (osm_id, member, ref, network) -- Create GBR/IRE relations (so we can use it in the same way as other relations)
SELECT r.* -- etldoc: gbr_route_members_view -> transportation_route_member_coalesced
FROM gbr_route_members_view AS r INSERT INTO transportation_route_member_coalesced (member, network, ref, network_type, concurrency_index, osm_id)
JOIN transportation_name.network_changes AS c ON SELECT member, network, coalesce(ref, '') AS ref,
r.osm_id = c.osm_id; osm_route_member_network_type(network, coalesce(ref, '')) AS network_type,
1 AS concurrency_index, 0 AS osm_id
FROM gbr_route_members_view
WHERE full_update OR EXISTS(
SELECT NULL
FROM transportation_name.network_changes c
WHERE c.is_old IS FALSE AND c.osm_id = gbr_route_members_view.member
)
GROUP BY member, network, coalesce(ref, '')
ON CONFLICT (member, network, ref) DO NOTHING;
INSERT INTO osm_route_member (osm_id, member, ref, network) -- etldoc: ire_route_members_view -> transportation_route_member_coalesced
SELECT r.* INSERT INTO transportation_route_member_coalesced (member, network, ref, network_type, concurrency_index, osm_id)
FROM ire_route_members_view AS r SELECT member, network, coalesce(ref, '') AS ref,
JOIN transportation_name.network_changes AS c ON osm_route_member_network_type(network, coalesce(ref, '')) AS network_type,
r.osm_id = c.osm_id; 1 AS concurrency_index, 0 AS osm_id
FROM ire_route_members_view
WHERE full_update OR EXISTS(
SELECT NULL
FROM transportation_name.network_changes c
WHERE c.is_old IS FALSE AND c.osm_id = ire_route_members_view.member
)
GROUP BY member, network, coalesce(ref, '')
ON CONFLICT (member, network, ref) DO NOTHING;
INSERT INTO osm_route_member (id, osm_id, network_type, concurrency_index, rank) -- etldoc: osm_route_member -> transportation_route_member_coalesced
INSERT INTO transportation_route_member_coalesced
SELECT SELECT
id, osm_route_member_filtered.*,
osm_id,
osm_route_member_network_type(network, ref) AS network_type, osm_route_member_network_type(network, ref) AS network_type,
DENSE_RANK() over (PARTITION BY member ORDER BY network_type, network, LENGTH(ref), ref) AS concurrency_index, DENSE_RANK() OVER (
PARTITION BY member
ORDER BY osm_route_member_network_type(network, ref), network, LENGTH(ref), ref
) AS concurrency_index,
CASE CASE
WHEN network IN ('iwn', 'nwn', 'rwn') THEN 1 WHEN network IN ('iwn', 'nwn', 'rwn') THEN 1
WHEN network = 'lwn' THEN 2 WHEN network = 'lwn' THEN 2
WHEN osmc_symbol || colour <> '' THEN 2 WHEN osmc_symbol || colour <> '' THEN 2
END AS rank END AS rank
FROM osm_route_member rm FROM (
WHERE rm.member IN -- etldoc: osm_route_member -> osm_route_member
(SELECT DISTINCT osm_id FROM transportation_name.network_changes) -- see http://wiki.openstreetmap.org/wiki/Relation:route#Road_routes
ON CONFLICT (id, osm_id) DO UPDATE SET concurrency_index = EXCLUDED.concurrency_index, SELECT DISTINCT ON (member, COALESCE(network, ''), COALESCE(ref, ''))
rank = EXCLUDED.rank, member,
network_type = EXCLUDED.network_type; COALESCE(network, '') AS network,
COALESCE(ref, '') AS ref,
osm_id,
role,
type,
name,
osmc_symbol,
colour
FROM osm_route_member
WHERE full_update OR EXISTS(
SELECT NULL
FROM transportation_name.network_changes c
WHERE c.is_old IS FALSE AND c.osm_id = osm_route_member.member
)
) osm_route_member_filtered
ON CONFLICT (member, network, ref) DO UPDATE SET osm_id = EXCLUDED.osm_id, role = EXCLUDED.role,
type = EXCLUDED.type, name = EXCLUDED.name,
osmc_symbol = EXCLUDED.osmc_symbol, colour = EXCLUDED.colour,
concurrency_index = EXCLUDED.concurrency_index,
rank = EXCLUDED.rank;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE INDEX IF NOT EXISTS osm_route_member_network_idx ON osm_route_member ("network", "ref"); -- Indexes which can be utilized during full-update for queries originating from update_osm_route_member() function
CREATE INDEX IF NOT EXISTS osm_route_member_member_idx ON osm_route_member ("member"); CREATE INDEX IF NOT EXISTS osm_route_member_member_network_ref_idx
CREATE INDEX IF NOT EXISTS osm_route_member_name_idx ON osm_route_member ("name"); ON osm_route_member (member, COALESCE(network, ''), COALESCE(ref, ''));
CREATE INDEX IF NOT EXISTS osm_route_member_ref_idx ON osm_route_member ("ref");
CREATE INDEX IF NOT EXISTS osm_route_member_network_type_idx ON osm_route_member ("network_type"); -- Analyze created index
ANALYZE osm_route_member;
/** -- Ensure transportation_name.network_changes table exists since it is required by update_osm_route_member
* Discard duplicate routes CREATE SCHEMA IF NOT EXISTS transportation_name;
*/ CREATE TABLE IF NOT EXISTS transportation_name.network_changes
DELETE FROM osm_route_member WHERE id IN (
(SELECT id is_old bool,
FROM (SELECT id, osm_id bigint,
ROW_NUMBER() OVER (partition BY member, network, ref ORDER BY id) AS rnum PRIMARY KEY (is_old, osm_id)
FROM osm_route_member) t );
WHERE t.rnum > 1);
CREATE UNIQUE INDEX IF NOT EXISTS osm_route_member_network_ref_idx ON osm_route_member ("member", "network", "ref");
CREATE INDEX IF NOT EXISTS osm_highway_linestring_osm_id_idx ON osm_highway_linestring ("osm_id"); -- Fill transportation_route_member_coalesced table
CREATE UNIQUE INDEX IF NOT EXISTS osm_highway_linestring_gen_z11_osm_id_idx ON osm_highway_linestring_gen_z11 ("osm_id"); TRUNCATE transportation_route_member_coalesced;
SELECT update_osm_route_member(TRUE);
ALTER TABLE osm_route_member ADD COLUMN IF NOT EXISTS concurrency_index int, -- Index for queries against transportation_route_member_coalesced during transportation-name-network updates
ADD COLUMN IF NOT EXISTS rank int; CREATE INDEX IF NOT EXISTS transportation_route_member_member_idx ON
transportation_route_member_coalesced ("member", "concurrency_index");
-- One-time load of concurrency indexes; updates occur via trigger -- Analyze populated table with indexes
-- etldoc: osm_route_member -> osm_route_member ANALYZE transportation_route_member_coalesced;
INSERT INTO osm_route_member (id, osm_id, concurrency_index, rank)
SELECT -- Ensure OSM-ID index exists on osm_highway_linestring
id, CREATE UNIQUE INDEX IF NOT EXISTS osm_highway_linestring_osm_id_idx ON osm_highway_linestring ("osm_id");
osm_id,
DENSE_RANK() over (PARTITION BY member ORDER BY network_type, network, LENGTH(ref), ref) AS concurrency_index,
CASE
WHEN network IN ('iwn', 'nwn', 'rwn') THEN 1
WHEN network = 'lwn' THEN 2
WHEN osmc_symbol || colour <> '' THEN 2
END AS rank
FROM osm_route_member
ON CONFLICT (id, osm_id) DO UPDATE SET concurrency_index = EXCLUDED.concurrency_index, rank = EXCLUDED.rank;
-- etldoc: osm_route_member -> osm_highway_linestring -- etldoc: osm_route_member -> osm_highway_linestring
UPDATE osm_highway_linestring hl UPDATE osm_highway_linestring hl
SET network = rm.network_type SET network = rm.network_type
FROM osm_route_member rm FROM transportation_route_member_coalesced rm
WHERE hl.osm_id=rm.member AND rm.concurrency_index=1; WHERE hl.osm_id=rm.member AND rm.concurrency_index=1;
-- etldoc: osm_route_member -> osm_highway_linestring_gen_z11 -- etldoc: osm_route_member -> osm_highway_linestring_gen_z11
UPDATE osm_highway_linestring_gen_z11 hl UPDATE osm_highway_linestring_gen_z11 hl
SET network = rm.network_type SET network = rm.network_type
FROM osm_route_member rm FROM transportation_route_member_coalesced rm
WHERE hl.osm_id=rm.member AND rm.concurrency_index=1; WHERE hl.osm_id=rm.member AND rm.concurrency_index=1;

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 283 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 329 KiB

Wyświetl plik

@ -1,52 +1,46 @@
CREATE OR REPLACE FUNCTION highway_to_val(hwy_class varchar) CREATE OR REPLACE FUNCTION highway_to_val(hwy_class varchar)
RETURNS int RETURNS int
IMMUTABLE IMMUTABLE
LANGUAGE plpgsql LANGUAGE sql
AS $$ AS $$
BEGIN SELECT CASE hwy_class
CASE hwy_class WHEN 'motorway' THEN 6
WHEN 'motorway' THEN RETURN 6; WHEN 'trunk' THEN 5
WHEN 'trunk' THEN RETURN 5; WHEN 'primary' THEN 4
WHEN 'primary' THEN RETURN 4; WHEN 'secondary' THEN 3
WHEN 'secondary' THEN RETURN 3; WHEN 'tertiary' THEN 2
WHEN 'tertiary' THEN RETURN 2; WHEN 'unclassified' THEN 1
WHEN 'unclassified' THEN RETURN 1; ELSE 0
else RETURN 0; END;
END CASE;
END;
$$; $$;
CREATE OR REPLACE FUNCTION val_to_highway(hwy_val int) CREATE OR REPLACE FUNCTION val_to_highway(hwy_val int)
RETURNS varchar RETURNS varchar
IMMUTABLE IMMUTABLE
LANGUAGE plpgsql LANGUAGE sql
AS $$ AS $$
BEGIN SELECT CASE hwy_val
CASE hwy_val WHEN 6 THEN 'motorway'
WHEN 6 THEN RETURN 'motorway'; WHEN 5 THEN 'trunk'
WHEN 5 THEN RETURN 'trunk'; WHEN 4 THEN 'primary'
WHEN 4 THEN RETURN 'primary'; WHEN 3 THEN 'secondary'
WHEN 3 THEN RETURN 'secondary'; WHEN 2 THEN 'tertiary'
WHEN 2 THEN RETURN 'tertiary'; WHEN 1 THEN 'unclassified'
WHEN 1 THEN RETURN 'unclassified'; ELSE null
else RETURN null; END;
END CASE;
END;
$$; $$;
CREATE OR REPLACE FUNCTION highest_hwy_sfunc(agg_state varchar, hwy_class varchar) CREATE OR REPLACE FUNCTION highest_hwy_sfunc(agg_state varchar, hwy_class varchar)
RETURNS varchar RETURNS varchar
IMMUTABLE IMMUTABLE
LANGUAGE plpgsql LANGUAGE sql
AS $$ AS $$
BEGIN SELECT val_to_highway(
RETURN val_to_highway(
GREATEST( GREATEST(
highway_to_val(agg_state), highway_to_val(agg_state),
highway_to_val(hwy_class) highway_to_val(hwy_class)
) )
); );
END;
$$; $$;
DROP AGGREGATE IF EXISTS highest_highway (varchar); DROP AGGREGATE IF EXISTS highest_highway (varchar);

Wyświetl plik

@ -54,7 +54,20 @@ SELECT geometry,
FROM ( FROM (
-- etldoc: osm_transportation_name_linestring_gen4 -> layer_transportation_name:z6 -- etldoc: osm_transportation_name_linestring_gen4 -> layer_transportation_name:z6
SELECT *, SELECT geometry,
tags,
ref,
highway,
subclass,
brunnel,
network,
route_1,
route_2,
route_3,
route_4,
route_5,
route_6,
z_order,
NULL::int AS layer, NULL::int AS layer,
NULL::int AS level, NULL::int AS level,
NULL::boolean AS indoor NULL::boolean AS indoor
@ -63,32 +76,71 @@ FROM (
UNION ALL UNION ALL
-- etldoc: osm_transportation_name_linestring_gen3 -> layer_transportation_name:z7 -- etldoc: osm_transportation_name_linestring_gen3 -> layer_transportation_name:z7
SELECT *, SELECT geometry,
tags,
ref,
highway,
subclass,
brunnel,
network,
route_1,
route_2,
route_3,
route_4,
route_5,
route_6,
z_order,
NULL::int AS layer, NULL::int AS layer,
NULL::int AS level, NULL::int AS level,
NULL::boolean AS indoor NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen3 FROM osm_transportation_name_linestring_gen3
WHERE zoom_level = 7 WHERE ST_Length(geometry) > 20000 AND zoom_level = 7
UNION ALL UNION ALL
-- etldoc: osm_transportation_name_linestring_gen2 -> layer_transportation_name:z8 -- etldoc: osm_transportation_name_linestring_gen2 -> layer_transportation_name:z8
SELECT *, SELECT geometry,
tags,
ref,
highway,
subclass,
brunnel,
network,
route_1,
route_2,
route_3,
route_4,
route_5,
route_6,
z_order,
NULL::int AS layer, NULL::int AS layer,
NULL::int AS level, NULL::int AS level,
NULL::boolean AS indoor NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen2 FROM osm_transportation_name_linestring_gen2
WHERE zoom_level = 8 WHERE ST_Length(geometry) > 14000 AND zoom_level = 8
UNION ALL UNION ALL
-- etldoc: osm_transportation_name_linestring_gen1 -> layer_transportation_name:z9 -- etldoc: osm_transportation_name_linestring_gen1 -> layer_transportation_name:z9
-- etldoc: osm_transportation_name_linestring_gen1 -> layer_transportation_name:z10 -- etldoc: osm_transportation_name_linestring_gen1 -> layer_transportation_name:z10
-- etldoc: osm_transportation_name_linestring_gen1 -> layer_transportation_name:z11 -- etldoc: osm_transportation_name_linestring_gen1 -> layer_transportation_name:z11
SELECT *, SELECT geometry,
tags,
ref,
highway,
subclass,
brunnel,
network,
route_1,
route_2,
route_3,
route_4,
route_5,
route_6,
z_order,
NULL::int AS layer, NULL::int AS layer,
NULL::int AS level, NULL::int AS level,
NULL::boolean AS indoor NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen1 FROM osm_transportation_name_linestring_gen1
WHERE zoom_level BETWEEN 9 AND 11 WHERE ST_Length(geometry) > 8000 / POWER(2, zoom_level - 9) AND zoom_level BETWEEN 9 AND 11
UNION ALL UNION ALL
-- etldoc: osm_transportation_name_linestring -> layer_transportation_name:z12 -- etldoc: osm_transportation_name_linestring -> layer_transportation_name:z12

Wyświetl plik

@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS water_name_marine;
CREATE TABLE IF NOT EXISTS water_name_marine.osm_ids CREATE TABLE IF NOT EXISTS water_name_marine.osm_ids
( (
osm_id bigint osm_id bigint PRIMARY KEY
); );
CREATE OR REPLACE FUNCTION update_osm_marine_point(full_update boolean) RETURNS void AS CREATE OR REPLACE FUNCTION update_osm_marine_point(full_update boolean) RETURNS void AS
@ -45,11 +45,7 @@ CREATE INDEX IF NOT EXISTS osm_marine_point_rank_idx ON osm_marine_point ("rank"
CREATE OR REPLACE FUNCTION water_name_marine.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION water_name_marine.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op = 'DELETE') THEN INSERT INTO water_name_marine.osm_ids VALUES (NEW.osm_id) ON CONFLICT (osm_id) DO NOTHING;
INSERT INTO water_name_marine.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO water_name_marine.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -74,6 +70,11 @@ DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp(); t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh water_name_marine rank'; RAISE LOG 'Refresh water_name_marine rank';
-- Analyze tracking and source tables before performing update
ANALYZE water_name_marine.osm_ids;
ANALYZE osm_marine_point;
PERFORM update_osm_marine_point(false); PERFORM update_osm_marine_point(false);
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM water_name_marine.osm_ids; DELETE FROM water_name_marine.osm_ids;
@ -86,13 +87,13 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_marine_point ON osm_marine_point
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE water_name_marine.store(); EXECUTE PROCEDURE water_name_marine.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE
ON osm_marine_point ON osm_marine_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE water_name_marine.flag(); EXECUTE PROCEDURE water_name_marine.flag();

Wyświetl plik

@ -1,94 +0,0 @@
DROP TRIGGER IF EXISTS trigger_delete_line ON osm_water_polygon;
DROP TRIGGER IF EXISTS trigger_update_line ON osm_water_polygon;
DROP TRIGGER IF EXISTS trigger_insert_line ON osm_water_polygon;
CREATE OR REPLACE VIEW osm_water_lakeline_view AS
SELECT wp.osm_id,
ll.wkb_geometry AS geometry,
name,
name_en,
name_de,
update_tags(tags, ll.wkb_geometry) AS tags,
ST_Area(wp.geometry) AS area,
is_intermittent
FROM osm_water_polygon AS wp
INNER JOIN lake_centerline ll ON wp.osm_id = ll.osm_id
WHERE wp.name <> ''
AND ST_IsValid(wp.geometry);
-- etldoc: osm_water_polygon -> osm_water_lakeline
-- etldoc: lake_centerline -> osm_water_lakeline
CREATE TABLE IF NOT EXISTS osm_water_lakeline AS
SELECT *
FROM osm_water_lakeline_view;
DO
$$
BEGIN
ALTER TABLE osm_water_lakeline
ADD CONSTRAINT osm_water_lakeline_pk PRIMARY KEY (osm_id);
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'primary key osm_water_lakeline_pk already exists in osm_water_lakeline.';
END;
$$;
CREATE INDEX IF NOT EXISTS osm_water_lakeline_geometry_idx ON osm_water_lakeline USING gist (geometry);
-- Handle updates
CREATE SCHEMA IF NOT EXISTS water_lakeline;
CREATE OR REPLACE FUNCTION water_lakeline.delete() RETURNS trigger AS
$$
BEGIN
DELETE
FROM osm_water_lakeline
WHERE osm_water_lakeline.osm_id = OLD.osm_id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_lakeline.update() RETURNS trigger AS
$$
BEGIN
UPDATE osm_water_lakeline
SET (osm_id, geometry, name, name_en, name_de, tags, area, is_intermittent) =
(SELECT * FROM osm_water_lakeline_view WHERE osm_water_lakeline_view.osm_id = NEW.osm_id)
WHERE osm_water_lakeline.osm_id = NEW.osm_id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_lakeline.insert() RETURNS trigger AS
$$
BEGIN
INSERT INTO osm_water_lakeline
SELECT *
FROM osm_water_lakeline_view
WHERE osm_water_lakeline_view.osm_id = NEW.osm_id
-- May happen in case we replay update
ON CONFLICT ON CONSTRAINT osm_water_lakeline_pk
DO NOTHING;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_delete_line
AFTER DELETE
ON osm_water_polygon
FOR EACH ROW
EXECUTE PROCEDURE water_lakeline.delete();
CREATE TRIGGER trigger_update_line
AFTER UPDATE
ON osm_water_polygon
FOR EACH ROW
EXECUTE PROCEDURE water_lakeline.update();
CREATE TRIGGER trigger_insert_line
AFTER INSERT
ON osm_water_polygon
FOR EACH ROW
EXECUTE PROCEDURE water_lakeline.insert();

Wyświetl plik

@ -0,0 +1,213 @@
DROP TRIGGER IF EXISTS trigger_store ON osm_water_polygon;
DROP TRIGGER IF EXISTS trigger_flag ON osm_water_polygon;
DROP TRIGGER IF EXISTS trigger_refresh ON water_name.updates;
CREATE INDEX IF NOT EXISTS lake_centerline_osm_id_idx ON lake_centerline (osm_id);
CREATE INDEX IF NOT EXISTS osm_water_polygon_update_idx ON osm_water_polygon (name, ST_IsValid(geometry))
WHERE name <> '' AND ST_IsValid(geometry);;
CREATE OR REPLACE VIEW osm_water_lakeline_view AS
SELECT wp.osm_id,
ll.wkb_geometry AS geometry,
name,
name_en,
name_de,
update_tags(tags, ll.wkb_geometry) AS tags,
ST_Area(wp.geometry) AS area,
is_intermittent
FROM osm_water_polygon AS wp
INNER JOIN lake_centerline ll ON wp.osm_id = ll.osm_id
WHERE wp.name <> ''
AND ST_IsValid(wp.geometry);
-- etldoc: osm_water_polygon -> osm_water_lakeline
-- etldoc: lake_centerline -> osm_water_lakeline
CREATE TABLE IF NOT EXISTS osm_water_lakeline AS
SELECT *
FROM osm_water_lakeline_view;
DO
$$
BEGIN
ALTER TABLE osm_water_lakeline
ADD CONSTRAINT osm_water_lakeline_pk PRIMARY KEY (osm_id);
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'primary key osm_water_lakeline_pk already exists in osm_water_lakeline.';
END;
$$;
CREATE INDEX IF NOT EXISTS osm_water_lakeline_geometry_idx ON osm_water_lakeline USING gist (geometry);
-- etldoc: osm_water_polygon -> osm_water_point_view
-- etldoc: lake_centerline -> osm_water_point_view
CREATE OR REPLACE VIEW osm_water_point_view AS
SELECT wp.osm_id,
ST_PointOnSurface(wp.geometry) AS geometry,
wp.name,
wp.name_en,
wp.name_de,
CASE
WHEN "natural" = 'bay' THEN 'bay'
WHEN place = 'sea' THEN 'sea'
ELSE 'lake'
END AS class,
update_tags(wp.tags, ST_PointOnSurface(wp.geometry)) AS tags,
-- Area of the feature in square meters
ST_Area(wp.geometry) AS area,
wp.is_intermittent
FROM osm_water_polygon AS wp
LEFT JOIN lake_centerline ll ON wp.osm_id = ll.osm_id
WHERE ll.osm_id IS NULL
AND wp.name <> ''
AND ST_IsValid(wp.geometry);
-- etldoc: osm_water_point_view -> osm_water_point_earth_view
CREATE OR REPLACE VIEW osm_water_point_earth_view AS
SELECT osm_id,
geometry,
name,
name_en,
name_de,
class,
tags,
-- Percentage of the earth's surface covered by this feature (approximately)
-- The constant below is 111,842^2 * 180 * 180, where 111,842 is the length of one degree of latitude at the equator in meters.
area / (405279708033600 * COS(ST_Y(ST_Transform(geometry,4326))*PI()/180)) as earth_area,
is_intermittent
FROM osm_water_point_view;
-- etldoc: osm_water_point_earth_view -> osm_water_point
CREATE TABLE IF NOT EXISTS osm_water_point AS
SELECT *
FROM osm_water_point_earth_view;
DO
$$
BEGIN
ALTER TABLE osm_water_point
ADD CONSTRAINT osm_water_point_pk PRIMARY KEY (osm_id);
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'primary key osm_water_point_pk already exists in osm_water_point.';
END;
$$;
CREATE INDEX IF NOT EXISTS osm_water_point_geometry_idx ON osm_water_point USING gist (geometry);
-- Handle updates
CREATE SCHEMA IF NOT EXISTS water_name;
CREATE TABLE IF NOT EXISTS water_name.osm_ids
(
osm_id bigint,
is_old bool,
PRIMARY KEY (osm_id, is_old)
);
CREATE OR REPLACE FUNCTION update_osm_water_name() RETURNS void AS $$
BEGIN
DELETE FROM osm_water_lakeline
WHERE EXISTS(
SELECT NULL
FROM water_name.osm_ids
WHERE water_name.osm_ids.osm_id = osm_water_lakeline.osm_id
AND water_name.osm_ids.is_old IS TRUE
);
INSERT INTO osm_water_lakeline
SELECT * FROM osm_water_lakeline_view
WHERE EXISTS(
SELECT NULL
FROM water_name.osm_ids
WHERE water_name.osm_ids.osm_id = osm_water_lakeline_view.osm_id
AND water_name.osm_ids.is_old IS FALSE
) ON CONFLICT (osm_id) DO UPDATE SET geometry = excluded.geometry, name = excluded.name, name_en = excluded.name_en,
name_de = excluded.name_de, tags = excluded.tags, area = excluded.area,
is_intermittent = excluded.is_intermittent;
DELETE FROM osm_water_point
WHERE EXISTS(
SELECT NULL
FROM water_name.osm_ids
WHERE water_name.osm_ids.osm_id = osm_water_point.osm_id
AND water_name.osm_ids.is_old IS TRUE
);
INSERT INTO osm_water_point
SELECT * FROM osm_water_point_earth_view
WHERE EXISTS(
SELECT NULL
FROM water_name.osm_ids
WHERE water_name.osm_ids.osm_id = osm_water_point_earth_view.osm_id
AND water_name.osm_ids.is_old IS FALSE
) ON CONFLICT (osm_id) DO UPDATE SET geometry = excluded.geometry, name = excluded.name, name_en = excluded.name_en,
name_de = excluded.name_de, class = excluded.class, tags = excluded.tags,
earth_area = excluded.earth_area, is_intermittent = excluded.is_intermittent;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_name.store() RETURNS trigger AS $$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO water_name.osm_ids (osm_id, is_old) VALUES (OLD.osm_id, TRUE) ON CONFLICT (osm_id, is_old) DO NOTHING;
ELSE
INSERT INTO water_name.osm_ids (osm_id, is_old) VALUES (NEW.osm_id, FALSE) ON CONFLICT (osm_id, is_old) DO NOTHING;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS water_name.updates
(
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION water_name.flag() RETURNS trigger AS
$$
BEGIN
INSERT INTO water_name.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_name.refresh() RETURNS trigger AS
$$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN
RAISE LOG 'Refresh water_name';
-- Analyze tracking and source tables before performing update
ANALYZE water_name.osm_ids;
ANALYZE osm_water_lakeline;
ANALYZE osm_water_point;
PERFORM update_osm_water_name();
-- noinspection SqlWithoutWhere
DELETE FROM water_name.osm_ids;
-- noinspection SqlWithoutWhere
DELETE FROM water_name.updates;
RAISE LOG 'Refresh water_name done in %', age(clock_timestamp(), t);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_water_polygon
FOR EACH ROW
EXECUTE PROCEDURE water_name.store();
CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE
ON osm_water_polygon
FOR EACH STATEMENT
EXECUTE PROCEDURE water_name.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT
ON water_name.updates
INITIALLY DEFERRED
FOR EACH ROW
EXECUTE PROCEDURE water_name.refresh();

Wyświetl plik

@ -1,117 +0,0 @@
DROP TRIGGER IF EXISTS trigger_delete_point ON osm_water_polygon;
DROP TRIGGER IF EXISTS trigger_update_point ON osm_water_polygon;
DROP TRIGGER IF EXISTS trigger_insert_point ON osm_water_polygon;
-- etldoc: osm_water_polygon -> osm_water_point_view
-- etldoc: lake_centerline -> osm_water_point_view
CREATE OR REPLACE VIEW osm_water_point_view AS
SELECT wp.osm_id,
ST_PointOnSurface(wp.geometry) AS geometry,
wp.name,
wp.name_en,
wp.name_de,
CASE
WHEN "natural" = 'bay' THEN 'bay'
WHEN place = 'sea' THEN 'sea'
ELSE 'lake'
END AS class,
update_tags(wp.tags, ST_PointOnSurface(wp.geometry)) AS tags,
-- Area of the feature in square meters
ST_Area(wp.geometry) as area,
wp.is_intermittent
FROM osm_water_polygon AS wp
LEFT JOIN lake_centerline ll ON wp.osm_id = ll.osm_id
WHERE ll.osm_id IS NULL
AND wp.name <> ''
AND ST_IsValid(wp.geometry);
-- etldoc: osm_water_point_view -> osm_water_point_earth_view
CREATE OR REPLACE VIEW osm_water_point_earth_view AS
SELECT osm_id,
geometry,
name,
name_en,
name_de,
class,
tags,
-- Percentage of the earth's surface covered by this feature (approximately)
-- The constant below is 111,842^2 * 180 * 180, where 111,842 is the length of one degree of latitude at the equator in meters.
area / (405279708033600 * COS(ST_Y(ST_Transform(geometry,4326))*PI()/180)) as earth_area,
is_intermittent
FROM osm_water_point_view;
-- etldoc: osm_water_point_earth_view -> osm_water_point
CREATE TABLE IF NOT EXISTS osm_water_point AS
SELECT *
FROM osm_water_point_earth_view;
DO
$$
BEGIN
ALTER TABLE osm_water_point
ADD CONSTRAINT osm_water_point_pk PRIMARY KEY (osm_id);
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'primary key osm_water_point_pk already exists in osm_water_point.';
END;
$$;
CREATE INDEX IF NOT EXISTS osm_water_point_geometry_idx ON osm_water_point USING gist (geometry);
-- Handle updates
CREATE SCHEMA IF NOT EXISTS water_point;
CREATE OR REPLACE FUNCTION water_point.delete() RETURNS trigger AS
$$
BEGIN
DELETE
FROM osm_water_point
WHERE osm_water_point.osm_id = OLD.osm_id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_point.update() RETURNS trigger AS
$$
BEGIN
UPDATE osm_water_point
SET (osm_id, geometry, name, name_en, name_de, tags, area, is_intermittent) =
(SELECT * FROM osm_water_point_view WHERE osm_water_point_view.osm_id = NEW.osm_id)
WHERE osm_water_point.osm_id = NEW.osm_id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_point.insert() RETURNS trigger AS
$$
BEGIN
INSERT INTO osm_water_point
SELECT *
FROM osm_water_point_view
WHERE osm_water_point_view.osm_id = NEW.osm_id
-- May happen in case we replay update
ON CONFLICT ON CONSTRAINT osm_water_point_pk
DO NOTHING;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_delete_point
AFTER DELETE
ON osm_water_polygon
FOR EACH ROW
EXECUTE PROCEDURE water_point.delete();
CREATE TRIGGER trigger_update_point
AFTER UPDATE
ON osm_water_polygon
FOR EACH ROW
EXECUTE PROCEDURE water_point.update();
CREATE TRIGGER trigger_insert_point
AFTER INSERT
ON osm_water_polygon
FOR EACH ROW
EXECUTE PROCEDURE water_point.insert();

Wyświetl plik

@ -35,8 +35,7 @@ layer:
query: (SELECT osm_id, geometry, name, name_en, name_de, {name_languages}, class, intermittent FROM layer_water_name(!bbox!, z(!scale_denominator!))) AS t query: (SELECT osm_id, geometry, name, name_en, name_de, {name_languages}, class, intermittent FROM layer_water_name(!bbox!, z(!scale_denominator!))) AS t
schema: schema:
- ./update_marine_point.sql - ./update_marine_point.sql
- ./update_water_lakeline.sql - ./update_water_name.sql
- ./update_water_point.sql
- ./water_name.sql - ./water_name.sql
datasources: datasources:
- type: imposm3 - type: imposm3

Wyświetl plik

@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trigger_important_waterway_linestring ON osm_important_waterway_linestring; DROP TRIGGER IF EXISTS trigger_important_waterway_linestring_store ON osm_important_waterway_linestring;
DROP TRIGGER IF EXISTS trigger_store ON osm_waterway_linestring; DROP TRIGGER IF EXISTS trigger_store ON osm_waterway_linestring;
DROP TRIGGER IF EXISTS trigger_flag ON osm_waterway_linestring; DROP TRIGGER IF EXISTS trigger_flag ON osm_waterway_linestring;
DROP TRIGGER IF EXISTS trigger_refresh ON waterway_important.updates; DROP TRIGGER IF EXISTS trigger_refresh ON waterway_important.updates;
@ -7,54 +7,183 @@ DROP TRIGGER IF EXISTS trigger_refresh ON waterway_important.updates;
-- This helps to drop not important rivers (since they do not have a name) -- This helps to drop not important rivers (since they do not have a name)
-- and also makes it possible to filter out too short rivers -- and also makes it possible to filter out too short rivers
CREATE INDEX IF NOT EXISTS osm_waterway_linestring_waterway_partial_idx -- Index for filling and updating osm_important_waterway_linestring table
ON osm_waterway_linestring ((true)) CREATE UNIQUE INDEX IF NOT EXISTS osm_waterway_linestring_waterway_partial_idx
ON osm_waterway_linestring (osm_id)
WHERE name <> '' WHERE name <> ''
AND waterway = 'river' AND waterway = 'river'
AND ST_IsValid(geometry); AND ST_IsValid(geometry);
-- Analyze created index
ANALYZE osm_waterway_linestring;
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring ( CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring (
id SERIAL PRIMARY KEY, id SERIAL,
geometry geometry, geometry geometry('LineString'),
source_ids bigint[],
name varchar, name varchar,
name_en varchar, name_en varchar,
name_de varchar, name_de varchar,
tags hstore tags hstore
); );
-- etldoc: osm_waterway_linestring -> osm_important_waterway_linestring -- Create osm_important_waterway_linestring_gen_z11 as a copy of osm_important_waterway_linestring but drop the
INSERT INTO osm_important_waterway_linestring (geometry, name, name_en, name_de, tags) -- "source_ids" column. This can be done because z10 and z9 tables are only simplified and not merged, therefore
SELECT (ST_Dump(geometry)).geom AS geometry, -- relations to sources are direct via the id column.
name,
name_en,
name_de,
tags
FROM (
SELECT ST_LineMerge(ST_Union(geometry)) AS geometry,
name,
name_en,
name_de,
slice_language_tags(tags) AS tags
FROM osm_waterway_linestring
WHERE name <> ''
AND waterway = 'river'
AND ST_IsValid(geometry)
GROUP BY name, name_en, name_de, slice_language_tags(tags)
) AS waterway_union;
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_geometry_idx ON osm_important_waterway_linestring USING gist (geometry);
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen_z11 CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen_z11
(LIKE osm_important_waterway_linestring); (LIKE osm_important_waterway_linestring);
ALTER TABLE osm_important_waterway_linestring_gen_z11 DROP COLUMN IF EXISTS source_ids;
-- Create osm_important_waterway_linestring_gen_z10 as a copy of osm_important_waterway_linestring_gen_z11
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen_z10 CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen_z10
(LIKE osm_important_waterway_linestring_gen_z11); (LIKE osm_important_waterway_linestring_gen_z11);
-- Create osm_important_waterway_linestring_gen_z9 as a copy of osm_important_waterway_linestring_gen_z10
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen_z9 CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen_z9
(LIKE osm_important_waterway_linestring_gen_z10); (LIKE osm_important_waterway_linestring_gen_z10);
CREATE OR REPLACE FUNCTION insert_important_waterway_linestring_gen(update_id bigint) RETURNS void AS -- Create OneToMany-Relation-Table storing relations of a Merged-LineString in table
$$ -- osm_important_waterway_linestring to Source-LineStrings from table osm_waterway_linestring
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_source_ids(
id int,
source_id bigint,
PRIMARY KEY (id, source_id)
);
-- Ensure tables are emtpy if they haven't been created
TRUNCATE osm_important_waterway_linestring;
TRUNCATE osm_important_waterway_linestring_source_ids;
-- etldoc: osm_waterway_linestring -> osm_important_waterway_linestring
-- Merge LineStrings from osm_waterway_linestring by grouping them and creating intersecting
-- clusters of each group via ST_ClusterDBSCAN
INSERT INTO osm_important_waterway_linestring (geometry, source_ids, name, name_en, name_de, tags)
SELECT (ST_Dump(ST_LineMerge(ST_Union(geometry)))).geom AS geometry,
-- We use St_Union instead of St_Collect to ensure no overlapping points exist within the geometries
-- to merge. https://postgis.net/docs/ST_Union.html
-- ST_LineMerge only merges across singular intersections and groups its output into a MultiLineString
-- if more than two LineStrings form an intersection or no intersection could be found.
-- https://postgis.net/docs/ST_LineMerge.html
-- In order to not end up with a mixture of LineStrings and MultiLineStrings we dump eventual
-- MultiLineStrings via ST_Dump. https://postgis.net/docs/ST_Dump.html
array_agg(osm_id) as source_ids,
name,
name_en,
name_de,
slice_language_tags(tags) AS tags
FROM (
SELECT *,
-- Get intersecting clusters by setting minimum distance to 0 and minimum intersecting points to 1.
-- https://postgis.net/docs/ST_ClusterDBSCAN.html
ST_ClusterDBSCAN(geometry, 0, 1) OVER (
PARTITION BY name, name_en, name_de, slice_language_tags(tags)
) AS cluster,
-- ST_ClusterDBSCAN returns an increasing integer as the cluster-ids within each partition starting at 0.
-- This leads to clusters having the same ID across multiple partitions therefore we generate a
-- Cluster-Group-ID by utilizing the DENSE_RANK function sorted over the partition columns.
DENSE_RANK() OVER (ORDER BY name, name_en, name_de, slice_language_tags(tags)) as cluster_group
FROM osm_waterway_linestring
WHERE name <> '' AND waterway = 'river' AND ST_IsValid(geometry)
) q
GROUP BY cluster_group, cluster, name, name_en, name_de, slice_language_tags(tags);
-- Geometry Index
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_geometry_idx
ON osm_important_waterway_linestring USING gist (geometry);
-- Create Primary-Keys for osm_important_waterway_linestring and osm_important_waterway_linestring_gen_z11/z10/z9 tables
DO $$
BEGIN BEGIN
IF NOT EXISTS (
SELECT constraint_name
FROM information_schema.table_constraints
WHERE table_name = 'osm_important_waterway_linestring' AND constraint_type = 'PRIMARY KEY'
) THEN
ALTER TABLE osm_important_waterway_linestring ADD PRIMARY KEY (id);
END IF;
IF NOT EXISTS (
SELECT constraint_name
FROM information_schema.table_constraints
WHERE table_name = 'osm_important_waterway_linestring_gen_z11' AND constraint_type = 'PRIMARY KEY'
) THEN
ALTER TABLE osm_important_waterway_linestring_gen_z11 ADD PRIMARY KEY (id);
END IF;
IF NOT EXISTS (
SELECT constraint_name
FROM information_schema.table_constraints
WHERE table_name = 'osm_important_waterway_linestring_gen_z10' AND constraint_type = 'PRIMARY KEY'
) THEN
ALTER TABLE osm_important_waterway_linestring_gen_z10 ADD PRIMARY KEY (id);
END IF;
IF NOT EXISTS (
SELECT constraint_name
FROM information_schema.table_constraints
WHERE table_name = 'osm_important_waterway_linestring_gen_z9' AND constraint_type = 'PRIMARY KEY'
) THEN
ALTER TABLE osm_important_waterway_linestring_gen_z9 ADD PRIMARY KEY (id);
END IF;
END;
$$ LANGUAGE plpgsql;
-- Index for storing OSM-IDs of Source-LineStrings
CREATE UNIQUE INDEX IF NOT EXISTS osm_waterway_linestring_osm_id_idx ON osm_waterway_linestring ("osm_id");
-- Indexes which can be utilized during full-update for queries originating from
-- insert_important_waterway_linestring_gen() function
CREATE UNIQUE INDEX IF NOT EXISTS osm_important_waterway_linestring_update_idx
ON osm_important_waterway_linestring (id) WHERE ST_Length(geometry) > 1000;
-- Analyze populated table with indexes
ANALYZE osm_important_waterway_linestring;
-- Store OSM-IDs of Source-LineStrings by intersecting Merged-LineStrings with their sources. This required because
-- ST_LineMerge only merges across singular intersections and groups its output into a MultiLineString if
-- more than two LineStrings form an intersection or no intersection could be found.
-- Execute after indexes have been created on osm_highway_linestring_gen_z11 to improve performance
INSERT INTO osm_important_waterway_linestring_source_ids (id, source_id)
SELECT m.id, m.source_id
FROM (
SELECT id, unnest(source_ids) AS source_id, geometry
FROM osm_important_waterway_linestring
) m
JOIN osm_waterway_linestring s ON (m.source_id = s.osm_id)
WHERE ST_Intersects(s.geometry, m.geometry)
ON CONFLICT (id, source_id) DO NOTHING;
-- Drop temporary Merged-LineString to Source-LineStrings-ID column
ALTER TABLE osm_important_waterway_linestring DROP COLUMN IF EXISTS source_ids;
CREATE SCHEMA IF NOT EXISTS waterway_important;
CREATE TABLE IF NOT EXISTS waterway_important.changes_z9_z10_z11
(
is_old boolean,
id integer,
PRIMARY KEY (is_old, id)
);
CREATE OR REPLACE FUNCTION insert_important_waterway_linestring_gen(full_update bool) RETURNS void AS
$$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN
RAISE LOG 'Refresh waterway z9 z10 z11';
-- Analyze tracking and source tables before performing update
ANALYZE waterway_important.changes_z9_z10_z11;
ANALYZE osm_important_waterway_linestring;
-- Remove entries which have been deleted from source table
DELETE FROM osm_important_waterway_linestring_gen_z11
USING waterway_important.changes_z9_z10_z11
WHERE full_update IS TRUE OR (
waterway_important.changes_z9_z10_z11.is_old IS TRUE AND
waterway_important.changes_z9_z10_z11.id = osm_important_waterway_linestring_gen_z11.id
);
-- etldoc: osm_important_waterway_linestring -> osm_important_waterway_linestring_gen_z11 -- etldoc: osm_important_waterway_linestring -> osm_important_waterway_linestring_gen_z11
INSERT INTO osm_important_waterway_linestring_gen_z11 (geometry, id, name, name_en, name_de, tags) INSERT INTO osm_important_waterway_linestring_gen_z11 (geometry, id, name, name_en, name_de, tags)
SELECT ST_Simplify(geometry, ZRes(12)) AS geometry, SELECT ST_Simplify(geometry, ZRes(12)) AS geometry,
@ -64,9 +193,28 @@ BEGIN
name_de, name_de,
tags tags
FROM osm_important_waterway_linestring FROM osm_important_waterway_linestring
WHERE WHERE (
(update_id IS NULL OR id = update_id) AND full_update OR
ST_Length(geometry) > 1000; EXISTS(
SELECT NULL
FROM waterway_important.changes_z9_z10_z11
WHERE waterway_important.changes_z9_z10_z11.is_old IS FALSE AND
waterway_important.changes_z9_z10_z11.id = osm_important_waterway_linestring.id
)
) AND ST_Length(geometry) > 1000
ON CONFLICT (id) DO UPDATE SET geometry = excluded.geometry, name = excluded.name, name_en = excluded.name_en,
name_de = excluded.name_de, tags = excluded.tags;
-- Analyze source table
ANALYZE osm_important_waterway_linestring_gen_z11;
-- Remove entries which have been deleted from source table
DELETE FROM osm_important_waterway_linestring_gen_z10
USING waterway_important.changes_z9_z10_z11
WHERE full_update IS TRUE OR (
waterway_important.changes_z9_z10_z11.is_old IS TRUE AND
waterway_important.changes_z9_z10_z11.id = osm_important_waterway_linestring_gen_z10.id
);
-- etldoc: osm_important_waterway_linestring_gen_z11 -> osm_important_waterway_linestring_gen_z10 -- etldoc: osm_important_waterway_linestring_gen_z11 -> osm_important_waterway_linestring_gen_z10
INSERT INTO osm_important_waterway_linestring_gen_z10 (geometry, id, name, name_en, name_de, tags) INSERT INTO osm_important_waterway_linestring_gen_z10 (geometry, id, name, name_en, name_de, tags)
@ -77,9 +225,28 @@ BEGIN
name_de, name_de,
tags tags
FROM osm_important_waterway_linestring_gen_z11 FROM osm_important_waterway_linestring_gen_z11
WHERE WHERE (
(update_id IS NULL OR id = update_id) AND full_update OR
ST_Length(geometry) > 4000; EXISTS(
SELECT NULL
FROM waterway_important.changes_z9_z10_z11
WHERE waterway_important.changes_z9_z10_z11.is_old IS FALSE AND
waterway_important.changes_z9_z10_z11.id = osm_important_waterway_linestring_gen_z11.id
)
) AND ST_Length(geometry) > 4000
ON CONFLICT (id) DO UPDATE SET geometry = excluded.geometry, name = excluded.name, name_en = excluded.name_en,
name_de = excluded.name_de, tags = excluded.tags;
-- Analyze source table
ANALYZE osm_important_waterway_linestring_gen_z10;
-- Remove entries which have been deleted from source table
DELETE FROM osm_important_waterway_linestring_gen_z9
USING waterway_important.changes_z9_z10_z11
WHERE full_update IS TRUE OR (
waterway_important.changes_z9_z10_z11.is_old IS TRUE AND
waterway_important.changes_z9_z10_z11.id = osm_important_waterway_linestring_gen_z9.id
);
-- etldoc: osm_important_waterway_linestring_gen_z10 -> osm_important_waterway_linestring_gen_z9 -- etldoc: osm_important_waterway_linestring_gen_z10 -> osm_important_waterway_linestring_gen_z9
INSERT INTO osm_important_waterway_linestring_gen_z9 (geometry, id, name, name_en, name_de, tags) INSERT INTO osm_important_waterway_linestring_gen_z9 (geometry, id, name, name_en, name_de, tags)
@ -90,17 +257,39 @@ BEGIN
name_de, name_de,
tags tags
FROM osm_important_waterway_linestring_gen_z10 FROM osm_important_waterway_linestring_gen_z10
WHERE WHERE (
(update_id IS NULL OR id = update_id) AND full_update OR
ST_Length(geometry) > 8000; EXISTS(
SELECT NULL
FROM waterway_important.changes_z9_z10_z11
WHERE waterway_important.changes_z9_z10_z11.is_old IS FALSE AND
waterway_important.changes_z9_z10_z11.id = osm_important_waterway_linestring_gen_z10.id
)
) AND ST_Length(geometry) > 8000
ON CONFLICT (id) DO UPDATE SET geometry = excluded.geometry, name = excluded.name, name_en = excluded.name_en,
name_de = excluded.name_de, tags = excluded.tags;
-- noinspection SqlWithoutWhere
DELETE FROM waterway_important.changes_z9_z10_z11;
RAISE LOG 'Refresh waterway z9 z10 z11 done in %', age(clock_timestamp(), t);
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
-- Ensure tables are emtpy if they haven't been created
TRUNCATE osm_important_waterway_linestring_gen_z11; TRUNCATE osm_important_waterway_linestring_gen_z11;
TRUNCATE osm_important_waterway_linestring_gen_z10; TRUNCATE osm_important_waterway_linestring_gen_z10;
TRUNCATE osm_important_waterway_linestring_gen_z9; TRUNCATE osm_important_waterway_linestring_gen_z9;
SELECT insert_important_waterway_linestring_gen(NULL);
SELECT insert_important_waterway_linestring_gen(TRUE);
-- Indexes for queries originating from insert_important_waterway_linestring_gen() function
CREATE UNIQUE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z11_update_idx
ON osm_important_waterway_linestring_gen_z11 (id) WHERE ST_Length(geometry) > 4000;
CREATE UNIQUE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z10_update_idx
ON osm_important_waterway_linestring_gen_z10 (id) WHERE ST_Length(geometry) > 8000;
-- Geometry Indexes
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z11_geometry_idx CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z11_geometry_idx
ON osm_important_waterway_linestring_gen_z11 USING gist (geometry); ON osm_important_waterway_linestring_gen_z11 USING gist (geometry);
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z10_geometry_idx CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z10_geometry_idx
@ -109,35 +298,57 @@ CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z9_geometry_idx
ON osm_important_waterway_linestring_gen_z9 USING gist (geometry); ON osm_important_waterway_linestring_gen_z9 USING gist (geometry);
-- Handle updates -- Handle updates on
-- -- osm_waterway_linestring -> osm_important_waterway_linestring
-- -- osm_important_waterway_linestring -> osm_important_waterway_linestring_gen_z11
-- -- osm_important_waterway_linestring -> osm_important_waterway_linestring_gen_z10
-- -- osm_important_waterway_linestring -> osm_important_waterway_linestring_gen_z9
CREATE SCHEMA IF NOT EXISTS waterway_important; CREATE OR REPLACE AGGREGATE array_cat_agg(anycompatiblearray) (
SFUNC=array_cat,
STYPE=anycompatiblearray,
INITCOND = '{}'
);
CREATE TABLE IF NOT EXISTS waterway_important.changes CREATE TABLE IF NOT EXISTS waterway_important.changes
( (
id serial PRIMARY KEY,
osm_id bigint, osm_id bigint,
is_old boolean, is_old boolean,
name character varying, PRIMARY KEY (is_old, osm_id)
name_en character varying,
name_de character varying,
tags hstore
); );
-- Store IDs of changed elements from osm_waterway_linestring table.
CREATE OR REPLACE FUNCTION waterway_important.store() RETURNS trigger AS CREATE OR REPLACE FUNCTION waterway_important.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
IF (tg_op IN ('DELETE', 'UPDATE')) AND OLD.name <> '' AND OLD.waterway = 'river' THEN IF (tg_op IN ('DELETE', 'UPDATE')) AND OLD.name <> '' AND OLD.waterway = 'river' THEN
INSERT INTO waterway_important.changes(is_old, name, name_en, name_de, tags) INSERT INTO waterway_important.changes(is_old, osm_id)
VALUES (TRUE, OLD.name, OLD.name_en, OLD.name_de, slice_language_tags(OLD.tags)); VALUES (TRUE, old.osm_id) ON CONFLICT DO NOTHING;
END IF; END IF;
IF (tg_op IN ('UPDATE', 'INSERT')) AND NEW.name <> '' AND NEW.waterway = 'river' THEN IF (tg_op IN ('UPDATE', 'INSERT')) AND NEW.name <> '' AND NEW.waterway = 'river' THEN
INSERT INTO waterway_important.changes(is_old, name, name_en, name_de, tags) INSERT INTO waterway_important.changes(is_old, osm_id)
VALUES (FALSE, NEW.name, NEW.name_en, NEW.name_de, slice_language_tags(NEW.tags)); VALUES (FALSE, new.osm_id) ON CONFLICT DO NOTHING;
END IF; END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
-- Store IDs of changed elements from osm_important_waterway_linestring table.
CREATE OR REPLACE FUNCTION waterway_important.important_waterway_linestring_store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'UPDATE' OR tg_op = 'DELETE') THEN
INSERT INTO waterway_important.changes_z9_z10_z11 (is_old, id) VALUES (TRUE, old.id) ON CONFLICT DO NOTHING ;
END IF;
IF (tg_op = 'UPDATE' OR tg_op = 'INSERT') THEN
INSERT INTO waterway_important.changes_z9_z10_z11 (is_old, id) VALUES (FALSE, new.id) ON CONFLICT DO NOTHING;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS waterway_important.updates CREATE TABLE IF NOT EXISTS waterway_important.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
@ -161,93 +372,182 @@ BEGIN
-- REFRESH osm_important_waterway_linestring -- REFRESH osm_important_waterway_linestring
-- Compact the change history to keep only the first and last version, and then uniq version of row -- Analyze tracking and source tables before performing update
CREATE TEMP TABLE changes_compact AS ANALYZE waterway_important.changes;
SELECT DISTINCT ON (name, name_en, name_de, tags) ANALYZE osm_waterway_linestring;
name,
name_en,
name_de,
tags
FROM ((
SELECT DISTINCT ON (osm_id) *
FROM waterway_important.changes
WHERE is_old
ORDER BY osm_id,
id ASC
)
UNION ALL
(
SELECT DISTINCT ON (osm_id) *
FROM waterway_important.changes
WHERE NOT is_old
ORDER BY osm_id,
id DESC
)) AS t;
-- Fetch updated and deleted Merged-LineString from relation-table filtering for each Merged-LineString which
-- contains an updated Source-LineString.
-- Additionally attach a list of Source-LineString-IDs to each Merged-LineString in order to unnest them later.
CREATE TEMPORARY TABLE affected_merged_linestrings AS
SELECT m.id, array_agg(source_id) AS source_ids
FROM osm_important_waterway_linestring_source_ids m
WHERE EXISTS(
SELECT NULL
FROM waterway_important.changes c
WHERE c.is_old IS TRUE AND c.osm_id = m.source_id
)
GROUP BY id;
-- Analyze the created table to speed up subsequent queries
ANALYZE affected_merged_linestrings;
-- Delete all Merged-LineStrings which contained an updated or deleted Source-LineString
DELETE DELETE
FROM osm_important_waterway_linestring AS w FROM osm_important_waterway_linestring m
USING changes_compact AS c USING affected_merged_linestrings
WHERE w.name = c.name WHERE affected_merged_linestrings.id = m.id;
AND w.name_en IS NOT DISTINCT FROM c.name_en DELETE
AND w.name_de IS NOT DISTINCT FROM c.name_de FROM osm_important_waterway_linestring_source_ids m
AND w.tags IS NOT DISTINCT FROM c.tags; USING affected_merged_linestrings
WHERE affected_merged_linestrings.id = m.id;
INSERT INTO osm_important_waterway_linestring (geometry, name, name_en, name_de, tags) -- Analyze the tables affected by the delete-query in order to speed up subsequent queries
SELECT (ST_Dump(geometry)).geom AS geometry, ANALYZE osm_important_waterway_linestring;
name, ANALYZE osm_important_waterway_linestring_source_ids;
name_en,
name_de, -- Create a table containing all LineStrings which should be merged
tags CREATE TEMPORARY TABLE linestrings_to_merge AS
-- Add all Source-LineStrings affected by this update
SELECT osm_id, NULL::INTEGER AS id, NULL::BIGINT[] AS source_ids, geometry, name, name_en, name_de,
slice_language_tags(tags) as tags
-- Table containing the IDs of all Source-LineStrings affected by this update
FROM ( FROM (
SELECT ST_LineMerge(ST_Union(geometry)) AS geometry, -- Get Source-LineString-IDs of deleted or updated elements
w.name, SELECT unnest(affected_merged_linestrings.source_ids)::bigint AS source_id FROM affected_merged_linestrings
w.name_en, UNION
w.name_de, -- Get Source-LineString-IDs of inserted or updated elements
slice_language_tags(w.tags) AS tags SELECT osm_id AS source_id FROM waterway_important.changes WHERE is_old IS FALSE
FROM osm_waterway_linestring AS w ORDER BY source_id
JOIN changes_compact AS c ON ) affected_source_linestrings
w.name = c.name AND w.name_en IS NOT DISTINCT FROM c.name_en AND JOIN osm_waterway_linestring ON (
w.name_de IS NOT DISTINCT FROM c.name_de AND affected_source_linestrings.source_id = osm_waterway_linestring.osm_id
slice_language_tags(w.tags) IS NOT DISTINCT FROM c.tags )
WHERE w.name <> '' WHERE name <> '' AND waterway = 'river' AND ST_IsValid(geometry);
AND w.waterway = 'river'
AND ST_IsValid(geometry) -- Drop temporary tables early to save resources
GROUP BY w.name, w.name_en, w.name_de, slice_language_tags(w.tags) DROP TABLE affected_merged_linestrings;
) AS waterway_union;
-- Analyze the created table to speed up subsequent queries
ANALYZE linestrings_to_merge;
-- Add all Merged-LineStrings intersecting with Source-LineStrings affected by this update
INSERT INTO linestrings_to_merge
SELECT NULL::BIGINT AS osm_id, m.id,
ARRAY(
SELECT s.source_id FROM osm_important_waterway_linestring_source_ids s WHERE s.id = m.id
)::BIGINT[] AS source_ids,
m.geometry, m.name, m.name_en, m.name_de, m.tags
FROM linestrings_to_merge
JOIN osm_important_waterway_linestring m ON (ST_Intersects(linestrings_to_merge.geometry, m.geometry));
-- Analyze the created table to speed up subsequent queries
ANALYZE linestrings_to_merge;
-- Delete all Merged-LineStrings intersecting with Source-LineStrings affected by this update.
-- We can use the linestrings_to_merge table since Source-LineStrings affected by this update and present in the
-- table will have their ID-Column set to NULL by the previous query.
DELETE
FROM osm_important_waterway_linestring m
USING linestrings_to_merge
WHERE m.id = linestrings_to_merge.id;
DELETE
FROM osm_important_waterway_linestring_source_ids m
USING linestrings_to_merge
WHERE m.id = linestrings_to_merge.id;
-- Create table containing all LineStrings to and create clusters of intersecting LineStrings partitioned by their
-- groups
CREATE TEMPORARY TABLE clustered_linestrings_to_merge AS
SELECT *,
-- Get intersecting clusters by setting minimum distance to 0 and minimum intersecting points to 1.
-- https://postgis.net/docs/ST_ClusterDBSCAN.html
ST_ClusterDBSCAN(geometry, 0, 1) OVER (PARTITION BY name, name_en, name_de, tags) AS cluster,
-- ST_ClusterDBSCAN returns an increasing integer as the cluster-ids within each partition starting at 0.
-- This leads to clusters having the same ID across multiple partitions therefore we generate a
-- Cluster-Group-ID by utilizing the DENSE_RANK function sorted over the partition columns.
DENSE_RANK() OVER (ORDER BY name, name_en, name_de, tags) as cluster_group
FROM linestrings_to_merge;
-- Drop temporary tables early to save resources
DROP TABLE linestrings_to_merge;
-- Create index on cluster columns and analyze the created table to speed up subsequent queries
CREATE INDEX ON clustered_linestrings_to_merge (cluster_group, cluster);
ANALYZE clustered_linestrings_to_merge;
-- Create temporary Merged-LineString to Source-LineStrings-ID columns to store relations before they have been
-- intersected
ALTER TABLE osm_important_waterway_linestring ADD COLUMN IF NOT EXISTS new_source_ids BIGINT[];
ALTER TABLE osm_important_waterway_linestring ADD COLUMN IF NOT EXISTS old_source_ids BIGINT[];
WITH inserted_linestrings AS (
-- Merge LineStrings of each cluster and insert them
INSERT INTO osm_important_waterway_linestring (geometry, new_source_ids, old_source_ids, name, name_en, name_de,
tags)
SELECT (ST_Dump(ST_LineMerge(ST_Union(geometry)))).geom AS geometry,
-- We use St_Union instead of St_Collect to ensure no overlapping points exist within the geometries
-- to merge. https://postgis.net/docs/ST_Union.html
-- ST_LineMerge only merges across singular intersections and groups its output into a MultiLineString
-- if more than two LineStrings form an intersection or no intersection could be found.
-- https://postgis.net/docs/ST_LineMerge.html
-- In order to not end up with a mixture of LineStrings and MultiLineStrings we dump eventual
-- MultiLineStrings via ST_Dump. https://postgis.net/docs/ST_Dump.html
coalesce( array_agg(osm_id) FILTER (WHERE osm_id IS NOT NULL), '{}' )::BIGINT[] AS new_source_ids,
array_cat_agg(source_ids)::BIGINT[] as old_source_ids,
name,
name_en,
name_de,
tags
FROM clustered_linestrings_to_merge
GROUP BY cluster_group, cluster, name, name_en, name_de, tags
RETURNING id, new_source_ids, old_source_ids, geometry
)
-- Store OSM-IDs of Source-LineStrings by intersecting Merged-LineStrings with their sources.
-- This is required because ST_LineMerge only merges across singular intersections and groups its output into a
-- MultiLineString if more than two LineStrings form an intersection or no intersection could be found.
INSERT INTO osm_important_waterway_linestring_source_ids (id, source_id)
SELECT m.id, source_id
FROM (
SELECT id, source_id, geometry
FROM inserted_linestrings
CROSS JOIN LATERAL (
SELECT DISTINCT all_source_ids.source_id
FROM unnest(
array_cat(inserted_linestrings.new_source_ids, inserted_linestrings.old_source_ids)
) AS all_source_ids(source_id)
) source_ids
) m
JOIN osm_waterway_linestring s ON (m.source_id = s.osm_id)
WHERE ST_Intersects(s.geometry, m.geometry)
ON CONFLICT (id, source_id) DO NOTHING;
-- Cleanup remaining table
DROP TABLE clustered_linestrings_to_merge;
-- Drop temporary Merged-LineString to Source-LineStrings-ID columns
ALTER TABLE osm_important_waterway_linestring DROP COLUMN IF EXISTS new_source_ids;
ALTER TABLE osm_important_waterway_linestring DROP COLUMN IF EXISTS old_source_ids;
DROP TABLE changes_compact;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM waterway_important.changes; DELETE FROM waterway_important.changes;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM waterway_important.updates; DELETE FROM waterway_important.updates;
RAISE LOG 'Refresh waterway done in %', age(clock_timestamp(), t); RAISE LOG 'Refresh waterway done in %', age(clock_timestamp(), t);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION waterway_important.important_waterway_linestring_gen_refresh() RETURNS trigger AS -- Update z11, z10 and z9 tables
$$ PERFORM insert_important_waterway_linestring_gen(FALSE);
BEGIN
IF (tg_op = 'DELETE' OR tg_op = 'UPDATE') THEN
DELETE FROM osm_important_waterway_linestring_gen_z11 WHERE id = old.id;
DELETE FROM osm_important_waterway_linestring_gen_z10 WHERE id = old.id;
DELETE FROM osm_important_waterway_linestring_gen_z9 WHERE id = old.id;
END IF;
IF (tg_op = 'UPDATE' OR tg_op = 'INSERT') THEN
PERFORM insert_important_waterway_linestring_gen(new.id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_important_waterway_linestring CREATE TRIGGER trigger_important_waterway_linestring_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_important_waterway_linestring ON osm_important_waterway_linestring
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE waterway_important.important_waterway_linestring_gen_refresh(); EXECUTE PROCEDURE waterway_important.important_waterway_linestring_store();
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE

Wyświetl plik

@ -75,13 +75,28 @@ echo " : Minimum required Docker version: $MIN_DOCKER_VER+"
echo " : Minimum required docker-compose version: $MIN_COMPOSE_VER+" echo " : Minimum required docker-compose version: $MIN_COMPOSE_VER+"
echo " : See the .travis build for the currently supported versions." echo " : See the .travis build for the currently supported versions."
echo " : Your docker system:" echo " : Your docker system:"
if ! command -v docker-compose &> /dev/null; then
DOCKER_COMPOSE_HYPHEN=false
else
DOCKER_COMPOSE_HYPHEN=true
fi
function docker_compose_command () {
if $DOCKER_COMPOSE_HYPHEN; then
docker-compose $@
else
docker compose $@
fi
}
docker --version docker --version
docker-compose --version docker_compose_command --version
# based on: http://stackoverflow.com/questions/16989598/bash-comparing-version-numbers # based on: http://stackoverflow.com/questions/16989598/bash-comparing-version-numbers
function version { echo "$@" | tr -d 'v' | tr -cs '0-9.' '.' | awk -F. '{ printf("%03d%03d%03d\n", $1,$2,$3); }'; } function version { echo "$@" | tr -d 'v' | tr -cs '0-9.' '.' | awk -F. '{ printf("%03d%03d%03d\n", $1,$2,$3); }'; }
COMPOSE_VER=$(docker-compose version --short) COMPOSE_VER=$(docker_compose_command version --short)
if [ "$(version "$COMPOSE_VER")" -lt "$(version "$MIN_COMPOSE_VER")" ]; then if [ "$(version "$COMPOSE_VER")" -lt "$(version "$MIN_COMPOSE_VER")" ]; then
echo "ERR: Your Docker-compose version is known to have bugs, please update docker-compose!" echo "ERR: Your Docker-compose version is known to have bugs, please update docker-compose!"
exit 1 exit 1
@ -116,7 +131,7 @@ echo " : Started : $STARTDATE "
echo " : Your bash version: $BASH_VERSION" echo " : Your bash version: $BASH_VERSION"
echo " : Your OS : $OSTYPE" echo " : Your OS : $OSTYPE"
docker --version docker --version
docker-compose --version docker_compose_command --version
if [[ "$OSTYPE" == "linux-gnu" ]]; then if [[ "$OSTYPE" == "linux-gnu" ]]; then
echo " " echo " "
@ -148,6 +163,13 @@ else
echo " " echo " "
fi fi
# override the output filename based on the area if the default `tiles.mbtiles` is found
if [[ "$(source .env ; echo "$MBTILES_FILE")" = "tiles.mbtiles" ]]; then
MBTILES_FILENAME=${area}.mbtiles
else
MBTILES_FILENAME=$(source .env ; echo "$MBTILES_FILE")
fi
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : Stopping running services & removing old containers" echo "====> : Stopping running services & removing old containers"
@ -165,8 +187,8 @@ make init-dirs
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : Removing old MBTILES if exists ( ./data/${area}.mbtiles ) " echo "====> : Removing old MBTILES if exists ( ./data/$MBTILES_FILENAME ) "
rm -f "./data/${area}.mbtiles" rm -f "./data/$MBTILES_FILENAME"
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
@ -277,9 +299,9 @@ fi
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : Start generating MBTiles (containing gzipped MVT PBF) using PostGIS. " echo "====> : Start generating MBTiles (containing gzipped MVT PBF) using PostGIS. "
echo " : Output MBTiles: ./data/${area}.mbtiles " echo " : Output MBTiles: $MBTILES_FILENAME "
echo " : Source code: https://github.com/openmaptiles/openmaptiles-tools/blob/master/bin/generate-tiles " echo " : Source code: https://github.com/openmaptiles/openmaptiles-tools/blob/master/bin/generate-tiles "
make generate-tiles-pg MBTILES_FILE=$MBTILES_FILENAME make generate-tiles-pg
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
@ -291,8 +313,7 @@ echo "--------------------------------------------------------------------------
echo "====> : Inputs - Outputs md5sum for debugging " echo "====> : Inputs - Outputs md5sum for debugging "
rm -f ./data/quickstart_checklist.chk rm -f ./data/quickstart_checklist.chk
{ {
find build -type f | sort | xargs md5sum find build data -type f -exec md5sum {} + | sort -k2
find data -type f | sort | xargs md5sum
} >> ./data/quickstart_checklist.chk } >> ./data/quickstart_checklist.chk
cat ./data/quickstart_checklist.chk cat ./data/quickstart_checklist.chk
@ -311,7 +332,7 @@ docker images | grep openmaptiles
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : (disk space) We have created the new vectortiles ( ./data/${area}.mbtiles ) " echo "====> : (disk space) We have created the new vectortiles ( ./data/$MBTILES_FILENAME ) "
echo " : Please respect the licenses (OdBL for OSM data) of the sources when distributing the MBTiles file." echo " : Please respect the licenses (OdBL for OSM data) of the sources when distributing the MBTiles file."
echo " : Data directory content:" echo " : Data directory content:"
ls -la ./data ls -la ./data

Wyświetl plik

@ -165,4 +165,14 @@
<tag k="ref" v="95"/> <tag k="ref" v="95"/>
<tag k="description" v="I-95 Southbound"/> <tag k="description" v="I-95 Southbound"/>
</relation> </relation>
<!-- Zoom-Level 5 Trunk National Network -->
<relation id="517" visible="true" timestamp="2019-01-01T00:00:00Z" version="1" changeset="1" user="u" uid="1">
<member type="way" ref="5001" role=""/>
<tag k="type" v="route"/>
<tag k="route" v="road"/>
<tag k="network" v="US:I"/>
<tag k="ref" v="94"/>
<tag k="description" v="I-94"/>
</relation>
</osm> </osm>

Wyświetl plik

@ -28,4 +28,28 @@
<tag k="amenity" v="parcel_locker"/> <tag k="amenity" v="parcel_locker"/>
<tag k="operator" v="OpenMapTiles Parcel Locker"/> <tag k="operator" v="OpenMapTiles Parcel Locker"/>
</node> </node>
<node id="600007" visible="true" timestamp="2019-01-01T00:00:00Z" version="1" lat="35.8" lon="-80.8">
<tag k="amenity" v="charging_station"/>
<tag k="name" v="OpenMapTiles Charging Station"/>
<tag k="brand" v="OpenMapTiles Charging Station Brand"/>
</node>
<node id="600008" visible="true" timestamp="2019-01-01T00:00:00Z" version="1" lat="34.0" lon="-80.0" />
<node id="600009" visible="true" timestamp="2019-01-01T00:00:00Z" version="1" lat="34.1" lon="-80.0" />
<node id="600010" visible="true" timestamp="2019-01-01T00:00:00Z" version="1" lat="34.1" lon="-80.1" />
<node id="600011" visible="true" timestamp="2019-01-01T00:00:00Z" version="1" lat="34.0" lon="-80.1" />
</node>
<node id="6000012" visible="true" timestamp="2019-01-01T00:00:00Z" version="1" lat="35.9" lon="-80.9">
<tag k="amenity" v="charging_station"/>
<tag k="name" v="OpenMapTiles Charging Station"/>
<tag k="operator" v="OpenMapTiles Charging Station Operator"/>
</node>
<way id="6000" timestamp="2019-01-01T00:00:00Z" version="1" visible="true">
<nd ref="600008" />
<nd ref="600009" />
<nd ref="600010" />
<nd ref="600011" />
<nd ref="600008" />
<tag k="amenity" v="charging_station"/>
<tag k="brand" v="OpenMapTiles Charging Station Brand"/>
</way>
</osm> </osm>

Wyświetl plik

@ -72,19 +72,24 @@ BEGIN
-- Test 500 -- Test 500
-- Verify that road classifications show up at the right zoom level -- Verify that road classifications show up at the right zoom level
SELECT COUNT(*) INTO cnt FROM osm_transportation_merge_linestring_gen_z4 WHERE highway='motorway'; SELECT COUNT(*) INTO cnt FROM osm_transportation_merge_linestring_gen_z4 WHERE osm_national_network(network);
IF cnt < 1 THEN IF cnt < 1 THEN
INSERT INTO omt_test_failures VALUES(500, 'import', 'osm_transportation_linestring z4 motorway count expected >=1, got ' || cnt); INSERT INTO omt_test_failures VALUES(500, 'import', 'osm_transportation_linestring z4 national network count expected >=1, got ' || cnt);
END IF; END IF;
SELECT COUNT(*) INTO cnt FROM osm_transportation_merge_linestring_gen_z4 WHERE highway='trunk'; SELECT COUNT(*) INTO cnt FROM osm_transportation_merge_linestring_gen_z4 WHERE NOT osm_national_network(network);
IF cnt <> 0 THEN IF cnt <> 0 THEN
INSERT INTO omt_test_failures VALUES(500, 'import', 'osm_transportation_linestring z4 trunk count expected 0, got ' || cnt); INSERT INTO omt_test_failures VALUES(500, 'import', 'osm_transportation_linestring z4 not national network count expected 0, got ' || cnt);
END IF; END IF;
SELECT COUNT(*) INTO cnt FROM osm_transportation_merge_linestring_gen_z5 WHERE highway='trunk'; SELECT COUNT(*) INTO cnt FROM osm_transportation_merge_linestring_gen_z5 WHERE highway='motorway';
IF cnt < 1 THEN IF cnt < 1 THEN
INSERT INTO omt_test_failures VALUES(500, 'import', 'osm_transportation_linestring z5 trunk count expected >=1, got ' || cnt); INSERT INTO omt_test_failures VALUES(500, 'import', 'osm_transportation_linestring z5 motorway count expected >=1, got ' || cnt);
END IF;
SELECT COUNT(*) INTO cnt FROM osm_transportation_merge_linestring_gen_z5 WHERE highway='trunk' AND osm_national_network(network);
IF cnt < 1 THEN
INSERT INTO omt_test_failures VALUES(500, 'import', 'osm_transportation_linestring z5 trunk and national network count expected >=1, got ' || cnt);
END IF; END IF;
SELECT COUNT(*) INTO cnt FROM osm_transportation_merge_linestring_gen_z6 WHERE highway='primary'; SELECT COUNT(*) INTO cnt FROM osm_transportation_merge_linestring_gen_z6 WHERE highway='primary';
@ -161,10 +166,10 @@ BEGIN
END IF; END IF;
-- Duplicate route concurrencies collapsed -- Duplicate route concurrencies collapsed
SELECT COUNT(*) INTO cnt FROM osm_route_member SELECT COUNT(*) INTO cnt FROM transportation_route_member_coalesced
WHERE network='US:I' AND ref='95'; WHERE network='US:I' AND ref='95';
IF cnt <> 1 THEN IF cnt <> 1 THEN
INSERT INTO omt_test_failures VALUES(500, 'import', 'osm_route_member 1 route membership expected, got ' || cnt); INSERT INTO omt_test_failures VALUES(500, 'import', 'transportation_route_member_coalesced 1 route membership expected, got ' || cnt);
END IF; END IF;
-- Test 600 -- Test 600
@ -190,6 +195,20 @@ BEGIN
IF cnt <> 1 THEN IF cnt <> 1 THEN
INSERT INTO omt_test_failures VALUES(600, 'import', 'osm_poi_point parcel_locker with name like "OpenMapTiles Parcel Locker PL00%" expected 1, got ' || cnt); INSERT INTO omt_test_failures VALUES(600, 'import', 'osm_poi_point parcel_locker with name like "OpenMapTiles Parcel Locker PL00%" expected 1, got ' || cnt);
END IF; END IF;
-- verify that charging stations are imported with correct name which can come from tags like brand or operator and can contain ref
SELECT COUNT(*) INTO cnt FROM osm_poi_point
WHERE subclass = 'charging_station'
AND tags->'name' = 'OpenMapTiles Charging Station';
IF cnt <> 2 THEN
INSERT INTO omt_test_failures VALUES(600, 'import', 'osm_poi_point charging_station with name "OpenMapTiles Charging Station" expected 2, got ' || cnt);
END IF;
SELECT COUNT(*) INTO cnt FROM osm_poi_polygon
WHERE subclass = 'charging_station'
AND tags->'name' = 'OpenMapTiles Charging Station Brand';
IF cnt <> 1 THEN
INSERT INTO omt_test_failures VALUES(600, 'import', 'osm_poi_polygon charging_station with name "OpenMapTiles Charging Station Brand" expected 1, got ' || cnt);
END IF;
END; END;

Wyświetl plik

@ -98,7 +98,7 @@ BEGIN
WHERE subclass = 'parcel_locker' WHERE subclass = 'parcel_locker'
AND tags->'name' like 'OpenMapTiles Parcel Locker%'; AND tags->'name' like 'OpenMapTiles Parcel Locker%';
IF cnt <> 2 THEN IF cnt <> 2 THEN
INSERT INTO omt_test_failures VALUES(600, 'update', 'osm_poi_point atm with name "OpenMapTiles ATM" expected 2, got ' || cnt); INSERT INTO omt_test_failures VALUES(600, 'update', 'osm_poi_point atm with name "OpenMapTiles Parcel Locker%" expected 2, got ' || cnt);
END IF; END IF;
SELECT COUNT(*) INTO cnt FROM osm_poi_point SELECT COUNT(*) INTO cnt FROM osm_poi_point
WHERE subclass = 'parcel_locker' WHERE subclass = 'parcel_locker'
@ -107,6 +107,26 @@ BEGIN
INSERT INTO omt_test_failures VALUES(600, 'update', 'osm_poi_point parcel_locker with name "Different operator PL001" expected 1, got ' || cnt); INSERT INTO omt_test_failures VALUES(600, 'update', 'osm_poi_point parcel_locker with name "Different operator PL001" expected 1, got ' || cnt);
END IF; END IF;
-- for charging_station
SELECT COUNT(*) INTO cnt FROM osm_poi_point
WHERE subclass = 'charging_station'
AND tags->'name' = 'OpenMapTiles Charging Station';
IF cnt <> 1 THEN
INSERT INTO omt_test_failures VALUES(600, 'update', 'osm_poi_point charging_station with name "OpenMapTiles Charging Station" expected 1, got ' || cnt);
END IF;
SELECT COUNT(*) INTO cnt FROM osm_poi_point
WHERE subclass = 'charging_station'
AND tags->'name' = 'OpenMapTiles Charging Station Brand';
IF cnt <> 1 THEN
INSERT INTO omt_test_failures VALUES(600, 'update', 'osm_poi_point charging_station with name "OpenMapTiles Charging Station Brand" expected 1, got ' || cnt);
END IF;
SELECT COUNT(*) INTO cnt FROM osm_poi_polygon
WHERE subclass = 'charging_station'
AND tags->'name' = 'OpenMapTiles Charging Station';
IF cnt <> 1 THEN
INSERT INTO omt_test_failures VALUES(600, 'update', 'osm_poi_polygon charging_station with name "OpenMapTiles Charging Station" expected 1, got ' || cnt);
END IF;
END; END;
$$; $$;

Wyświetl plik

@ -15,5 +15,18 @@
<tag k="brand" v="Different operator"/> <tag k="brand" v="Different operator"/>
<tag k="ref" v="PL001"/> <tag k="ref" v="PL001"/>
</node> </node>
<node id="600007" visible="true" timestamp="2020-01-02T00:00:00Z" version="1" lat="35.8" lon="-80.8">
<tag k="amenity" v="charging_station"/>
<tag k="brand" v="OpenMapTiles Charging Station Brand"/>
</node>
<way id="6000" timestamp="2020-01-02T00:00:00Z" version="1" visible="true">
<nd ref="600008" />
<nd ref="600009" />
<nd ref="600010" />
<nd ref="600011" />
<nd ref="600008" />
<tag k="amenity" v="charging_station"/>
<tag k="name" v="OpenMapTiles Charging Station"/>
</way>
</modify> </modify>
</osmChange> </osmChange>