Merge remote-tracking branch 'github/master'

# Conflicts:
#	Makefile
This commit is contained in:
Miel Truyen 2020-07-01 15:18:59 +02:00
commit 566f4c47d5
60 changed files with 5122 additions and 3324 deletions

29
.env
View File

@ -1,7 +1,7 @@
# This file defines default environment variables for all images # This file defines default environment variables for all images
# Use 3-part patch version to ignore patch updates, e.g. 5.0.0 # Use 3-part patch version to ignore patch updates, e.g. 5.0.0
TOOLS_VERSION=5.1 TOOLS_VERSION=5.2
# Make sure these values are in sync with the ones in .env-postgres file # Make sure these values are in sync with the ones in .env-postgres file
PGDATABASE=openmaptiles PGDATABASE=openmaptiles
@ -10,13 +10,16 @@ PGPASSWORD=openmaptiles
PGHOST=postgres PGHOST=postgres
PGPORT=5432 PGPORT=5432
QUICKSTART_MIN_ZOOM=0 # BBOX may get overwritten by the computed bbox of the specific area:
QUICKSTART_MAX_ZOOM=7 # make generate-dc-config
DIFF_MODE=false
BBOX=-180.0,-85.0511,180.0,85.0511 BBOX=-180.0,-85.0511,180.0,85.0511
# Which zooms to generate in make generate-tiles
MIN_ZOOM=0 MIN_ZOOM=0
MAX_ZOOM=14 MAX_ZOOM=7
# Use true (case sensitive) to allow data updates
DIFF_MODE=false
# Hide some output from Mapnik tile generation for clarity # Hide some output from Mapnik tile generation for clarity
FILTER_MAPNIK_OUTPUT=1 FILTER_MAPNIK_OUTPUT=1
@ -24,3 +27,17 @@ FILTER_MAPNIK_OUTPUT=1
# Some area data like openstreetmap.fr can contain invalid references # Some area data like openstreetmap.fr can contain invalid references
# that must be cleaned up before using it for borders -- set it to true. # that must be cleaned up before using it for borders -- set it to true.
BORDERS_CLEANUP=false BORDERS_CLEANUP=false
# The current setup assumes this file is placed inside the data/ dir
MBTILES_FILE=tiles.mbtiles
# This is the current repl_config.json location, pre-configured in the tools Dockerfile
# Makefile and quickstart replace it with the dynamically generated one, but we keep it here in case some other method is used to run.
IMPOSM_CONFIG_FILE=/usr/src/app/config/repl_config.json
# import-borders temp files - set them here to defaults, and override in the Makefile based on the area
BORDERS_CLEANUP_FILE=data/borders/cleanup.pbf
BORDERS_PBF_FILE=data/borders/filtered.pbf
BORDERS_CSV_FILE=data/borders/lines.csv
# Number of parallel processes to use when importing sql files
MAX_PARALLEL_PSQL=5

View File

@ -20,12 +20,12 @@ jobs:
- name: Run quickstart for a small area - name: Run quickstart for a small area
env: env:
area: monaco area: monaco
QUICKSTART_MIN_ZOOM: 0 MIN_ZOOM: 0
QUICKSTART_MAX_ZOOM: 14 MAX_ZOOM: 14
run: | run: |
# For now, change the quickstart values directly in the .env file # For now, change the quickstart values directly in the .env file
# TODO: We should probably use env vars instead # TODO: We should probably use env vars instead
sed -i 's/QUICKSTART_MAX_ZOOM=7/QUICKSTART_MAX_ZOOM=14/g' .env sed -i 's/MAX_ZOOM=7/MAX_ZOOM=14/g' .env
export QUIET=1 export QUIET=1
./quickstart.sh $area ./quickstart.sh $area
@ -42,10 +42,7 @@ jobs:
performance: performance:
name: Evaluate performance name: Evaluate performance
runs-on: ubuntu-latest runs-on: self-hosted
# Even though we technically don't need to wait for integrity test to finish,
# there is no point to run long perf test until we know the code is OK
needs: integrity_test
env: env:
## Smaller tests (runs everything in about 30 minutes) ## Smaller tests (runs everything in about 30 minutes)
## Two test areas: equatorial-guinea and liechtenstein ## Two test areas: equatorial-guinea and liechtenstein
@ -173,7 +170,7 @@ jobs:
create_db() { create_db() {
make clean make clean
make init-dirs make init-dirs
cp ../ci_cache/perf-test-areas-latest.osm.pbf data/perf-test-areas-latest.osm.pbf cp ../ci_cache/perf-test-areas-latest.osm.pbf data/perf-test-areas.osm.pbf
make destroy-db make destroy-db
make all make all
make start-db make start-db

242
Makefile
View File

@ -1,7 +1,14 @@
#
# First section - common variable initialization
#
# Ensure that errors don't hide inside pipes # Ensure that errors don't hide inside pipes
SHELL = /bin/bash SHELL = /bin/bash
.SHELLFLAGS = -o pipefail -c .SHELLFLAGS = -o pipefail -c
# Make all .env variables available for make targets
include .env
# Options to run with docker and docker-compose - ensure the container is destroyed on exit # Options to run with docker and docker-compose - ensure the container is destroyed on exit
# Containers run as the current user rather than root (so that created files are not root-owned) # Containers run as the current user rather than root (so that created files are not root-owned)
DC_OPTS ?= --rm -u $(shell id -u):$(shell id -g) DC_OPTS ?= --rm -u $(shell id -u):$(shell id -g)
@ -12,9 +19,6 @@ DC_PASSWORD?=openmaptiles
# If set to a non-empty value, will use postgis-preloaded instead of postgis docker image # If set to a non-empty value, will use postgis-preloaded instead of postgis docker image
USE_PRELOADED_IMAGE ?= USE_PRELOADED_IMAGE ?=
# If set, this file will be imported in the import-osm target
PBF_FILE?=
# Local port to use with postserve # Local port to use with postserve
PPORT ?= 8090 PPORT ?= 8090
export PPORT export PPORT
@ -24,7 +28,7 @@ export TPORT
# Allow a custom docker-compose project name # Allow a custom docker-compose project name
ifeq ($(strip $(DC_PROJECT)),) ifeq ($(strip $(DC_PROJECT)),)
override DC_PROJECT:=$(notdir $(shell pwd)) DC_PROJECT := $(notdir $(shell pwd))
DOCKER_COMPOSE := docker-compose DOCKER_COMPOSE := docker-compose
else else
DOCKER_COMPOSE := docker-compose --project-name $(DC_PROJECT) DOCKER_COMPOSE := docker-compose --project-name $(DC_PROJECT)
@ -50,12 +54,109 @@ else
GRAPH_PARAMS=./layers GRAPH_PARAMS=./layers
endif endif
.PHONY: all
all: init-dirs build/openmaptiles.tm2source/data.yml build/mapping.yaml build-sql
# Set OpenMapTiles host # Set OpenMapTiles host
OMT_HOST := http://$(firstword $(subst :, ,$(subst tcp://,,$(DOCKER_HOST))) localhost) OMT_HOST := http://$(firstword $(subst :, ,$(subst tcp://,,$(DOCKER_HOST))) localhost)
# This defines an easy $(newline) value to act as a "\n". Make sure to keep exactly two empty lines after newline.
define newline
endef
#
# Determine area to work on
# If $(area) parameter is not set and data/*.osm.pbf finds only one file, use it as $(area).
# Otherwise all make targets requiring area param will show an error.
# Note: If there are no data files, and user calls make download area=... once,
# they will not need to use area= parameter after that because there will be just a single file.
#
# historically we have been using $(area) rather than $(AREA), so make both work
area ?= $(AREA)
# Ensure the $(AREA) param is set, or try to automatically determine it based on available data files
ifeq ($(strip $(area)),)
# if $area is not set. set it to the name of the *.osm.pbf file, but only if there is only one
data_files := $(wildcard data/*.osm.pbf)
ifneq ($(word 2,$(data_files)),)
AREA_ERROR := The 'area' parameter (or env var) has not been set, and there are more than one data/*.osm.pbf files: $(patsubst data/%.osm.pbf,'%',$(data_files))
else
ifeq ($(word 1,$(data_files)),)
AREA_ERROR := The 'area' parameter (or env var) has not been set, and there are no data/*.osm.pbf files
else
# Keep just the name of the data file, without the .osm.pbf extension
area := $(strip $(basename $(basename $(notdir $(data_files)))))
# Rename area-latest.osm.pbf to area.osm.pbf
# TODO: This if statement could be removed in a few months once everyone is using the file without the `-latest`?
ifneq ($(area),$(area:-latest=))
$(shell mv "data/$(area).osm.pbf" "data/$(area:-latest=).osm.pbf")
area := $(area:-latest=)
$(warning ATTENTION: File data/$(area)-latest.osm.pbf was renamed to $(area).osm.pbf.)
AREA_INFO := Detected area=$(area) based on the found data/$(area)-latest.osm.pbf (renamed to $(area).osm.pbf). Use 'area' parameter (or env var) to override.
else
AREA_INFO := Detected area=$(area) based on the found data/ pbf file. Use 'area' parameter (or env var) to override.
endif
endif
endif
endif
# If set, this file will be downloaded in download-osm and imported in the import-osm targets
PBF_FILE ?= data/$(area).osm.pbf
# For download-osm, allow URL parameter to download file from a given URL. Area param must still be provided.
ifneq ($(strip $(url)),)
DOWNLOAD_AREA := $(url)
else
DOWNLOAD_AREA := $(area)
endif
# import-borders uses these temp files during border parsing/import
export BORDERS_CLEANUP_FILE ?= data/borders/$(area).cleanup.pbf
export BORDERS_PBF_FILE ?= data/borders/$(area).filtered.pbf
export BORDERS_CSV_FILE ?= data/borders/$(area).lines.csv
# The file is placed into the $EXPORT_DIR=/export (mapped to ./data)
export MBTILES_FILE ?= $(area).mbtiles
MBTILES_LOCAL_FILE = data/$(MBTILES_FILE)
ifeq ($(strip $(DIFF_MODE)),true)
# import-osm implementation requires IMPOSM_CONFIG_FILE to be set to a valid file
# For static (no-updates) import, we don't need to override the default value
# For the update mode, set location of the dynamically-generated area-based config file
export IMPOSM_CONFIG_FILE = data/$(area).repl.json
endif
# download-osm generates this file with metadata about the file
AREA_DC_CONFIG_FILE ?= data/$(area).dc-config.yml
ifeq ($(strip $(area)),)
define assert_area_is_given
@echo ""
@echo "ERROR: $(AREA_ERROR)"
@echo ""
@echo " make $@ area=<area-id>"
@echo ""
@echo "To download an area, use make download <area-id>"
@echo "To list downloadable areas, use make list-geofabrik and/or make list-bbbike"
@exit 1
endef
else
ifneq ($(strip $(AREA_INFO)),)
define assert_area_is_given
@echo "$(AREA_INFO)"
endef
endif
endif
#
# TARGETS
#
.PHONY: all
all: init-dirs build/openmaptiles.tm2source/data.yml build/mapping.yaml build-sql
.PHONY: help .PHONY: help
help: help:
@echo "==============================================================================" @echo "=============================================================================="
@ -72,9 +173,12 @@ help:
@echo "Hints for developers:" @echo "Hints for developers:"
@echo " make # build source code" @echo " make # build source code"
@echo " make list-geofabrik # list actual geofabrik OSM extracts for download" @echo " make list-geofabrik # list actual geofabrik OSM extracts for download"
@echo " make download-geofabrik area=albania # download OSM data from geofabrik, and create config file" @echo " make list-bbbike # list actual BBBike OSM extracts for download"
@echo " make download-osmfr area=asia/qatar # download OSM data from openstreetmap.fr, and create config file" @echo " make download area=albania # download OSM data from any source and create config file"
@echo " make download-bbike area=Amsterdam # download OSM data from bbike.org, and create config file" @echo " make download-geofabrik area=albania # download OSM data from geofabrik.de and create config file"
@echo " make download-osmfr area=asia/qatar # download OSM data from openstreetmap.fr and create config file"
@echo " make download-bbbike area=Amsterdam # download OSM data from bbbike.org and create config file"
@echo " make generate-dc-config # scan data file and generate tile generation config file with bbox"
@echo " make psql # start PostgreSQL console" @echo " make psql # start PostgreSQL console"
@echo " make psql-list-tables # list all PostgreSQL tables" @echo " make psql-list-tables # list all PostgreSQL tables"
@echo " make vacuum-db # PostgreSQL: VACUUM ANALYZE" @echo " make vacuum-db # PostgreSQL: VACUUM ANALYZE"
@ -98,29 +202,39 @@ help:
.PHONY: init-dirs .PHONY: init-dirs
init-dirs: init-dirs:
@mkdir -p build/sql @mkdir -p build/sql/parallel
@mkdir -p data @mkdir -p build/openmaptiles.tm2source
@mkdir -p data/borders
@mkdir -p cache @mkdir -p cache
build/openmaptiles.tm2source/data.yml: init-dirs build/openmaptiles.tm2source/data.yml: init-dirs
mkdir -p build/openmaptiles.tm2source ifeq (,$(wildcard build/openmaptiles.tm2source/data.yml))
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools generate-tm2source openmaptiles.yaml --host="postgres" --port=5432 --database="openmaptiles" --user="$(DC_USER)" --password="$(DC_PASSWORD)" > $@ $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools generate-tm2source openmaptiles.yaml --host="postgres" --port=5432 --database="openmaptiles" --user="$(DC_USER)" --password="$(DC_PASSWORD)" > $@
endif
build/mapping.yaml: init-dirs build/mapping.yaml: init-dirs
ifeq (,$(wildcard build/mapping.yaml))
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools generate-imposm3 openmaptiles.yaml > $@ $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools generate-imposm3 openmaptiles.yaml > $@
endif
.PHONY: build-sql .PHONY: build-sql
build-sql: init-dirs build-sql: init-dirs
ifeq (,$(wildcard build/sql/run_last.sql))
@mkdir -p build/sql/parallel
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools bash -c \ $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools bash -c \
'generate-sql openmaptiles.yaml --dir ./build/sql \ 'generate-sql openmaptiles.yaml --dir ./build/sql \
&& generate-sqltomvt openmaptiles.yaml --key --postgis-ver 2.4.8 --function --fname=getmvt >> "./build/sql/run_last.sql"' && generate-sqltomvt openmaptiles.yaml \
--key --gzip --postgis-ver 3.0.1 \
--function --fname=getmvt >> ./build/sql/run_last.sql'
endif
.PHONY: clean .PHONY: clean
clean: clean:
rm -rf build rm -rf build
.PHONY: destroy-db .PHONY: destroy-db
destroy-db: override DC_PROJECT:=$(shell echo $(DC_PROJECT) | tr A-Z a-z) # TODO: Use https://stackoverflow.com/a/27852388/177275
destroy-db: DC_PROJECT := $(shell echo $(DC_PROJECT) | tr A-Z a-z)
destroy-db: destroy-db:
$(DOCKER_COMPOSE) down -v --remove-orphans $(DOCKER_COMPOSE) down -v --remove-orphans
$(DOCKER_COMPOSE) rm -fv $(DOCKER_COMPOSE) rm -fv
@ -152,29 +266,63 @@ stop-db:
list-geofabrik: init-dirs list-geofabrik: init-dirs
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools download-osm list geofabrik $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools download-osm list geofabrik
.PHONY: list-bbbike
list-bbbike: init-dirs
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools download-osm list bbbike
#
# download, download-geofabrik, download-osmfr, and download-bbbike are handled here
# The --imposm-cfg will fail for some of the sources, but we ignore that error -- only needed for diff mode
#
OSM_SERVERS := geofabrik osmfr bbbike OSM_SERVERS := geofabrik osmfr bbbike
ALL_DOWNLOADS:=$(addprefix download-,$(OSM_SERVERS)) ALL_DOWNLOADS := $(addprefix download-,$(OSM_SERVERS)) download
OSM_SERVER=$(patsubst download-%,%,$@) OSM_SERVER=$(patsubst download,,$(patsubst download-%,%,$@))
.PHONY: $(ALL_DOWNLOADS) .PHONY: $(ALL_DOWNLOADS)
$(ALL_DOWNLOADS): init-dirs $(ALL_DOWNLOADS): init-dirs
ifeq ($(strip $(area)),) @$(assert_area_is_given)
@echo "" ifneq ($(strip $(url)),)
@echo "ERROR: Unable to download an area if area is not given." $(if $(OSM_SERVER),$(error url parameter can only be used with non-specific download target:$(newline) make download area=$(area) url="$(url)"$(newline)))
@echo "Usage:" endif
@echo " make download-$(OSM_SERVER) area=<area-id>" ifeq (,$(wildcard $(PBF_FILE)))
@echo "" ifeq ($(strip $(DIFF_MODE)),true)
$(if $(filter %-geofabrik,$@),@echo "Use make list-geofabrik to get a list of all available areas";echo "") @echo "Downloading $(DOWNLOAD_AREA) with replication support into $(PBF_FILE) and $(IMPOSM_CONFIG_FILE) from $(if $(OSM_SERVER),$(OSM_SERVER),any source)"
@exit 1 @$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools download-osm $(OSM_SERVER) "$(DOWNLOAD_AREA)" \
--imposm-cfg "$(IMPOSM_CONFIG_FILE)" \
--output "$(PBF_FILE)"
else else
@echo "=============== download-$(OSM_SERVER) =======================" @echo "Downloading $(DOWNLOAD_AREA) into $(PBF_FILE) from $(if $(OSM_SERVER),$(OSM_SERVER),any source)"
@echo "Download area: $(area)" @$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools download-osm $(OSM_SERVER) "$(DOWNLOAD_AREA)" \
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools bash -c \ --output "$(PBF_FILE)"
'download-osm $(OSM_SERVER) $(area) \ endif
--minzoom $$QUICKSTART_MIN_ZOOM \
--maxzoom $$QUICKSTART_MAX_ZOOM \
--make-dc /import/docker-compose-config.yml -- -d /import'
ls -la ./data/$(notdir $(area))*
@echo "" @echo ""
else
ifeq ($(strip $(DIFF_MODE)),true)
ifeq (,$(wildcard $(IMPOSM_CONFIG_FILE)))
$(error \
$(newline) Data files $(PBF_FILE) already exists, but $(IMPOSM_CONFIG_FILE) does not. \
$(newline) You probably downloaded the data file before setting DIFF_MODE=true. \
$(newline) You can delete the data file $(PBF_FILE) and re-run make download \
$(newline) to re-download and generate config, or manually create $(IMPOSM_CONFIG_FILE) \
$(newline) See example https://github.com/openmaptiles/openmaptiles-tools/blob/v5.2/bin/config/repl_config.json \
$(newline))
else
@echo "Data files $(PBF_FILE) and replication config $(IMPOSM_CONFIG_FILE) already exists, skipping the download."
endif
else
@echo "Data files $(PBF_FILE) already exists, skipping the download."
endif
endif
.PHONY: generate-dc-config
generate-dc-config:
@$(assert_area_is_given)
ifeq (,$(wildcard $(AREA_DC_CONFIG_FILE)))
@$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools bash -c ' \
download-osm make-dc "$(PBF_FILE)" \
--make-dc "$(AREA_DC_CONFIG_FILE)" \
--id "$(area)"'
else
@echo "Configuration file $(AREA_DC_CONFIG_FILE) already exists, no need to regenerate."
endif endif
.PHONY: psql .PHONY: psql
@ -183,14 +331,17 @@ psql: start-db-nowait
.PHONY: import-osm .PHONY: import-osm
import-osm: all start-db-nowait import-osm: all start-db-nowait
@$(assert_area_is_given)
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-osm $(PBF_FILE)' $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-osm $(PBF_FILE)'
.PHONY: update-osm .PHONY: update-osm
update-osm: all start-db-nowait update-osm: all start-db-nowait
@$(assert_area_is_given)
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-update' $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-update'
.PHONY: import-diff .PHONY: import-diff
import-diff: all start-db-nowait import-diff: all start-db-nowait
@$(assert_area_is_given)
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-diff' $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-diff'
.PHONY: import-data .PHONY: import-data
@ -199,27 +350,28 @@ import-data: start-db
.PHONY: import-borders .PHONY: import-borders
import-borders: start-db-nowait import-borders: start-db-nowait
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-borders' @$(assert_area_is_given)
# If CSV borders file already exists, use it without re-parsing
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c \
'pgwait && import-borders $$([ -f "$(BORDERS_CSV_FILE)" ] && echo load $(BORDERS_CSV_FILE) || echo import $(PBF_FILE))'
.PHONY: import-sql .PHONY: import-sql
import-sql: all start-db-nowait import-sql: all start-db-nowait
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-sql' | \ $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-sql' | \
awk -v s=": WARNING:" '$$0~s{print; print "\n*** WARNING detected, aborting"; exit(1)} 1' awk -v s=": WARNING:" '$$0~s{print; print "\n*** WARNING detected, aborting"; exit(1)} 1'
.PHONY: show-metadata ifneq ($(wildcard $(AREA_DC_CONFIG_FILE)),)
show-metadata: init-dirs DC_CONFIG_TILES := -f docker-compose.yml -f $(AREA_DC_CONFIG_FILE)
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools mbtiles-tools meta-all ./data/tiles.mbtiles
.PHONY: generate-tiles
ifneq ($(wildcard data/docker-compose-config.yml),)
DC_CONFIG_TILES:=-f docker-compose.yml -f ./data/docker-compose-config.yml
endif endif
.PHONY: generate-tiles
generate-tiles: all start-db generate-tiles: all start-db
rm -rf data/tiles.mbtiles @$(assert_area_is_given)
echo "Generating tiles ..."; \ @echo "Generating tiles into $(MBTILES_LOCAL_FILE) (will delete if already exists)..."
@rm -rf "$(MBTILES_LOCAL_FILE)"
$(DOCKER_COMPOSE) $(DC_CONFIG_TILES) run $(DC_OPTS) generate-vectortiles $(DOCKER_COMPOSE) $(DC_CONFIG_TILES) run $(DC_OPTS) generate-vectortiles
@echo "Updating generated tile metadata ..." @echo "Updating generated tile metadata ..."
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools generate-metadata ./data/tiles.mbtiles $(DOCKER_COMPOSE) $(DC_CONFIG_TILES) run $(DC_OPTS) openmaptiles-tools \
mbtiles-tools meta-generate "$(MBTILES_LOCAL_FILE)" ./openmaptiles.yaml --auto-minmax --show-ranges
.PHONY: start-tileserver .PHONY: start-tileserver
start-tileserver: init-dirs start-tileserver: init-dirs
@ -356,7 +508,7 @@ remove-docker-images:
.PHONY: clean-unnecessary-docker .PHONY: clean-unnecessary-docker
clean-unnecessary-docker: clean-unnecessary-docker:
@echo "Deleting unnecessary container(s)..." @echo "Deleting unnecessary container(s)..."
@docker ps -a --filter "status=exited" | $(XARGS) docker rm @docker ps -a -q --filter "status=exited" | $(XARGS) docker rm
@echo "Deleting unnecessary image(s)..." @echo "Deleting unnecessary image(s)..."
@docker images | grep \<none\> | awk -F" " '{print $$3}' | $(XARGS) docker rmi @docker images | grep \<none\> | awk -F" " '{print $$3}' | $(XARGS) docker rmi

View File

@ -384,20 +384,17 @@ and the generated maps are going to be available in webbrowser on [localhost:808
This is only a quick preview, because your mbtiles only generated to zoom level 7 ! This is only a quick preview, because your mbtiles only generated to zoom level 7 !
### Change MIN_ZOOM and MAX_ZOOM ### Set which zooms to generate
modify the settings in the `.env` file, the defaults: modify the settings in the `.env` file, the defaults:
* QUICKSTART_MIN_ZOOM=0 * `MIN_ZOOM=0`
* QUICKSTART_MAX_ZOOM=7 * `MAX_ZOOM=7`
and re-start `./quickstart.sh ` Delete the `./data/<area>.dc-config.yml` file, and re-start `./quickstart.sh <area>`
* the new config file re-generating to here ./data/docker-compose-config.yml
* Known problems:
* If you use same area - then the ./data/docker-compose-config.yml not re-generating, so you have to modify by hand!
Hints: Hints:
* Small increments! Never starts with the MAX_ZOOM = 14 * Small increments! Never starts with the `MAX_ZOOM = 14`
* The suggested MAX_ZOOM = 14 - use only with small extracts * The suggested `MAX_ZOOM = 14` - use only with small extracts
### Check other commands ### Check other commands

View File

@ -83,10 +83,10 @@ make
``` ```
You can execute the following manual steps (for better understanding) You can execute the following manual steps (for better understanding)
or use the provided `quickstart.sh` script. or use the provided `quickstart.sh` script to automatically download and import given area. If area is not given, albania will be imported.
``` ```
./quickstart.sh ./quickstart.sh <area>
``` ```
### Prepare the Database ### Prepare the Database
@ -103,10 +103,10 @@ Import external data from [OpenStreetMapData](http://osmdata.openstreetmap.de/),
make import-data make import-data
``` ```
[Download OpenStreetMap data extracts](http://download.geofabrik.de/) and store the PBF file in the `./data` directory. Download OpenStreetMap data extracts from any source like [Geofabrik](http://download.geofabrik.de/), and store the PBF file in the `./data` directory. To use a specific download source, use `download-geofabrik`, `download-bbbike`, or `download-osmfr`, or use `download` to make it auto-pick the area. You can use `area=planet` for the entire OSM dataset (very large). Note that if you have more than one `data/*.osm.pbf` file, every `make` command will always require `area=...` parameter (or you can just `export area=...` first).
```bash ```bash
make download-geofabrik area=albania make download area=albania
``` ```
[Import OpenStreetMap data](https://github.com/openmaptiles/openmaptiles-tools/tree/master/docker/import-osm) with the mapping rules from [Import OpenStreetMap data](https://github.com/openmaptiles/openmaptiles-tools/tree/master/docker/import-osm) with the mapping rules from
@ -135,11 +135,11 @@ make
make import-sql make import-sql
``` ```
Now you are ready to **generate the vector tiles**. Using environment variables Now you are ready to **generate the vector tiles**. By default, `./.env` specifies the entire planet BBOX for zooms 0-7, but running `generate-dc-config` will analyze the data file and set the `BBOX` param to limit tile generation. It will also modify `MIN_ZOOM` and `MAX_ZOOM` values based on the .env, but can be changed.
you can limit the bounding box and zoom levels of what you want to generate (`docker-compose.yml`).
``` ```
make generate-tiles make generate-dc-config # compute data bbox -- not needed for the whole planet
make generate-tiles # generate tiles
``` ```
## License ## License

View File

@ -36,6 +36,14 @@ services:
MAKE_DC_VERSION: "2.3" MAKE_DC_VERSION: "2.3"
# Allow DIFF_MODE to be overwritten from shell # Allow DIFF_MODE to be overwritten from shell
DIFF_MODE: ${DIFF_MODE} DIFF_MODE: ${DIFF_MODE}
# Imposm configuration file describes how to load updates when enabled
IMPOSM_CONFIG_FILE: ${IMPOSM_CONFIG_FILE}
# Which files to use during import-borders processing
BORDERS_CLEANUP_FILE: ${BORDERS_CLEANUP_FILE}
BORDERS_PBF_FILE: ${BORDERS_PBF_FILE}
BORDERS_CSV_FILE: ${BORDERS_CSV_FILE}
# Control import-sql processes
MAX_PARALLEL_PSQL: ${MAX_PARALLEL_PSQL}
networks: networks:
- postgres_conn - postgres_conn
volumes: volumes:
@ -54,6 +62,9 @@ services:
networks: networks:
- postgres_conn - postgres_conn
env_file: .env env_file: .env
environment:
FILTER_MAPNIK_OUTPUT: ${FILTER_MAPNIK_OUTPUT}
MBTILES_NAME: ${MBTILES_FILE}
generate-vectortiles: generate-vectortiles:
image: "openmaptiles/generate-vectortiles:${TOOLS_VERSION}" image: "openmaptiles/generate-vectortiles:${TOOLS_VERSION}"
@ -64,10 +75,11 @@ services:
- postgres_conn - postgres_conn
env_file: .env env_file: .env
environment: environment:
FILTER_MAPNIK_OUTPUT: ${FILTER_MAPNIK_OUTPUT}
MBTILES_NAME: ${MBTILES_FILE}
BBOX: ${BBOX} BBOX: ${BBOX}
MIN_ZOOM: ${MIN_ZOOM} MIN_ZOOM: ${MIN_ZOOM}
MAX_ZOOM: ${MAX_ZOOM} MAX_ZOOM: ${MAX_ZOOM}
FILTER_MAPNIK_OUTPUT: ${FILTER_MAPNIK_OUTPUT}
postserve: postserve:
image: "openmaptiles/openmaptiles-tools:${TOOLS_VERSION}" image: "openmaptiles/openmaptiles-tools:${TOOLS_VERSION}"

View File

@ -41,7 +41,7 @@ layer:
key_field: osm_id key_field: osm_id
key_field_as_attribute: no key_field_as_attribute: no
srid: 900913 srid: 900913
query: (SELECT osm_id, geometry, name, name_en, name_de, {name_languages}, class, iata, icao, ele, ele_ft FROM layer_aerodrome_label (!bbox!, z(!scale_denominator!), !pixel_width!)) AS t query: (SELECT osm_id, geometry, name, name_en, name_de, {name_languages}, class, iata, icao, ele, ele_ft FROM layer_aerodrome_label(!bbox!, z(!scale_denominator!))) AS t
schema: schema:
- ./update_aerodrome_label_point.sql - ./update_aerodrome_label_point.sql
- ./layer.sql - ./layer.sql

View File

@ -1,11 +1,10 @@
-- etldoc: layer_aerodrome_label[shape=record fillcolor=lightpink, style="rounded,filled", label="layer_aerodrome_label | <z10_> z10+" ] ; -- etldoc: layer_aerodrome_label[shape=record fillcolor=lightpink, style="rounded,filled", label="layer_aerodrome_label | <z10_> z10+" ] ;
CREATE OR REPLACE FUNCTION layer_aerodrome_label( CREATE OR REPLACE FUNCTION layer_aerodrome_label(bbox geometry,
bbox geometry, zoom_level integer)
zoom_level integer, RETURNS TABLE
pixel_width numeric) (
RETURNS TABLE(
osm_id bigint, osm_id bigint,
geometry geometry, geometry geometry,
name text, name text,
@ -16,10 +15,12 @@ CREATE OR REPLACE FUNCTION layer_aerodrome_label(
iata text, iata text,
icao text, icao text,
ele int, ele int,
ele_ft int) AS ele_ft int
)
AS
$$ $$
-- etldoc: osm_aerodrome_label_point -> layer_aerodrome_label:z10_
SELECT SELECT
-- etldoc: osm_aerodrome_label_point -> layer_aerodrome_label:z10_
osm_id, osm_id,
geometry, geometry,
name, name,
@ -32,10 +33,11 @@ $$
END AS class, END AS class,
NULLIF(iata, '') AS iata, NULLIF(iata, '') AS iata,
NULLIF(icao, '') AS icao, NULLIF(icao, '') AS icao,
substring(ele from E'^(-?\\d+)(\\D|$)')::int AS ele, substring(ele FROM E'^(-?\\d+)(\\D|$)')::int AS ele,
round(substring(ele from E'^(-?\\d+)(\\D|$)')::int*3.2808399)::int AS ele_ft round(substring(ele FROM E'^(-?\\d+)(\\D|$)')::int * 3.2808399)::int AS ele_ft
FROM osm_aerodrome_label_point FROM osm_aerodrome_label_point
WHERE geometry && bbox AND zoom_level >= 10; WHERE geometry && bbox
$$ AND zoom_level >= 10;
LANGUAGE SQL $$ LANGUAGE SQL STABLE
IMMUTABLE PARALLEL SAFE; -- STRICT
PARALLEL SAFE;

View File

@ -2,7 +2,8 @@ DROP TRIGGER IF EXISTS trigger_flag ON osm_aerodrome_label_point;
DROP TRIGGER IF EXISTS trigger_refresh ON aerodrome_label.updates; DROP TRIGGER IF EXISTS trigger_refresh ON aerodrome_label.updates;
-- etldoc: osm_aerodrome_label_point -> osm_aerodrome_label_point -- etldoc: osm_aerodrome_label_point -> osm_aerodrome_label_point
CREATE OR REPLACE FUNCTION update_aerodrome_label_point() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_aerodrome_label_point() RETURNS void AS
$$
BEGIN BEGIN
UPDATE osm_aerodrome_label_point UPDATE osm_aerodrome_label_point
SET geometry = ST_Centroid(geometry) SET geometry = ST_Centroid(geometry)
@ -20,32 +21,40 @@ SELECT update_aerodrome_label_point();
CREATE SCHEMA IF NOT EXISTS aerodrome_label; CREATE SCHEMA IF NOT EXISTS aerodrome_label;
CREATE TABLE IF NOT EXISTS aerodrome_label.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS aerodrome_label.updates
CREATE OR REPLACE FUNCTION aerodrome_label.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION aerodrome_label.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO aerodrome_label.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO aerodrome_label.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION aerodrome_label.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION aerodrome_label.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh aerodrome_label'; RAISE LOG 'Refresh aerodrome_label';
PERFORM update_aerodrome_label_point(); PERFORM update_aerodrome_label_point();
-- noinspection SqlWithoutWhere
DELETE FROM aerodrome_label.updates; DELETE FROM aerodrome_label.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_aerodrome_label_point AFTER INSERT OR UPDATE OR DELETE
ON osm_aerodrome_label_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE aerodrome_label.flag(); EXECUTE PROCEDURE aerodrome_label.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON aerodrome_label.updates AFTER INSERT
ON aerodrome_label.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE aerodrome_label.refresh(); EXECUTE PROCEDURE aerodrome_label.refresh();

View File

@ -2,44 +2,60 @@
-- etldoc: label="layer_aeroway |<z10> z10|<z11> z11|<z12> z12|<z13> z13|<z14_> z14+" ]; -- etldoc: label="layer_aeroway |<z10> z10|<z11> z11|<z12> z12|<z13> z13|<z14_> z14+" ];
CREATE OR REPLACE FUNCTION layer_aeroway(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_aeroway(bbox geometry, zoom_level int)
RETURNS TABLE(geometry geometry, class text, ref text) AS $$ RETURNS TABLE
SELECT geometry, aeroway AS class, ref FROM ( (
geometry geometry,
class text,
ref text
)
AS
$$
SELECT geometry, aeroway AS class, ref
FROM (
-- etldoc: osm_aeroway_linestring_gen3 -> layer_aeroway:z10 -- etldoc: osm_aeroway_linestring_gen3 -> layer_aeroway:z10
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_linestring_gen3 WHERE zoom_level = 10 FROM osm_aeroway_linestring_gen3
WHERE zoom_level = 10
UNION ALL UNION ALL
-- etldoc: osm_aeroway_linestring_gen2 -> layer_aeroway:z11 -- etldoc: osm_aeroway_linestring_gen2 -> layer_aeroway:z11
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_linestring_gen2 WHERE zoom_level = 11 FROM osm_aeroway_linestring_gen2
WHERE zoom_level = 11
UNION ALL UNION ALL
-- etldoc: osm_aeroway_linestring_gen1 -> layer_aeroway:z12 -- etldoc: osm_aeroway_linestring_gen1 -> layer_aeroway:z12
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_linestring_gen1 WHERE zoom_level = 12 FROM osm_aeroway_linestring_gen1
WHERE zoom_level = 12
UNION ALL UNION ALL
-- etldoc: osm_aeroway_linestring -> layer_aeroway:z13 -- etldoc: osm_aeroway_linestring -> layer_aeroway:z13
-- etldoc: osm_aeroway_linestring -> layer_aeroway:z14_ -- etldoc: osm_aeroway_linestring -> layer_aeroway:z14_
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_linestring WHERE zoom_level >= 13 FROM osm_aeroway_linestring
WHERE zoom_level >= 13
UNION ALL UNION ALL
-- etldoc: osm_aeroway_polygon_gen3 -> layer_aeroway:z10 -- etldoc: osm_aeroway_polygon_gen3 -> layer_aeroway:z10
-- etldoc: osm_aeroway_polygon_gen3 -> layer_aeroway:z11 -- etldoc: osm_aeroway_polygon_gen3 -> layer_aeroway:z11
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_polygon_gen3 WHERE zoom_level BETWEEN 10 AND 11 FROM osm_aeroway_polygon_gen3
WHERE zoom_level BETWEEN 10 AND 11
UNION ALL UNION ALL
-- etldoc: osm_aeroway_polygon_gen2 -> layer_aeroway:z12 -- etldoc: osm_aeroway_polygon_gen2 -> layer_aeroway:z12
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_polygon_gen2 WHERE zoom_level = 12 FROM osm_aeroway_polygon_gen2
WHERE zoom_level = 12
UNION ALL UNION ALL
-- etldoc: osm_aeroway_polygon_gen1 -> layer_aeroway:z13 -- etldoc: osm_aeroway_polygon_gen1 -> layer_aeroway:z13
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_polygon_gen1 WHERE zoom_level = 13 FROM osm_aeroway_polygon_gen1
WHERE zoom_level = 13
UNION ALL UNION ALL
-- etldoc: osm_aeroway_polygon -> layer_aeroway:z14_ -- etldoc: osm_aeroway_polygon -> layer_aeroway:z14_
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_polygon WHERE zoom_level >= 14 FROM osm_aeroway_polygon
WHERE zoom_level >= 14
) AS zoom_levels ) AS zoom_levels
WHERE geometry && bbox; WHERE geometry && bbox;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL IMMUTABLE -- STRICT
PARALLEL SAFE; PARALLEL SAFE;

View File

@ -1,8 +1,17 @@
-- This statement can be deleted after the border importer image stops creating this object as a table -- This statement can be deleted after the border importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_border_linestring_gen1 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; DO
$$
BEGIN
DROP TABLE IF EXISTS osm_border_linestring_gen1 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_border_linestring -> osm_border_linestring_gen1 -- etldoc: osm_border_linestring -> osm_border_linestring_gen1
DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen1 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen1 CASCADE;
CREATE MATERIALIZED VIEW osm_border_linestring_gen1 AS ( CREATE MATERIALIZED VIEW osm_border_linestring_gen1 AS
(
SELECT ST_Simplify(geometry, 10) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime SELECT ST_Simplify(geometry, 10) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime
FROM osm_border_linestring FROM osm_border_linestring
WHERE admin_level <= 10 WHERE admin_level <= 10
@ -10,10 +19,19 @@ CREATE MATERIALIZED VIEW osm_border_linestring_gen1 AS (
CREATE INDEX IF NOT EXISTS osm_border_linestring_gen1_idx ON osm_border_linestring_gen1 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_linestring_gen1_idx ON osm_border_linestring_gen1 USING gist (geometry);
-- This statement can be deleted after the border importer image stops creating this object as a table -- This statement can be deleted after the border importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_border_linestring_gen2 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; DO
$$
BEGIN
DROP TABLE IF EXISTS osm_border_linestring_gen2 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_border_linestring -> osm_border_linestring_gen2 -- etldoc: osm_border_linestring -> osm_border_linestring_gen2
DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen2 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen2 CASCADE;
CREATE MATERIALIZED VIEW osm_border_linestring_gen2 AS ( CREATE MATERIALIZED VIEW osm_border_linestring_gen2 AS
(
SELECT ST_Simplify(geometry, 20) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime SELECT ST_Simplify(geometry, 20) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime
FROM osm_border_linestring FROM osm_border_linestring
WHERE admin_level <= 10 WHERE admin_level <= 10
@ -21,10 +39,19 @@ CREATE MATERIALIZED VIEW osm_border_linestring_gen2 AS (
CREATE INDEX IF NOT EXISTS osm_border_linestring_gen2_idx ON osm_border_linestring_gen2 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_linestring_gen2_idx ON osm_border_linestring_gen2 USING gist (geometry);
-- This statement can be deleted after the border importer image stops creating this object as a table -- This statement can be deleted after the border importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_border_linestring_gen3 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; DO
$$
BEGIN
DROP TABLE IF EXISTS osm_border_linestring_gen3 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_border_linestring -> osm_border_linestring_gen3 -- etldoc: osm_border_linestring -> osm_border_linestring_gen3
DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen3 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen3 CASCADE;
CREATE MATERIALIZED VIEW osm_border_linestring_gen3 AS ( CREATE MATERIALIZED VIEW osm_border_linestring_gen3 AS
(
SELECT ST_Simplify(geometry, 40) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime SELECT ST_Simplify(geometry, 40) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime
FROM osm_border_linestring FROM osm_border_linestring
WHERE admin_level <= 8 WHERE admin_level <= 8
@ -32,10 +59,19 @@ CREATE MATERIALIZED VIEW osm_border_linestring_gen3 AS (
CREATE INDEX IF NOT EXISTS osm_border_linestring_gen3_idx ON osm_border_linestring_gen3 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_linestring_gen3_idx ON osm_border_linestring_gen3 USING gist (geometry);
-- This statement can be deleted after the border importer image stops creating this object as a table -- This statement can be deleted after the border importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_border_linestring_gen4 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; DO
$$
BEGIN
DROP TABLE IF EXISTS osm_border_linestring_gen4 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_border_linestring -> osm_border_linestring_gen4 -- etldoc: osm_border_linestring -> osm_border_linestring_gen4
DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen4 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen4 CASCADE;
CREATE MATERIALIZED VIEW osm_border_linestring_gen4 AS ( CREATE MATERIALIZED VIEW osm_border_linestring_gen4 AS
(
SELECT ST_Simplify(geometry, 80) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime SELECT ST_Simplify(geometry, 80) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime
FROM osm_border_linestring FROM osm_border_linestring
WHERE admin_level <= 6 WHERE admin_level <= 6
@ -43,10 +79,19 @@ CREATE MATERIALIZED VIEW osm_border_linestring_gen4 AS (
CREATE INDEX IF NOT EXISTS osm_border_linestring_gen4_idx ON osm_border_linestring_gen4 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_linestring_gen4_idx ON osm_border_linestring_gen4 USING gist (geometry);
-- This statement can be deleted after the border importer image stops creating this object as a table -- This statement can be deleted after the border importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_border_linestring_gen5 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; DO
$$
BEGIN
DROP TABLE IF EXISTS osm_border_linestring_gen5 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_border_linestring -> osm_border_linestring_gen5 -- etldoc: osm_border_linestring -> osm_border_linestring_gen5
DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen5 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen5 CASCADE;
CREATE MATERIALIZED VIEW osm_border_linestring_gen5 AS ( CREATE MATERIALIZED VIEW osm_border_linestring_gen5 AS
(
SELECT ST_Simplify(geometry, 160) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime SELECT ST_Simplify(geometry, 160) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime
FROM osm_border_linestring FROM osm_border_linestring
WHERE admin_level <= 6 WHERE admin_level <= 6
@ -54,10 +99,19 @@ CREATE MATERIALIZED VIEW osm_border_linestring_gen5 AS (
CREATE INDEX IF NOT EXISTS osm_border_linestring_gen5_idx ON osm_border_linestring_gen5 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_linestring_gen5_idx ON osm_border_linestring_gen5 USING gist (geometry);
-- This statement can be deleted after the border importer image stops creating this object as a table -- This statement can be deleted after the border importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_border_linestring_gen6 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; DO
$$
BEGIN
DROP TABLE IF EXISTS osm_border_linestring_gen6 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_border_linestring -> osm_border_linestring_gen6 -- etldoc: osm_border_linestring -> osm_border_linestring_gen6
DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen6 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen6 CASCADE;
CREATE MATERIALIZED VIEW osm_border_linestring_gen6 AS ( CREATE MATERIALIZED VIEW osm_border_linestring_gen6 AS
(
SELECT ST_Simplify(geometry, 300) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime SELECT ST_Simplify(geometry, 300) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime
FROM osm_border_linestring FROM osm_border_linestring
WHERE admin_level <= 4 WHERE admin_level <= 4
@ -65,10 +119,19 @@ CREATE MATERIALIZED VIEW osm_border_linestring_gen6 AS (
CREATE INDEX IF NOT EXISTS osm_border_linestring_gen6_idx ON osm_border_linestring_gen6 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_linestring_gen6_idx ON osm_border_linestring_gen6 USING gist (geometry);
-- This statement can be deleted after the border importer image stops creating this object as a table -- This statement can be deleted after the border importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_border_linestring_gen7 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; DO
$$
BEGIN
DROP TABLE IF EXISTS osm_border_linestring_gen7 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_border_linestring -> osm_border_linestring_gen7 -- etldoc: osm_border_linestring -> osm_border_linestring_gen7
DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen7 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen7 CASCADE;
CREATE MATERIALIZED VIEW osm_border_linestring_gen7 AS ( CREATE MATERIALIZED VIEW osm_border_linestring_gen7 AS
(
SELECT ST_Simplify(geometry, 600) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime SELECT ST_Simplify(geometry, 600) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime
FROM osm_border_linestring FROM osm_border_linestring
WHERE admin_level <= 4 WHERE admin_level <= 4
@ -76,10 +139,19 @@ CREATE MATERIALIZED VIEW osm_border_linestring_gen7 AS (
CREATE INDEX IF NOT EXISTS osm_border_linestring_gen7_idx ON osm_border_linestring_gen7 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_linestring_gen7_idx ON osm_border_linestring_gen7 USING gist (geometry);
-- This statement can be deleted after the border importer image stops creating this object as a table -- This statement can be deleted after the border importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_border_linestring_gen8 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; DO
$$
BEGIN
DROP TABLE IF EXISTS osm_border_linestring_gen8 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_border_linestring -> osm_border_linestring_gen8 -- etldoc: osm_border_linestring -> osm_border_linestring_gen8
DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen8 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen8 CASCADE;
CREATE MATERIALIZED VIEW osm_border_linestring_gen8 AS ( CREATE MATERIALIZED VIEW osm_border_linestring_gen8 AS
(
SELECT ST_Simplify(geometry, 1200) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime SELECT ST_Simplify(geometry, 1200) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime
FROM osm_border_linestring FROM osm_border_linestring
WHERE admin_level <= 4 WHERE admin_level <= 4
@ -87,10 +159,19 @@ CREATE MATERIALIZED VIEW osm_border_linestring_gen8 AS (
CREATE INDEX IF NOT EXISTS osm_border_linestring_gen8_idx ON osm_border_linestring_gen8 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_linestring_gen8_idx ON osm_border_linestring_gen8 USING gist (geometry);
-- This statement can be deleted after the border importer image stops creating this object as a table -- This statement can be deleted after the border importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_border_linestring_gen9 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; DO
$$
BEGIN
DROP TABLE IF EXISTS osm_border_linestring_gen9 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_border_linestring -> osm_border_linestring_gen9 -- etldoc: osm_border_linestring -> osm_border_linestring_gen9
DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen9 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen9 CASCADE;
CREATE MATERIALIZED VIEW osm_border_linestring_gen9 AS ( CREATE MATERIALIZED VIEW osm_border_linestring_gen9 AS
(
SELECT ST_Simplify(geometry, 2400) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime SELECT ST_Simplify(geometry, 2400) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime
FROM osm_border_linestring FROM osm_border_linestring
WHERE admin_level <= 4 WHERE admin_level <= 4
@ -98,10 +179,19 @@ CREATE MATERIALIZED VIEW osm_border_linestring_gen9 AS (
CREATE INDEX IF NOT EXISTS osm_border_linestring_gen9_idx ON osm_border_linestring_gen9 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_linestring_gen9_idx ON osm_border_linestring_gen9 USING gist (geometry);
-- This statement can be deleted after the border importer image stops creating this object as a table -- This statement can be deleted after the border importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_border_linestring_gen10 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; DO
$$
BEGIN
DROP TABLE IF EXISTS osm_border_linestring_gen10 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_border_linestring -> osm_border_linestring_gen10 -- etldoc: osm_border_linestring -> osm_border_linestring_gen10
DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen10 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_border_linestring_gen10 CASCADE;
CREATE MATERIALIZED VIEW osm_border_linestring_gen10 AS ( CREATE MATERIALIZED VIEW osm_border_linestring_gen10 AS
(
SELECT ST_Simplify(geometry, 4800) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime SELECT ST_Simplify(geometry, 4800) AS geometry, osm_id, admin_level, dividing_line, disputed, maritime
FROM osm_border_linestring FROM osm_border_linestring
WHERE admin_level <= 2 WHERE admin_level <= 2
@ -109,49 +199,55 @@ CREATE MATERIALIZED VIEW osm_border_linestring_gen10 AS (
CREATE INDEX IF NOT EXISTS osm_border_linestring_gen10_idx ON osm_border_linestring_gen10 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_border_linestring_gen10_idx ON osm_border_linestring_gen10 USING gist (geometry);
CREATE OR REPLACE FUNCTION edit_name(name VARCHAR) RETURNS TEXT AS $$ CREATE OR REPLACE FUNCTION edit_name(name varchar) RETURNS text AS
$$
SELECT CASE SELECT CASE
WHEN POSITION(' at ' in name) > 0 WHEN POSITION(' at ' IN name) > 0
THEN replace(SUBSTRING(name, POSITION(' at ' in name)+4), ' ', '') THEN replace(SUBSTRING(name, POSITION(' at ' IN name) + 4), ' ', '')
ELSE replace(replace(name, ' ', ''), 'Extentof', '') ELSE replace(replace(name, ' ', ''), 'Extentof', '')
END; END;
$$ LANGUAGE SQL IMMUTABLE; $$ LANGUAGE SQL IMMUTABLE
-- STRICT
PARALLEL SAFE
;
-- etldoc: ne_110m_admin_0_boundary_lines_land -> boundary_z0 -- etldoc: ne_110m_admin_0_boundary_lines_land -> boundary_z0
CREATE OR REPLACE VIEW boundary_z0 AS ( CREATE OR REPLACE VIEW boundary_z0 AS
(
SELECT geometry, SELECT geometry,
2 AS admin_level, 2 AS admin_level,
(CASE WHEN featurecla LIKE 'Disputed%' THEN true ELSE false END) AS disputed, (CASE WHEN featurecla LIKE 'Disputed%' THEN TRUE ELSE FALSE END) AS disputed,
NULL::text AS disputed_name, NULL::text AS disputed_name,
NULL::text AS claimed_by, NULL::text AS claimed_by,
false AS maritime FALSE AS maritime
FROM ne_110m_admin_0_boundary_lines_land FROM ne_110m_admin_0_boundary_lines_land
); );
-- etldoc: ne_50m_admin_0_boundary_lines_land -> boundary_z1 -- etldoc: ne_50m_admin_0_boundary_lines_land -> boundary_z1
-- etldoc: ne_50m_admin_1_states_provinces_lines -> boundary_z1 -- etldoc: ne_50m_admin_1_states_provinces_lines -> boundary_z1
-- etldoc: osm_border_disp_linestring_gen11 -> boundary_z1 -- etldoc: osm_border_disp_linestring_gen11 -> boundary_z1
CREATE OR REPLACE VIEW boundary_z1 AS ( CREATE OR REPLACE VIEW boundary_z1 AS
(
SELECT geometry, SELECT geometry,
2 AS admin_level, 2 AS admin_level,
(CASE WHEN featurecla LIKE 'Disputed%' THEN true ELSE false END) AS disputed, (CASE WHEN featurecla LIKE 'Disputed%' THEN TRUE ELSE FALSE END) AS disputed,
NULL AS disputed_name, NULL AS disputed_name,
NULL AS claimed_by, NULL AS claimed_by,
false AS maritime FALSE AS maritime
FROM ne_50m_admin_0_boundary_lines_land FROM ne_50m_admin_0_boundary_lines_land
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
4 AS admin_level, 4 AS admin_level,
false AS disputed, FALSE AS disputed,
NULL AS disputed_name, NULL AS disputed_name,
NULL AS claimed_by, NULL AS claimed_by,
false AS maritime FALSE AS maritime
FROM ne_50m_admin_1_states_provinces_lines FROM ne_50m_admin_1_states_provinces_lines
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -162,26 +258,27 @@ CREATE OR REPLACE VIEW boundary_z1 AS (
-- etldoc: ne_50m_admin_0_boundary_lines_land -> boundary_z3 -- etldoc: ne_50m_admin_0_boundary_lines_land -> boundary_z3
-- etldoc: ne_50m_admin_1_states_provinces_lines -> boundary_z3 -- etldoc: ne_50m_admin_1_states_provinces_lines -> boundary_z3
-- etldoc: osm_border_disp_linestring_gen11 -> boundary_z3 -- etldoc: osm_border_disp_linestring_gen11 -> boundary_z3
CREATE OR REPLACE VIEW boundary_z3 AS ( CREATE OR REPLACE VIEW boundary_z3 AS
(
SELECT geometry, SELECT geometry,
2 AS admin_level, 2 AS admin_level,
(CASE WHEN featurecla LIKE 'Disputed%' THEN true ELSE false END) AS disputed, (CASE WHEN featurecla LIKE 'Disputed%' THEN TRUE ELSE FALSE END) AS disputed,
NULL AS disputed_name, NULL AS disputed_name,
NULL AS claimed_by, NULL AS claimed_by,
false AS maritime FALSE AS maritime
FROM ne_50m_admin_0_boundary_lines_land FROM ne_50m_admin_0_boundary_lines_land
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
4 AS admin_level, 4 AS admin_level,
false AS disputed, FALSE AS disputed,
NULL AS disputed_name, NULL AS disputed_name,
NULL AS claimed_by, NULL AS claimed_by,
false AS maritime FALSE AS maritime
FROM ne_50m_admin_1_states_provinces_lines FROM ne_50m_admin_1_states_provinces_lines
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -193,22 +290,23 @@ CREATE OR REPLACE VIEW boundary_z3 AS (
-- etldoc: ne_10m_admin_1_states_provinces_lines -> boundary_z4 -- etldoc: ne_10m_admin_1_states_provinces_lines -> boundary_z4
-- etldoc: osm_border_linestring_gen10 -> boundary_z4 -- etldoc: osm_border_linestring_gen10 -> boundary_z4
-- etldoc: osm_border_disp_linestring_gen10 -> boundary_z4 -- etldoc: osm_border_disp_linestring_gen10 -> boundary_z4
CREATE OR REPLACE VIEW boundary_z4 AS ( CREATE OR REPLACE VIEW boundary_z4 AS
(
SELECT geometry, SELECT geometry,
2 AS admin_level, 2 AS admin_level,
(CASE WHEN featurecla LIKE 'Disputed%' THEN true ELSE false END) AS disputed, (CASE WHEN featurecla LIKE 'Disputed%' THEN TRUE ELSE FALSE END) AS disputed,
NULL AS disputed_name, NULL AS disputed_name,
NULL AS claimed_by, NULL AS claimed_by,
false AS maritime FALSE AS maritime
FROM ne_10m_admin_0_boundary_lines_land FROM ne_10m_admin_0_boundary_lines_land
WHERE featurecla <> 'Lease limit' WHERE featurecla <> 'Lease limit'
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
4 AS admin_level, 4 AS admin_level,
false AS disputed, FALSE AS disputed,
NULL AS disputed_name, NULL AS disputed_name,
NULL AS claimed_by, NULL AS claimed_by,
false AS maritime FALSE AS maritime
FROM ne_10m_admin_1_states_provinces_lines FROM ne_10m_admin_1_states_provinces_lines
WHERE min_zoom <= 5 WHERE min_zoom <= 5
UNION ALL UNION ALL
@ -219,11 +317,12 @@ CREATE OR REPLACE VIEW boundary_z4 AS (
NULL AS claimed_by, NULL AS claimed_by,
maritime maritime
FROM osm_border_linestring_gen10 FROM osm_border_linestring_gen10
WHERE maritime=true AND admin_level <= 2 WHERE maritime = TRUE
AND admin_level <= 2
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -232,7 +331,8 @@ CREATE OR REPLACE VIEW boundary_z4 AS (
-- etldoc: osm_border_linestring_gen9 -> boundary_z5 -- etldoc: osm_border_linestring_gen9 -> boundary_z5
-- etldoc: osm_border_disp_linestring_gen9 -> boundary_z5 -- etldoc: osm_border_disp_linestring_gen9 -> boundary_z5
CREATE OR REPLACE VIEW boundary_z5 AS ( CREATE OR REPLACE VIEW boundary_z5 AS
(
SELECT geometry, SELECT geometry,
admin_level, admin_level,
disputed, disputed,
@ -245,7 +345,7 @@ CREATE OR REPLACE VIEW boundary_z5 AS (
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -254,7 +354,8 @@ CREATE OR REPLACE VIEW boundary_z5 AS (
-- etldoc: osm_border_linestring_gen8 -> boundary_z6 -- etldoc: osm_border_linestring_gen8 -> boundary_z6
-- etldoc: osm_border_disp_linestring_gen8 -> boundary_z6 -- etldoc: osm_border_disp_linestring_gen8 -> boundary_z6
CREATE OR REPLACE VIEW boundary_z6 AS ( CREATE OR REPLACE VIEW boundary_z6 AS
(
SELECT geometry, SELECT geometry,
admin_level, admin_level,
disputed, disputed,
@ -267,7 +368,7 @@ CREATE OR REPLACE VIEW boundary_z6 AS (
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -276,7 +377,8 @@ CREATE OR REPLACE VIEW boundary_z6 AS (
-- etldoc: osm_border_linestring_gen7 -> boundary_z7 -- etldoc: osm_border_linestring_gen7 -> boundary_z7
-- etldoc: osm_border_disp_linestring_gen7 -> boundary_z7 -- etldoc: osm_border_disp_linestring_gen7 -> boundary_z7
CREATE OR REPLACE VIEW boundary_z7 AS ( CREATE OR REPLACE VIEW boundary_z7 AS
(
SELECT geometry, SELECT geometry,
admin_level, admin_level,
disputed, disputed,
@ -289,7 +391,7 @@ CREATE OR REPLACE VIEW boundary_z7 AS (
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -298,7 +400,8 @@ CREATE OR REPLACE VIEW boundary_z7 AS (
-- etldoc: osm_border_linestring_gen6 -> boundary_z8 -- etldoc: osm_border_linestring_gen6 -> boundary_z8
-- etldoc: osm_border_disp_linestring_gen6 -> boundary_z8 -- etldoc: osm_border_disp_linestring_gen6 -> boundary_z8
CREATE OR REPLACE VIEW boundary_z8 AS ( CREATE OR REPLACE VIEW boundary_z8 AS
(
SELECT geometry, SELECT geometry,
admin_level, admin_level,
disputed, disputed,
@ -311,7 +414,7 @@ CREATE OR REPLACE VIEW boundary_z8 AS (
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -320,7 +423,8 @@ CREATE OR REPLACE VIEW boundary_z8 AS (
-- etldoc: osm_border_linestring_gen5 -> boundary_z9 -- etldoc: osm_border_linestring_gen5 -> boundary_z9
-- etldoc: osm_border_disp_linestring_gen5 -> boundary_z9 -- etldoc: osm_border_disp_linestring_gen5 -> boundary_z9
CREATE OR REPLACE VIEW boundary_z9 AS ( CREATE OR REPLACE VIEW boundary_z9 AS
(
SELECT geometry, SELECT geometry,
admin_level, admin_level,
disputed, disputed,
@ -333,7 +437,7 @@ CREATE OR REPLACE VIEW boundary_z9 AS (
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -342,7 +446,8 @@ CREATE OR REPLACE VIEW boundary_z9 AS (
-- etldoc: osm_border_linestring_gen4 -> boundary_z10 -- etldoc: osm_border_linestring_gen4 -> boundary_z10
-- etldoc: osm_border_disp_linestring_gen4 -> boundary_z10 -- etldoc: osm_border_disp_linestring_gen4 -> boundary_z10
CREATE OR REPLACE VIEW boundary_z10 AS ( CREATE OR REPLACE VIEW boundary_z10 AS
(
SELECT geometry, SELECT geometry,
admin_level, admin_level,
disputed, disputed,
@ -355,7 +460,7 @@ CREATE OR REPLACE VIEW boundary_z10 AS (
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -364,7 +469,8 @@ CREATE OR REPLACE VIEW boundary_z10 AS (
-- etldoc: osm_border_linestring_gen3 -> boundary_z11 -- etldoc: osm_border_linestring_gen3 -> boundary_z11
-- etldoc: osm_border_disp_linestring_gen3 -> boundary_z11 -- etldoc: osm_border_disp_linestring_gen3 -> boundary_z11
CREATE OR REPLACE VIEW boundary_z11 AS ( CREATE OR REPLACE VIEW boundary_z11 AS
(
SELECT geometry, SELECT geometry,
admin_level, admin_level,
disputed, disputed,
@ -377,7 +483,7 @@ CREATE OR REPLACE VIEW boundary_z11 AS (
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -386,7 +492,8 @@ CREATE OR REPLACE VIEW boundary_z11 AS (
-- etldoc: osm_border_linestring_gen2 -> boundary_z12 -- etldoc: osm_border_linestring_gen2 -> boundary_z12
-- etldoc: osm_border_disp_linestring_gen2 -> boundary_z12 -- etldoc: osm_border_disp_linestring_gen2 -> boundary_z12
CREATE OR REPLACE VIEW boundary_z12 AS ( CREATE OR REPLACE VIEW boundary_z12 AS
(
SELECT geometry, SELECT geometry,
admin_level, admin_level,
disputed, disputed,
@ -398,7 +505,7 @@ CREATE OR REPLACE VIEW boundary_z12 AS (
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -407,7 +514,8 @@ CREATE OR REPLACE VIEW boundary_z12 AS (
-- etldoc: osm_border_linestring_gen1 -> boundary_z13 -- etldoc: osm_border_linestring_gen1 -> boundary_z13
-- etldoc: osm_border_disp_linestring_gen1 -> boundary_z13 -- etldoc: osm_border_disp_linestring_gen1 -> boundary_z13
CREATE OR REPLACE VIEW boundary_z13 AS ( CREATE OR REPLACE VIEW boundary_z13 AS
(
SELECT geometry, SELECT geometry,
admin_level, admin_level,
disputed, disputed,
@ -419,7 +527,7 @@ CREATE OR REPLACE VIEW boundary_z13 AS (
UNION ALL UNION ALL
SELECT geometry, SELECT geometry,
admin_level, admin_level,
true AS disputed, TRUE AS disputed,
edit_name(name) AS disputed_name, edit_name(name) AS disputed_name,
claimed_by, claimed_by,
maritime maritime
@ -429,47 +537,97 @@ CREATE OR REPLACE VIEW boundary_z13 AS (
-- etldoc: layer_boundary[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_boundary[shape=record fillcolor=lightpink, style="rounded,filled",
-- etldoc: label="<sql> layer_boundary |<z0> z0 |<z1_2> z1_2 | <z3> z3 | <z4> z4 | <z5> z5 | <z6> z6 | <z7> z7 | <z8> z8 | <z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13+"] -- etldoc: label="<sql> layer_boundary |<z0> z0 |<z1_2> z1_2 | <z3> z3 | <z4> z4 | <z5> z5 | <z6> z6 | <z7> z7 | <z8> z8 | <z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13+"]
CREATE OR REPLACE FUNCTION layer_boundary(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_boundary(bbox geometry, zoom_level int)
RETURNS TABLE(geometry geometry, admin_level int, disputed int, disputed_name text, claimed_by text, maritime int) AS $$ RETURNS TABLE
SELECT geometry, admin_level, disputed::int, disputed_name, claimed_by, maritime::int FROM ( (
geometry geometry,
admin_level int,
disputed int,
disputed_name text,
claimed_by text,
maritime int
)
AS
$$
SELECT geometry, admin_level, disputed::int, disputed_name, claimed_by, maritime::int
FROM (
-- etldoc: boundary_z0 -> layer_boundary:z0 -- etldoc: boundary_z0 -> layer_boundary:z0
SELECT * FROM boundary_z0 WHERE geometry && bbox AND zoom_level = 0 SELECT *
FROM boundary_z0
WHERE geometry && bbox
AND zoom_level = 0
UNION ALL UNION ALL
-- etldoc: boundary_z1 -> layer_boundary:z1_2 -- etldoc: boundary_z1 -> layer_boundary:z1_2
SELECT * FROM boundary_z1 WHERE geometry && bbox AND zoom_level BETWEEN 1 AND 2 SELECT *
FROM boundary_z1
WHERE geometry && bbox
AND zoom_level BETWEEN 1 AND 2
UNION ALL UNION ALL
-- etldoc: boundary_z3 -> layer_boundary:z3 -- etldoc: boundary_z3 -> layer_boundary:z3
SELECT * FROM boundary_z3 WHERE geometry && bbox AND zoom_level = 3 SELECT *
FROM boundary_z3
WHERE geometry && bbox
AND zoom_level = 3
UNION ALL UNION ALL
-- etldoc: boundary_z4 -> layer_boundary:z4 -- etldoc: boundary_z4 -> layer_boundary:z4
SELECT * FROM boundary_z4 WHERE geometry && bbox AND zoom_level = 4 SELECT *
FROM boundary_z4
WHERE geometry && bbox
AND zoom_level = 4
UNION ALL UNION ALL
-- etldoc: boundary_z5 -> layer_boundary:z5 -- etldoc: boundary_z5 -> layer_boundary:z5
SELECT * FROM boundary_z5 WHERE geometry && bbox AND zoom_level = 5 SELECT *
FROM boundary_z5
WHERE geometry && bbox
AND zoom_level = 5
UNION ALL UNION ALL
-- etldoc: boundary_z6 -> layer_boundary:z6 -- etldoc: boundary_z6 -> layer_boundary:z6
SELECT * FROM boundary_z6 WHERE geometry && bbox AND zoom_level = 6 SELECT *
FROM boundary_z6
WHERE geometry && bbox
AND zoom_level = 6
UNION ALL UNION ALL
-- etldoc: boundary_z7 -> layer_boundary:z7 -- etldoc: boundary_z7 -> layer_boundary:z7
SELECT * FROM boundary_z7 WHERE geometry && bbox AND zoom_level = 7 SELECT *
FROM boundary_z7
WHERE geometry && bbox
AND zoom_level = 7
UNION ALL UNION ALL
-- etldoc: boundary_z8 -> layer_boundary:z8 -- etldoc: boundary_z8 -> layer_boundary:z8
SELECT * FROM boundary_z8 WHERE geometry && bbox AND zoom_level = 8 SELECT *
FROM boundary_z8
WHERE geometry && bbox
AND zoom_level = 8
UNION ALL UNION ALL
-- etldoc: boundary_z9 -> layer_boundary:z9 -- etldoc: boundary_z9 -> layer_boundary:z9
SELECT * FROM boundary_z9 WHERE geometry && bbox AND zoom_level = 9 SELECT *
FROM boundary_z9
WHERE geometry && bbox
AND zoom_level = 9
UNION ALL UNION ALL
-- etldoc: boundary_z10 -> layer_boundary:z10 -- etldoc: boundary_z10 -> layer_boundary:z10
SELECT * FROM boundary_z10 WHERE geometry && bbox AND zoom_level = 10 SELECT *
FROM boundary_z10
WHERE geometry && bbox
AND zoom_level = 10
UNION ALL UNION ALL
-- etldoc: boundary_z11 -> layer_boundary:z11 -- etldoc: boundary_z11 -> layer_boundary:z11
SELECT * FROM boundary_z11 WHERE geometry && bbox AND zoom_level = 11 SELECT *
FROM boundary_z11
WHERE geometry && bbox
AND zoom_level = 11
UNION ALL UNION ALL
-- etldoc: boundary_z12 -> layer_boundary:z12 -- etldoc: boundary_z12 -> layer_boundary:z12
SELECT * FROM boundary_z12 WHERE geometry && bbox AND zoom_level = 12 SELECT *
FROM boundary_z12
WHERE geometry && bbox
AND zoom_level = 12
UNION ALL UNION ALL
-- etldoc: boundary_z13 -> layer_boundary:z13 -- etldoc: boundary_z13 -> layer_boundary:z13
SELECT * FROM boundary_z13 WHERE geometry && bbox AND zoom_level >= 13 SELECT *
FROM boundary_z13
WHERE geometry && bbox
AND zoom_level >= 13
) AS zoom_levels; ) AS zoom_levels;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL IMMUTABLE -- STRICT
PARALLEL SAFE; PARALLEL SAFE;

View File

@ -110,4 +110,3 @@ tables:
#admin_level: ['2'] #admin_level: ['2']
admin_level: [__any__] admin_level: [__any__]
claimed_by: [__any__] claimed_by: [__any__]

View File

@ -4,33 +4,38 @@
CREATE INDEX IF NOT EXISTS osm_building_relation_building_idx ON osm_building_relation (building) WHERE building = '' AND ST_GeometryType(geometry) = 'ST_Polygon'; CREATE INDEX IF NOT EXISTS osm_building_relation_building_idx ON osm_building_relation (building) WHERE building = '' AND ST_GeometryType(geometry) = 'ST_Polygon';
CREATE INDEX IF NOT EXISTS osm_building_relation_member_idx ON osm_building_relation (member) WHERE role = 'outline'; CREATE INDEX IF NOT EXISTS osm_building_relation_member_idx ON osm_building_relation (member) WHERE role = 'outline';
CREATE OR REPLACE VIEW osm_all_buildings AS ( CREATE OR REPLACE VIEW osm_all_buildings AS
(
SELECT
-- etldoc: osm_building_relation -> layer_building:z14_ -- etldoc: osm_building_relation -> layer_building:z14_
-- Buildings built from relations -- Buildings built from relations
SELECT member AS osm_id, geometry, member AS osm_id,
COALESCE(CleanNumeric(height), CleanNumeric(buildingheight)) as height, geometry,
COALESCE(CleanNumeric(min_height), CleanNumeric(buildingmin_height)) as min_height, COALESCE(CleanNumeric(height), CleanNumeric(buildingheight)) AS height,
COALESCE(CleanNumeric(levels), CleanNumeric(buildinglevels)) as levels, COALESCE(CleanNumeric(min_height), CleanNumeric(buildingmin_height)) AS min_height,
COALESCE(CleanNumeric(min_level), CleanNumeric(buildingmin_level)) as min_level, COALESCE(CleanNumeric(levels), CleanNumeric(buildinglevels)) AS levels,
COALESCE(CleanNumeric(min_level), CleanNumeric(buildingmin_level)) AS min_level,
nullif(material, '') AS material, nullif(material, '') AS material,
nullif(colour, '') AS colour, nullif(colour, '') AS colour,
FALSE as hide_3d FALSE AS hide_3d
FROM FROM osm_building_relation
osm_building_relation WHERE building = '' AND ST_GeometryType(geometry) = 'ST_Polygon' WHERE building = ''
AND ST_GeometryType(geometry) = 'ST_Polygon'
UNION ALL UNION ALL
SELECT
-- etldoc: osm_building_polygon -> layer_building:z14_ -- etldoc: osm_building_polygon -> layer_building:z14_
-- Standalone buildings -- Standalone buildings
SELECT obp.osm_id, obp.geometry, obp.osm_id,
COALESCE(CleanNumeric(obp.height), CleanNumeric(obp.buildingheight)) as height, obp.geometry,
COALESCE(CleanNumeric(obp.min_height), CleanNumeric(obp.buildingmin_height)) as min_height, COALESCE(CleanNumeric(obp.height), CleanNumeric(obp.buildingheight)) AS height,
COALESCE(CleanNumeric(obp.levels), CleanNumeric(obp.buildinglevels)) as levels, COALESCE(CleanNumeric(obp.min_height), CleanNumeric(obp.buildingmin_height)) AS min_height,
COALESCE(CleanNumeric(obp.min_level), CleanNumeric(obp.buildingmin_level)) as min_level, COALESCE(CleanNumeric(obp.levels), CleanNumeric(obp.buildinglevels)) AS levels,
COALESCE(CleanNumeric(obp.min_level), CleanNumeric(obp.buildingmin_level)) AS min_level,
nullif(obp.material, '') AS material, nullif(obp.material, '') AS material,
nullif(obp.colour, '') AS colour, nullif(obp.colour, '') AS colour,
obr.role IS NOT NULL AS hide_3d obr.role IS NOT NULL AS hide_3d
FROM FROM osm_building_polygon obp
osm_building_polygon obp
LEFT JOIN osm_building_relation obr ON LEFT JOIN osm_building_relation obr ON
obp.osm_id >= 0 AND obp.osm_id >= 0 AND
obr.member = obp.osm_id AND obr.member = obp.osm_id AND
@ -39,8 +44,21 @@ CREATE OR REPLACE VIEW osm_all_buildings AS (
); );
CREATE OR REPLACE FUNCTION layer_building(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_building(bbox geometry, zoom_level int)
RETURNS TABLE(geometry geometry, osm_id bigint, render_height int, render_min_height int, colour text, hide_3d boolean) AS $$ RETURNS TABLE
SELECT geometry, osm_id, render_height, render_min_height, (
geometry geometry,
osm_id bigint,
render_height int,
render_min_height int,
colour text,
hide_3d boolean
)
AS
$$
SELECT geometry,
osm_id,
render_height,
render_min_height,
COALESCE(colour, CASE material COALESCE(colour, CASE material
-- Ordered by count from taginfo -- Ordered by count from taginfo
WHEN 'cement_block' THEN '#6a7880' WHEN 'cement_block' THEN '#6a7880'
@ -63,33 +81,40 @@ RETURNS TABLE(geometry geometry, osm_id bigint, render_height int, render_min_he
END) AS colour, END) AS colour,
CASE WHEN hide_3d THEN TRUE END AS hide_3d CASE WHEN hide_3d THEN TRUE END AS hide_3d
FROM ( FROM (
-- etldoc: osm_building_polygon_gen1 -> layer_building:z13
SELECT SELECT
osm_id, geometry, -- etldoc: osm_building_block_gen1 -> layer_building:z13
NULL::int AS render_height, NULL::int AS render_min_height, osm_id,
NULL::text AS material, NULL::text AS colour, geometry,
NULL::int AS render_height,
NULL::int AS render_min_height,
NULL::text AS material,
NULL::text AS colour,
FALSE AS hide_3d FALSE AS hide_3d
FROM osm_building_polygon_gen1 FROM osm_building_block_gen1
WHERE zoom_level = 13 AND geometry && bbox WHERE zoom_level = 13
AND geometry && bbox
UNION ALL UNION ALL
SELECT
-- etldoc: osm_building_polygon -> layer_building:z14_ -- etldoc: osm_building_polygon -> layer_building:z14_
SELECT DISTINCT ON (osm_id) DISTINCT ON (osm_id) osm_id,
osm_id, geometry, geometry,
ceil(COALESCE(height, levels * 3.66, 5))::int AS render_height, ceil(COALESCE(height, levels * 3.66, 5))::int AS render_height,
floor(COALESCE(min_height, min_level * 3.66, 0))::int AS render_min_height, floor(COALESCE(min_height, min_level * 3.66, 0))::int AS render_min_height,
material, material,
colour, colour,
hide_3d hide_3d
FROM osm_all_buildings FROM osm_all_buildings
WHERE WHERE (levels IS NULL OR levels < 1000)
(levels IS NULL OR levels < 1000) AND AND (min_level IS NULL OR min_level < 1000)
(min_level IS NULL OR min_level < 1000) AND AND (height IS NULL OR height < 3000)
(height IS NULL OR height < 3000) AND AND (min_height IS NULL OR min_height < 3000)
(min_height IS NULL OR min_height < 3000) AND AND zoom_level >= 14
zoom_level >= 14 AND geometry && bbox AND geometry && bbox
) AS zoom_levels ) AS zoom_levels
ORDER BY render_height ASC, ST_YMin(geometry) DESC; ORDER BY render_height ASC, ST_YMin(geometry) DESC;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL IMMUTABLE; -- STRICT
PARALLEL SAFE
;
-- not handled: where a building outline covers building parts -- not handled: where a building outline covers building parts

View File

@ -20,6 +20,7 @@ layer:
hide_3d: | hide_3d: |
If True, building (part) should not be rendered in 3D. Currently, [building outlines](https://wiki.openstreetmap.org/wiki/Simple_3D_buildings) are marked as hide_3d. If True, building (part) should not be rendered in 3D. Currently, [building outlines](https://wiki.openstreetmap.org/wiki/Simple_3D_buildings) are marked as hide_3d.
schema: schema:
- ./update_building.sql
- ./building.sql - ./building.sql
datasources: datasources:
- type: imposm3 - type: imposm3

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -1,9 +1,9 @@
generalized_tables: #generalized_tables:
# etldoc: imposm3 -> osm_building_polygon_gen1 # # etldoc: imposm3 -> osm_building_polygon_gen1
building_polygon_gen1: # building_polygon_gen1:
source: building_polygon # source: building_polygon
sql_filter: area>power(ZRES12,2) AND ST_IsValid(geometry) # sql_filter: area>power(ZRES12,2) AND ST_IsValid(geometry)
tolerance: ZRES14 # tolerance: ZRES14
tables: tables:
# etldoc: imposm3 -> osm_building_polygon # etldoc: imposm3 -> osm_building_polygon

View File

@ -0,0 +1,125 @@
DROP TRIGGER IF EXISTS trigger_refresh ON buildings.updates;
DROP TRIGGER IF EXISTS trigger_flag ON osm_building_polygon;
--creating aggregated building blocks with removed small polygons and small
--holes. Aggregated polygons are simplified.
--function returning recordset for matview
--returning recordset of buildings aggregates by zres 14, with removed small
--holes and with removed small buildings/blocks
--
CREATE OR REPLACE FUNCTION osm_building_block_gen1()
RETURNS table
(
osm_id bigint,
geometry geometry
)
AS
$$
DECLARE
zres14 float := Zres(14);
zres12 float := Zres(12);
BEGIN
FOR osm_id, geometry IN
WITH dta AS ( -- CTE is used because of optimization
SELECT o.osm_id, o.geometry, ST_ClusterDBSCAN(o.geometry, eps := zres14, minpoints := 1) OVER () cid
FROM osm_building_polygon o
)
SELECT (array_agg(dta.osm_id))[1] osm_id,
ST_Buffer(ST_MemUnion(ST_Buffer(dta.geometry, zres14, 'join=mitre')), -zres14, 'join=mitre') geometry
FROM dta
GROUP BY cid
LOOP
-- removing holes smaller than
IF ST_NumInteriorRings(geometry) > 0 THEN -- only from geometries wih holes
geometry := (
-- there are some multi-geometries in this layer
SELECT ST_Collect(gn)
FROM (
-- in some cases are "holes" NULL, because all holes are smaller than
SELECT COALESCE(
-- exterior ring
ST_MakePolygon(ST_ExteriorRing(dmp.geom), holes),
ST_MakePolygon(ST_ExteriorRing(dmp.geom))
) gn
FROM ST_Dump(geometry) dmp, -- 1 dump polygons
LATERAL (
SELECT array_agg(ST_Boundary(rg.geom)) holes -- 2 create array
FROM ST_DumpRings(dmp.geom) rg -- 3 from rings
WHERE rg.path[1] > 0 -- 5 except inner ring
AND ST_Area(rg.geom) >= power(zres12, 2) -- 4 bigger than
) holes
) new_geom
);
END IF;
IF ST_Area(geometry) < power(zres12, 2) THEN
CONTINUE;
END IF;
-- simplify
geometry := ST_SimplifyPreserveTopology(geometry, zres14::float);
RETURN NEXT;
END LOOP;
END;
$$ LANGUAGE plpgsql STABLE
STRICT
PARALLEL SAFE;
DROP MATERIALIZED VIEW IF EXISTS osm_building_block_gen1;
CREATE MATERIALIZED VIEW osm_building_block_gen1 AS
SELECT *
FROM osm_building_block_gen1();
CREATE INDEX ON osm_building_block_gen1 USING gist (geometry);
CREATE UNIQUE INDEX ON osm_building_block_gen1 USING btree (osm_id);
-- Handle updates
CREATE SCHEMA IF NOT EXISTS buildings;
CREATE TABLE IF NOT EXISTS buildings.updates
(
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION buildings.flag() RETURNS trigger AS
$$
BEGIN
INSERT INTO buildings.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION buildings.refresh() RETURNS trigger AS
$$
BEGIN
RAISE LOG 'Refresh buildings block';
REFRESH MATERIALIZED VIEW osm_building_block_gen1;
-- noinspection SqlWithoutWhere
DELETE FROM buildings.updates;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE
ON osm_building_polygon
FOR EACH STATEMENT
EXECUTE PROCEDURE buildings.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT
ON buildings.updates
INITIALLY DEFERRED
FOR EACH ROW
EXECUTE PROCEDURE buildings.refresh();

View File

@ -2,11 +2,13 @@ DROP TRIGGER IF EXISTS trigger_flag ON osm_housenumber_point;
DROP TRIGGER IF EXISTS trigger_refresh ON housenumber.updates; DROP TRIGGER IF EXISTS trigger_refresh ON housenumber.updates;
-- etldoc: osm_housenumber_point -> osm_housenumber_point -- etldoc: osm_housenumber_point -> osm_housenumber_point
CREATE OR REPLACE FUNCTION convert_housenumber_point() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION convert_housenumber_point() RETURNS void AS
$$
BEGIN BEGIN
UPDATE osm_housenumber_point UPDATE osm_housenumber_point
SET geometry = SET geometry =
CASE WHEN ST_NPoints(ST_ConvexHull(geometry))=ST_NPoints(geometry) CASE
WHEN ST_NPoints(ST_ConvexHull(geometry)) = ST_NPoints(geometry)
THEN ST_Centroid(geometry) THEN ST_Centroid(geometry)
ELSE ST_PointOnSurface(geometry) ELSE ST_PointOnSurface(geometry)
END END
@ -20,32 +22,40 @@ SELECT convert_housenumber_point();
CREATE SCHEMA IF NOT EXISTS housenumber; CREATE SCHEMA IF NOT EXISTS housenumber;
CREATE TABLE IF NOT EXISTS housenumber.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS housenumber.updates
CREATE OR REPLACE FUNCTION housenumber.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION housenumber.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO housenumber.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO housenumber.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION housenumber.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION housenumber.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh housenumber'; RAISE LOG 'Refresh housenumber';
PERFORM convert_housenumber_point(); PERFORM convert_housenumber_point();
-- noinspection SqlWithoutWhere
DELETE FROM housenumber.updates; DELETE FROM housenumber.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_housenumber_point AFTER INSERT OR UPDATE OR DELETE
ON osm_housenumber_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE housenumber.flag(); EXECUTE PROCEDURE housenumber.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON housenumber.updates AFTER INSERT
ON housenumber.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE housenumber.refresh(); EXECUTE PROCEDURE housenumber.refresh();

View File

@ -1,12 +1,23 @@
-- etldoc: layer_housenumber[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_housenumber[shape=record fillcolor=lightpink, style="rounded,filled",
-- etldoc: label="layer_housenumber | <z14_> z14+" ] ; -- etldoc: label="layer_housenumber | <z14_> z14+" ] ;
CREATE OR REPLACE FUNCTION layer_housenumber(bbox geometry, zoom_level integer) CREATE OR REPLACE FUNCTION layer_housenumber(bbox geometry, zoom_level integer)
RETURNS TABLE(osm_id bigint, geometry geometry, housenumber text) AS $$ RETURNS TABLE
-- etldoc: osm_housenumber_point -> layer_housenumber:z14_ (
SELECT osm_id, geometry, housenumber FROM osm_housenumber_point osm_id bigint,
WHERE zoom_level >= 14 AND geometry && bbox; geometry geometry,
housenumber text
)
AS
$$ $$
LANGUAGE SQL SELECT
IMMUTABLE PARALLEL SAFE; -- etldoc: osm_housenumber_point -> layer_housenumber:z14_
osm_id,
geometry,
housenumber
FROM osm_housenumber_point
WHERE zoom_level >= 14
AND geometry && bbox;
$$ LANGUAGE SQL STABLE
-- STRICT
PARALLEL SAFE;

View File

@ -9,127 +9,183 @@
--); --);
--CREATE INDEX IF NOT EXISTS landcover_grouped_gen2_geometry_idx ON landcover_grouped_gen2 USING gist(geometry); --CREATE INDEX IF NOT EXISTS landcover_grouped_gen2_geometry_idx ON landcover_grouped_gen2 USING gist(geometry);
CREATE OR REPLACE FUNCTION landcover_class(subclass VARCHAR) RETURNS TEXT AS $$ CREATE OR REPLACE FUNCTION landcover_class(subclass varchar) RETURNS text AS
$$
SELECT CASE SELECT CASE
%%FIELD_MAPPING: class %% %%FIELD_MAPPING: class %%
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL -- STRICT
IMMUTABLE PARALLEL SAFE; PARALLEL SAFE;
-- etldoc: ne_110m_glaciated_areas -> landcover_z0 -- etldoc: ne_110m_glaciated_areas -> landcover_z0
CREATE OR REPLACE VIEW landcover_z0 AS ( CREATE OR REPLACE VIEW landcover_z0 AS
SELECT NULL::bigint AS osm_id, geometry, 'glacier'::text AS subclass FROM ne_110m_glaciated_areas (
SELECT NULL::bigint AS osm_id, geometry, 'glacier'::text AS subclass
FROM ne_110m_glaciated_areas
); );
CREATE OR REPLACE VIEW landcover_z2 AS ( CREATE OR REPLACE VIEW landcover_z2 AS
(
-- etldoc: ne_50m_glaciated_areas -> landcover_z2 -- etldoc: ne_50m_glaciated_areas -> landcover_z2
SELECT NULL::bigint AS osm_id, geometry, 'glacier'::text AS subclass FROM ne_50m_glaciated_areas SELECT NULL::bigint AS osm_id, geometry, 'glacier'::text AS subclass
FROM ne_50m_glaciated_areas
UNION ALL UNION ALL
-- etldoc: ne_50m_antarctic_ice_shelves_polys -> landcover_z2 -- etldoc: ne_50m_antarctic_ice_shelves_polys -> landcover_z2
SELECT NULL::bigint AS osm_id, geometry, 'ice_shelf'::text AS subclass FROM ne_50m_antarctic_ice_shelves_polys SELECT NULL::bigint AS osm_id, geometry, 'ice_shelf'::text AS subclass
FROM ne_50m_antarctic_ice_shelves_polys
); );
CREATE OR REPLACE VIEW landcover_z5 AS ( CREATE OR REPLACE VIEW landcover_z5 AS
(
-- etldoc: ne_10m_glaciated_areas -> landcover_z5 -- etldoc: ne_10m_glaciated_areas -> landcover_z5
SELECT NULL::bigint AS osm_id, geometry, 'glacier'::text AS subclass FROM ne_10m_glaciated_areas SELECT NULL::bigint AS osm_id, geometry, 'glacier'::text AS subclass
FROM ne_10m_glaciated_areas
UNION ALL UNION ALL
-- etldoc: ne_10m_antarctic_ice_shelves_polys -> landcover_z5 -- etldoc: ne_10m_antarctic_ice_shelves_polys -> landcover_z5
SELECT NULL::bigint AS osm_id, geometry, 'ice_shelf'::text AS subclass FROM ne_10m_antarctic_ice_shelves_polys SELECT NULL::bigint AS osm_id, geometry, 'ice_shelf'::text AS subclass
FROM ne_10m_antarctic_ice_shelves_polys
); );
CREATE OR REPLACE VIEW landcover_z7 AS ( CREATE OR REPLACE VIEW landcover_z7 AS
(
-- etldoc: osm_landcover_polygon_gen7 -> landcover_z7 -- etldoc: osm_landcover_polygon_gen7 -> landcover_z7
SELECT osm_id, geometry, subclass FROM osm_landcover_polygon_gen7 SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen7
); );
CREATE OR REPLACE VIEW landcover_z8 AS ( CREATE OR REPLACE VIEW landcover_z8 AS
(
-- etldoc: osm_landcover_polygon_gen6 -> landcover_z8 -- etldoc: osm_landcover_polygon_gen6 -> landcover_z8
SELECT osm_id, geometry, subclass FROM osm_landcover_polygon_gen6 SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen6
); );
CREATE OR REPLACE VIEW landcover_z9 AS ( CREATE OR REPLACE VIEW landcover_z9 AS
(
-- etldoc: osm_landcover_polygon_gen5 -> landcover_z9 -- etldoc: osm_landcover_polygon_gen5 -> landcover_z9
SELECT osm_id, geometry, subclass FROM osm_landcover_polygon_gen5 SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen5
); );
CREATE OR REPLACE VIEW landcover_z10 AS ( CREATE OR REPLACE VIEW landcover_z10 AS
(
-- etldoc: osm_landcover_polygon_gen4 -> landcover_z10 -- etldoc: osm_landcover_polygon_gen4 -> landcover_z10
SELECT osm_id, geometry, subclass FROM osm_landcover_polygon_gen4 SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen4
); );
CREATE OR REPLACE VIEW landcover_z11 AS ( CREATE OR REPLACE VIEW landcover_z11 AS
(
-- etldoc: osm_landcover_polygon_gen3 -> landcover_z11 -- etldoc: osm_landcover_polygon_gen3 -> landcover_z11
SELECT osm_id, geometry, subclass FROM osm_landcover_polygon_gen3 SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen3
); );
CREATE OR REPLACE VIEW landcover_z12 AS ( CREATE OR REPLACE VIEW landcover_z12 AS
(
-- etldoc: osm_landcover_polygon_gen2 -> landcover_z12 -- etldoc: osm_landcover_polygon_gen2 -> landcover_z12
SELECT osm_id, geometry, subclass FROM osm_landcover_polygon_gen2 SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen2
); );
CREATE OR REPLACE VIEW landcover_z13 AS ( CREATE OR REPLACE VIEW landcover_z13 AS
(
-- etldoc: osm_landcover_polygon_gen1 -> landcover_z13 -- etldoc: osm_landcover_polygon_gen1 -> landcover_z13
SELECT osm_id, geometry, subclass FROM osm_landcover_polygon_gen1 SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen1
); );
CREATE OR REPLACE VIEW landcover_z14 AS ( CREATE OR REPLACE VIEW landcover_z14 AS
(
-- etldoc: osm_landcover_polygon -> landcover_z14 -- etldoc: osm_landcover_polygon -> landcover_z14
SELECT osm_id, geometry, subclass FROM osm_landcover_polygon SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon
); );
-- etldoc: layer_landcover[shape=record fillcolor=lightpink, style="rounded, filled", label="layer_landcover | <z0_1> z0-z1 | <z2_4> z2-z4 | <z5_6> z5-z6 |<z7> z7 |<z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14_> z14+" ] ; -- etldoc: layer_landcover[shape=record fillcolor=lightpink, style="rounded, filled", label="layer_landcover | <z0_1> z0-z1 | <z2_4> z2-z4 | <z5_6> z5-z6 |<z7> z7 |<z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14_> z14+" ] ;
CREATE OR REPLACE FUNCTION layer_landcover(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_landcover(bbox geometry, zoom_level int)
RETURNS TABLE(osm_id bigint, geometry geometry, class text, subclass text) AS $$ RETURNS TABLE
SELECT osm_id, geometry, (
osm_id bigint,
geometry geometry,
class text,
subclass text
)
AS
$$
SELECT osm_id,
geometry,
landcover_class(subclass) AS class, landcover_class(subclass) AS class,
subclass subclass
FROM ( FROM (
-- etldoc: landcover_z0 -> layer_landcover:z0_1 -- etldoc: landcover_z0 -> layer_landcover:z0_1
SELECT * FROM landcover_z0 SELECT *
WHERE zoom_level BETWEEN 0 AND 1 AND geometry && bbox FROM landcover_z0
WHERE zoom_level BETWEEN 0 AND 1
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z2 -> layer_landcover:z2_4 -- etldoc: landcover_z2 -> layer_landcover:z2_4
SELECT * FROM landcover_z2 SELECT *
WHERE zoom_level BETWEEN 2 AND 4 AND geometry && bbox FROM landcover_z2
WHERE zoom_level BETWEEN 2 AND 4
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z5 -> layer_landcover:z5_6 -- etldoc: landcover_z5 -> layer_landcover:z5_6
SELECT * FROM landcover_z5 SELECT *
WHERE zoom_level BETWEEN 5 AND 6 AND geometry && bbox FROM landcover_z5
WHERE zoom_level BETWEEN 5 AND 6
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z7 -> layer_landcover:z7 -- etldoc: landcover_z7 -> layer_landcover:z7
SELECT * SELECT *
FROM landcover_z7 WHERE zoom_level = 7 AND geometry && bbox FROM landcover_z7
WHERE zoom_level = 7
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z8 -> layer_landcover:z8 -- etldoc: landcover_z8 -> layer_landcover:z8
SELECT * SELECT *
FROM landcover_z8 WHERE zoom_level = 8 AND geometry && bbox FROM landcover_z8
WHERE zoom_level = 8
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z9 -> layer_landcover:z9 -- etldoc: landcover_z9 -> layer_landcover:z9
SELECT * SELECT *
FROM landcover_z9 WHERE zoom_level = 9 AND geometry && bbox FROM landcover_z9
WHERE zoom_level = 9
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z10 -> layer_landcover:z10 -- etldoc: landcover_z10 -> layer_landcover:z10
SELECT * SELECT *
FROM landcover_z10 WHERE zoom_level = 10 AND geometry && bbox FROM landcover_z10
WHERE zoom_level = 10
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z11 -> layer_landcover:z11 -- etldoc: landcover_z11 -> layer_landcover:z11
SELECT * SELECT *
FROM landcover_z11 WHERE zoom_level = 11 AND geometry && bbox FROM landcover_z11
WHERE zoom_level = 11
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z12 -> layer_landcover:z12 -- etldoc: landcover_z12 -> layer_landcover:z12
SELECT * SELECT *
FROM landcover_z12 WHERE zoom_level = 12 AND geometry && bbox FROM landcover_z12
WHERE zoom_level = 12
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z13 -> layer_landcover:z13 -- etldoc: landcover_z13 -> layer_landcover:z13
SELECT * SELECT *
FROM landcover_z13 WHERE zoom_level = 13 AND geometry && bbox FROM landcover_z13
WHERE zoom_level = 13
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z14 -> layer_landcover:z14_ -- etldoc: landcover_z14 -> layer_landcover:z14_
SELECT * SELECT *
FROM landcover_z14 WHERE zoom_level >= 14 AND geometry && bbox FROM landcover_z14
WHERE zoom_level >= 14
AND geometry && bbox
) AS zoom_levels; ) AS zoom_levels;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL -- STRICT
IMMUTABLE PARALLEL SAFE; PARALLEL SAFE;

View File

@ -1,61 +1,141 @@
-- etldoc: ne_50m_urban_areas -> landuse_z4 -- etldoc: ne_50m_urban_areas -> landuse_z4
CREATE OR REPLACE VIEW landuse_z4 AS ( CREATE OR REPLACE VIEW landuse_z4 AS
SELECT NULL::bigint AS osm_id, geometry, 'residential'::text AS landuse, NULL::text AS amenity, NULL::text AS leisure, NULL::text AS tourism, NULL::text AS place, NULL::text AS waterway (
SELECT NULL::bigint AS osm_id,
geometry,
'residential'::text AS landuse,
NULL::text AS amenity,
NULL::text AS leisure,
NULL::text AS tourism,
NULL::text AS place,
NULL::text AS waterway
FROM ne_50m_urban_areas FROM ne_50m_urban_areas
WHERE scalerank <= 2 WHERE scalerank <= 2
); );
-- etldoc: ne_50m_urban_areas -> landuse_z5 -- etldoc: ne_50m_urban_areas -> landuse_z5
CREATE OR REPLACE VIEW landuse_z5 AS ( CREATE OR REPLACE VIEW landuse_z5 AS
SELECT NULL::bigint AS osm_id, geometry, 'residential'::text AS landuse, NULL::text AS amenity, NULL::text AS leisure, NULL::text AS tourism, NULL::text AS place, NULL::text AS waterway (
SELECT NULL::bigint AS osm_id,
geometry,
'residential'::text AS landuse,
NULL::text AS amenity,
NULL::text AS leisure,
NULL::text AS tourism,
NULL::text AS place,
NULL::text AS waterway
FROM ne_50m_urban_areas FROM ne_50m_urban_areas
); );
-- etldoc: osm_landuse_polygon_gen7 -> landuse_z6 -- etldoc: osm_landuse_polygon_gen7 -> landuse_z6
CREATE OR REPLACE VIEW landuse_z6 AS ( CREATE OR REPLACE VIEW landuse_z6 AS
SELECT osm_id, geometry, landuse, amenity, leisure, tourism, place, waterway (
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway
FROM osm_landuse_polygon_gen7 FROM osm_landuse_polygon_gen7
); );
-- etldoc: osm_landuse_polygon_gen6 -> landuse_z8 -- etldoc: osm_landuse_polygon_gen6 -> landuse_z8
CREATE OR REPLACE VIEW landuse_z8 AS ( CREATE OR REPLACE VIEW landuse_z8 AS
SELECT osm_id, geometry, landuse, amenity, leisure, tourism, place, waterway (
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway
FROM osm_landuse_polygon_gen6 FROM osm_landuse_polygon_gen6
); );
-- etldoc: osm_landuse_polygon_gen5 -> landuse_z9 -- etldoc: osm_landuse_polygon_gen5 -> landuse_z9
CREATE OR REPLACE VIEW landuse_z9 AS ( CREATE OR REPLACE VIEW landuse_z9 AS
SELECT osm_id, geometry, landuse, amenity, leisure, tourism, place, waterway (
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway
FROM osm_landuse_polygon_gen5 FROM osm_landuse_polygon_gen5
); );
-- etldoc: osm_landuse_polygon_gen4 -> landuse_z10 -- etldoc: osm_landuse_polygon_gen4 -> landuse_z10
CREATE OR REPLACE VIEW landuse_z10 AS ( CREATE OR REPLACE VIEW landuse_z10 AS
SELECT osm_id, geometry, landuse, amenity, leisure, tourism, place, waterway (
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway
FROM osm_landuse_polygon_gen4 FROM osm_landuse_polygon_gen4
); );
-- etldoc: osm_landuse_polygon_gen3 -> landuse_z11 -- etldoc: osm_landuse_polygon_gen3 -> landuse_z11
CREATE OR REPLACE VIEW landuse_z11 AS ( CREATE OR REPLACE VIEW landuse_z11 AS
SELECT osm_id, geometry, landuse, amenity, leisure, tourism, place, waterway (
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway
FROM osm_landuse_polygon_gen3 FROM osm_landuse_polygon_gen3
); );
-- etldoc: osm_landuse_polygon_gen2 -> landuse_z12 -- etldoc: osm_landuse_polygon_gen2 -> landuse_z12
CREATE OR REPLACE VIEW landuse_z12 AS ( CREATE OR REPLACE VIEW landuse_z12 AS
SELECT osm_id, geometry, landuse, amenity, leisure, tourism, place, waterway (
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway
FROM osm_landuse_polygon_gen2 FROM osm_landuse_polygon_gen2
); );
-- etldoc: osm_landuse_polygon_gen1 -> landuse_z13 -- etldoc: osm_landuse_polygon_gen1 -> landuse_z13
CREATE OR REPLACE VIEW landuse_z13 AS ( CREATE OR REPLACE VIEW landuse_z13 AS
SELECT osm_id, geometry, landuse, amenity, leisure, tourism, place, waterway (
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway
FROM osm_landuse_polygon_gen1 FROM osm_landuse_polygon_gen1
); );
-- etldoc: osm_landuse_polygon -> landuse_z14 -- etldoc: osm_landuse_polygon -> landuse_z14
CREATE OR REPLACE VIEW landuse_z14 AS ( CREATE OR REPLACE VIEW landuse_z14 AS
SELECT osm_id, geometry, landuse, amenity, leisure, tourism, place, waterway (
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway
FROM osm_landuse_polygon FROM osm_landuse_polygon
); );
@ -63,8 +143,16 @@ CREATE OR REPLACE VIEW landuse_z14 AS (
-- etldoc: label="layer_landuse |<z4> z4|<z5>z5|<z6>z6|<z7>z7| <z8> z8 |<z9> z9 |<z10> z10 |<z11> z11|<z12> z12|<z13> z13|<z14> z14+" ] ; -- etldoc: label="layer_landuse |<z4> z4|<z5>z5|<z6>z6|<z7>z7| <z8> z8 |<z9> z9 |<z10> z10 |<z11> z11|<z12> z12|<z13> z13|<z14> z14+" ] ;
CREATE OR REPLACE FUNCTION layer_landuse(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_landuse(bbox geometry, zoom_level int)
RETURNS TABLE(osm_id bigint, geometry geometry, class text) AS $$ RETURNS TABLE
SELECT osm_id, geometry, (
osm_id bigint,
geometry geometry,
class text
)
AS
$$
SELECT osm_id,
geometry,
COALESCE( COALESCE(
NULLIF(landuse, ''), NULLIF(landuse, ''),
NULLIF(amenity, ''), NULLIF(amenity, ''),
@ -75,39 +163,57 @@ RETURNS TABLE(osm_id bigint, geometry geometry, class text) AS $$
) AS class ) AS class
FROM ( FROM (
-- etldoc: landuse_z4 -> layer_landuse:z4 -- etldoc: landuse_z4 -> layer_landuse:z4
SELECT * FROM landuse_z4 SELECT *
FROM landuse_z4
WHERE zoom_level = 4 WHERE zoom_level = 4
UNION ALL UNION ALL
-- etldoc: landuse_z5 -> layer_landuse:z5 -- etldoc: landuse_z5 -> layer_landuse:z5
SELECT * FROM landuse_z5 SELECT *
FROM landuse_z5
WHERE zoom_level = 5 WHERE zoom_level = 5
UNION ALL UNION ALL
-- etldoc: landuse_z6 -> layer_landuse:z6 -- etldoc: landuse_z6 -> layer_landuse:z6
-- etldoc: landuse_z6 -> layer_landuse:z7 -- etldoc: landuse_z6 -> layer_landuse:z7
SELECT * FROM landuse_z6 WHERE zoom_level BETWEEN 6 AND 7 SELECT *
FROM landuse_z6
WHERE zoom_level BETWEEN 6 AND 7
UNION ALL UNION ALL
-- etldoc: landuse_z8 -> layer_landuse:z8 -- etldoc: landuse_z8 -> layer_landuse:z8
SELECT * FROM landuse_z8 WHERE zoom_level = 8 SELECT *
FROM landuse_z8
WHERE zoom_level = 8
UNION ALL UNION ALL
-- etldoc: landuse_z9 -> layer_landuse:z9 -- etldoc: landuse_z9 -> layer_landuse:z9
SELECT * FROM landuse_z9 WHERE zoom_level = 9 SELECT *
FROM landuse_z9
WHERE zoom_level = 9
UNION ALL UNION ALL
-- etldoc: landuse_z10 -> layer_landuse:z10 -- etldoc: landuse_z10 -> layer_landuse:z10
SELECT * FROM landuse_z10 WHERE zoom_level = 10 SELECT *
FROM landuse_z10
WHERE zoom_level = 10
UNION ALL UNION ALL
-- etldoc: landuse_z11 -> layer_landuse:z11 -- etldoc: landuse_z11 -> layer_landuse:z11
SELECT * FROM landuse_z11 WHERE zoom_level = 11 SELECT *
FROM landuse_z11
WHERE zoom_level = 11
UNION ALL UNION ALL
-- etldoc: landuse_z12 -> layer_landuse:z12 -- etldoc: landuse_z12 -> layer_landuse:z12
SELECT * FROM landuse_z12 WHERE zoom_level = 12 SELECT *
FROM landuse_z12
WHERE zoom_level = 12
UNION ALL UNION ALL
-- etldoc: landuse_z13 -> layer_landuse:z13 -- etldoc: landuse_z13 -> layer_landuse:z13
SELECT * FROM landuse_z13 WHERE zoom_level = 13 SELECT *
FROM landuse_z13
WHERE zoom_level = 13
UNION ALL UNION ALL
-- etldoc: landuse_z14 -> layer_landuse:z14 -- etldoc: landuse_z14 -> layer_landuse:z14
SELECT * FROM landuse_z14 WHERE zoom_level >= 14 SELECT *
FROM landuse_z14
WHERE zoom_level >= 14
) AS zoom_levels ) AS zoom_levels
WHERE geometry && bbox; WHERE geometry && bbox;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL -- STRICT
IMMUTABLE PARALLEL SAFE; PARALLEL SAFE;

View File

@ -1,12 +1,11 @@
-- etldoc: layer_mountain_peak[shape=record fillcolor=lightpink, -- etldoc: layer_mountain_peak[shape=record fillcolor=lightpink,
-- etldoc: style="rounded,filled", label="layer_mountain_peak | <z7_> z7+" ] ; -- etldoc: style="rounded,filled", label="layer_mountain_peak | <z7_> z7+" ] ;
CREATE OR REPLACE FUNCTION layer_mountain_peak( CREATE OR REPLACE FUNCTION layer_mountain_peak(bbox geometry,
bbox geometry,
zoom_level integer, zoom_level integer,
pixel_width numeric) pixel_width numeric)
RETURNS TABLE( RETURNS TABLE
(
osm_id bigint, osm_id bigint,
geometry geometry, geometry geometry,
name text, name text,
@ -16,10 +15,12 @@ CREATE OR REPLACE FUNCTION layer_mountain_peak(
tags hstore, tags hstore,
ele int, ele int,
ele_ft int, ele_ft int,
"rank" int) AS "rank" int
)
AS
$$ $$
-- etldoc: osm_peak_point -> layer_mountain_peak:z7_
SELECT SELECT
-- etldoc: osm_peak_point -> layer_mountain_peak:z7_
osm_id, osm_id,
geometry, geometry,
name, name,
@ -29,29 +30,33 @@ $$
tags, tags,
ele::int, ele::int,
ele_ft::int, ele_ft::int,
rank::int FROM ( rank::int
SELECT osm_id, geometry, name, FROM (
SELECT osm_id,
geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
substring(ele from E'^(-?\\d+)(\\D|$)')::int AS ele, substring(ele FROM E'^(-?\\d+)(\\D|$)')::int AS ele,
round(substring(ele from E'^(-?\\d+)(\\D|$)')::int*3.2808399)::int AS ele_ft, round(substring(ele FROM E'^(-?\\d+)(\\D|$)')::int * 3.2808399)::int AS ele_ft,
row_number() OVER ( row_number() OVER (
PARTITION BY LabelGrid(geometry, 100 * pixel_width) PARTITION BY LabelGrid(geometry, 100 * pixel_width)
ORDER BY ( ORDER BY (
substring(ele from E'^(-?\\d+)(\\D|$)')::int + substring(ele FROM E'^(-?\\d+)(\\D|$)')::int +
(CASE WHEN NULLIF(wikipedia, '') is not null THEN 10000 ELSE 0 END) + (CASE WHEN NULLIF(wikipedia, '') IS NOT NULL THEN 10000 ELSE 0 END) +
(CASE WHEN NULLIF(name, '') is not null THEN 10000 ELSE 0 END) (CASE WHEN NULLIF(name, '') IS NOT NULL THEN 10000 ELSE 0 END)
) DESC ) DESC
)::int AS "rank" )::int AS "rank"
FROM osm_peak_point FROM osm_peak_point
WHERE geometry && bbox WHERE geometry && bbox
AND ele is not null AND ele IS NOT NULL
AND ele ~ E'^-?\\d{1,4}(\\D|$)' AND ele ~ E'^-?\\d{1,4}(\\D|$)'
) AS ranked_peaks ) AS ranked_peaks
WHERE zoom_level >= 7 AND (rank <= 5 OR zoom_level >= 14) WHERE zoom_level >= 7
AND (rank <= 5 OR zoom_level >= 14)
ORDER BY "rank" ASC; ORDER BY "rank" ASC;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL PARALLEL SAFE;
IMMUTABLE PARALLEL SAFE; -- TODO: Check if the above can be made STRICT -- i.e. if pixel_width could be NULL

View File

@ -1,48 +1,33 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_peak_point; DROP TRIGGER IF EXISTS trigger_update_point ON osm_peak_point;
DROP TRIGGER IF EXISTS trigger_refresh ON mountain_peak_point.updates;
-- etldoc: osm_peak_point -> osm_peak_point -- etldoc: osm_peak_point -> osm_peak_point
CREATE OR REPLACE FUNCTION update_osm_peak_point() RETURNS VOID AS $$ -- etldoc: osm_peak_point -> osm_peak_point
BEGIN CREATE OR REPLACE FUNCTION update_osm_peak_point(new_osm_id bigint) RETURNS void AS
$$
UPDATE osm_peak_point UPDATE osm_peak_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 (new_osm_id IS NULL OR osm_id = new_osm_id)
AND COALESCE(tags -> 'name:latin', tags -> 'name:nonlatin', tags -> 'name_int') IS NULL
AND tags != update_tags(tags, geometry)
$$ LANGUAGE SQL;
END; SELECT update_osm_peak_point(NULL);
$$ LANGUAGE plpgsql;
SELECT update_osm_peak_point();
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS mountain_peak_point; CREATE SCHEMA IF NOT EXISTS mountain_peak_point;
CREATE TABLE IF NOT EXISTS mountain_peak_point.updates(id serial primary key, t text, unique (t)); CREATE OR REPLACE FUNCTION mountain_peak_point.update() RETURNS trigger AS
CREATE OR REPLACE FUNCTION mountain_peak_point.flag() RETURNS trigger AS $$ $$
BEGIN BEGIN
INSERT INTO mountain_peak_point.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; PERFORM update_osm_peak_point(new.osm_id);
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION mountain_peak_point.refresh() RETURNS trigger AS CREATE CONSTRAINT TRIGGER trigger_update_point
$BODY$ AFTER INSERT OR UPDATE
BEGIN ON osm_peak_point
RAISE LOG 'Refresh mountain_peak_point';
PERFORM update_osm_peak_point();
DELETE FROM mountain_peak_point.updates;
RETURN null;
END;
$BODY$
language plpgsql;
CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_peak_point
FOR EACH STATEMENT
EXECUTE PROCEDURE mountain_peak_point.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON mountain_peak_point.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE mountain_peak_point.refresh(); EXECUTE PROCEDURE mountain_peak_point.update();

View File

@ -2,134 +2,340 @@
-- etldoc: label="layer_park |<z6> z6 |<z7> z7 |<z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14> z14+" ] ; -- etldoc: label="layer_park |<z6> z6 |<z7> z7 |<z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14> z14+" ] ;
CREATE OR REPLACE FUNCTION layer_park(bbox geometry, zoom_level int, pixel_width numeric) CREATE OR REPLACE FUNCTION layer_park(bbox geometry, zoom_level int, pixel_width numeric)
RETURNS TABLE(osm_id bigint, geometry geometry, class text, name text, name_en text, name_de text, tags hstore, rank int) AS $$ RETURNS TABLE
SELECT osm_id, geometry, class, name, name_en, name_de, tags, rank (
osm_id bigint,
geometry geometry,
class text,
name text,
name_en text,
name_de text,
tags hstore,
rank int
)
AS
$$
SELECT osm_id,
geometry,
class,
name,
name_en,
name_de,
tags,
rank
FROM ( FROM (
SELECT osm_id, geometry, SELECT osm_id,
geometry,
COALESCE( COALESCE(
LOWER(REPLACE(NULLIF(protection_title, ''), ' ', '_')), LOWER(REPLACE(NULLIF(protection_title, ''), ' ', '_')),
NULLIF(boundary, ''), NULLIF(boundary, ''),
NULLIF(leisure, '') NULLIF(leisure, '')
) AS class, ) AS class,
name, name_en, name_de, tags, name,
NULL::int as rank name_en,
name_de,
tags,
NULL::int AS rank
FROM ( FROM (
-- etldoc: osm_park_polygon_gen8 -> layer_park:z6 -- etldoc: osm_park_polygon_gen8 -> layer_park:z6
SELECT osm_id, geometry, name, name_en, name_de, tags, leisure, boundary, protection_title SELECT osm_id,
geometry,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title
FROM osm_park_polygon_gen8 FROM osm_park_polygon_gen8
WHERE zoom_level = 6 AND geometry && bbox WHERE zoom_level = 6
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen7 -> layer_park:z7 -- etldoc: osm_park_polygon_gen7 -> layer_park:z7
SELECT osm_id, geometry, name, name_en, name_de, tags, leisure, boundary, protection_title SELECT osm_id,
geometry,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title
FROM osm_park_polygon_gen7 FROM osm_park_polygon_gen7
WHERE zoom_level = 7 AND geometry && bbox WHERE zoom_level = 7
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen6 -> layer_park:z8 -- etldoc: osm_park_polygon_gen6 -> layer_park:z8
SELECT osm_id, geometry, name, name_en, name_de, tags, leisure, boundary, protection_title SELECT osm_id,
geometry,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title
FROM osm_park_polygon_gen6 FROM osm_park_polygon_gen6
WHERE zoom_level = 8 AND geometry && bbox WHERE zoom_level = 8
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen5 -> layer_park:z9 -- etldoc: osm_park_polygon_gen5 -> layer_park:z9
SELECT osm_id, geometry, name, name_en, name_de, tags, leisure, boundary, protection_title SELECT osm_id,
geometry,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title
FROM osm_park_polygon_gen5 FROM osm_park_polygon_gen5
WHERE zoom_level = 9 AND geometry && bbox WHERE zoom_level = 9
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen4 -> layer_park:z10 -- etldoc: osm_park_polygon_gen4 -> layer_park:z10
SELECT osm_id, geometry, name, name_en, name_de, tags, leisure, boundary, protection_title SELECT osm_id,
geometry,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title
FROM osm_park_polygon_gen4 FROM osm_park_polygon_gen4
WHERE zoom_level = 10 AND geometry && bbox WHERE zoom_level = 10
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen3 -> layer_park:z11 -- etldoc: osm_park_polygon_gen3 -> layer_park:z11
SELECT osm_id, geometry, name, name_en, name_de, tags, leisure, boundary, protection_title SELECT osm_id,
geometry,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title
FROM osm_park_polygon_gen3 FROM osm_park_polygon_gen3
WHERE zoom_level = 11 AND geometry && bbox WHERE zoom_level = 11
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen2 -> layer_park:z12 -- etldoc: osm_park_polygon_gen2 -> layer_park:z12
SELECT osm_id, geometry, name, name_en, name_de, tags, leisure, boundary, protection_title SELECT osm_id,
geometry,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title
FROM osm_park_polygon_gen2 FROM osm_park_polygon_gen2
WHERE zoom_level = 12 AND geometry && bbox WHERE zoom_level = 12
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen1 -> layer_park:z13 -- etldoc: osm_park_polygon_gen1 -> layer_park:z13
SELECT osm_id, geometry, name, name_en, name_de, tags, leisure, boundary, protection_title SELECT osm_id,
geometry,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title
FROM osm_park_polygon_gen1 FROM osm_park_polygon_gen1
WHERE zoom_level = 13 AND geometry && bbox WHERE zoom_level = 13
AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon -> layer_park:z14 -- etldoc: osm_park_polygon -> layer_park:z14
SELECT osm_id, geometry, name, name_en, name_de, tags, leisure, boundary, protection_title SELECT osm_id,
geometry,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title
FROM osm_park_polygon FROM osm_park_polygon
WHERE zoom_level >= 14 AND geometry && bbox WHERE zoom_level >= 14
AND geometry && bbox
) AS park_polygon ) AS park_polygon
UNION ALL UNION ALL
SELECT osm_id, geometry_point AS geometry, SELECT osm_id,
geometry_point AS geometry,
COALESCE( COALESCE(
LOWER(REPLACE(NULLIF(protection_title, ''), ' ', '_')), LOWER(REPLACE(NULLIF(protection_title, ''), ' ', '_')),
NULLIF(boundary, ''), NULLIF(boundary, ''),
NULLIF(leisure, '') NULLIF(leisure, '')
) AS class, ) AS class,
name, name_en, name_de, tags, name,
name_en,
name_de,
tags,
row_number() OVER ( row_number() OVER (
PARTITION BY LabelGrid(geometry_point, 100 * pixel_width) PARTITION BY LabelGrid(geometry_point, 100 * pixel_width)
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,
area DESC area DESC
)::int AS "rank" )::int AS "rank"
FROM ( FROM (
-- etldoc: osm_park_polygon_gen8 -> layer_park:z6 -- etldoc: osm_park_polygon_gen8 -> layer_park:z6
SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, protection_title, area SELECT osm_id,
geometry_point,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title,
area
FROM osm_park_polygon_gen8 FROM osm_park_polygon_gen8
WHERE zoom_level = 6 AND geometry_point && bbox WHERE zoom_level = 6
AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen7 -> layer_park:z7 -- etldoc: osm_park_polygon_gen7 -> layer_park:z7
SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, protection_title, area SELECT osm_id,
geometry_point,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title,
area
FROM osm_park_polygon_gen7 FROM osm_park_polygon_gen7
WHERE zoom_level = 7 AND geometry_point && bbox WHERE zoom_level = 7
AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen6 -> layer_park:z8 -- etldoc: osm_park_polygon_gen6 -> layer_park:z8
SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, protection_title, area SELECT osm_id,
geometry_point,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title,
area
FROM osm_park_polygon_gen6 FROM osm_park_polygon_gen6
WHERE zoom_level = 8 AND geometry_point && bbox WHERE zoom_level = 8
AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen5 -> layer_park:z9 -- etldoc: osm_park_polygon_gen5 -> layer_park:z9
SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, protection_title, area SELECT osm_id,
geometry_point,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title,
area
FROM osm_park_polygon_gen5 FROM osm_park_polygon_gen5
WHERE zoom_level = 9 AND geometry_point && bbox WHERE zoom_level = 9
AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen4 -> layer_park:z10 -- etldoc: osm_park_polygon_gen4 -> layer_park:z10
SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, protection_title, area SELECT osm_id,
geometry_point,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title,
area
FROM osm_park_polygon_gen4 FROM osm_park_polygon_gen4
WHERE zoom_level = 10 AND geometry_point && bbox WHERE zoom_level = 10
AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen3 -> layer_park:z11 -- etldoc: osm_park_polygon_gen3 -> layer_park:z11
SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, protection_title, area SELECT osm_id,
geometry_point,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title,
area
FROM osm_park_polygon_gen3 FROM osm_park_polygon_gen3
WHERE zoom_level = 11 AND geometry_point && bbox WHERE zoom_level = 11
AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen2 -> layer_park:z12 -- etldoc: osm_park_polygon_gen2 -> layer_park:z12
SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, protection_title, area SELECT osm_id,
geometry_point,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title,
area
FROM osm_park_polygon_gen2 FROM osm_park_polygon_gen2
WHERE zoom_level = 12 AND geometry_point && bbox WHERE zoom_level = 12
AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen1 -> layer_park:z13 -- etldoc: osm_park_polygon_gen1 -> layer_park:z13
SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, protection_title, area SELECT osm_id,
geometry_point,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title,
area
FROM osm_park_polygon_gen1 FROM osm_park_polygon_gen1
WHERE zoom_level = 13 AND geometry_point && bbox WHERE zoom_level = 13
AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon -> layer_park:z14 -- etldoc: osm_park_polygon -> layer_park:z14
SELECT osm_id, geometry_point, name, name_en, name_de, tags, leisure, boundary, protection_title, area SELECT osm_id,
geometry_point,
name,
name_en,
name_de,
tags,
leisure,
boundary,
protection_title,
area
FROM osm_park_polygon FROM osm_park_polygon
WHERE zoom_level >= 14 AND geometry_point && bbox WHERE zoom_level >= 14
AND geometry_point && bbox
) AS park_point ) AS park_point
) AS park_all; ) AS park_all;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL PARALLEL SAFE;
IMMUTABLE PARALLEL SAFE; -- TODO: Check if the above can be made STRICT -- i.e. if pixel_width could be NULL

View File

@ -1,12 +1,22 @@
ALTER TABLE osm_park_polygon ADD COLUMN IF NOT EXISTS geometry_point geometry; ALTER TABLE osm_park_polygon
ALTER TABLE osm_park_polygon_gen1 ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen2 ADD COLUMN IF NOT EXISTS geometry_point geometry; ALTER TABLE osm_park_polygon_gen1
ALTER TABLE osm_park_polygon_gen3 ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen4 ADD COLUMN IF NOT EXISTS geometry_point geometry; ALTER TABLE osm_park_polygon_gen2
ALTER TABLE osm_park_polygon_gen5 ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen6 ADD COLUMN IF NOT EXISTS geometry_point geometry; ALTER TABLE osm_park_polygon_gen3
ALTER TABLE osm_park_polygon_gen7 ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen8 ADD COLUMN IF NOT EXISTS geometry_point geometry; ALTER TABLE osm_park_polygon_gen4
ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen5
ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen6
ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen7
ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen8
ADD COLUMN IF NOT EXISTS geometry_point geometry;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen1; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen1;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen2; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen2;
@ -26,7 +36,8 @@ DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen8;
-- etldoc: osm_park_polygon_gen6 -> osm_park_polygon_gen6 -- etldoc: osm_park_polygon_gen6 -> osm_park_polygon_gen6
-- etldoc: osm_park_polygon_gen7 -> osm_park_polygon_gen7 -- etldoc: osm_park_polygon_gen7 -> osm_park_polygon_gen7
-- etldoc: osm_park_polygon_gen8 -> osm_park_polygon_gen8 -- etldoc: osm_park_polygon_gen8 -> osm_park_polygon_gen8
CREATE OR REPLACE FUNCTION update_osm_park_polygon() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_osm_park_polygon() RETURNS void AS
$$
BEGIN BEGIN
UPDATE osm_park_polygon UPDATE osm_park_polygon
SET tags = update_tags(tags, geometry), SET tags = update_tags(tags, geometry),
@ -80,61 +91,66 @@ CREATE INDEX IF NOT EXISTS osm_park_polygon_gen8_point_geom_idx ON osm_park_poly
CREATE OR REPLACE FUNCTION update_osm_park_polygon_row() CREATE OR REPLACE FUNCTION update_osm_park_polygon_row()
RETURNS TRIGGER RETURNS trigger
AS AS
$BODY$ $$
BEGIN BEGIN
NEW.tags = update_tags(NEW.tags, NEW.geometry); NEW.tags = update_tags(NEW.tags, NEW.geometry);
NEW.geometry_point = st_centroid(NEW.geometry); NEW.geometry_point = st_centroid(NEW.geometry);
RETURN NEW; RETURN NEW;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
LANGUAGE plpgsql;
CREATE TRIGGER update_row CREATE TRIGGER update_row
BEFORE INSERT OR UPDATE ON osm_park_polygon BEFORE INSERT OR UPDATE
ON osm_park_polygon
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_polygon_row(); EXECUTE PROCEDURE update_osm_park_polygon_row();
CREATE TRIGGER update_row CREATE TRIGGER update_row
BEFORE INSERT OR UPDATE ON osm_park_polygon_gen1 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen1
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_polygon_row(); EXECUTE PROCEDURE update_osm_park_polygon_row();
CREATE TRIGGER update_row CREATE TRIGGER update_row
BEFORE INSERT OR UPDATE ON osm_park_polygon_gen2 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen2
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_polygon_row(); EXECUTE PROCEDURE update_osm_park_polygon_row();
CREATE TRIGGER update_row CREATE TRIGGER update_row
BEFORE INSERT OR UPDATE ON osm_park_polygon_gen3 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen3
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_polygon_row(); EXECUTE PROCEDURE update_osm_park_polygon_row();
CREATE TRIGGER update_row CREATE TRIGGER update_row
BEFORE INSERT OR UPDATE ON osm_park_polygon_gen4 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen4
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_polygon_row(); EXECUTE PROCEDURE update_osm_park_polygon_row();
CREATE TRIGGER update_row CREATE TRIGGER update_row
BEFORE INSERT OR UPDATE ON osm_park_polygon_gen5 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen5
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_polygon_row(); EXECUTE PROCEDURE update_osm_park_polygon_row();
CREATE TRIGGER update_row CREATE TRIGGER update_row
BEFORE INSERT OR UPDATE ON osm_park_polygon_gen6 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen6
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_polygon_row(); EXECUTE PROCEDURE update_osm_park_polygon_row();
CREATE TRIGGER update_row CREATE TRIGGER update_row
BEFORE INSERT OR UPDATE ON osm_park_polygon_gen7 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen7
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_polygon_row(); EXECUTE PROCEDURE update_osm_park_polygon_row();
CREATE TRIGGER update_row CREATE TRIGGER update_row
BEFORE INSERT OR UPDATE ON osm_park_polygon_gen8 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen8
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_polygon_row(); EXECUTE PROCEDURE update_osm_park_polygon_row();

View File

@ -1,9 +1,10 @@
CREATE OR REPLACE FUNCTION normalize_capital_level(capital TEXT) CREATE OR REPLACE FUNCTION normalize_capital_level(capital text)
RETURNS INT AS $$ RETURNS int AS
$$
SELECT CASE SELECT CASE
WHEN capital IN ('yes', '2') THEN 2 WHEN capital IN ('yes', '2') THEN 2
WHEN capital = '4' THEN 4 WHEN capital = '4' THEN 4
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL STRICT
IMMUTABLE STRICT PARALLEL SAFE; PARALLEL SAFE;

View File

@ -1,23 +1,42 @@
-- etldoc: layer_city[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_city[shape=record fillcolor=lightpink, style="rounded,filled",
-- etldoc: label="layer_city | <z2_14> z2-z14+" ] ; -- etldoc: label="layer_city | <z2_14> z2-z14+" ] ;
-- etldoc: osm_city_point -> layer_city:z2_14 -- etldoc: osm_city_point -> layer_city:z2_14
CREATE OR REPLACE FUNCTION layer_city(bbox geometry, zoom_level int, pixel_width numeric) CREATE OR REPLACE FUNCTION layer_city(bbox geometry, zoom_level int, pixel_width numeric)
RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, tags hstore, place city_place, "rank" int, capital int) AS $$ RETURNS TABLE
SELECT * FROM ( (
SELECT osm_id, geometry, name, osm_id bigint,
geometry geometry,
name text,
name_en text,
name_de text,
tags hstore,
place city_place,
"rank" int,
capital int
)
AS
$$
SELECT *
FROM (
SELECT osm_id,
geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
place, "rank", normalize_capital_level(capital) AS capital place,
"rank",
normalize_capital_level(capital) AS capital
FROM osm_city_point FROM osm_city_point
WHERE geometry && bbox WHERE geometry && bbox
AND ((zoom_level = 2 AND "rank" = 1) AND ((zoom_level = 2 AND "rank" = 1)
OR (zoom_level BETWEEN 3 AND 7 AND "rank" <= zoom_level + 1) OR (zoom_level BETWEEN 3 AND 7 AND "rank" <= zoom_level + 1)
) )
UNION ALL UNION ALL
SELECT osm_id, geometry, name, SELECT osm_id,
geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
@ -25,11 +44,15 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de
COALESCE("rank", gridrank + 10), COALESCE("rank", gridrank + 10),
normalize_capital_level(capital) AS capital normalize_capital_level(capital) AS capital
FROM ( FROM (
SELECT osm_id, geometry, name, SELECT osm_id,
geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
place, "rank", capital, place,
"rank",
capital,
row_number() OVER ( row_number() OVER (
PARTITION BY LabelGrid(geometry, 128 * pixel_width) PARTITION BY LabelGrid(geometry, 128 * pixel_width)
ORDER BY "rank" ASC NULLS LAST, ORDER BY "rank" ASC NULLS LAST,
@ -41,7 +64,6 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de
WHERE geometry && bbox WHERE geometry && bbox
AND ((zoom_level = 7 AND place <= 'town'::city_place AND ((zoom_level = 7 AND place <= 'town'::city_place
OR (zoom_level BETWEEN 8 AND 10 AND place <= 'village'::city_place) OR (zoom_level BETWEEN 8 AND 10 AND place <= 'village'::city_place)
OR (zoom_level BETWEEN 11 AND 13 AND place <= 'suburb'::city_place) OR (zoom_level BETWEEN 11 AND 13 AND place <= 'suburb'::city_place)
OR (zoom_level >= 14) OR (zoom_level >= 14)
)) ))
@ -51,7 +73,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de
OR (zoom_level = 10 AND (gridrank <= 12 OR "rank" IS NOT NULL)) OR (zoom_level = 10 AND (gridrank <= 12 OR "rank" IS NOT NULL))
OR (zoom_level BETWEEN 11 AND 12 AND (gridrank <= 14 OR "rank" IS NOT NULL)) OR (zoom_level BETWEEN 11 AND 12 AND (gridrank <= 14 OR "rank" IS NOT NULL))
OR (zoom_level >= 13) OR (zoom_level >= 13)
) as city_all; ) AS city_all;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL -- STRICT
IMMUTABLE PARALLEL SAFE; PARALLEL SAFE;

View File

@ -1,4 +1,5 @@
CREATE OR REPLACE FUNCTION island_rank(area REAL) RETURNS INT AS $$ CREATE OR REPLACE FUNCTION island_rank(area real) RETURNS int AS
$$
SELECT CASE SELECT CASE
WHEN area < 10000000 THEN 6 WHEN area < 10000000 THEN 6
WHEN area BETWEEN 1000000 AND 15000000 THEN 5 WHEN area BETWEEN 1000000 AND 15000000 THEN 5
@ -6,6 +7,6 @@ CREATE OR REPLACE FUNCTION island_rank(area REAL) RETURNS INT AS $$
WHEN area > 40000000 THEN 3 WHEN area > 40000000 THEN 3
ELSE 7 ELSE 7
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL STRICT
IMMUTABLE STRICT PARALLEL SAFE; PARALLEL SAFE;

View File

@ -1,101 +1,147 @@
-- etldoc: layer_place[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_place[shape=record fillcolor=lightpink, style="rounded,filled",
-- etldoc: label="layer_place | <z0_3> z0-3|<z4_7> z4-7|<z8_11> z8-11| <z12_14> z12-z14+" ] ; -- etldoc: label="layer_place | <z0_3> z0-3|<z4_7> z4-7|<z8_11> z8-11| <z12_14> z12-z14+" ] ;
CREATE OR REPLACE FUNCTION layer_place(bbox geometry, zoom_level int, pixel_width numeric) CREATE OR REPLACE FUNCTION layer_place(bbox geometry, zoom_level int, pixel_width numeric)
RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, RETURNS TABLE
name_de text, tags hstore, class text, "rank" int, capital INT, iso_a2 (
TEXT) AS $$ osm_id bigint,
SELECT * FROM ( geometry geometry,
name text,
-- etldoc: osm_continent_point -> layer_place:z0_3 name_en text,
name_de text,
tags hstore,
class text,
"rank" int,
capital int,
iso_a2 text
)
AS
$$
SELECT *
FROM (
SELECT SELECT
osm_id*10, geometry, name, -- etldoc: osm_continent_point -> layer_place:z0_3
osm_id * 10 AS osm_id,
geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
'continent' AS class, 1 AS "rank", NULL::int AS capital, 'continent' AS class,
1 AS "rank",
NULL::int AS capital,
NULL::text AS iso_a2 NULL::text AS iso_a2
FROM osm_continent_point FROM osm_continent_point
WHERE geometry && bbox AND zoom_level < 4 WHERE geometry && bbox
AND zoom_level < 4
UNION ALL UNION ALL
SELECT
-- etldoc: osm_country_point -> layer_place:z0_3 -- etldoc: osm_country_point -> layer_place:z0_3
-- etldoc: osm_country_point -> layer_place:z4_7 -- etldoc: osm_country_point -> layer_place:z4_7
-- etldoc: osm_country_point -> layer_place:z8_11 -- etldoc: osm_country_point -> layer_place:z8_11
-- etldoc: osm_country_point -> layer_place:z12_14 -- etldoc: osm_country_point -> layer_place:z12_14
SELECT osm_id * 10 AS osm_id,
osm_id*10, geometry, name, geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
'country' AS class, "rank", NULL::int AS capital, 'country' AS class,
"rank",
NULL::int AS capital,
iso3166_1_alpha_2 AS iso_a2 iso3166_1_alpha_2 AS iso_a2
FROM osm_country_point FROM osm_country_point
WHERE geometry && bbox AND "rank" <= zoom_level + 1 AND name <> '' WHERE geometry && bbox
AND "rank" <= zoom_level + 1
AND name <> ''
UNION ALL UNION ALL
SELECT
-- etldoc: osm_state_point -> layer_place:z0_3 -- etldoc: osm_state_point -> layer_place:z0_3
-- etldoc: osm_state_point -> layer_place:z4_7 -- etldoc: osm_state_point -> layer_place:z4_7
-- etldoc: osm_state_point -> layer_place:z8_11 -- etldoc: osm_state_point -> layer_place:z8_11
-- etldoc: osm_state_point -> layer_place:z12_14 -- etldoc: osm_state_point -> layer_place:z12_14
SELECT osm_id * 10 AS osm_id,
osm_id*10, geometry, name, geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
'state' AS class, "rank", NULL::int AS capital, 'state' AS class,
"rank",
NULL::int AS capital,
NULL::text AS iso_a2 NULL::text AS iso_a2
FROM osm_state_point FROM osm_state_point
WHERE geometry && bbox AND WHERE geometry && bbox
name <> '' AND AND name <> ''
("rank" + 2 <= zoom_level) AND ( AND ("rank" + 2 <= zoom_level)
AND (
zoom_level >= 5 OR zoom_level >= 5 OR
is_in_country IN ('United Kingdom', 'USA', 'Россия', 'Brasil', 'China', 'India') OR is_in_country IN ('United Kingdom', 'USA', 'Россия', 'Brasil', 'China', 'India') OR
is_in_country_code IN ('AU', 'CN', 'IN', 'BR', 'US')) is_in_country_code IN ('AU', 'CN', 'IN', 'BR', 'US'))
UNION ALL UNION ALL
-- etldoc: osm_island_point -> layer_place:z12_14
SELECT SELECT
osm_id*10, geometry, name, -- etldoc: osm_island_point -> layer_place:z12_14
osm_id * 10 AS osm_id,
geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
'island' AS class, 7 AS "rank", NULL::int AS capital, 'island' AS class,
7 AS "rank",
NULL::int AS capital,
NULL::text AS iso_a2 NULL::text AS iso_a2
FROM osm_island_point FROM osm_island_point
WHERE zoom_level >= 12 WHERE zoom_level >= 12
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
SELECT
-- etldoc: osm_island_polygon -> layer_place:z8_11 -- etldoc: osm_island_polygon -> layer_place:z8_11
-- etldoc: osm_island_polygon -> layer_place:z12_14 -- etldoc: osm_island_polygon -> layer_place:z12_14
SELECT osm_id * 10 AS osm_id,
osm_id*10, geometry, name, geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
'island' AS class, island_rank(area) AS "rank", NULL::int AS capital, 'island' AS class,
island_rank(area) AS "rank",
NULL::int AS capital,
NULL::text AS iso_a2 NULL::text AS iso_a2
FROM osm_island_polygon FROM osm_island_polygon
WHERE geometry && bbox AND WHERE geometry && bbox
((zoom_level = 8 AND island_rank(area) <= 3) AND ((zoom_level = 8 AND island_rank(area) <= 3)
OR (zoom_level = 9 AND island_rank(area) <= 4) OR (zoom_level = 9 AND island_rank(area) <= 4)
OR (zoom_level >= 10)) OR (zoom_level >= 10))
UNION ALL UNION ALL
SELECT
-- etldoc: layer_city -> layer_place:z0_3 -- etldoc: layer_city -> layer_place:z0_3
-- etldoc: layer_city -> layer_place:z4_7 -- etldoc: layer_city -> layer_place:z4_7
-- etldoc: layer_city -> layer_place:z8_11 -- etldoc: layer_city -> layer_place:z8_11
-- etldoc: layer_city -> layer_place:z12_14 -- etldoc: layer_city -> layer_place:z12_14
SELECT osm_id * 10 AS osm_id,
osm_id*10, geometry, name, name_en, name_de, geometry,
name,
name_en,
name_de,
tags, tags,
place::text AS class, "rank", capital, place::text AS class,
"rank",
capital,
NULL::text AS iso_a2 NULL::text AS iso_a2
FROM layer_city(bbox, zoom_level, pixel_width) FROM layer_city(bbox, zoom_level, pixel_width)
ORDER BY "rank" ASC ORDER BY "rank" ASC
) AS place_all ) AS place_all
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL PARALLEL SAFE;
IMMUTABLE PARALLEL SAFE; -- TODO: Check if the above can be made STRICT -- i.e. if pixel_width could be NULL

View File

@ -1,9 +1,11 @@
DO $$ DO
$$
BEGIN BEGIN
IF NOT EXISTS(SELECT 1 FROM pg_type WHERE typname = 'city_place') THEN IF NOT EXISTS(SELECT 1 FROM pg_type WHERE typname = 'city_place') THEN
CREATE TYPE city_place AS ENUM ('city', 'town', 'village', 'hamlet', 'suburb', 'neighbourhood', 'isolated_dwelling'); CREATE TYPE city_place AS enum ('city', 'town', 'village', 'hamlet', 'suburb', 'neighbourhood', 'isolated_dwelling');
END IF; END IF;
END END
$$; $$;
ALTER TABLE osm_city_point ALTER COLUMN place TYPE city_place USING place::city_place; ALTER TABLE osm_city_point
ALTER COLUMN place TYPE city_place USING place::city_place;

View File

@ -3,7 +3,8 @@ DROP TRIGGER IF EXISTS trigger_refresh ON place_city.updates;
CREATE EXTENSION IF NOT EXISTS unaccent; CREATE EXTENSION IF NOT EXISTS unaccent;
CREATE OR REPLACE FUNCTION update_osm_city_point() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_osm_city_point() RETURNS void AS
$$
BEGIN BEGIN
-- Clear OSM key:rank ( https://github.com/openmaptiles/openmaptiles/issues/108 ) -- Clear OSM key:rank ( https://github.com/openmaptiles/openmaptiles/issues/108 )
@ -15,9 +16,9 @@ BEGIN
WITH important_city_point AS ( WITH important_city_point AS (
SELECT osm.geometry, osm.osm_id, osm.name, osm.name_en, ne.scalerank, ne.labelrank SELECT osm.geometry, osm.osm_id, osm.name, osm.name_en, ne.scalerank, ne.labelrank
FROM ne_10m_populated_places AS ne, osm_city_point AS osm FROM ne_10m_populated_places AS ne,
WHERE osm_city_point AS osm
( WHERE (
(osm.tags ? 'wikidata' AND osm.tags->'wikidata' = ne.wikidataid) OR (osm.tags ? 'wikidata' AND osm.tags->'wikidata' = ne.wikidataid) OR
ne.name ILIKE osm.name OR ne.name ILIKE osm.name OR
ne.name ILIKE osm.name_en OR ne.name ILIKE osm.name_en OR
@ -56,32 +57,40 @@ CREATE INDEX IF NOT EXISTS osm_city_point_rank_idx ON osm_city_point("rank");
CREATE SCHEMA IF NOT EXISTS place_city; CREATE SCHEMA IF NOT EXISTS place_city;
CREATE TABLE IF NOT EXISTS place_city.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS place_city.updates
CREATE OR REPLACE FUNCTION place_city.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION place_city.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO place_city.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO place_city.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_city.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_city.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh place_city rank'; RAISE LOG 'Refresh place_city rank';
PERFORM update_osm_city_point(); PERFORM update_osm_city_point();
-- noinspection SqlWithoutWhere
DELETE FROM place_city.updates; DELETE FROM place_city.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_city_point AFTER INSERT OR UPDATE OR DELETE
ON osm_city_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_city.flag(); EXECUTE PROCEDURE place_city.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON place_city.updates AFTER INSERT
ON place_city.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_city.refresh(); EXECUTE PROCEDURE place_city.refresh();

View File

@ -2,7 +2,8 @@ DROP TRIGGER IF EXISTS trigger_flag ON osm_continent_point;
DROP TRIGGER IF EXISTS trigger_refresh ON place_continent_point.updates; DROP TRIGGER IF EXISTS trigger_refresh ON place_continent_point.updates;
-- etldoc: osm_continent_point -> osm_continent_point -- etldoc: osm_continent_point -> osm_continent_point
CREATE OR REPLACE FUNCTION update_osm_continent_point() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_osm_continent_point() RETURNS void AS
$$
BEGIN BEGIN
UPDATE osm_continent_point UPDATE osm_continent_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
@ -17,32 +18,40 @@ SELECT update_osm_continent_point();
CREATE SCHEMA IF NOT EXISTS place_continent_point; CREATE SCHEMA IF NOT EXISTS place_continent_point;
CREATE TABLE IF NOT EXISTS place_continent_point.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS place_continent_point.updates
CREATE OR REPLACE FUNCTION place_continent_point.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION place_continent_point.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO place_continent_point.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO place_continent_point.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_continent_point.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_continent_point.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh place_continent_point'; RAISE LOG 'Refresh place_continent_point';
PERFORM update_osm_continent_point(); PERFORM update_osm_continent_point();
-- noinspection SqlWithoutWhere
DELETE FROM place_continent_point.updates; DELETE FROM place_continent_point.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_continent_point AFTER INSERT OR UPDATE OR DELETE
ON osm_continent_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_continent_point.flag(); EXECUTE PROCEDURE place_continent_point.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON place_continent_point.updates AFTER INSERT
ON place_continent_point.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_continent_point.refresh(); EXECUTE PROCEDURE place_continent_point.refresh();

View File

@ -1,27 +1,33 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_country_point; DROP TRIGGER IF EXISTS trigger_flag ON osm_country_point;
DROP TRIGGER IF EXISTS trigger_refresh ON place_country.updates; DROP TRIGGER IF EXISTS trigger_refresh ON place_country.updates;
ALTER TABLE osm_country_point DROP CONSTRAINT IF EXISTS osm_country_point_rank_constraint; ALTER TABLE osm_country_point
DROP CONSTRAINT IF EXISTS osm_country_point_rank_constraint;
-- etldoc: ne_10m_admin_0_countries -> osm_country_point -- etldoc: ne_10m_admin_0_countries -> osm_country_point
-- etldoc: osm_country_point -> osm_country_point -- etldoc: osm_country_point -> osm_country_point
CREATE OR REPLACE FUNCTION update_osm_country_point() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_osm_country_point() RETURNS void AS
$$
BEGIN BEGIN
UPDATE osm_country_point AS osm UPDATE osm_country_point AS osm
SET SET "rank" = 7,
"rank" = 7,
iso3166_1_alpha_2 = COALESCE( iso3166_1_alpha_2 = COALESCE(
NULLIF(osm.country_code_iso3166_1_alpha_2, ''), NULLIF(osm.country_code_iso3166_1_alpha_2, ''),
NULLIF(osm.iso3166_1_alpha_2, ''), NULLIF(osm.iso3166_1_alpha_2, ''),
NULLIF(osm.iso3166_1, '') NULLIF(osm.iso3166_1, '')
) );
;
WITH important_country_point AS ( WITH important_country_point AS (
SELECT osm.geometry, osm.osm_id, osm.name, COALESCE(NULLIF(osm.name_en, ''), ne.name) AS name_en, ne.scalerank, ne.labelrank SELECT osm.geometry,
FROM ne_10m_admin_0_countries AS ne, osm_country_point AS osm osm.osm_id,
osm.name,
COALESCE(NULLIF(osm.name_en, ''), ne.name) AS name_en,
ne.scalerank,
ne.labelrank
FROM ne_10m_admin_0_countries AS ne,
osm_country_point AS osm
WHERE WHERE
-- We match only countries with ISO codes to eliminate disputed countries -- We match only countries with ISO codes to eliminate disputed countries
iso3166_1_alpha_2 IS NOT NULL iso3166_1_alpha_2 IS NOT NULL
@ -38,8 +44,7 @@ BEGIN
-- Repeat the step for archipelago countries like Philippines or Indonesia -- Repeat the step for archipelago countries like Philippines or Indonesia
-- whose label point is not within country's polygon -- whose label point is not within country's polygon
WITH important_country_point AS ( WITH important_country_point AS (
SELECT SELECT osm.osm_id,
osm.osm_id,
-- osm.name, -- osm.name,
ne.scalerank, ne.scalerank,
ne.labelrank, ne.labelrank,
@ -52,8 +57,7 @@ BEGIN
) AS rk ) AS rk
FROM osm_country_point osm, FROM osm_country_point osm,
ne_10m_admin_0_countries AS ne ne_10m_admin_0_countries AS ne
WHERE WHERE iso3166_1_alpha_2 IS NOT NULL
iso3166_1_alpha_2 IS NOT NULL
AND NOT (osm."rank" BETWEEN 1 AND 6) AND NOT (osm."rank" BETWEEN 1 AND 6)
) )
UPDATE osm_country_point AS osm UPDATE osm_country_point AS osm
@ -61,7 +65,8 @@ BEGIN
-- where the ranks are still distributed uniform enough across all countries -- where the ranks are still distributed uniform enough across all countries
SET "rank" = LEAST(6, CEILING((ne.scalerank + ne.labelrank) / 2.0)) SET "rank" = LEAST(6, CEILING((ne.scalerank + ne.labelrank) / 2.0))
FROM important_country_point AS ne FROM important_country_point AS ne
WHERE osm.osm_id = ne.osm_id AND ne.rk = 1; WHERE osm.osm_id = ne.osm_id
AND ne.rk = 1;
UPDATE osm_country_point AS osm UPDATE osm_country_point AS osm
SET "rank" = 6 SET "rank" = 6
@ -88,32 +93,40 @@ CREATE INDEX IF NOT EXISTS osm_country_point_rank_idx ON osm_country_point("rank
CREATE SCHEMA IF NOT EXISTS place_country; CREATE SCHEMA IF NOT EXISTS place_country;
CREATE TABLE IF NOT EXISTS place_country.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS place_country.updates
CREATE OR REPLACE FUNCTION place_country.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION place_country.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO place_country.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO place_country.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_country.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_country.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh place_country rank'; RAISE LOG 'Refresh place_country rank';
PERFORM update_osm_country_point(); PERFORM update_osm_country_point();
-- noinspection SqlWithoutWhere
DELETE FROM place_country.updates; DELETE FROM place_country.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_country_point AFTER INSERT OR UPDATE OR DELETE
ON osm_country_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_country.flag(); EXECUTE PROCEDURE place_country.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON place_country.updates AFTER INSERT
ON place_country.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_country.refresh(); EXECUTE PROCEDURE place_country.refresh();

View File

@ -2,7 +2,8 @@ DROP TRIGGER IF EXISTS trigger_flag ON osm_island_point;
DROP TRIGGER IF EXISTS trigger_refresh ON place_island_point.updates; DROP TRIGGER IF EXISTS trigger_refresh ON place_island_point.updates;
-- etldoc: osm_island_point -> osm_island_point -- etldoc: osm_island_point -> osm_island_point
CREATE OR REPLACE FUNCTION update_osm_island_point() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_osm_island_point() RETURNS void AS
$$
BEGIN BEGIN
UPDATE osm_island_point UPDATE osm_island_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
@ -17,32 +18,40 @@ SELECT update_osm_island_point();
CREATE SCHEMA IF NOT EXISTS place_island_point; CREATE SCHEMA IF NOT EXISTS place_island_point;
CREATE TABLE IF NOT EXISTS place_island_point.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS place_island_point.updates
CREATE OR REPLACE FUNCTION place_island_point.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION place_island_point.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO place_island_point.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO place_island_point.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_island_point.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_island_point.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh place_island_point'; RAISE LOG 'Refresh place_island_point';
PERFORM update_osm_island_point(); PERFORM update_osm_island_point();
-- noinspection SqlWithoutWhere
DELETE FROM place_island_point.updates; DELETE FROM place_island_point.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_island_point AFTER INSERT OR UPDATE OR DELETE
ON osm_island_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_island_point.flag(); EXECUTE PROCEDURE place_island_point.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON place_island_point.updates AFTER INSERT
ON place_island_point.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_island_point.refresh(); EXECUTE PROCEDURE place_island_point.refresh();

View File

@ -2,7 +2,8 @@ DROP TRIGGER IF EXISTS trigger_flag ON osm_island_polygon;
DROP TRIGGER IF EXISTS trigger_refresh ON place_island_polygon.updates; DROP TRIGGER IF EXISTS trigger_refresh ON place_island_polygon.updates;
-- etldoc: osm_island_polygon -> osm_island_polygon -- etldoc: osm_island_polygon -> osm_island_polygon
CREATE OR REPLACE FUNCTION update_osm_island_polygon() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_osm_island_polygon() RETURNS void AS
$$
BEGIN BEGIN
UPDATE osm_island_polygon SET geometry=ST_PointOnSurface(geometry) WHERE ST_GeometryType(geometry) <> 'ST_Point'; UPDATE osm_island_polygon SET geometry=ST_PointOnSurface(geometry) WHERE ST_GeometryType(geometry) <> 'ST_Point';
@ -20,32 +21,40 @@ SELECT update_osm_island_polygon();
CREATE SCHEMA IF NOT EXISTS place_island_polygon; CREATE SCHEMA IF NOT EXISTS place_island_polygon;
CREATE TABLE IF NOT EXISTS place_island_polygon.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS place_island_polygon.updates
CREATE OR REPLACE FUNCTION place_island_polygon.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION place_island_polygon.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO place_island_polygon.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO place_island_polygon.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_island_polygon.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_island_polygon.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh place_island_polygon'; RAISE LOG 'Refresh place_island_polygon';
PERFORM update_osm_island_polygon(); PERFORM update_osm_island_polygon();
-- noinspection SqlWithoutWhere
DELETE FROM place_island_polygon.updates; DELETE FROM place_island_polygon.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_island_polygon AFTER INSERT OR UPDATE OR DELETE
ON osm_island_polygon
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_island_polygon.flag(); EXECUTE PROCEDURE place_island_polygon.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON place_island_polygon.updates AFTER INSERT
ON place_island_polygon.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_island_polygon.refresh(); EXECUTE PROCEDURE place_island_polygon.refresh();

View File

@ -1,23 +1,33 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_state_point; DROP TRIGGER IF EXISTS trigger_flag ON osm_state_point;
DROP TRIGGER IF EXISTS trigger_refresh ON place_state.updates; DROP TRIGGER IF EXISTS trigger_refresh ON place_state.updates;
ALTER TABLE osm_state_point DROP CONSTRAINT IF EXISTS osm_state_point_rank_constraint; ALTER TABLE osm_state_point
DROP CONSTRAINT IF EXISTS osm_state_point_rank_constraint;
-- etldoc: ne_10m_admin_1_states_provinces -> osm_state_point -- etldoc: ne_10m_admin_1_states_provinces -> osm_state_point
-- etldoc: osm_state_point -> osm_state_point -- etldoc: osm_state_point -> osm_state_point
CREATE OR REPLACE FUNCTION update_osm_state_point() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_osm_state_point() RETURNS void AS
$$
BEGIN BEGIN
WITH important_state_point AS ( WITH important_state_point AS (
SELECT osm.geometry, osm.osm_id, osm.name, COALESCE(NULLIF(osm.name_en, ''), ne.name) AS name_en, ne.scalerank, ne.labelrank, ne.datarank SELECT osm.geometry,
FROM ne_10m_admin_1_states_provinces AS ne, osm_state_point AS osm osm.osm_id,
osm.name,
COALESCE(NULLIF(osm.name_en, ''), ne.name) AS name_en,
ne.scalerank,
ne.labelrank,
ne.datarank
FROM ne_10m_admin_1_states_provinces AS ne,
osm_state_point AS osm
WHERE WHERE
-- We only match whether the point is within the Natural Earth polygon -- We only match whether the point is within the Natural Earth polygon
-- because name matching is difficult -- because name matching is difficult
ST_Within(osm.geometry, ne.geometry) ST_Within(osm.geometry, ne.geometry)
-- We leave out leess important states -- We leave out leess important states
AND ne.scalerank <= 3 AND ne.labelrank <= 2 AND ne.scalerank <= 3
AND ne.labelrank <= 2
) )
UPDATE osm_state_point AS osm UPDATE osm_state_point AS osm
-- Normalize both scalerank and labelrank into a ranking system from 1 to 6. -- Normalize both scalerank and labelrank into a ranking system from 1 to 6.
@ -48,32 +58,40 @@ CREATE INDEX IF NOT EXISTS osm_state_point_rank_idx ON osm_state_point("rank");
CREATE SCHEMA IF NOT EXISTS place_state; CREATE SCHEMA IF NOT EXISTS place_state;
CREATE TABLE IF NOT EXISTS place_state.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS place_state.updates
CREATE OR REPLACE FUNCTION place_state.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION place_state.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO place_state.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO place_state.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_state.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_state.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh place_state rank'; RAISE LOG 'Refresh place_state rank';
PERFORM update_osm_state_point(); PERFORM update_osm_state_point();
-- noinspection SqlWithoutWhere
DELETE FROM place_state.updates; DELETE FROM place_state.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_state_point AFTER INSERT OR UPDATE OR DELETE
ON osm_state_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE place_state.flag(); EXECUTE PROCEDURE place_state.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON place_state.updates AFTER INSERT
ON place_state.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE place_state.refresh(); EXECUTE PROCEDURE place_state.refresh();

View File

@ -1,5 +1,6 @@
CREATE OR REPLACE FUNCTION poi_class_rank(class TEXT) CREATE OR REPLACE FUNCTION poi_class_rank(class text)
RETURNS INT AS $$ RETURNS int AS
$$
SELECT CASE class SELECT CASE class
WHEN 'hospital' THEN 20 WHEN 'hospital' THEN 20
WHEN 'railway' THEN 40 WHEN 'railway' THEN 40
@ -25,16 +26,15 @@ RETURNS INT AS $$
WHEN 'bar' THEN 800 WHEN 'bar' THEN 800
ELSE 1000 ELSE 1000
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL PARALLEL SAFE;
IMMUTABLE PARALLEL SAFE;
CREATE OR REPLACE FUNCTION poi_class(subclass TEXT, mapping_key TEXT) CREATE OR REPLACE FUNCTION poi_class(subclass text, mapping_key text)
RETURNS TEXT AS $$ RETURNS text AS
$$
SELECT CASE SELECT CASE
%%FIELD_MAPPING: class %% %%FIELD_MAPPING: class %%
ELSE subclass ELSE subclass
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL PARALLEL SAFE;
IMMUTABLE PARALLEL SAFE;

View File

@ -1,10 +1,28 @@
-- etldoc: layer_poi[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_poi[shape=record fillcolor=lightpink, style="rounded,filled",
-- etldoc: label="layer_poi | <z12> z12 | <z13> z13 | <z14_> z14+" ] ; -- etldoc: label="layer_poi | <z12> z12 | <z13> z13 | <z14_> z14+" ] ;
CREATE OR REPLACE FUNCTION layer_poi(bbox geometry, zoom_level integer, pixel_width numeric) CREATE OR REPLACE FUNCTION layer_poi(bbox geometry, zoom_level integer, pixel_width numeric)
RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, tags hstore, class text, subclass text, agg_stop integer, layer integer, level integer, indoor integer, "rank" int) AS $$ RETURNS TABLE
SELECT osm_id_hash AS osm_id, geometry, NULLIF(name, '') AS name, (
osm_id bigint,
geometry geometry,
name text,
name_en text,
name_de text,
tags hstore,
class text,
subclass text,
agg_stop integer,
layer integer,
level integer,
indoor integer,
"rank" int
)
AS
$$
SELECT osm_id_hash AS osm_id,
geometry,
NULLIF(name, '') AS name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
@ -21,7 +39,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de
agg_stop, agg_stop,
NULLIF(layer, 0) AS layer, NULLIF(layer, 0) AS layer,
"level", "level",
CASE WHEN indoor=TRUE THEN 1 END as indoor, CASE WHEN indoor = TRUE THEN 1 END AS indoor,
row_number() OVER ( row_number() OVER (
PARTITION BY LabelGrid(geometry, 100 * pixel_width) PARTITION BY LabelGrid(geometry, 100 * pixel_width)
ORDER BY CASE WHEN name = '' THEN 2000 ELSE poi_class_rank(poi_class(subclass, mapping_key)) END ASC ORDER BY CASE WHEN name = '' THEN 2000 ELSE poi_class_rank(poi_class(subclass, mapping_key)) END ASC
@ -30,25 +48,30 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de
-- etldoc: osm_poi_point -> layer_poi:z12 -- etldoc: osm_poi_point -> layer_poi:z12
-- etldoc: osm_poi_point -> layer_poi:z13 -- etldoc: osm_poi_point -> layer_poi:z13
SELECT *, SELECT *,
osm_id*10 AS osm_id_hash FROM osm_poi_point osm_id * 10 AS osm_id_hash
FROM osm_poi_point
WHERE geometry && bbox WHERE geometry && bbox
AND zoom_level BETWEEN 12 AND 13 AND zoom_level BETWEEN 12 AND 13
AND ((subclass = 'station' AND mapping_key = 'railway') AND ((subclass = 'station' AND mapping_key = 'railway')
OR subclass IN ('halt', 'ferry_terminal')) OR subclass IN ('halt', 'ferry_terminal'))
UNION ALL UNION ALL
-- etldoc: osm_poi_point -> layer_poi:z14_ -- etldoc: osm_poi_point -> layer_poi:z14_
SELECT *, SELECT *,
osm_id*10 AS osm_id_hash FROM osm_poi_point osm_id * 10 AS osm_id_hash
FROM osm_poi_point
WHERE geometry && bbox WHERE geometry && bbox
AND zoom_level >= 14 AND zoom_level >= 14
UNION ALL UNION ALL
-- etldoc: osm_poi_polygon -> layer_poi:z12 -- etldoc: osm_poi_polygon -> layer_poi:z12
-- etldoc: osm_poi_polygon -> layer_poi:z13 -- etldoc: osm_poi_polygon -> layer_poi:z13
SELECT *, SELECT *,
NULL::INTEGER AS agg_stop, NULL::integer AS agg_stop,
CASE WHEN osm_id<0 THEN -osm_id*10+4 CASE
WHEN osm_id < 0 THEN -osm_id * 10 + 4
ELSE osm_id * 10 + 1 ELSE osm_id * 10 + 1
END AS osm_id_hash END AS osm_id_hash
FROM osm_poi_polygon FROM osm_poi_polygon
@ -58,18 +81,19 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de
OR subclass IN ('halt', 'ferry_terminal')) OR subclass IN ('halt', 'ferry_terminal'))
UNION ALL UNION ALL
-- etldoc: osm_poi_polygon -> layer_poi:z14_ -- etldoc: osm_poi_polygon -> layer_poi:z14_
SELECT *, SELECT *,
NULL::INTEGER AS agg_stop, NULL::integer AS agg_stop,
CASE WHEN osm_id<0 THEN -osm_id*10+4 CASE
WHEN osm_id < 0 THEN -osm_id * 10 + 4
ELSE osm_id * 10 + 1 ELSE osm_id * 10 + 1
END AS osm_id_hash END AS osm_id_hash
FROM osm_poi_polygon FROM osm_poi_polygon
WHERE geometry && bbox WHERE geometry && bbox
AND zoom_level >= 14 AND zoom_level >= 14
) as poi_union ) AS poi_union
ORDER BY "rank" ORDER BY "rank"
; $$ LANGUAGE SQL STABLE
$$ PARALLEL SAFE;
LANGUAGE SQL -- TODO: Check if the above can be made STRICT -- i.e. if pixel_width could be NULL
IMMUTABLE PARALLEL SAFE;

View File

@ -1,23 +1,20 @@
DROP MATERIALIZED VIEW IF EXISTS osm_poi_stop_centroid CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_poi_stop_centroid CASCADE;
CREATE MATERIALIZED VIEW osm_poi_stop_centroid AS ( CREATE MATERIALIZED VIEW osm_poi_stop_centroid AS
SELECT (
uic_ref, SELECT uic_ref,
count(*) as count, count(*) AS count,
CASE WHEN count(*) > 2 THEN ST_Centroid(ST_UNION(geometry)) END AS centroid CASE WHEN count(*) > 2 THEN ST_Centroid(ST_UNION(geometry)) END AS centroid
FROM osm_poi_point FROM osm_poi_point
WHERE WHERE nullif(uic_ref, '') IS NOT NULL
nullif(uic_ref, '') IS NOT NULL
AND subclass IN ('bus_stop', 'bus_station', 'tram_stop', 'subway') AND subclass IN ('bus_stop', 'bus_station', 'tram_stop', 'subway')
GROUP BY GROUP BY uic_ref
uic_ref HAVING count(*) > 1
HAVING
count(*) > 1
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
DROP MATERIALIZED VIEW IF EXISTS osm_poi_stop_rank CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_poi_stop_rank CASCADE;
CREATE MATERIALIZED VIEW osm_poi_stop_rank AS ( CREATE MATERIALIZED VIEW osm_poi_stop_rank AS
SELECT (
p.osm_id, SELECT p.osm_id,
-- p.uic_ref, -- p.uic_ref,
-- p.subclass, -- p.subclass,
ROW_NUMBER() ROW_NUMBER()
@ -29,7 +26,6 @@ CREATE MATERIALIZED VIEW osm_poi_stop_rank AS (
) AS rk ) AS rk
FROM osm_poi_point p FROM osm_poi_point p
INNER JOIN osm_poi_stop_centroid c ON (p.uic_ref = c.uic_ref) INNER JOIN osm_poi_stop_centroid c ON (p.uic_ref = c.uic_ref)
WHERE WHERE subclass IN ('bus_stop', 'bus_station', 'tram_stop', 'subway')
subclass IN ('bus_stop', 'bus_station', 'tram_stop', 'subway')
ORDER BY p.uic_ref, rk ORDER BY p.uic_ref, rk
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;

View File

@ -1,9 +1,10 @@
DO $$ DO
$$
BEGIN BEGIN
IF NOT EXISTS(SELECT 1 IF NOT EXISTS(SELECT 1
FROM pg_type FROM pg_type
WHERE typname = 'public_transport_stop_type') THEN WHERE typname = 'public_transport_stop_type') THEN
CREATE TYPE public_transport_stop_type AS ENUM ( CREATE TYPE public_transport_stop_type AS enum (
'subway', 'tram_stop', 'bus_station', 'bus_stop' 'subway', 'tram_stop', 'bus_station', 'bus_stop'
); );
END IF; END IF;

View File

@ -2,15 +2,18 @@ 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;
-- 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() RETURNS void AS
$$
BEGIN BEGIN
UPDATE osm_poi_point UPDATE osm_poi_point
SET subclass = 'subway' SET subclass = 'subway'
WHERE station = 'subway' and subclass='station'; WHERE station = 'subway'
AND subclass = 'station';
UPDATE osm_poi_point UPDATE osm_poi_point
SET subclass = 'halt' SET subclass = 'halt'
WHERE funicular = 'yes' and subclass='station'; WHERE funicular = 'yes'
AND subclass = 'station';
UPDATE osm_poi_point UPDATE osm_poi_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
@ -21,7 +24,8 @@ $$ LANGUAGE plpgsql;
SELECT update_osm_poi_point(); SELECT update_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
$$
BEGIN BEGIN
UPDATE osm_poi_point p UPDATE osm_poi_point p
SET agg_stop = CASE SET agg_stop = CASE
@ -37,48 +41,56 @@ BEGIN
THEN 1 THEN 1
END) END)
FROM osm_poi_stop_rank r FROM osm_poi_stop_rank r
WHERE p.osm_id = r.osm_id WHERE p.osm_id = r.osm_id;
;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
ALTER TABLE osm_poi_point ADD COLUMN IF NOT EXISTS agg_stop INTEGER DEFAULT NULL; ALTER TABLE osm_poi_point
ADD COLUMN IF NOT EXISTS agg_stop integer DEFAULT NULL;
SELECT update_osm_poi_point_agg(); SELECT update_osm_poi_point_agg();
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS poi_point; CREATE SCHEMA IF NOT EXISTS poi_point;
CREATE TABLE IF NOT EXISTS poi_point.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS poi_point.updates
CREATE OR REPLACE FUNCTION poi_point.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION poi_point.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO poi_point.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO poi_point.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION poi_point.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION poi_point.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh poi_point'; RAISE LOG 'Refresh poi_point';
PERFORM update_osm_poi_point(); PERFORM update_osm_poi_point();
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
DELETE FROM poi_point.updates; DELETE FROM poi_point.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_poi_point AFTER INSERT OR UPDATE OR DELETE
ON osm_poi_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE poi_point.flag(); EXECUTE PROCEDURE poi_point.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON poi_point.updates AFTER INSERT
ON poi_point.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE poi_point.refresh(); EXECUTE PROCEDURE poi_point.refresh();

View File

@ -3,11 +3,13 @@ DROP TRIGGER IF EXISTS trigger_refresh ON poi_polygon.updates;
-- etldoc: osm_poi_polygon -> osm_poi_polygon -- etldoc: osm_poi_polygon -> osm_poi_polygon
CREATE OR REPLACE FUNCTION update_poi_polygon() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_poi_polygon() RETURNS void AS
$$
BEGIN BEGIN
UPDATE osm_poi_polygon UPDATE osm_poi_polygon
SET geometry = SET geometry =
CASE WHEN ST_NPoints(ST_ConvexHull(geometry))=ST_NPoints(geometry) CASE
WHEN ST_NPoints(ST_ConvexHull(geometry)) = ST_NPoints(geometry)
THEN ST_Centroid(geometry) THEN ST_Centroid(geometry)
ELSE ST_PointOnSurface(geometry) ELSE ST_PointOnSurface(geometry)
END END
@ -15,11 +17,13 @@ BEGIN
UPDATE osm_poi_polygon UPDATE osm_poi_polygon
SET subclass = 'subway' SET subclass = 'subway'
WHERE station = 'subway' and subclass='station'; WHERE station = 'subway'
AND subclass = 'station';
UPDATE osm_poi_polygon UPDATE osm_poi_polygon
SET subclass = 'halt' SET subclass = 'halt'
WHERE funicular = 'yes' and subclass='station'; WHERE funicular = 'yes'
AND subclass = 'station';
UPDATE osm_poi_polygon UPDATE osm_poi_polygon
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
@ -35,32 +39,40 @@ SELECT update_poi_polygon();
CREATE SCHEMA IF NOT EXISTS poi_polygon; CREATE SCHEMA IF NOT EXISTS poi_polygon;
CREATE TABLE IF NOT EXISTS poi_polygon.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS poi_polygon.updates
CREATE OR REPLACE FUNCTION poi_polygon.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION poi_polygon.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO poi_polygon.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO poi_polygon.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION poi_polygon.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION poi_polygon.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh poi_polygon'; RAISE LOG 'Refresh poi_polygon';
PERFORM update_poi_polygon(); PERFORM update_poi_polygon();
-- noinspection SqlWithoutWhere
DELETE FROM poi_polygon.updates; DELETE FROM poi_polygon.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_poi_polygon AFTER INSERT OR UPDATE OR DELETE
ON osm_poi_polygon
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE poi_polygon.flag(); EXECUTE PROCEDURE poi_polygon.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON poi_polygon.updates AFTER INSERT
ON poi_polygon.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE poi_polygon.refresh(); EXECUTE PROCEDURE poi_polygon.refresh();

View File

@ -1,51 +1,58 @@
CREATE OR REPLACE FUNCTION brunnel(is_bridge BOOL, is_tunnel BOOL, is_ford BOOL) RETURNS TEXT AS $$ CREATE OR REPLACE FUNCTION brunnel(is_bridge bool, is_tunnel bool, is_ford bool) RETURNS text AS
$$
SELECT CASE SELECT CASE
WHEN is_bridge THEN 'bridge' WHEN is_bridge THEN 'bridge'
WHEN is_tunnel THEN 'tunnel' WHEN is_tunnel THEN 'tunnel'
WHEN is_ford THEN 'ford' WHEN is_ford THEN 'ford'
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL STRICT
IMMUTABLE STRICT PARALLEL SAFE; PARALLEL SAFE;
-- The classes for highways are derived from the classes used in ClearTables -- The classes for highways are derived from the classes used in ClearTables
-- https://github.com/ClearTables/ClearTables/blob/master/transportation.lua -- https://github.com/ClearTables/ClearTables/blob/master/transportation.lua
CREATE OR REPLACE FUNCTION highway_class(highway TEXT, public_transport TEXT, construction TEXT) RETURNS TEXT AS $$ CREATE OR REPLACE FUNCTION highway_class(highway text, public_transport text, construction text) RETURNS text AS
$$
SELECT CASE SELECT CASE
%%FIELD_MAPPING: class %% %%FIELD_MAPPING: class %%
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL PARALLEL SAFE;
IMMUTABLE PARALLEL SAFE;
-- The classes for railways are derived from the classes used in ClearTables -- The classes for railways are derived from the classes used in ClearTables
-- https://github.com/ClearTables/ClearTables/blob/master/transportation.lua -- https://github.com/ClearTables/ClearTables/blob/master/transportation.lua
CREATE OR REPLACE FUNCTION railway_class(railway TEXT) RETURNS TEXT AS $$ CREATE OR REPLACE FUNCTION railway_class(railway text) RETURNS text AS
$$
SELECT CASE SELECT CASE
WHEN railway IN ('rail', 'narrow_gauge', 'preserved', 'funicular') THEN 'rail' WHEN railway IN ('rail', 'narrow_gauge', 'preserved', 'funicular') THEN 'rail'
WHEN railway IN ('subway', 'light_rail', 'monorail', 'tram') THEN 'transit' WHEN railway IN ('subway', 'light_rail', 'monorail', 'tram') THEN 'transit'
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL STRICT
IMMUTABLE STRICT PARALLEL SAFE; PARALLEL SAFE;
-- Limit service to only the most important values to ensure -- Limit service to only the most important values to ensure
-- we always know the values of service -- we always know the values of service
CREATE OR REPLACE FUNCTION service_value(service TEXT) RETURNS TEXT AS $$ CREATE OR REPLACE FUNCTION service_value(service text) RETURNS text AS
$$
SELECT CASE SELECT CASE
WHEN service IN ('spur', 'yard', 'siding', 'crossover', 'driveway', 'alley', 'parking_aisle') THEN service WHEN service IN ('spur', 'yard', 'siding', 'crossover', 'driveway', 'alley', 'parking_aisle') THEN service
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL STRICT
IMMUTABLE STRICT PARALLEL SAFE; PARALLEL SAFE;
-- Limit surface to only the most important values to ensure -- Limit surface to only the most important values to ensure
-- we always know the values of surface -- we always know the values of surface
CREATE OR REPLACE FUNCTION surface_value(surface TEXT) RETURNS TEXT AS $$ CREATE OR REPLACE FUNCTION surface_value(surface text) RETURNS text AS
SELECT CASE
WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'concrete', 'concrete:lanes', 'concrete:plates', 'metal', 'paving_stones', 'sett', 'unhewn_cobblestone', 'wood') THEN 'paved'
WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 'grass_paver', 'gravel', 'gravel_turf', 'ground', 'ice', 'mud', 'pebblestone', 'salt', 'sand', 'snow', 'woodchips') THEN 'unpaved'
END;
$$ $$
LANGUAGE SQL SELECT CASE
IMMUTABLE STRICT PARALLEL SAFE; WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'concrete', 'concrete:lanes', 'concrete:plates', 'metal',
'paving_stones', 'sett', 'unhewn_cobblestone', 'wood') THEN 'paved'
WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 'grass_paver', 'gravel',
'gravel_turf', 'ground', 'ice', 'mud', 'pebblestone', 'salt', 'sand', 'snow', 'woodchips')
THEN 'unpaved'
END;
$$ LANGUAGE SQL IMMUTABLE
STRICT
PARALLEL SAFE;

View File

@ -1,20 +1,40 @@
CREATE OR REPLACE FUNCTION highway_is_link(highway TEXT) RETURNS BOOLEAN AS $$ CREATE OR REPLACE FUNCTION highway_is_link(highway text) RETURNS boolean AS
SELECT highway LIKE '%_link';
$$ $$
LANGUAGE SQL SELECT highway LIKE '%_link';
IMMUTABLE STRICT PARALLEL SAFE; $$ LANGUAGE SQL IMMUTABLE
STRICT
PARALLEL SAFE;
-- etldoc: layer_transportation[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_transportation[shape=record fillcolor=lightpink, style="rounded,filled",
-- etldoc: label="<sql> layer_transportation |<z4> z4 |<z5> z5 |<z6> z6 |<z7> z7 |<z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14_> z14+" ] ; -- etldoc: label="<sql> layer_transportation |<z4> z4 |<z5> z5 |<z6> z6 |<z7> z7 |<z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14_> z14+" ] ;
CREATE OR REPLACE FUNCTION layer_transportation(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_transportation(bbox geometry, zoom_level int)
RETURNS TABLE(osm_id bigint, geometry geometry, class text, subclass text, RETURNS TABLE
ramp int, oneway int, brunnel TEXT, service TEXT, layer INT, level INT, (
indoor INT, bicycle TEXT, foot TEXT, horse TEXT, mtb_scale TEXT, surface TEXT) AS $$ osm_id bigint,
SELECT geometry geometry,
osm_id, geometry, class text,
subclass text,
ramp int,
oneway int,
brunnel text,
service text,
layer int,
level int,
indoor int,
bicycle text,
foot text,
horse text,
mtb_scale text,
surface text
)
AS
$$
SELECT osm_id,
geometry,
CASE CASE
WHEN NULLIF(highway, '') IS NOT NULL OR NULLIF(public_transport, '') IS NOT NULL THEN highway_class(highway, public_transport, construction) WHEN NULLIF(highway, '') IS NOT NULL OR NULLIF(public_transport, '') IS NOT NULL
THEN highway_class(highway, public_transport, construction)
WHEN NULLIF(railway, '') IS NOT NULL THEN railway_class(railway) WHEN NULLIF(railway, '') IS NOT NULL THEN railway_class(railway)
WHEN NULLIF(aerialway, '') IS NOT NULL THEN aerialway WHEN NULLIF(aerialway, '') IS NOT NULL THEN aerialway
WHEN NULLIF(shipway, '') IS NOT NULL THEN shipway WHEN NULLIF(shipway, '') IS NOT NULL THEN shipway
@ -27,14 +47,16 @@ indoor INT, bicycle TEXT, foot TEXT, horse TEXT, mtb_scale TEXT, surface TEXT) A
THEN COALESCE(NULLIF(public_transport, ''), highway) THEN COALESCE(NULLIF(public_transport, ''), highway)
END AS subclass, END AS subclass,
-- All links are considered as ramps as well -- All links are considered as ramps as well
CASE WHEN highway_is_link(highway) OR highway = 'steps' CASE
THEN 1 ELSE is_ramp::int END AS ramp, WHEN highway_is_link(highway) OR highway = 'steps'
THEN 1
ELSE is_ramp::int END AS ramp,
is_oneway::int AS oneway, is_oneway::int AS oneway,
brunnel(is_bridge, is_tunnel, is_ford) AS brunnel, brunnel(is_bridge, is_tunnel, is_ford) AS brunnel,
NULLIF(service, '') AS service, NULLIF(service, '') AS service,
NULLIF(layer, 0) AS layer, NULLIF(layer, 0) AS layer,
"level", "level",
CASE WHEN indoor=TRUE THEN 1 END as indoor, CASE WHEN indoor = TRUE THEN 1 END AS indoor,
NULLIF(bicycle, '') AS bicycle, NULLIF(bicycle, '') AS bicycle,
NULLIF(foot, '') AS foot, NULLIF(foot, '') AS foot,
NULLIF(horse, '') AS horse, NULLIF(horse, '') AS horse,
@ -42,108 +64,206 @@ indoor INT, bicycle TEXT, foot TEXT, horse TEXT, mtb_scale TEXT, surface TEXT) A
NULLIF(surface, '') AS surface NULLIF(surface, '') AS surface
FROM ( FROM (
-- etldoc: osm_transportation_merge_linestring_gen7 -> layer_transportation:z4 -- etldoc: osm_transportation_merge_linestring_gen7 -> layer_transportation:z4
SELECT SELECT osm_id,
osm_id, geometry, geometry,
highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, highway,
NULL AS public_transport, NULL AS service, construction,
NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_ford, NULL::boolean AS is_ford,
NULL::boolean AS is_ramp, NULL::int AS is_oneway, NULL as man_made, NULL::boolean AS is_ramp,
NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor, NULL::int AS is_oneway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS man_made,
NULL AS surface, z_order NULL::int AS 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_transportation_merge_linestring_gen7 FROM osm_transportation_merge_linestring_gen7
WHERE zoom_level = 4 WHERE zoom_level = 4
UNION ALL UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen6 -> layer_transportation:z5 -- etldoc: osm_transportation_merge_linestring_gen6 -> layer_transportation:z5
SELECT SELECT osm_id,
osm_id, geometry, geometry,
highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, highway,
NULL AS public_transport, NULL AS service, construction,
NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_ford, NULL::boolean AS is_ford,
NULL::boolean AS is_ramp, NULL::int AS is_oneway, NULL as man_made, NULL::boolean AS is_ramp,
NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor, NULL::int AS is_oneway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS man_made,
NULL AS surface, z_order NULL::int AS 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_transportation_merge_linestring_gen6 FROM osm_transportation_merge_linestring_gen6
WHERE zoom_level = 5 WHERE zoom_level = 5
UNION ALL UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen5 -> layer_transportation:z6 -- etldoc: osm_transportation_merge_linestring_gen5 -> layer_transportation:z6
SELECT SELECT osm_id,
osm_id, geometry, geometry,
highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, highway,
NULL AS public_transport, NULL AS service, construction,
NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_ford, NULL::boolean AS is_ford,
NULL::boolean AS is_ramp, NULL::int AS is_oneway, NULL as man_made, NULL::boolean AS is_ramp,
NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor, NULL::int AS is_oneway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS man_made,
NULL AS surface, z_order NULL::int AS 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_transportation_merge_linestring_gen5 FROM osm_transportation_merge_linestring_gen5
WHERE zoom_level = 6 WHERE zoom_level = 6
UNION ALL UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen4 -> layer_transportation:z7 -- etldoc: osm_transportation_merge_linestring_gen4 -> layer_transportation:z7
SELECT SELECT osm_id,
osm_id, geometry, geometry,
highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, highway,
NULL AS public_transport, NULL AS service, construction,
NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_ford, NULL::boolean AS is_ford,
NULL::boolean AS is_ramp, NULL::int AS is_oneway, NULL as man_made, NULL::boolean AS is_ramp,
NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor, NULL::int AS is_oneway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS man_made,
NULL AS surface, z_order NULL::int AS 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_transportation_merge_linestring_gen4 FROM osm_transportation_merge_linestring_gen4
WHERE zoom_level = 7 WHERE zoom_level = 7
UNION ALL UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen3 -> layer_transportation:z8 -- etldoc: osm_transportation_merge_linestring_gen3 -> layer_transportation:z8
SELECT SELECT osm_id,
osm_id, geometry, geometry,
highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, highway,
NULL AS public_transport, NULL AS service, construction,
NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_ford, NULL::boolean AS is_ford,
NULL::boolean AS is_ramp, NULL::int AS is_oneway, NULL as man_made, NULL::boolean AS is_ramp,
NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor, NULL::int AS is_oneway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS man_made,
NULL AS surface, z_order NULL::int AS 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_transportation_merge_linestring_gen3 FROM osm_transportation_merge_linestring_gen3
WHERE zoom_level = 8 WHERE zoom_level = 8
UNION ALL UNION ALL
-- etldoc: osm_highway_linestring_gen2 -> layer_transportation:z9 -- etldoc: osm_highway_linestring_gen2 -> layer_transportation:z9
-- etldoc: osm_highway_linestring_gen2 -> layer_transportation:z10 -- etldoc: osm_highway_linestring_gen2 -> layer_transportation:z10
SELECT SELECT osm_id,
osm_id, geometry, geometry,
highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, highway,
NULL AS public_transport, NULL AS service, construction,
NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_ford, NULL::boolean AS is_ford,
NULL::boolean AS is_ramp, NULL::int AS is_oneway, NULL as man_made, NULL::boolean AS is_ramp,
layer, NULL::int AS level, NULL::boolean AS indoor, NULL::int AS is_oneway,
bicycle, foot, horse, mtb_scale, NULL AS man_made,
NULL AS surface, z_order layer,
NULL::int AS level,
NULL::boolean AS indoor,
bicycle,
foot,
horse,
mtb_scale,
NULL AS surface,
z_order
FROM osm_highway_linestring_gen2 FROM osm_highway_linestring_gen2
WHERE zoom_level BETWEEN 9 AND 10 WHERE zoom_level BETWEEN 9 AND 10
AND st_length(geometry) > zres(11) AND st_length(geometry) > zres(11)
UNION ALL UNION ALL
-- etldoc: osm_highway_linestring_gen1 -> layer_transportation:z11 -- etldoc: osm_highway_linestring_gen1 -> layer_transportation:z11
SELECT SELECT osm_id,
osm_id, geometry, geometry,
highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, highway,
NULL AS public_transport, NULL AS service, construction,
NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_ford, NULL::boolean AS is_ford,
NULL::boolean AS is_ramp, NULL::int AS is_oneway, NULL as man_made, NULL::boolean AS is_ramp,
layer, NULL::int AS level, NULL::boolean AS indoor, NULL::int AS is_oneway,
bicycle, foot, horse, mtb_scale, NULL AS man_made,
NULL AS surface, z_order layer,
NULL::int AS level,
NULL::boolean AS indoor,
bicycle,
foot,
horse,
mtb_scale,
NULL AS surface,
z_order
FROM osm_highway_linestring_gen1 FROM osm_highway_linestring_gen1
WHERE zoom_level = 11 WHERE zoom_level = 11
AND st_length(geometry) > zres(12) AND st_length(geometry) > zres(12)
@ -152,26 +272,41 @@ indoor INT, bicycle TEXT, foot TEXT, horse TEXT, mtb_scale TEXT, surface TEXT) A
-- etldoc: osm_highway_linestring -> layer_transportation:z12 -- etldoc: osm_highway_linestring -> layer_transportation:z12
-- etldoc: osm_highway_linestring -> layer_transportation:z13 -- etldoc: osm_highway_linestring -> layer_transportation:z13
-- etldoc: osm_highway_linestring -> layer_transportation:z14_ -- etldoc: osm_highway_linestring -> layer_transportation:z14_
SELECT SELECT osm_id,
osm_id, geometry, geometry,
highway, construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, highway,
public_transport, service_value(service) AS service, construction,
is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, man_made, NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
public_transport,
service_value(service) AS service,
is_bridge,
is_tunnel,
is_ford,
is_ramp,
is_oneway,
man_made,
layer, layer,
CASE WHEN highway IN ('footway', 'steps') THEN "level" END AS "level", CASE WHEN highway IN ('footway', 'steps') THEN "level" END AS "level",
CASE WHEN highway IN ('footway', 'steps') THEN indoor END AS indoor, CASE WHEN highway IN ('footway', 'steps') THEN indoor END AS indoor,
bicycle, foot, horse, mtb_scale, bicycle,
foot,
horse,
mtb_scale,
surface_value(surface) AS "surface", surface_value(surface) AS "surface",
z_order z_order
FROM osm_highway_linestring FROM osm_highway_linestring
WHERE NOT is_area AND ( WHERE NOT is_area
AND (
zoom_level = 12 AND ( zoom_level = 12 AND (
highway_class(highway, public_transport, construction) NOT IN ('track', 'path', 'minor') highway_class(highway, public_transport, construction) NOT IN ('track', 'path', 'minor')
OR highway IN ('unclassified', 'residential') OR highway IN ('unclassified', 'residential')
) AND man_made <> 'pier' ) AND man_made <> 'pier'
OR zoom_level = 13 OR zoom_level = 13
AND ( AND (
highway_class(highway, public_transport, construction) NOT IN ('track', 'path') AND man_made <> 'pier' highway_class(highway, public_transport, construction) NOT IN ('track', 'path') AND
man_made <> 'pier'
OR OR
man_made = 'pier' AND NOT ST_IsClosed(geometry) man_made = 'pier' AND NOT ST_IsClosed(geometry)
) )
@ -185,158 +320,337 @@ indoor INT, bicycle TEXT, foot TEXT, horse TEXT, mtb_scale TEXT, surface TEXT) A
UNION ALL UNION ALL
-- etldoc: osm_railway_linestring_gen5 -> layer_transportation:z8 -- etldoc: osm_railway_linestring_gen5 -> layer_transportation:z8
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
service_value(service) AS service,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_ford, NULL::boolean AS is_ford,
NULL::boolean AS is_ramp, NULL::int AS is_oneway, NULL as man_made, NULL::boolean AS is_ramp,
NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor, NULL::int AS is_oneway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS man_made,
NULL as surface, z_order NULL::int AS 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_railway_linestring_gen5 FROM osm_railway_linestring_gen5
WHERE zoom_level = 8 WHERE zoom_level = 8
AND railway='rail' AND service = '' and usage='main' AND railway = 'rail'
AND service = ''
AND usage = 'main'
UNION ALL UNION ALL
-- etldoc: osm_railway_linestring_gen4 -> layer_transportation:z9 -- etldoc: osm_railway_linestring_gen4 -> layer_transportation:z9
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
service_value(service) AS service,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_ford, NULL::boolean AS is_ford,
NULL::boolean AS is_ramp, NULL::int AS is_oneway, NULL as man_made, NULL::boolean AS is_ramp,
layer, NULL::int AS level, NULL::boolean AS indoor, NULL::int AS is_oneway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS man_made,
NULL AS surface, z_order 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_railway_linestring_gen4 FROM osm_railway_linestring_gen4
WHERE zoom_level = 9 WHERE zoom_level = 9
AND railway='rail' AND service = '' and usage='main' AND railway = 'rail'
AND service = ''
AND usage = 'main'
UNION ALL UNION ALL
-- etldoc: osm_railway_linestring_gen3 -> layer_transportation:z10 -- etldoc: osm_railway_linestring_gen3 -> layer_transportation:z10
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, railway,
layer, NULL::int AS level, NULL::boolean AS indoor, NULL AS aerialway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS shipway,
NULL AS surface, z_order NULL AS public_transport,
service_value(service) AS service,
is_bridge,
is_tunnel,
is_ford,
is_ramp,
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_railway_linestring_gen3 FROM osm_railway_linestring_gen3
WHERE zoom_level = 10 WHERE zoom_level = 10
AND railway IN ('rail', 'narrow_gauge') AND service = '' AND railway IN ('rail', 'narrow_gauge')
AND service = ''
UNION ALL UNION ALL
-- etldoc: osm_railway_linestring_gen2 -> layer_transportation:z11 -- etldoc: osm_railway_linestring_gen2 -> layer_transportation:z11
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, railway,
layer, NULL::int AS level, NULL::boolean AS indoor, NULL AS aerialway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS shipway,
NULL as surface, z_order NULL AS public_transport,
service_value(service) AS service,
is_bridge,
is_tunnel,
is_ford,
is_ramp,
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_railway_linestring_gen2 FROM osm_railway_linestring_gen2
WHERE zoom_level = 11 WHERE zoom_level = 11
AND railway IN ('rail', 'narrow_gauge', 'light_rail') AND service = '' AND railway IN ('rail', 'narrow_gauge', 'light_rail')
AND service = ''
UNION ALL UNION ALL
-- etldoc: osm_railway_linestring_gen1 -> layer_transportation:z12 -- etldoc: osm_railway_linestring_gen1 -> layer_transportation:z12
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, railway,
layer, NULL::int AS level, NULL::boolean AS indoor, NULL AS aerialway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS shipway,
NULL as surface, z_order NULL AS public_transport,
service_value(service) AS service,
is_bridge,
is_tunnel,
is_ford,
is_ramp,
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_railway_linestring_gen1 FROM osm_railway_linestring_gen1
WHERE zoom_level = 12 WHERE zoom_level = 12
AND railway IN ('rail', 'narrow_gauge', 'light_rail') AND service = '' AND railway IN ('rail', 'narrow_gauge', 'light_rail')
AND service = ''
UNION ALL UNION ALL
-- etldoc: osm_railway_linestring -> layer_transportation:z13 -- etldoc: osm_railway_linestring -> layer_transportation:z13
-- etldoc: osm_railway_linestring -> layer_transportation:z14_ -- etldoc: osm_railway_linestring -> layer_transportation:z14_
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, railway, NULL AS aerialway, NULL AS shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, railway,
layer, NULL::int AS level, NULL::boolean AS indoor, NULL AS aerialway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS shipway,
NULL as surface, z_order NULL AS public_transport,
service_value(service) AS service,
is_bridge,
is_tunnel,
is_ford,
is_ramp,
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_railway_linestring FROM osm_railway_linestring
WHERE zoom_level = 13 WHERE zoom_level = 13
AND railway IN ('rail', 'narrow_gauge', 'light_rail') AND service = '' AND railway IN ('rail', 'narrow_gauge', 'light_rail') AND service = ''
OR zoom_Level >= 14 OR zoom_level >= 14
UNION ALL UNION ALL
-- etldoc: osm_aerialway_linestring_gen1 -> layer_transportation:z12 -- etldoc: osm_aerialway_linestring_gen1 -> layer_transportation:z12
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, NULL as railway, aerialway, NULL AS shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, NULL AS railway,
layer, NULL::int AS level, NULL::boolean AS indoor, aerialway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS shipway,
NULL AS surface, z_order NULL AS public_transport,
service_value(service) AS service,
is_bridge,
is_tunnel,
is_ford,
is_ramp,
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_aerialway_linestring_gen1 FROM osm_aerialway_linestring_gen1
WHERE zoom_level = 12 WHERE zoom_level = 12
UNION ALL UNION ALL
-- etldoc: osm_aerialway_linestring -> layer_transportation:z13 -- etldoc: osm_aerialway_linestring -> layer_transportation:z13
-- etldoc: osm_aerialway_linestring -> layer_transportation:z14_ -- etldoc: osm_aerialway_linestring -> layer_transportation:z14_
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, NULL as railway, aerialway, NULL AS shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, NULL AS railway,
layer, NULL::int AS level, NULL::boolean AS indoor, aerialway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, NULL AS shipway,
NULL AS surface, z_order NULL AS public_transport,
service_value(service) AS service,
is_bridge,
is_tunnel,
is_ford,
is_ramp,
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_aerialway_linestring FROM osm_aerialway_linestring
WHERE zoom_level >= 13 WHERE zoom_level >= 13
UNION ALL UNION ALL
-- etldoc: osm_shipway_linestring_gen2 -> layer_transportation:z11 -- etldoc: osm_shipway_linestring_gen2 -> layer_transportation:z11
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, NULL AS railway, NULL AS aerialway, shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, NULL AS railway,
layer, NULL::int AS level, NULL::boolean AS indoor, NULL AS aerialway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, shipway,
NULL AS surface, z_order NULL AS public_transport,
service_value(service) AS service,
is_bridge,
is_tunnel,
is_ford,
is_ramp,
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_gen2 FROM osm_shipway_linestring_gen2
WHERE zoom_level = 11 WHERE zoom_level = 11
UNION ALL UNION ALL
-- etldoc: osm_shipway_linestring_gen1 -> layer_transportation:z12 -- etldoc: osm_shipway_linestring_gen1 -> layer_transportation:z12
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, NULL AS railway, NULL AS aerialway, shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, NULL AS railway,
layer, NULL::int AS level, NULL::boolean AS indoor, NULL AS aerialway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, shipway,
NULL AS surface, z_order NULL AS public_transport,
service_value(service) AS service,
is_bridge,
is_tunnel,
is_ford,
is_ramp,
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_gen1 FROM osm_shipway_linestring_gen1
WHERE zoom_level = 12 WHERE zoom_level = 12
UNION ALL UNION ALL
-- etldoc: osm_shipway_linestring -> layer_transportation:z13 -- etldoc: osm_shipway_linestring -> layer_transportation:z13
-- etldoc: osm_shipway_linestring -> layer_transportation:z14_ -- etldoc: osm_shipway_linestring -> layer_transportation:z14_
SELECT SELECT osm_id,
osm_id, geometry, geometry,
NULL AS highway, NULL AS construction, NULL AS railway, NULL AS aerialway, shipway, NULL AS highway,
NULL AS public_transport, service_value(service) AS service, NULL AS construction,
is_bridge, is_tunnel, is_ford, is_ramp, is_oneway, NULL as man_made, NULL AS railway,
layer, NULL::int AS level, NULL::boolean AS indoor, NULL AS aerialway,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, shipway,
NULL AS surface, z_order NULL AS public_transport,
service_value(service) AS service,
is_bridge,
is_tunnel,
is_ford,
is_ramp,
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 FROM osm_shipway_linestring
WHERE zoom_level >= 13 WHERE zoom_level >= 13
UNION ALL UNION ALL
@ -347,17 +661,33 @@ indoor INT, bicycle TEXT, foot TEXT, horse TEXT, mtb_scale TEXT, surface TEXT) A
-- highway linestrings and as polygon -- highway linestrings and as polygon
-- etldoc: osm_highway_polygon -> layer_transportation:z13 -- etldoc: osm_highway_polygon -> layer_transportation:z13
-- etldoc: osm_highway_polygon -> layer_transportation:z14_ -- etldoc: osm_highway_polygon -> layer_transportation:z14_
SELECT SELECT osm_id,
osm_id, geometry, geometry,
highway, NULL AS construction, NULL AS railway, NULL AS aerialway, NULL AS shipway, highway,
public_transport, NULL AS service, NULL AS construction,
CASE WHEN man_made IN ('bridge') THEN TRUE NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
public_transport,
NULL AS service,
CASE
WHEN man_made IN ('bridge') THEN TRUE
ELSE FALSE ELSE FALSE
END AS is_bridge, FALSE AS is_tunnel, FALSE AS is_ford, END AS is_bridge,
FALSE AS is_ramp, FALSE::int AS is_oneway, man_made, FALSE AS is_tunnel,
layer, NULL::int AS level, NULL::boolean AS indoor, FALSE AS is_ford,
NULL as bicycle, NULL as foot, NULL as horse, NULL as mtb_scale, FALSE AS is_ramp,
NULL AS surface, z_order FALSE::int AS is_oneway,
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_highway_polygon FROM osm_highway_polygon
-- We do not want underground pedestrian areas for now -- We do not want underground pedestrian areas for now
WHERE zoom_level >= 13 WHERE zoom_level >= 13
@ -368,6 +698,6 @@ indoor INT, bicycle TEXT, foot TEXT, horse TEXT, mtb_scale TEXT, surface TEXT) A
) AS zoom_levels ) AS zoom_levels
WHERE geometry && bbox WHERE geometry && bbox
ORDER BY z_order ASC; ORDER BY z_order ASC;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL -- STRICT
IMMUTABLE PARALLEL SAFE; PARALLEL SAFE;

View File

@ -25,21 +25,23 @@ CREATE INDEX IF NOT EXISTS osm_highway_linestring_highway_partial_idx
WHERE highway IN ('motorway', 'trunk', 'primary', 'construction'); WHERE highway IN ('motorway', 'trunk', 'primary', 'construction');
-- etldoc: osm_highway_linestring -> osm_transportation_merge_linestring -- etldoc: osm_highway_linestring -> osm_transportation_merge_linestring
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring AS ( CREATE MATERIALIZED VIEW osm_transportation_merge_linestring AS
SELECT (
(ST_Dump(geometry)).geom AS geometry, SELECT (ST_Dump(geometry)).geom AS geometry,
NULL::bigint AS osm_id, NULL::bigint AS osm_id,
highway, construction, highway,
construction,
z_order z_order
FROM ( FROM (
SELECT SELECT ST_LineMerge(ST_Collect(geometry)) AS geometry,
ST_LineMerge(ST_Collect(geometry)) AS geometry, highway,
highway, construction, construction,
min(z_order) AS z_order min(z_order) AS z_order
FROM osm_highway_linestring FROM osm_highway_linestring
WHERE (highway IN ('motorway','trunk', 'primary') OR highway = 'construction' AND construction IN ('motorway','trunk', 'primary')) WHERE (highway IN ('motorway', 'trunk', 'primary') OR
highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary'))
AND ST_IsValid(geometry) AND ST_IsValid(geometry)
group by highway, construction GROUP BY highway, construction
) AS highway_union ) AS highway_union
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_geometry_idx CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_geometry_idx
@ -49,7 +51,8 @@ CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_highway_partial_i
WHERE highway IN ('motorway', 'trunk', 'primary', 'construction'); WHERE highway IN ('motorway', 'trunk', 'primary', 'construction');
-- etldoc: osm_transportation_merge_linestring -> osm_transportation_merge_linestring_gen3 -- etldoc: osm_transportation_merge_linestring -> osm_transportation_merge_linestring_gen3
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen3 AS ( CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen3 AS
(
SELECT ST_Simplify(geometry, 120) AS geometry, osm_id, highway, construction, z_order SELECT ST_Simplify(geometry, 120) AS geometry, osm_id, highway, construction, z_order
FROM osm_transportation_merge_linestring FROM osm_transportation_merge_linestring
WHERE highway IN ('motorway', 'trunk', 'primary') WHERE highway IN ('motorway', 'trunk', 'primary')
@ -62,10 +65,12 @@ CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen3_highway_part
WHERE highway IN ('motorway', 'trunk', 'primary', 'construction'); WHERE highway IN ('motorway', 'trunk', 'primary', 'construction');
-- etldoc: osm_transportation_merge_linestring_gen3 -> osm_transportation_merge_linestring_gen4 -- etldoc: osm_transportation_merge_linestring_gen3 -> osm_transportation_merge_linestring_gen4
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen4 AS ( CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen4 AS
(
SELECT ST_Simplify(geometry, 200) AS geometry, osm_id, highway, construction, z_order SELECT ST_Simplify(geometry, 200) AS geometry, osm_id, highway, construction, z_order
FROM osm_transportation_merge_linestring_gen3 FROM osm_transportation_merge_linestring_gen3
WHERE (highway IN ('motorway','trunk', 'primary') OR highway = 'construction' AND construction IN ('motorway','trunk', 'primary')) WHERE (highway IN ('motorway', 'trunk', 'primary') OR
highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary'))
AND ST_Length(geometry) > 50 AND ST_Length(geometry) > 50
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen4_geometry_idx CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen4_geometry_idx
@ -75,7 +80,8 @@ CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen4_highway_part
WHERE highway IN ('motorway', 'trunk', 'primary', 'construction'); WHERE highway IN ('motorway', 'trunk', 'primary', 'construction');
-- etldoc: osm_transportation_merge_linestring_gen4 -> osm_transportation_merge_linestring_gen5 -- etldoc: osm_transportation_merge_linestring_gen4 -> osm_transportation_merge_linestring_gen5
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen5 AS ( CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen5 AS
(
SELECT ST_Simplify(geometry, 500) AS geometry, osm_id, highway, construction, z_order SELECT ST_Simplify(geometry, 500) AS geometry, osm_id, highway, construction, z_order
FROM osm_transportation_merge_linestring_gen4 FROM osm_transportation_merge_linestring_gen4
WHERE (highway IN ('motorway', 'trunk') OR highway = 'construction' AND construction IN ('motorway', 'trunk')) WHERE (highway IN ('motorway', 'trunk') OR highway = 'construction' AND construction IN ('motorway', 'trunk'))
@ -88,10 +94,12 @@ CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen5_highway_part
WHERE highway IN ('motorway', 'trunk', 'construction'); WHERE highway IN ('motorway', 'trunk', 'construction');
-- etldoc: osm_transportation_merge_linestring_gen5 -> osm_transportation_merge_linestring_gen6 -- etldoc: osm_transportation_merge_linestring_gen5 -> osm_transportation_merge_linestring_gen6
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen6 AS ( CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen6 AS
(
SELECT ST_Simplify(geometry, 1000) AS geometry, osm_id, highway, construction, z_order SELECT ST_Simplify(geometry, 1000) AS geometry, osm_id, highway, construction, z_order
FROM osm_transportation_merge_linestring_gen5 FROM osm_transportation_merge_linestring_gen5
WHERE (highway IN ('motorway','trunk') OR highway = 'construction' AND construction IN ('motorway','trunk')) AND ST_Length(geometry) > 500 WHERE (highway IN ('motorway', 'trunk') OR highway = 'construction' AND construction IN ('motorway', 'trunk'))
AND ST_Length(geometry) > 500
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen6_geometry_idx CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen6_geometry_idx
ON osm_transportation_merge_linestring_gen6 USING gist (geometry); ON osm_transportation_merge_linestring_gen6 USING gist (geometry);
@ -100,10 +108,12 @@ CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen6_highway_part
WHERE highway IN ('motorway', 'trunk', 'construction'); WHERE highway IN ('motorway', 'trunk', 'construction');
-- etldoc: osm_transportation_merge_linestring_gen6 -> osm_transportation_merge_linestring_gen7 -- etldoc: osm_transportation_merge_linestring_gen6 -> osm_transportation_merge_linestring_gen7
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen7 AS ( CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen7 AS
(
SELECT ST_Simplify(geometry, 2000) AS geometry, osm_id, highway, construction, z_order SELECT ST_Simplify(geometry, 2000) AS geometry, osm_id, highway, construction, z_order
FROM osm_transportation_merge_linestring_gen6 FROM osm_transportation_merge_linestring_gen6
WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway') AND ST_Length(geometry) > 1000 WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway')
AND ST_Length(geometry) > 1000
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen7_geometry_idx CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen7_geometry_idx
ON osm_transportation_merge_linestring_gen7 USING gist (geometry); ON osm_transportation_merge_linestring_gen7 USING gist (geometry);
@ -113,16 +123,22 @@ CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen7_geometry_idx
CREATE SCHEMA IF NOT EXISTS transportation; CREATE SCHEMA IF NOT EXISTS transportation;
CREATE TABLE IF NOT EXISTS transportation.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS transportation.updates
CREATE OR REPLACE FUNCTION transportation.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION transportation.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO transportation.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO transportation.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION transportation.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION transportation.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE NOTICE 'Refresh transportation'; RAISE NOTICE 'Refresh transportation';
REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring; REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring;
@ -131,19 +147,21 @@ CREATE OR REPLACE FUNCTION transportation.refresh() RETURNS trigger AS
REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen5; REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen5;
REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen6; REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen6;
REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen7; REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen7;
-- noinspection SqlWithoutWhere
DELETE FROM transportation.updates; DELETE FROM transportation.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag_transportation CREATE TRIGGER trigger_flag_transportation
AFTER INSERT OR UPDATE OR DELETE ON osm_highway_linestring AFTER INSERT OR UPDATE OR DELETE
ON osm_highway_linestring
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE transportation.flag(); EXECUTE PROCEDURE transportation.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON transportation.updates AFTER INSERT
ON transportation.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE transportation.refresh(); EXECUTE PROCEDURE transportation.refresh();

View File

@ -1,24 +1,41 @@
-- etldoc: layer_transportation_name[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_transportation_name[shape=record fillcolor=lightpink, style="rounded,filled",
-- etldoc: label="layer_transportation_name | <z6> z6 | <z7> z7 | <z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14_> z14+" ] ; -- etldoc: label="layer_transportation_name | <z6> z6 | <z7> z7 | <z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14_> z14+" ] ;
CREATE OR REPLACE FUNCTION layer_transportation_name(bbox geometry, zoom_level integer) CREATE OR REPLACE FUNCTION layer_transportation_name(bbox geometry, zoom_level integer)
RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, RETURNS TABLE
name_de text, tags hstore, ref text, ref_length int, network text, class (
text, subclass text, layer INT, level INT, indoor INT) AS $$ osm_id bigint,
SELECT osm_id, geometry, geometry geometry,
name text,
name_en text,
name_de text,
tags hstore,
ref text,
ref_length int,
network text,
class text,
subclass text,
layer int,
level int,
indoor int
)
AS
$$
SELECT osm_id,
geometry,
NULLIF(name, '') AS name, NULLIF(name, '') AS name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
NULLIF(ref, ''), NULLIF(LENGTH(ref), 0) AS ref_length, NULLIF(ref, ''),
NULLIF(LENGTH(ref), 0) AS ref_length,
--TODO: The road network of the road is not yet implemented --TODO: The road network of the road is not yet implemented
case CASE
when network is not null WHEN network IS NOT NULL
then network::text THEN network::text
when length(coalesce(ref, ''))>0 WHEN length(coalesce(ref, '')) > 0
then 'road' THEN 'road'
end as network, END AS network,
highway_class(highway, '', construction) AS class, highway_class(highway, '', construction) AS class,
CASE CASE
WHEN highway IS NOT NULL AND highway_class(highway, '', construction) = 'path' WHEN highway IS NOT NULL AND highway_class(highway, '', construction) = 'path'
@ -26,26 +43,32 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text,
END AS subclass, END AS subclass,
NULLIF(layer, 0) AS layer, NULLIF(layer, 0) AS layer,
"level", "level",
CASE WHEN indoor=TRUE THEN 1 END as indoor CASE WHEN indoor = TRUE THEN 1 END AS indoor
FROM ( FROM (
-- etldoc: osm_transportation_name_linestring_gen4 -> layer_transportation_name:z6 -- etldoc: osm_transportation_name_linestring_gen4 -> layer_transportation_name:z6
SELECT *, SELECT *,
NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor NULL::int AS layer,
NULL::int AS level,
NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen4 FROM osm_transportation_name_linestring_gen4
WHERE zoom_level = 6 WHERE zoom_level = 6
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 *,
NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor NULL::int AS layer,
NULL::int AS level,
NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen3 FROM osm_transportation_name_linestring_gen3
WHERE zoom_level = 7 WHERE 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 *,
NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor NULL::int AS layer,
NULL::int AS level,
NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen2 FROM osm_transportation_name_linestring_gen2
WHERE zoom_level = 8 WHERE zoom_level = 8
UNION ALL UNION ALL
@ -54,14 +77,15 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text,
-- 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 *,
NULL::int AS layer, NULL::int AS level, NULL::boolean AS indoor NULL::int AS layer,
NULL::int AS level,
NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen1 FROM osm_transportation_name_linestring_gen1
WHERE zoom_level BETWEEN 9 AND 11 WHERE 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
SELECT SELECT geometry,
geometry,
osm_id, osm_id,
name, name,
name_en, name_en,
@ -83,8 +107,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text,
UNION ALL UNION ALL
-- etldoc: osm_transportation_name_linestring -> layer_transportation_name:z13 -- etldoc: osm_transportation_name_linestring -> layer_transportation_name:z13
SELECT SELECT geometry,
geometry,
osm_id, osm_id,
name, name,
name_en, name_en,
@ -105,8 +128,7 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text,
UNION ALL UNION ALL
-- etldoc: osm_transportation_name_linestring -> layer_transportation_name:z14_ -- etldoc: osm_transportation_name_linestring -> layer_transportation_name:z14_
SELECT SELECT geometry,
geometry,
osm_id, osm_id,
name, name,
name_en, name_en,
@ -122,10 +144,9 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text,
indoor indoor
FROM osm_transportation_name_linestring FROM osm_transportation_name_linestring
WHERE zoom_level >= 14 WHERE zoom_level >= 14
) AS zoom_levels ) AS zoom_levels
WHERE geometry && bbox WHERE geometry && bbox
ORDER BY z_order ASC; ORDER BY z_order ASC;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL -- STRICT
IMMUTABLE PARALLEL SAFE; PARALLEL SAFE;

View File

@ -5,26 +5,27 @@ DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_linestring_gen2 CASCADE
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_linestring_gen3 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_linestring_gen3 CASCADE;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_linestring_gen4 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_linestring_gen4 CASCADE;
DO $$ DO
$$
BEGIN BEGIN
IF NOT EXISTS(SELECT 1 FROM pg_type WHERE typname = 'route_network_type') THEN IF NOT EXISTS(SELECT 1 FROM pg_type WHERE typname = 'route_network_type') THEN
CREATE TYPE route_network_type AS ENUM ( CREATE TYPE route_network_type AS enum (
'us-interstate', 'us-highway', 'us-state', 'us-interstate', 'us-highway', 'us-state',
'ca-transcanada', 'ca-transcanada',
'gb-motorway', 'gb-trunk' 'gb-motorway', 'gb-trunk'
); );
END IF; END IF;
END END
$$ $$;
;
DO $$ DO
$$
BEGIN BEGIN
BEGIN BEGIN
ALTER TABLE osm_route_member ADD COLUMN network_type route_network_type; ALTER TABLE osm_route_member
ADD COLUMN network_type route_network_type;
EXCEPTION EXCEPTION
WHEN duplicate_column THEN RAISE NOTICE 'column network_type already exists in network_type.'; WHEN duplicate_column THEN RAISE NOTICE 'column network_type already exists in network_type.';
END; END;
END; END;
$$ $$;
;

View File

@ -2,27 +2,30 @@ DROP TRIGGER IF EXISTS trigger_flag_transportation_name ON osm_route_member;
-- create GBR relations (so we can use it in the same way as other relations) -- create GBR relations (so we can use it in the same way as other relations)
CREATE OR REPLACE FUNCTION update_gbr_route_members() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_gbr_route_members() RETURNS void AS
DECLARE gbr_geom geometry; $$
DECLARE
gbr_geom geometry;
BEGIN BEGIN
SELECT st_buffer(geometry, 10000) INTO gbr_geom FROM ne_10m_admin_0_countries where iso_a2 = 'GB'; SELECT st_buffer(geometry, 10000) INTO gbr_geom FROM ne_10m_admin_0_countries WHERE iso_a2 = 'GB';
DELETE FROM osm_route_member WHERE network IN ('omt-gb-motorway', 'omt-gb-trunk'); DELETE FROM osm_route_member WHERE network IN ('omt-gb-motorway', 'omt-gb-trunk');
INSERT INTO osm_route_member (osm_id, member, ref, network) INSERT INTO osm_route_member (osm_id, member, ref, network)
SELECT 0, osm_id, substring(ref FROM E'^[AM][0-9AM()]+'), SELECT 0,
osm_id,
substring(ref FROM E'^[AM][0-9AM()]+'),
CASE WHEN highway = 'motorway' THEN 'omt-gb-motorway' ELSE 'omt-gb-trunk' END CASE WHEN highway = 'motorway' THEN 'omt-gb-motorway' ELSE 'omt-gb-trunk' END
FROM osm_highway_linestring FROM osm_highway_linestring
WHERE WHERE length(ref) > 0
length(ref)>0 AND AND ST_Intersects(geometry, gbr_geom)
ST_Intersects(geometry, gbr_geom) AND AND highway IN ('motorway', 'trunk');
highway IN ('motorway', 'trunk')
;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
-- etldoc: osm_route_member -> osm_route_member -- etldoc: osm_route_member -> osm_route_member
CREATE OR REPLACE FUNCTION update_osm_route_member() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_osm_route_member() RETURNS void AS
$$
BEGIN BEGIN
PERFORM update_gbr_route_members(); PERFORM update_gbr_route_members();
@ -52,8 +55,7 @@ BEGIN
THEN 'ca-transcanada'::route_network_type THEN 'ca-transcanada'::route_network_type
WHEN network = 'omt-gb-motorway' THEN 'gb-motorway'::route_network_type WHEN network = 'omt-gb-motorway' THEN 'gb-motorway'::route_network_type
WHEN network = 'omt-gb-trunk' THEN 'gb-trunk'::route_network_type WHEN network = 'omt-gb-trunk' THEN 'gb-trunk'::route_network_type
END END;
;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;

View File

@ -9,9 +9,9 @@ DROP TRIGGER IF EXISTS trigger_refresh ON transportation_name.updates;
-- etldoc: osm_highway_linestring -> osm_transportation_name_network -- etldoc: osm_highway_linestring -> osm_transportation_name_network
-- etldoc: osm_route_member -> osm_transportation_name_network -- etldoc: osm_route_member -> osm_transportation_name_network
CREATE MATERIALIZED VIEW osm_transportation_name_network AS ( CREATE MATERIALIZED VIEW osm_transportation_name_network AS
SELECT (
hl.geometry, SELECT hl.geometry,
hl.osm_id, hl.osm_id,
CASE WHEN length(hl.name) > 15 THEN osml10n_street_abbrev_all(hl.name) ELSE hl.name END AS "name", CASE WHEN length(hl.name) > 15 THEN osml10n_street_abbrev_all(hl.name) ELSE hl.name END AS "name",
CASE WHEN length(hl.name_en) > 15 THEN osml10n_street_abbrev_en(hl.name_en) ELSE hl.name_en END AS "name_en", CASE WHEN length(hl.name_en) > 15 THEN osml10n_street_abbrev_en(hl.name_en) ELSE hl.name_en END AS "name_en",
@ -19,10 +19,10 @@ CREATE MATERIALIZED VIEW osm_transportation_name_network AS (
hl.tags, hl.tags,
rm.network_type, rm.network_type,
CASE CASE
WHEN (rm.network_type is not null AND nullif(rm.ref::text, '') is not null) WHEN (rm.network_type IS NOT NULL AND nullif(rm.ref::text, '') IS NOT NULL)
then rm.ref::text THEN rm.ref::text
else hl.ref ELSE hl.ref
end as ref, END AS ref,
hl.highway, hl.highway,
hl.construction, hl.construction,
CASE WHEN highway IN ('footway', 'steps') THEN layer END AS layer, CASE WHEN highway IN ('footway', 'steps') THEN layer END AS layer,
@ -32,15 +32,15 @@ CREATE MATERIALIZED VIEW osm_transportation_name_network AS (
ORDER BY rm.network_type) AS "rank", ORDER BY rm.network_type) AS "rank",
hl.z_order hl.z_order
FROM osm_highway_linestring hl FROM osm_highway_linestring hl
left join osm_route_member rm on (rm.member = hl.osm_id) LEFT JOIN osm_route_member rm ON (rm.member = hl.osm_id)
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_name_network_geometry_idx ON osm_transportation_name_network USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_transportation_name_network_geometry_idx ON osm_transportation_name_network USING gist (geometry);
-- etldoc: osm_transportation_name_network -> osm_transportation_name_linestring -- etldoc: osm_transportation_name_network -> osm_transportation_name_linestring
CREATE MATERIALIZED VIEW osm_transportation_name_linestring AS ( CREATE MATERIALIZED VIEW osm_transportation_name_linestring AS
SELECT (
(ST_Dump(geometry)).geom AS geometry, SELECT (ST_Dump(geometry)).geom AS geometry,
NULL::bigint AS osm_id, NULL::bigint AS osm_id,
name, name,
name_en, name_en,
@ -55,12 +55,13 @@ CREATE MATERIALIZED VIEW osm_transportation_name_linestring AS (
network_type AS network, network_type AS network,
z_order z_order
FROM ( FROM (
SELECT SELECT ST_LineMerge(ST_Collect(geometry)) AS geometry,
ST_LineMerge(ST_Collect(geometry)) AS geometry,
name, name,
name_en, name_en,
name_de, name_de,
hstore(string_agg(nullif(slice_language_tags(tags || hstore(ARRAY['name', name, 'name:en', name_en, 'name:de', name_de]))::text, ''), ',')) hstore(string_agg(nullif(slice_language_tags(tags ||
hstore(ARRAY ['name', name, 'name:en', name_en, 'name:de', name_de]))::text,
''), ','))
AS "tags", AS "tags",
ref, ref,
highway, highway,
@ -71,10 +72,10 @@ CREATE MATERIALIZED VIEW osm_transportation_name_linestring AS (
network_type, network_type,
min(z_order) AS z_order min(z_order) AS z_order
FROM osm_transportation_name_network FROM osm_transportation_name_network
WHERE ("rank"=1 OR "rank" is null) WHERE ("rank" = 1 OR "rank" IS NULL)
AND (name <> '' OR ref <> '') AND (name <> '' OR ref <> '')
AND NULLIF(highway, '') IS NOT NULL AND NULLIF(highway, '') IS NOT NULL
group by name, name_en, name_de, ref, highway, construction, "level", layer, indoor, network_type GROUP BY name, name_en, name_de, ref, highway, construction, "level", layer, indoor, network_type
) AS highway_union ) AS highway_union
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_geometry_idx ON osm_transportation_name_linestring USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_geometry_idx ON osm_transportation_name_linestring USING gist (geometry);
@ -84,10 +85,22 @@ CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_highway_partial_id
WHERE highway IN ('motorway', 'trunk', 'construction'); WHERE highway IN ('motorway', 'trunk', 'construction');
-- etldoc: osm_transportation_name_linestring -> osm_transportation_name_linestring_gen1 -- etldoc: osm_transportation_name_linestring -> osm_transportation_name_linestring_gen1
CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen1 AS ( CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen1 AS
SELECT ST_Simplify(geometry, 50) AS geometry, osm_id, name, name_en, name_de, tags, ref, highway, construction, network, z_order (
SELECT ST_Simplify(geometry, 50) AS geometry,
osm_id,
name,
name_en,
name_de,
tags,
ref,
highway,
construction,
network,
z_order
FROM osm_transportation_name_linestring FROM osm_transportation_name_linestring
WHERE (highway IN ('motorway','trunk') OR highway = 'construction' AND construction IN ('motorway','trunk')) AND ST_Length(geometry) > 8000 WHERE (highway IN ('motorway', 'trunk') OR highway = 'construction' AND construction IN ('motorway', 'trunk'))
AND ST_Length(geometry) > 8000
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen1_geometry_idx ON osm_transportation_name_linestring_gen1 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen1_geometry_idx ON osm_transportation_name_linestring_gen1 USING gist (geometry);
@ -96,10 +109,22 @@ CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen1_highway_parti
WHERE highway IN ('motorway', 'trunk', 'construction'); WHERE highway IN ('motorway', 'trunk', 'construction');
-- etldoc: osm_transportation_name_linestring_gen1 -> osm_transportation_name_linestring_gen2 -- etldoc: osm_transportation_name_linestring_gen1 -> osm_transportation_name_linestring_gen2
CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen2 AS ( CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen2 AS
SELECT ST_Simplify(geometry, 120) AS geometry, osm_id, name, name_en, name_de, tags, ref, highway, construction, network, z_order (
SELECT ST_Simplify(geometry, 120) AS geometry,
osm_id,
name,
name_en,
name_de,
tags,
ref,
highway,
construction,
network,
z_order
FROM osm_transportation_name_linestring_gen1 FROM osm_transportation_name_linestring_gen1
WHERE (highway IN ('motorway','trunk') OR highway = 'construction' AND construction IN ('motorway','trunk')) AND ST_Length(geometry) > 14000 WHERE (highway IN ('motorway', 'trunk') OR highway = 'construction' AND construction IN ('motorway', 'trunk'))
AND ST_Length(geometry) > 14000
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen2_geometry_idx ON osm_transportation_name_linestring_gen2 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen2_geometry_idx ON osm_transportation_name_linestring_gen2 USING gist (geometry);
@ -108,10 +133,22 @@ CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen2_highway_parti
WHERE highway IN ('motorway', 'trunk', 'construction'); WHERE highway IN ('motorway', 'trunk', 'construction');
-- etldoc: osm_transportation_name_linestring_gen2 -> osm_transportation_name_linestring_gen3 -- etldoc: osm_transportation_name_linestring_gen2 -> osm_transportation_name_linestring_gen3
CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen3 AS ( CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen3 AS
SELECT ST_Simplify(geometry, 200) AS geometry, osm_id, name, name_en, name_de, tags, ref, highway, construction, network, z_order (
SELECT ST_Simplify(geometry, 200) AS geometry,
osm_id,
name,
name_en,
name_de,
tags,
ref,
highway,
construction,
network,
z_order
FROM osm_transportation_name_linestring_gen2 FROM osm_transportation_name_linestring_gen2
WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway') AND ST_Length(geometry) > 20000 WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway')
AND ST_Length(geometry) > 20000
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen3_geometry_idx ON osm_transportation_name_linestring_gen3 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen3_geometry_idx ON osm_transportation_name_linestring_gen3 USING gist (geometry);
@ -120,10 +157,22 @@ CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen3_highway_parti
WHERE highway IN ('motorway', 'construction'); WHERE highway IN ('motorway', 'construction');
-- etldoc: osm_transportation_name_linestring_gen3 -> osm_transportation_name_linestring_gen4 -- etldoc: osm_transportation_name_linestring_gen3 -> osm_transportation_name_linestring_gen4
CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen4 AS ( CREATE MATERIALIZED VIEW osm_transportation_name_linestring_gen4 AS
SELECT ST_Simplify(geometry, 500) AS geometry, osm_id, name, name_en, name_de, tags, ref, highway, construction, network, z_order (
SELECT ST_Simplify(geometry, 500) AS geometry,
osm_id,
name,
name_en,
name_de,
tags,
ref,
highway,
construction,
network,
z_order
FROM osm_transportation_name_linestring_gen3 FROM osm_transportation_name_linestring_gen3
WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway') AND ST_Length(geometry) > 20000 WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway')
AND ST_Length(geometry) > 20000
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen4_geometry_idx ON osm_transportation_name_linestring_gen4 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen4_geometry_idx ON osm_transportation_name_linestring_gen4 USING gist (geometry);
@ -131,16 +180,22 @@ CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen4_geometry_idx
CREATE SCHEMA IF NOT EXISTS transportation_name; CREATE SCHEMA IF NOT EXISTS transportation_name;
CREATE TABLE IF NOT EXISTS transportation_name.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS transportation_name.updates
CREATE OR REPLACE FUNCTION transportation_name.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION transportation_name.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO transportation_name.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO transportation_name.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION transportation_name.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION transportation_name.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh transportation_name'; RAISE LOG 'Refresh transportation_name';
PERFORM update_osm_route_member(); PERFORM update_osm_route_member();
@ -150,24 +205,27 @@ CREATE OR REPLACE FUNCTION transportation_name.refresh() RETURNS trigger AS
REFRESH MATERIALIZED VIEW osm_transportation_name_linestring_gen2; REFRESH MATERIALIZED VIEW osm_transportation_name_linestring_gen2;
REFRESH MATERIALIZED VIEW osm_transportation_name_linestring_gen3; REFRESH MATERIALIZED VIEW osm_transportation_name_linestring_gen3;
REFRESH MATERIALIZED VIEW osm_transportation_name_linestring_gen4; REFRESH MATERIALIZED VIEW osm_transportation_name_linestring_gen4;
-- noinspection SqlWithoutWhere
DELETE FROM transportation_name.updates; DELETE FROM transportation_name.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag_transportation_name CREATE TRIGGER trigger_flag_transportation_name
AFTER INSERT OR UPDATE OR DELETE ON osm_route_member AFTER INSERT OR UPDATE OR DELETE
ON osm_route_member
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE transportation_name.flag(); EXECUTE PROCEDURE transportation_name.flag();
CREATE TRIGGER trigger_flag_transportation_name CREATE TRIGGER trigger_flag_transportation_name
AFTER INSERT OR UPDATE OR DELETE ON osm_highway_linestring AFTER INSERT OR UPDATE OR DELETE
ON osm_highway_linestring
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE transportation_name.flag(); EXECUTE PROCEDURE transportation_name.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON transportation_name.updates AFTER INSERT
ON transportation_name.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE transportation_name.refresh(); EXECUTE PROCEDURE transportation_name.refresh();

View File

@ -0,0 +1,78 @@
-- This statement can be deleted after the water importer image stops creating this object as a table
DO
$$
BEGIN
DROP TABLE IF EXISTS osm_ocean_polygon_gen1 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen1
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen1 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen1 AS
(
SELECT ST_Simplify(geometry, 20) AS geometry
FROM osm_ocean_polygon
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen1_idx ON osm_ocean_polygon_gen1 USING gist (geometry);
-- This statement can be deleted after the water importer image stops creating this object as a table
DO
$$
BEGIN
DROP TABLE IF EXISTS osm_ocean_polygon_gen2 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen2
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen2 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen2 AS
(
SELECT ST_Simplify(geometry, 40) AS geometry
FROM osm_ocean_polygon
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen2_idx ON osm_ocean_polygon_gen2 USING gist (geometry);
-- This statement can be deleted after the water importer image stops creating this object as a table
DO
$$
BEGIN
DROP TABLE IF EXISTS osm_ocean_polygon_gen3 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen3
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen3 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen3 AS
(
SELECT ST_Simplify(geometry, 80) AS geometry
FROM osm_ocean_polygon
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen3_idx ON osm_ocean_polygon_gen3 USING gist (geometry);
-- This statement can be deleted after the water importer image stops creating this object as a table
DO
$$
BEGIN
DROP TABLE IF EXISTS osm_ocean_polygon_gen4 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen4
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen4 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen4 AS
(
SELECT ST_Simplify(geometry, 160) AS geometry
FROM osm_ocean_polygon
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen4_idx ON osm_ocean_polygon_gen4 USING gist (geometry);

View File

@ -1,70 +1,27 @@
-- This statement can be deleted after the water importer image stops creating this object as a table CREATE OR REPLACE FUNCTION water_class(waterway text) RETURNS text AS
DO $$ BEGIN DROP TABLE IF EXISTS osm_ocean_polygon_gen1 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql'; $$
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen1
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen1 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen1 AS (
SELECT ST_Simplify(geometry, 20) AS geometry
FROM osm_ocean_polygon
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen1_idx ON osm_ocean_polygon_gen1 USING gist (geometry);
-- This statement can be deleted after the water importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_ocean_polygon_gen2 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql';
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen2
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen2 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen2 AS (
SELECT ST_Simplify(geometry, 40) AS geometry
FROM osm_ocean_polygon
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen2_idx ON osm_ocean_polygon_gen2 USING gist (geometry);
-- This statement can be deleted after the water importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_ocean_polygon_gen3 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql';
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen3
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen3 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen3 AS (
SELECT ST_Simplify(geometry, 80) AS geometry
FROM osm_ocean_polygon
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen3_idx ON osm_ocean_polygon_gen3 USING gist (geometry);
-- This statement can be deleted after the water importer image stops creating this object as a table
DO $$ BEGIN DROP TABLE IF EXISTS osm_ocean_polygon_gen4 CASCADE; EXCEPTION WHEN wrong_object_type THEN END; $$ language 'plpgsql';
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen4
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen4 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen4 AS (
SELECT ST_Simplify(geometry, 160) AS geometry
FROM osm_ocean_polygon
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen4_idx ON osm_ocean_polygon_gen4 USING gist (geometry);
CREATE OR REPLACE FUNCTION water_class(waterway TEXT) RETURNS TEXT AS $$
SELECT CASE SELECT CASE
%%FIELD_MAPPING: class %% %%FIELD_MAPPING: class %%
ELSE 'river' ELSE 'river'
END; END;
$$ LANGUAGE SQL IMMUTABLE
PARALLEL SAFE;
CREATE OR REPLACE FUNCTION waterway_brunnel(is_bridge bool, is_tunnel bool) RETURNS text AS
$$ $$
LANGUAGE SQL
IMMUTABLE PARALLEL SAFE;
CREATE OR REPLACE FUNCTION waterway_brunnel(is_bridge BOOL, is_tunnel BOOL) RETURNS TEXT AS $$
SELECT CASE SELECT CASE
WHEN is_bridge THEN 'bridge' WHEN is_bridge THEN 'bridge'
WHEN is_tunnel THEN 'tunnel' WHEN is_tunnel THEN 'tunnel'
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL STRICT
IMMUTABLE STRICT PARALLEL SAFE; PARALLEL SAFE;
CREATE OR REPLACE VIEW water_z0 AS ( CREATE OR REPLACE VIEW water_z0 AS
(
-- etldoc: ne_110m_ocean -> water_z0 -- etldoc: ne_110m_ocean -> water_z0
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -82,7 +39,8 @@ CREATE OR REPLACE VIEW water_z0 AS (
FROM ne_110m_lakes FROM ne_110m_lakes
); );
CREATE OR REPLACE VIEW water_z1 AS ( CREATE OR REPLACE VIEW water_z1 AS
(
-- etldoc: ne_110m_ocean -> water_z1 -- etldoc: ne_110m_ocean -> water_z1
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -100,7 +58,8 @@ CREATE OR REPLACE VIEW water_z1 AS (
FROM ne_110m_lakes FROM ne_110m_lakes
); );
CREATE OR REPLACE VIEW water_z2 AS ( CREATE OR REPLACE VIEW water_z2 AS
(
-- etldoc: ne_50m_ocean -> water_z2 -- etldoc: ne_50m_ocean -> water_z2
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -118,7 +77,8 @@ CREATE OR REPLACE VIEW water_z2 AS (
FROM ne_50m_lakes FROM ne_50m_lakes
); );
CREATE OR REPLACE VIEW water_z4 AS ( CREATE OR REPLACE VIEW water_z4 AS
(
-- etldoc: ne_50m_ocean -> water_z4 -- etldoc: ne_50m_ocean -> water_z4
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -136,7 +96,8 @@ CREATE OR REPLACE VIEW water_z4 AS (
FROM ne_10m_lakes FROM ne_10m_lakes
); );
CREATE OR REPLACE VIEW water_z5 AS ( CREATE OR REPLACE VIEW water_z5 AS
(
-- etldoc: ne_10m_ocean -> water_z5 -- etldoc: ne_10m_ocean -> water_z5
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -154,7 +115,8 @@ CREATE OR REPLACE VIEW water_z5 AS (
FROM ne_10m_lakes FROM ne_10m_lakes
); );
CREATE OR REPLACE VIEW water_z6 AS ( CREATE OR REPLACE VIEW water_z6 AS
(
-- etldoc: osm_ocean_polygon_gen4 -> water_z6 -- etldoc: osm_ocean_polygon_gen4 -> water_z6
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -173,7 +135,8 @@ CREATE OR REPLACE VIEW water_z6 AS (
WHERE "natural" != 'bay' WHERE "natural" != 'bay'
); );
CREATE OR REPLACE VIEW water_z7 AS ( CREATE OR REPLACE VIEW water_z7 AS
(
-- etldoc: osm_ocean_polygon_gen4 -> water_z7 -- etldoc: osm_ocean_polygon_gen4 -> water_z7
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -192,7 +155,8 @@ CREATE OR REPLACE VIEW water_z7 AS (
WHERE "natural" != 'bay' WHERE "natural" != 'bay'
); );
CREATE OR REPLACE VIEW water_z8 AS ( CREATE OR REPLACE VIEW water_z8 AS
(
-- etldoc: osm_ocean_polygon_gen4 -> water_z8 -- etldoc: osm_ocean_polygon_gen4 -> water_z8
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -211,7 +175,8 @@ CREATE OR REPLACE VIEW water_z8 AS (
WHERE "natural" != 'bay' WHERE "natural" != 'bay'
); );
CREATE OR REPLACE VIEW water_z9 AS ( CREATE OR REPLACE VIEW water_z9 AS
(
-- etldoc: osm_ocean_polygon_gen3 -> water_z9 -- etldoc: osm_ocean_polygon_gen3 -> water_z9
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -230,7 +195,8 @@ CREATE OR REPLACE VIEW water_z9 AS (
WHERE "natural" != 'bay' WHERE "natural" != 'bay'
); );
CREATE OR REPLACE VIEW water_z10 AS ( CREATE OR REPLACE VIEW water_z10 AS
(
-- etldoc: osm_ocean_polygon_gen2 -> water_z10 -- etldoc: osm_ocean_polygon_gen2 -> water_z10
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -249,7 +215,8 @@ CREATE OR REPLACE VIEW water_z10 AS (
WHERE "natural" != 'bay' WHERE "natural" != 'bay'
); );
CREATE OR REPLACE VIEW water_z11 AS ( CREATE OR REPLACE VIEW water_z11 AS
(
-- etldoc: osm_ocean_polygon_gen1 -> water_z11 -- etldoc: osm_ocean_polygon_gen1 -> water_z11
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -268,7 +235,8 @@ CREATE OR REPLACE VIEW water_z11 AS (
WHERE "natural" != 'bay' WHERE "natural" != 'bay'
); );
CREATE OR REPLACE VIEW water_z12 AS ( CREATE OR REPLACE VIEW water_z12 AS
(
-- etldoc: osm_ocean_polygon_gen1 -> water_z12 -- etldoc: osm_ocean_polygon_gen1 -> water_z12
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -287,7 +255,8 @@ CREATE OR REPLACE VIEW water_z12 AS (
WHERE "natural" != 'bay' WHERE "natural" != 'bay'
); );
CREATE OR REPLACE VIEW water_z13 AS ( CREATE OR REPLACE VIEW water_z13 AS
(
-- etldoc: osm_ocean_polygon -> water_z13 -- etldoc: osm_ocean_polygon -> water_z13
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -306,7 +275,8 @@ CREATE OR REPLACE VIEW water_z13 AS (
WHERE "natural" != 'bay' WHERE "natural" != 'bay'
); );
CREATE OR REPLACE VIEW water_z14 AS ( CREATE OR REPLACE VIEW water_z14 AS
(
-- etldoc: osm_ocean_polygon -> water_z14 -- etldoc: osm_ocean_polygon -> water_z14
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
@ -329,56 +299,92 @@ CREATE OR REPLACE VIEW water_z14 AS (
-- etldoc: label="layer_water |<z0> z0|<z1>z1|<z2>z2|<z3>z3 |<z4> z4|<z5>z5|<z6>z6|<z7>z7| <z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14_> z14+" ] ; -- etldoc: label="layer_water |<z0> z0|<z1>z1|<z2>z2|<z3>z3 |<z4> z4|<z5>z5|<z6>z6|<z7>z7| <z8> z8 |<z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14_> z14+" ] ;
CREATE OR REPLACE FUNCTION layer_water(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_water(bbox geometry, zoom_level int)
RETURNS TABLE(geometry geometry, class text, brunnel text, intermittent int) AS $$ RETURNS TABLE
(
geometry geometry,
class text,
brunnel text,
intermittent int
)
AS
$$
SELECT geometry, SELECT geometry,
class::text, class::text,
waterway_brunnel(is_bridge, is_tunnel) AS brunnel, waterway_brunnel(is_bridge, is_tunnel) AS brunnel,
is_intermittent::int AS intermittent is_intermittent::int AS intermittent
FROM ( FROM (
-- etldoc: water_z0 -> layer_water:z0 -- etldoc: water_z0 -> layer_water:z0
SELECT * FROM water_z0 WHERE zoom_level = 0 SELECT *
FROM water_z0
WHERE zoom_level = 0
UNION ALL UNION ALL
-- etldoc: water_z1 -> layer_water:z1 -- etldoc: water_z1 -> layer_water:z1
SELECT * FROM water_z1 WHERE zoom_level = 1 SELECT *
FROM water_z1
WHERE zoom_level = 1
UNION ALL UNION ALL
-- etldoc: water_z2 -> layer_water:z2 -- etldoc: water_z2 -> layer_water:z2
-- etldoc: water_z2 -> layer_water:z3 -- etldoc: water_z2 -> layer_water:z3
SELECT * FROM water_z2 WHERE zoom_level BETWEEN 2 AND 3 SELECT *
FROM water_z2
WHERE zoom_level BETWEEN 2 AND 3
UNION ALL UNION ALL
-- etldoc: water_z4 -> layer_water:z4 -- etldoc: water_z4 -> layer_water:z4
SELECT * FROM water_z4 WHERE zoom_level = 4 SELECT *
FROM water_z4
WHERE zoom_level = 4
UNION ALL UNION ALL
-- etldoc: water_z5 -> layer_water:z5 -- etldoc: water_z5 -> layer_water:z5
SELECT * FROM water_z5 WHERE zoom_level = 5 SELECT *
FROM water_z5
WHERE zoom_level = 5
UNION ALL UNION ALL
-- etldoc: water_z6 -> layer_water:z6 -- etldoc: water_z6 -> layer_water:z6
SELECT * FROM water_z6 WHERE zoom_level = 6 SELECT *
FROM water_z6
WHERE zoom_level = 6
UNION ALL UNION ALL
-- etldoc: water_z7 -> layer_water:z7 -- etldoc: water_z7 -> layer_water:z7
SELECT * FROM water_z7 WHERE zoom_level = 7 SELECT *
FROM water_z7
WHERE zoom_level = 7
UNION ALL UNION ALL
-- etldoc: water_z8 -> layer_water:z8 -- etldoc: water_z8 -> layer_water:z8
SELECT * FROM water_z8 WHERE zoom_level = 8 SELECT *
FROM water_z8
WHERE zoom_level = 8
UNION ALL UNION ALL
-- etldoc: water_z9 -> layer_water:z9 -- etldoc: water_z9 -> layer_water:z9
SELECT * FROM water_z9 WHERE zoom_level = 9 SELECT *
FROM water_z9
WHERE zoom_level = 9
UNION ALL UNION ALL
-- etldoc: water_z10 -> layer_water:z10 -- etldoc: water_z10 -> layer_water:z10
SELECT * FROM water_z10 WHERE zoom_level = 10 SELECT *
FROM water_z10
WHERE zoom_level = 10
UNION ALL UNION ALL
-- etldoc: water_z11 -> layer_water:z11 -- etldoc: water_z11 -> layer_water:z11
SELECT * FROM water_z11 WHERE zoom_level = 11 SELECT *
FROM water_z11
WHERE zoom_level = 11
UNION ALL UNION ALL
-- etldoc: water_z12 -> layer_water:z12 -- etldoc: water_z12 -> layer_water:z12
SELECT * FROM water_z12 WHERE zoom_level = 12 SELECT *
FROM water_z12
WHERE zoom_level = 12
UNION ALL UNION ALL
-- etldoc: water_z13 -> layer_water:z13 -- etldoc: water_z13 -> layer_water:z13
SELECT * FROM water_z13 WHERE zoom_level = 13 SELECT *
FROM water_z13
WHERE zoom_level = 13
UNION ALL UNION ALL
-- etldoc: water_z14 -> layer_water:z14_ -- etldoc: water_z14 -> layer_water:z14_
SELECT * FROM water_z14 WHERE zoom_level >= 14 SELECT *
FROM water_z14
WHERE zoom_level >= 14
) AS zoom_levels ) AS zoom_levels
WHERE geometry && bbox; WHERE geometry && bbox;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL -- STRICT
IMMUTABLE PARALLEL SAFE; PARALLEL SAFE;

View File

@ -34,6 +34,7 @@ layer:
datasource: datasource:
query: (SELECT geometry, class, intermittent, brunnel FROM layer_water(!bbox!, z(!scale_denominator!))) AS t query: (SELECT geometry, class, intermittent, brunnel FROM layer_water(!bbox!, z(!scale_denominator!))) AS t
schema: schema:
- ./update_water.sql
- ./water.sql - ./water.sql
datasources: datasources:
- type: imposm3 - type: imposm3

View File

@ -1,16 +1,29 @@
-- etldoc: layer_water_name[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_water_name[shape=record fillcolor=lightpink, style="rounded,filled",
-- etldoc: label="layer_water_name | <z0_8> z0_8 | <z9_13> z9_13 | <z14_> z14+" ] ; -- etldoc: label="layer_water_name | <z0_8> z0_8 | <z9_13> z9_13 | <z14_> z14+" ] ;
CREATE OR REPLACE FUNCTION layer_water_name(bbox geometry, zoom_level integer) CREATE OR REPLACE FUNCTION layer_water_name(bbox geometry, zoom_level integer)
RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de text, tags hstore, class text, intermittent int) AS $$ RETURNS TABLE
(
osm_id bigint,
geometry geometry,
name text,
name_en text,
name_de text,
tags hstore,
class text,
intermittent int
)
AS
$$
SELECT
-- etldoc: osm_water_lakeline -> layer_water_name:z9_13 -- etldoc: osm_water_lakeline -> layer_water_name:z9_13
-- etldoc: osm_water_lakeline -> layer_water_name:z14_ -- etldoc: osm_water_lakeline -> layer_water_name:z14_
SELECT CASE
CASE WHEN osm_id<0 THEN -osm_id*10+4 WHEN osm_id < 0 THEN -osm_id * 10 + 4
ELSE osm_id * 10 + 1 ELSE osm_id * 10 + 1
END AS osm_id_hash, END AS osm_id_hash,
geometry, name, geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
@ -20,40 +33,47 @@ RETURNS TABLE(osm_id bigint, geometry geometry, name text, name_en text, name_de
WHERE geometry && bbox WHERE geometry && bbox
AND ((zoom_level BETWEEN 9 AND 13 AND LineLabel(zoom_level, NULLIF(name, ''), geometry)) AND ((zoom_level BETWEEN 9 AND 13 AND LineLabel(zoom_level, NULLIF(name, ''), geometry))
OR (zoom_level >= 14)) OR (zoom_level >= 14))
-- etldoc: osm_water_point -> layer_water_name:z9_13
-- etldoc: osm_water_point -> layer_water_name:z14_
UNION ALL UNION ALL
SELECT SELECT
CASE WHEN osm_id<0 THEN -osm_id*10+4 -- etldoc: osm_water_point -> layer_water_name:z9_13
-- etldoc: osm_water_point -> layer_water_name:z14_
CASE
WHEN osm_id < 0 THEN -osm_id * 10 + 4
ELSE osm_id * 10 + 1 ELSE osm_id * 10 + 1
END AS osm_id_hash, END AS osm_id_hash,
geometry, name, geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
'lake'::text AS class, 'lake'::text AS class,
is_intermittent::int AS intermittent is_intermittent::int AS intermittent
FROM osm_water_point FROM osm_water_point
WHERE geometry && bbox AND ( WHERE geometry && bbox
AND (
(zoom_level BETWEEN 9 AND 13 AND area > 70000 * 2 ^ (20 - zoom_level)) (zoom_level BETWEEN 9 AND 13 AND area > 70000 * 2 ^ (20 - zoom_level))
OR (zoom_level >= 14) OR (zoom_level >= 14)
) )
UNION ALL
SELECT
-- etldoc: osm_marine_point -> layer_water_name:z0_8 -- etldoc: osm_marine_point -> layer_water_name:z0_8
-- etldoc: osm_marine_point -> layer_water_name:z9_13 -- etldoc: osm_marine_point -> layer_water_name:z9_13
-- etldoc: osm_marine_point -> layer_water_name:z14_ -- etldoc: osm_marine_point -> layer_water_name:z14_
UNION ALL osm_id * 10 AS osm_id_hash,
SELECT osm_id*10, geometry, name, geometry,
name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
tags, tags,
place::text AS class, place::text AS class,
is_intermittent::int AS intermittent is_intermittent::int AS intermittent
FROM osm_marine_point FROM osm_marine_point
WHERE geometry && bbox AND ( WHERE geometry && bbox
AND (
place = 'ocean' place = 'ocean'
OR (zoom_level >= "rank" AND "rank" IS NOT NULL) OR (zoom_level >= "rank" AND "rank" IS NOT NULL)
OR (zoom_level >= 8) OR (zoom_level >= 8)
); );
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL -- STRICT
IMMUTABLE PARALLEL SAFE; PARALLEL SAFE;

View File

@ -3,7 +3,8 @@ DROP TRIGGER IF EXISTS trigger_refresh ON water_name_marine.updates;
CREATE EXTENSION IF NOT EXISTS unaccent; CREATE EXTENSION IF NOT EXISTS unaccent;
CREATE OR REPLACE FUNCTION update_osm_marine_point() RETURNS VOID AS $$ CREATE OR REPLACE FUNCTION update_osm_marine_point() RETURNS void AS
$$
BEGIN BEGIN
-- etldoc: osm_marine_point -> osm_marine_point -- etldoc: osm_marine_point -> osm_marine_point
UPDATE osm_marine_point AS osm SET "rank" = NULL WHERE "rank" IS NOT NULL; UPDATE osm_marine_point AS osm SET "rank" = NULL WHERE "rank" IS NOT NULL;
@ -13,7 +14,8 @@ BEGIN
WITH important_marine_point AS ( WITH important_marine_point AS (
SELECT osm.geometry, osm.osm_id, osm.name, osm.name_en, ne.scalerank, osm.is_intermittent SELECT osm.geometry, osm.osm_id, osm.name, osm.name_en, ne.scalerank, osm.is_intermittent
FROM ne_10m_geography_marine_polys AS ne, osm_marine_point AS osm FROM ne_10m_geography_marine_polys AS ne,
osm_marine_point AS osm
WHERE trim(regexp_replace(ne.name, '\\s+', ' ', 'g')) ILIKE osm.name WHERE trim(regexp_replace(ne.name, '\\s+', ' ', 'g')) ILIKE osm.name
OR trim(regexp_replace(ne.name, '\\s+', ' ', 'g')) ILIKE osm.tags->'name:en' OR trim(regexp_replace(ne.name, '\\s+', ' ', 'g')) ILIKE osm.tags->'name:en'
OR trim(regexp_replace(ne.name, '\\s+', ' ', 'g')) ILIKE osm.tags->'name:es' OR trim(regexp_replace(ne.name, '\\s+', ' ', 'g')) ILIKE osm.tags->'name:es'
@ -38,32 +40,40 @@ CREATE INDEX IF NOT EXISTS osm_marine_point_rank_idx ON osm_marine_point("rank")
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS water_name_marine; CREATE SCHEMA IF NOT EXISTS water_name_marine;
CREATE TABLE IF NOT EXISTS water_name_marine.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS water_name_marine.updates
CREATE OR REPLACE FUNCTION water_name_marine.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION water_name_marine.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO water_name_marine.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO water_name_marine.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_name_marine.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION water_name_marine.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh water_name_marine rank'; RAISE LOG 'Refresh water_name_marine rank';
PERFORM update_osm_marine_point(); PERFORM update_osm_marine_point();
-- noinspection SqlWithoutWhere
DELETE FROM water_name_marine.updates; DELETE FROM water_name_marine.updates;
RETURN null; RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_marine_point AFTER INSERT OR UPDATE OR DELETE
ON osm_marine_point
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE water_name_marine.flag(); EXECUTE PROCEDURE water_name_marine.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON water_name_marine.updates AFTER INSERT
ON water_name_marine.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE water_name_marine.refresh(); EXECUTE PROCEDURE water_name_marine.refresh();

View File

@ -5,23 +5,29 @@ DROP TRIGGER IF EXISTS trigger_insert_line ON osm_water_polygon;
CREATE OR REPLACE VIEW osm_water_lakeline_view AS CREATE OR REPLACE VIEW osm_water_lakeline_view AS
SELECT wp.osm_id, SELECT wp.osm_id,
ll.wkb_geometry AS geometry, ll.wkb_geometry AS geometry,
name, name_en, name_de, name,
name_en,
name_de,
update_tags(tags, ll.wkb_geometry) AS tags, update_tags(tags, ll.wkb_geometry) AS tags,
ST_Area(wp.geometry) AS area, ST_Area(wp.geometry) AS area,
is_intermittent is_intermittent
FROM osm_water_polygon AS wp FROM osm_water_polygon AS wp
INNER JOIN lake_centerline ll ON wp.osm_id = ll.osm_id INNER JOIN lake_centerline ll ON wp.osm_id = ll.osm_id
WHERE wp.name <> '' AND ST_IsValid(wp.geometry) WHERE wp.name <> ''
; AND ST_IsValid(wp.geometry);
-- etldoc: osm_water_polygon -> osm_water_lakeline -- etldoc: osm_water_polygon -> osm_water_lakeline
-- etldoc: lake_centerline -> osm_water_lakeline -- etldoc: lake_centerline -> osm_water_lakeline
CREATE TABLE IF NOT EXISTS osm_water_lakeline AS CREATE TABLE IF NOT EXISTS osm_water_lakeline AS
SELECT * FROM osm_water_lakeline_view; SELECT *
DO $$ FROM osm_water_lakeline_view;
DO
$$
BEGIN BEGIN
ALTER TABLE osm_water_lakeline ADD CONSTRAINT osm_water_lakeline_pk PRIMARY KEY (osm_id); ALTER TABLE osm_water_lakeline
EXCEPTION WHEN others then 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.'; RAISE NOTICE 'primary key osm_water_lakeline_pk already exists in osm_water_lakeline.';
END; END;
$$; $$;
@ -31,48 +37,55 @@ CREATE INDEX IF NOT EXISTS osm_water_lakeline_geometry_idx ON osm_water_lakeline
CREATE SCHEMA IF NOT EXISTS water_lakeline; CREATE SCHEMA IF NOT EXISTS water_lakeline;
CREATE OR REPLACE FUNCTION water_lakeline.delete() RETURNS trigger AS $BODY$ CREATE OR REPLACE FUNCTION water_lakeline.delete() RETURNS trigger AS
$$
BEGIN BEGIN
DELETE FROM osm_water_lakeline DELETE
FROM osm_water_lakeline
WHERE osm_water_lakeline.osm_id = OLD.osm_id; WHERE osm_water_lakeline.osm_id = OLD.osm_id;
RETURN null; RETURN NULL;
END; END;
$BODY$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_lakeline.update() RETURNS trigger AS $BODY$ CREATE OR REPLACE FUNCTION water_lakeline.update() RETURNS trigger AS
$$
BEGIN BEGIN
UPDATE osm_water_lakeline UPDATE osm_water_lakeline
SET (osm_id, geometry, name, name_en, name_de, tags, area, is_intermittent) = 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) (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; WHERE osm_water_lakeline.osm_id = NEW.osm_id;
RETURN null; RETURN NULL;
END; END;
$BODY$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_lakeline.insert() RETURNS trigger AS $BODY$ CREATE OR REPLACE FUNCTION water_lakeline.insert() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO osm_water_lakeline INSERT INTO osm_water_lakeline
SELECT * SELECT *
FROM osm_water_lakeline_view FROM osm_water_lakeline_view
WHERE osm_water_lakeline_view.osm_id = NEW.osm_id; WHERE osm_water_lakeline_view.osm_id = NEW.osm_id;
RETURN null; RETURN NULL;
END; END;
$BODY$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_delete_line CREATE TRIGGER trigger_delete_line
AFTER DELETE ON osm_water_polygon AFTER DELETE
ON osm_water_polygon
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE water_lakeline.delete(); EXECUTE PROCEDURE water_lakeline.delete();
CREATE TRIGGER trigger_update_line CREATE TRIGGER trigger_update_line
AFTER UPDATE ON osm_water_polygon AFTER UPDATE
ON osm_water_polygon
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE water_lakeline.update(); EXECUTE PROCEDURE water_lakeline.update();
CREATE TRIGGER trigger_insert_line CREATE TRIGGER trigger_insert_line
AFTER INSERT ON osm_water_polygon AFTER INSERT
ON osm_water_polygon
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE water_lakeline.insert(); EXECUTE PROCEDURE water_lakeline.insert();

View File

@ -3,25 +3,31 @@ DROP TRIGGER IF EXISTS trigger_update_point ON osm_water_polygon;
DROP TRIGGER IF EXISTS trigger_insert_point ON osm_water_polygon; DROP TRIGGER IF EXISTS trigger_insert_point ON osm_water_polygon;
CREATE OR REPLACE VIEW osm_water_point_view AS CREATE OR REPLACE VIEW osm_water_point_view AS
SELECT SELECT wp.osm_id,
wp.osm_id, ST_PointOnSurface(wp.geometry) AS geometry, ST_PointOnSurface(wp.geometry) AS geometry,
wp.name, wp.name_en, wp.name_de, wp.name,
wp.name_en,
wp.name_de,
update_tags(wp.tags, ST_PointOnSurface(wp.geometry)) AS tags, update_tags(wp.tags, ST_PointOnSurface(wp.geometry)) AS tags,
ST_Area(wp.geometry) AS area, ST_Area(wp.geometry) AS area,
wp.is_intermittent wp.is_intermittent
FROM osm_water_polygon AS wp FROM osm_water_polygon AS wp
LEFT JOIN lake_centerline ll ON wp.osm_id = ll.osm_id LEFT JOIN lake_centerline ll ON wp.osm_id = ll.osm_id
WHERE ll.osm_id IS NULL AND wp.name <> '' WHERE ll.osm_id IS NULL
; AND wp.name <> '';
-- etldoc: osm_water_polygon -> osm_water_point -- etldoc: osm_water_polygon -> osm_water_point
-- etldoc: lake_centerline -> osm_water_point -- etldoc: lake_centerline -> osm_water_point
CREATE TABLE IF NOT EXISTS osm_water_point AS CREATE TABLE IF NOT EXISTS osm_water_point AS
SELECT * FROM osm_water_point_view; SELECT *
DO $$ FROM osm_water_point_view;
DO
$$
BEGIN BEGIN
ALTER TABLE osm_water_point ADD CONSTRAINT osm_water_point_pk PRIMARY KEY (osm_id); ALTER TABLE osm_water_point
EXCEPTION WHEN others then 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.'; RAISE NOTICE 'primary key osm_water_point_pk already exists in osm_water_point.';
END; END;
$$; $$;
@ -31,48 +37,55 @@ CREATE INDEX IF NOT EXISTS osm_water_point_geometry_idx ON osm_water_point USING
CREATE SCHEMA IF NOT EXISTS water_point; CREATE SCHEMA IF NOT EXISTS water_point;
CREATE OR REPLACE FUNCTION water_point.delete() RETURNS trigger AS $BODY$ CREATE OR REPLACE FUNCTION water_point.delete() RETURNS trigger AS
$$
BEGIN BEGIN
DELETE FROM osm_water_point DELETE
FROM osm_water_point
WHERE osm_water_point.osm_id = OLD.osm_id; WHERE osm_water_point.osm_id = OLD.osm_id;
RETURN null; RETURN NULL;
END; END;
$BODY$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_point.update() RETURNS trigger AS $BODY$ CREATE OR REPLACE FUNCTION water_point.update() RETURNS trigger AS
$$
BEGIN BEGIN
UPDATE osm_water_point UPDATE osm_water_point
SET (osm_id, geometry, name, name_en, name_de, tags, area, is_intermittent) = 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) (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; WHERE osm_water_point.osm_id = NEW.osm_id;
RETURN null; RETURN NULL;
END; END;
$BODY$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_point.insert() RETURNS trigger AS $BODY$ CREATE OR REPLACE FUNCTION water_point.insert() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO osm_water_point INSERT INTO osm_water_point
SELECT * SELECT *
FROM osm_water_point_view FROM osm_water_point_view
WHERE osm_water_point_view.osm_id = NEW.osm_id; WHERE osm_water_point_view.osm_id = NEW.osm_id;
RETURN null; RETURN NULL;
END; END;
$BODY$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_delete_point CREATE TRIGGER trigger_delete_point
AFTER DELETE ON osm_water_polygon AFTER DELETE
ON osm_water_polygon
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE water_point.delete(); EXECUTE PROCEDURE water_point.delete();
CREATE TRIGGER trigger_update_point CREATE TRIGGER trigger_update_point
AFTER UPDATE ON osm_water_polygon AFTER UPDATE
ON osm_water_polygon
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE water_point.update(); EXECUTE PROCEDURE water_point.update();
CREATE TRIGGER trigger_insert_point CREATE TRIGGER trigger_insert_point
AFTER INSERT ON osm_water_polygon AFTER INSERT
ON osm_water_polygon
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE water_point.insert(); EXECUTE PROCEDURE water_point.insert();

View File

@ -16,15 +16,21 @@ CREATE INDEX IF NOT EXISTS osm_waterway_linestring_name_partial_idx
-- etldoc: osm_waterway_linestring -> osm_important_waterway_linestring -- etldoc: osm_waterway_linestring -> osm_important_waterway_linestring
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring AS CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring AS
SELECT SELECT (ST_Dump(geometry)).geom AS geometry,
(ST_Dump(geometry)).geom AS geometry, name,
name, name_en, name_de, tags name_en,
name_de,
tags
FROM ( FROM (
SELECT SELECT ST_LineMerge(ST_Union(geometry)) AS geometry,
ST_LineMerge(ST_Union(geometry)) AS geometry, name,
name, name_en, name_de, slice_language_tags(tags) AS tags name_en,
name_de,
slice_language_tags(tags) AS tags
FROM osm_waterway_linestring FROM osm_waterway_linestring
WHERE name <> '' AND waterway = 'river' AND ST_IsValid(geometry) WHERE name <> ''
AND waterway = 'river'
AND ST_IsValid(geometry)
GROUP BY name, name_en, name_de, slice_language_tags(tags) GROUP BY name, name_en, name_de, slice_language_tags(tags)
) AS waterway_union; ) AS waterway_union;
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_names ON osm_important_waterway_linestring (name); CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_names ON osm_important_waterway_linestring (name);
@ -34,10 +40,11 @@ CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_geometry_idx ON osm
CREATE OR REPLACE VIEW osm_important_waterway_linestring_gen1_view AS CREATE OR REPLACE VIEW osm_important_waterway_linestring_gen1_view AS
SELECT ST_Simplify(geometry, 60) AS geometry, name, name_en, name_de, tags SELECT ST_Simplify(geometry, 60) AS geometry, name, name_en, name_de, tags
FROM osm_important_waterway_linestring FROM osm_important_waterway_linestring
WHERE ST_Length(geometry) > 1000 WHERE ST_Length(geometry) > 1000;
;
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen1 AS CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen1 AS
SELECT * FROM osm_important_waterway_linestring_gen1_view; SELECT *
FROM osm_important_waterway_linestring_gen1_view;
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen1_name_idx ON osm_important_waterway_linestring_gen1 (name); CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen1_name_idx ON osm_important_waterway_linestring_gen1 (name);
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen1_geometry_idx ON osm_important_waterway_linestring_gen1 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen1_geometry_idx ON osm_important_waterway_linestring_gen1 USING gist (geometry);
@ -45,10 +52,11 @@ CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen1_geometry_idx O
CREATE OR REPLACE VIEW osm_important_waterway_linestring_gen2_view AS CREATE OR REPLACE VIEW osm_important_waterway_linestring_gen2_view AS
SELECT ST_Simplify(geometry, 100) AS geometry, name, name_en, name_de, tags SELECT ST_Simplify(geometry, 100) AS geometry, name, name_en, name_de, tags
FROM osm_important_waterway_linestring_gen1 FROM osm_important_waterway_linestring_gen1
WHERE ST_Length(geometry) > 4000 WHERE ST_Length(geometry) > 4000;
;
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen2 AS CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen2 AS
SELECT * FROM osm_important_waterway_linestring_gen2_view; SELECT *
FROM osm_important_waterway_linestring_gen2_view;
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen2_name_idx ON osm_important_waterway_linestring_gen2 (name); CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen2_name_idx ON osm_important_waterway_linestring_gen2 (name);
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen2_geometry_idx ON osm_important_waterway_linestring_gen2 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen2_geometry_idx ON osm_important_waterway_linestring_gen2 USING gist (geometry);
@ -56,10 +64,11 @@ CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen2_geometry_idx O
CREATE OR REPLACE VIEW osm_important_waterway_linestring_gen3_view AS CREATE OR REPLACE VIEW osm_important_waterway_linestring_gen3_view AS
SELECT ST_Simplify(geometry, 200) AS geometry, name, name_en, name_de, tags SELECT ST_Simplify(geometry, 200) AS geometry, name, name_en, name_de, tags
FROM osm_important_waterway_linestring_gen2 FROM osm_important_waterway_linestring_gen2
WHERE ST_Length(geometry) > 8000 WHERE ST_Length(geometry) > 8000;
;
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen3 AS CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen3 AS
SELECT * FROM osm_important_waterway_linestring_gen3_view; SELECT *
FROM osm_important_waterway_linestring_gen3_view;
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen3_name_idx ON osm_important_waterway_linestring_gen3 (name); CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen3_name_idx ON osm_important_waterway_linestring_gen3 (name);
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen3_geometry_idx ON osm_important_waterway_linestring_gen3 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen3_geometry_idx ON osm_important_waterway_linestring_gen3 USING gist (geometry);
@ -67,73 +76,95 @@ CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen3_geometry_idx O
CREATE SCHEMA IF NOT EXISTS waterway_important; CREATE SCHEMA IF NOT EXISTS waterway_important;
CREATE TABLE IF NOT EXISTS waterway_important.changes( CREATE TABLE IF NOT EXISTS waterway_important.changes
id serial primary key, (
id serial PRIMARY KEY,
is_old boolean, is_old boolean,
name character varying, name character varying,
name_en character varying, name_en character varying,
name_de character varying, name_de character varying,
tags hstore, tags hstore,
unique (is_old, name, name_en, name_de, tags) UNIQUE (is_old, name, name_en, name_de, tags)
); );
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, name, name_en, name_de, tags)
VALUES (true, OLD.name, OLD.name_en, OLD.name_de, slice_language_tags(OLD.tags)) VALUES (TRUE, OLD.name, OLD.name_en, OLD.name_de, slice_language_tags(OLD.tags))
ON CONFLICT(is_old, name, name_en, name_de, tags) DO NOTHING; ON CONFLICT(is_old, name, name_en, name_de, tags) 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, name, name_en, name_de, tags)
VALUES (false, NEW.name, NEW.name_en, NEW.name_de, slice_language_tags(NEW.tags)) VALUES (FALSE, NEW.name, NEW.name_en, NEW.name_de, slice_language_tags(NEW.tags))
ON CONFLICT(is_old, name, name_en, name_de, tags) DO NOTHING; ON CONFLICT(is_old, name, name_en, name_de, tags) DO NOTHING;
END IF; END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS waterway_important.updates(id serial primary key, t text, unique (t)); CREATE TABLE IF NOT EXISTS waterway_important.updates
CREATE OR REPLACE FUNCTION waterway_important.flag() RETURNS trigger AS $$ (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION waterway_important.flag() RETURNS trigger AS
$$
BEGIN BEGIN
INSERT INTO waterway_important.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO waterway_important.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN null; RETURN NULL;
END; END;
$$ language plpgsql; $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION waterway_important.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION waterway_important.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
RAISE LOG 'Refresh waterway'; RAISE LOG 'Refresh waterway';
-- REFRESH osm_important_waterway_linestring -- REFRESH osm_important_waterway_linestring
DELETE FROM osm_important_waterway_linestring AS w DELETE
FROM osm_important_waterway_linestring AS w
USING waterway_important.changes AS c USING waterway_important.changes AS c
WHERE WHERE c.is_old
c.is_old AND AND w.name = c.name
w.name = c.name AND w.name_en IS NOT DISTINCT FROM c.name_en AND w.name_de IS NOT DISTINCT FROM c.name_de AND w.tags IS NOT DISTINCT FROM c.tags; AND w.name_en IS NOT DISTINCT FROM c.name_en
AND w.name_de IS NOT DISTINCT FROM c.name_de
AND w.tags IS NOT DISTINCT FROM c.tags;
INSERT INTO osm_important_waterway_linestring INSERT INTO osm_important_waterway_linestring
SELECT SELECT (ST_Dump(geometry)).geom AS geometry,
(ST_Dump(geometry)).geom AS geometry, name,
name, name_en, name_de, tags name_en,
name_de,
tags
FROM ( FROM (
SELECT SELECT ST_LineMerge(ST_Union(geometry)) AS geometry,
ST_LineMerge(ST_Union(geometry)) AS geometry, w.name,
w.name, w.name_en, w.name_de, slice_language_tags(w.tags) AS tags w.name_en,
w.name_de,
slice_language_tags(w.tags) AS tags
FROM osm_waterway_linestring AS w FROM osm_waterway_linestring AS w
JOIN waterway_important.changes AS c ON JOIN waterway_important.changes AS c ON
w.name = c.name AND w.name_en IS NOT DISTINCT FROM c.name_en AND w.name_de IS NOT DISTINCT FROM c.name_de AND slice_language_tags(w.tags) IS NOT DISTINCT FROM c.tags w.name = c.name AND w.name_en IS NOT DISTINCT FROM c.name_en AND
WHERE w.name <> '' AND w.waterway = 'river' AND ST_IsValid(geometry) AND w.name_de IS NOT DISTINCT FROM c.name_de AND
NOT c.is_old slice_language_tags(w.tags) IS NOT DISTINCT FROM c.tags
WHERE w.name <> ''
AND w.waterway = 'river'
AND ST_IsValid(geometry)
AND NOT c.is_old
GROUP BY w.name, w.name_en, w.name_de, slice_language_tags(w.tags) GROUP BY w.name, w.name_en, w.name_de, slice_language_tags(w.tags)
) AS waterway_union; ) AS waterway_union;
-- REFRESH sm_important_waterway_linestring_gen1 -- REFRESH sm_important_waterway_linestring_gen1
DELETE FROM osm_important_waterway_linestring_gen1 AS w DELETE
FROM osm_important_waterway_linestring_gen1 AS w
USING waterway_important.changes AS c USING waterway_important.changes AS c
WHERE WHERE c.is_old
c.is_old AND AND w.name = c.name
w.name = c.name AND w.name_en IS NOT DISTINCT FROM c.name_en AND w.name_de IS NOT DISTINCT FROM c.name_de AND w.tags IS NOT DISTINCT FROM c.tags; AND w.name_en IS NOT DISTINCT FROM c.name_en
AND w.name_de IS NOT DISTINCT FROM c.name_de
AND w.tags IS NOT DISTINCT FROM c.tags;
INSERT INTO osm_important_waterway_linestring_gen1 INSERT INTO osm_important_waterway_linestring_gen1
SELECT w.* SELECT w.*
@ -142,11 +173,14 @@ CREATE OR REPLACE FUNCTION waterway_important.refresh() RETURNS trigger AS
WHERE NOT c.is_old; WHERE NOT c.is_old;
-- REFRESH osm_important_waterway_linestring_gen2 -- REFRESH osm_important_waterway_linestring_gen2
DELETE FROM osm_important_waterway_linestring_gen2 AS w DELETE
FROM osm_important_waterway_linestring_gen2 AS w
USING waterway_important.changes AS c USING waterway_important.changes AS c
WHERE WHERE c.is_old
c.is_old AND AND w.name = c.name
w.name = c.name AND w.name_en IS NOT DISTINCT FROM c.name_en AND w.name_de IS NOT DISTINCT FROM c.name_de AND w.tags IS NOT DISTINCT FROM c.tags; AND w.name_en IS NOT DISTINCT FROM c.name_en
AND w.name_de IS NOT DISTINCT FROM c.name_de
AND w.tags IS NOT DISTINCT FROM c.tags;
INSERT INTO osm_important_waterway_linestring_gen2 INSERT INTO osm_important_waterway_linestring_gen2
SELECT w.* SELECT w.*
@ -155,11 +189,14 @@ CREATE OR REPLACE FUNCTION waterway_important.refresh() RETURNS trigger AS
WHERE NOT c.is_old; WHERE NOT c.is_old;
-- REFRESH osm_important_waterway_linestring_gen3 -- REFRESH osm_important_waterway_linestring_gen3
DELETE FROM osm_important_waterway_linestring_gen3 AS w DELETE
FROM osm_important_waterway_linestring_gen3 AS w
USING waterway_important.changes AS c USING waterway_important.changes AS c
WHERE WHERE c.is_old
c.is_old AND AND w.name = c.name
w.name = c.name AND w.name_en IS NOT DISTINCT FROM c.name_en AND w.name_de IS NOT DISTINCT FROM c.name_de AND w.tags IS NOT DISTINCT FROM c.tags; AND w.name_en IS NOT DISTINCT FROM c.name_en
AND w.name_de IS NOT DISTINCT FROM c.name_de
AND w.tags IS NOT DISTINCT FROM c.tags;
INSERT INTO osm_important_waterway_linestring_gen3 INSERT INTO osm_important_waterway_linestring_gen3
SELECT w.* SELECT w.*
@ -167,25 +204,30 @@ CREATE OR REPLACE FUNCTION waterway_important.refresh() RETURNS trigger AS
NATURAL JOIN waterway_important.changes AS c NATURAL JOIN waterway_important.changes AS c
WHERE NOT c.is_old; WHERE NOT c.is_old;
-- noinspection SqlWithoutWhere
DELETE FROM waterway_important.changes; DELETE FROM waterway_important.changes;
-- noinspection SqlWithoutWhere
DELETE FROM waterway_important.updates; DELETE FROM waterway_important.updates;
RETURN null;
RETURN NULL;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_store CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE ON osm_waterway_linestring AFTER INSERT OR UPDATE OR DELETE
ON osm_waterway_linestring
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE waterway_important.store(); EXECUTE PROCEDURE waterway_important.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE ON osm_waterway_linestring AFTER INSERT OR UPDATE OR DELETE
ON osm_waterway_linestring
FOR EACH STATEMENT FOR EACH STATEMENT
EXECUTE PROCEDURE waterway_important.flag(); EXECUTE PROCEDURE waterway_important.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT ON waterway_important.updates AFTER INSERT
ON waterway_important.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE waterway_important.refresh(); EXECUTE PROCEDURE waterway_important.refresh();

View File

@ -1,36 +1,38 @@
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 osm_waterway_linestring; DROP TRIGGER IF EXISTS trigger_refresh ON osm_waterway_linestring;
DO $$ DO
$$
BEGIN BEGIN
update osm_waterway_linestring UPDATE osm_waterway_linestring
SET tags = update_tags(tags, geometry); SET tags = update_tags(tags, geometry);
update osm_waterway_linestring_gen1 UPDATE osm_waterway_linestring_gen1
SET tags = update_tags(tags, geometry); SET tags = update_tags(tags, geometry);
update osm_waterway_linestring_gen2 UPDATE osm_waterway_linestring_gen2
SET tags = update_tags(tags, geometry); SET tags = update_tags(tags, geometry);
update osm_waterway_linestring_gen3 UPDATE osm_waterway_linestring_gen3
SET tags = update_tags(tags, geometry); SET tags = update_tags(tags, geometry);
END $$; END
$$;
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS waterway_linestring; CREATE SCHEMA IF NOT EXISTS waterway_linestring;
CREATE OR REPLACE FUNCTION waterway_linestring.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION waterway_linestring.refresh() RETURNS trigger AS
$BODY$ $$
BEGIN BEGIN
-- RAISE NOTICE 'Refresh waterway_linestring %', NEW.osm_id; -- RAISE NOTICE 'Refresh waterway_linestring %', NEW.osm_id;
NEW.tags = update_tags(NEW.tags, NEW.geometry); NEW.tags = update_tags(NEW.tags, NEW.geometry);
RETURN NEW; RETURN NEW;
END; END;
$BODY$ $$ LANGUAGE plpgsql;
language plpgsql;
CREATE TRIGGER trigger_refresh CREATE TRIGGER trigger_refresh
BEFORE INSERT OR UPDATE ON osm_waterway_linestring BEFORE INSERT OR UPDATE
ON osm_waterway_linestring
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE waterway_linestring.refresh(); EXECUTE PROCEDURE waterway_linestring.refresh();

View File

@ -1,68 +1,150 @@
CREATE OR REPLACE FUNCTION waterway_brunnel(is_bridge BOOL, is_tunnel BOOL) RETURNS TEXT AS $$ CREATE OR REPLACE FUNCTION waterway_brunnel(is_bridge bool, is_tunnel bool) RETURNS text AS
$$
SELECT CASE SELECT CASE
WHEN is_bridge THEN 'bridge' WHEN is_bridge THEN 'bridge'
WHEN is_tunnel THEN 'tunnel' WHEN is_tunnel THEN 'tunnel'
END; END;
$$ $$ LANGUAGE SQL IMMUTABLE
LANGUAGE SQL STRICT
IMMUTABLE STRICT PARALLEL SAFE; PARALLEL SAFE;
-- etldoc: ne_110m_rivers_lake_centerlines -> waterway_z3 -- etldoc: ne_110m_rivers_lake_centerlines -> waterway_z3
CREATE OR REPLACE VIEW waterway_z3 AS ( CREATE OR REPLACE VIEW waterway_z3 AS
SELECT geometry, 'river'::text AS class, NULL::text AS name, NULL::text AS name_en, NULL::text AS name_de, NULL::hstore AS tags, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_intermittent (
SELECT geometry,
'river'::text AS class,
NULL::text AS name,
NULL::text AS name_en,
NULL::text AS name_de,
NULL::hstore AS tags,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent
FROM ne_110m_rivers_lake_centerlines FROM ne_110m_rivers_lake_centerlines
WHERE featurecla = 'River' WHERE featurecla = 'River'
); );
-- etldoc: ne_50m_rivers_lake_centerlines -> waterway_z4 -- etldoc: ne_50m_rivers_lake_centerlines -> waterway_z4
CREATE OR REPLACE VIEW waterway_z4 AS ( CREATE OR REPLACE VIEW waterway_z4 AS
SELECT geometry, 'river'::text AS class, NULL::text AS name, NULL::text AS name_en, NULL::text AS name_de, NULL::hstore AS tags, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_intermittent (
SELECT geometry,
'river'::text AS class,
NULL::text AS name,
NULL::text AS name_en,
NULL::text AS name_de,
NULL::hstore AS tags,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent
FROM ne_50m_rivers_lake_centerlines FROM ne_50m_rivers_lake_centerlines
WHERE featurecla = 'River' WHERE featurecla = 'River'
); );
-- etldoc: ne_10m_rivers_lake_centerlines -> waterway_z6 -- etldoc: ne_10m_rivers_lake_centerlines -> waterway_z6
CREATE OR REPLACE VIEW waterway_z6 AS ( CREATE OR REPLACE VIEW waterway_z6 AS
SELECT geometry, 'river'::text AS class, NULL::text AS name, NULL::text AS name_en, NULL::text AS name_de, NULL::hstore AS tags, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_intermittent (
SELECT geometry,
'river'::text AS class,
NULL::text AS name,
NULL::text AS name_en,
NULL::text AS name_de,
NULL::hstore AS tags,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent
FROM ne_10m_rivers_lake_centerlines FROM ne_10m_rivers_lake_centerlines
WHERE featurecla = 'River' WHERE featurecla = 'River'
); );
-- etldoc: osm_important_waterway_linestring_gen3 -> waterway_z9 -- etldoc: osm_important_waterway_linestring_gen3 -> waterway_z9
CREATE OR REPLACE VIEW waterway_z9 AS ( CREATE OR REPLACE VIEW waterway_z9 AS
SELECT geometry, 'river'::text AS class, name, name_en, name_de, tags, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_intermittent (
SELECT geometry,
'river'::text AS class,
name,
name_en,
name_de,
tags,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent
FROM osm_important_waterway_linestring_gen3 FROM osm_important_waterway_linestring_gen3
); );
-- etldoc: osm_important_waterway_linestring_gen2 -> waterway_z10 -- etldoc: osm_important_waterway_linestring_gen2 -> waterway_z10
CREATE OR REPLACE VIEW waterway_z10 AS ( CREATE OR REPLACE VIEW waterway_z10 AS
SELECT geometry, 'river'::text AS class, name, name_en, name_de, tags, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_intermittent (
SELECT geometry,
'river'::text AS class,
name,
name_en,
name_de,
tags,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent
FROM osm_important_waterway_linestring_gen2 FROM osm_important_waterway_linestring_gen2
); );
-- etldoc:osm_important_waterway_linestring_gen1 -> waterway_z11 -- etldoc:osm_important_waterway_linestring_gen1 -> waterway_z11
CREATE OR REPLACE VIEW waterway_z11 AS ( CREATE OR REPLACE VIEW waterway_z11 AS
SELECT geometry, 'river'::text AS class, name, name_en, name_de, tags, NULL::boolean AS is_bridge, NULL::boolean AS is_tunnel, NULL::boolean AS is_intermittent (
SELECT geometry,
'river'::text AS class,
name,
name_en,
name_de,
tags,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent
FROM osm_important_waterway_linestring_gen1 FROM osm_important_waterway_linestring_gen1
); );
-- etldoc: osm_waterway_linestring -> waterway_z12 -- etldoc: osm_waterway_linestring -> waterway_z12
CREATE OR REPLACE VIEW waterway_z12 AS ( CREATE OR REPLACE VIEW waterway_z12 AS
SELECT geometry, waterway::text AS class, name, name_en, name_de, tags, is_bridge, is_tunnel, is_intermittent (
SELECT geometry,
waterway::text AS class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM osm_waterway_linestring FROM osm_waterway_linestring
WHERE waterway IN ('river', 'canal') WHERE waterway IN ('river', 'canal')
); );
-- etldoc: osm_waterway_linestring -> waterway_z13 -- etldoc: osm_waterway_linestring -> waterway_z13
CREATE OR REPLACE VIEW waterway_z13 AS ( CREATE OR REPLACE VIEW waterway_z13 AS
SELECT geometry, waterway::text AS class, name, name_en, name_de, tags, is_bridge, is_tunnel, is_intermittent (
SELECT geometry,
waterway::text AS class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM osm_waterway_linestring FROM osm_waterway_linestring
WHERE waterway IN ('river', 'canal', 'stream', 'drain', 'ditch') WHERE waterway IN ('river', 'canal', 'stream', 'drain', 'ditch')
); );
-- etldoc: osm_waterway_linestring -> waterway_z14 -- etldoc: osm_waterway_linestring -> waterway_z14
CREATE OR REPLACE VIEW waterway_z14 AS ( CREATE OR REPLACE VIEW waterway_z14 AS
SELECT geometry, waterway::text AS class, name, name_en, name_de, tags, is_bridge, is_tunnel, is_intermittent (
SELECT geometry,
waterway::text AS class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM osm_waterway_linestring FROM osm_waterway_linestring
); );
@ -70,8 +152,21 @@ CREATE OR REPLACE VIEW waterway_z14 AS (
-- etldoc: label="layer_waterway | <z3> z3 |<z4_5> z4-z5 |<z6_8> z6-8 | <z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14> z14+" ]; -- etldoc: label="layer_waterway | <z3> z3 |<z4_5> z4-z5 |<z6_8> z6-8 | <z9> z9 |<z10> z10 |<z11> z11 |<z12> z12|<z13> z13|<z14> z14+" ];
CREATE OR REPLACE FUNCTION layer_waterway(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_waterway(bbox geometry, zoom_level int)
RETURNS TABLE(geometry geometry, class text, name text, name_en text, name_de text, brunnel text, intermittent int, tags hstore) AS $$ RETURNS TABLE
SELECT geometry, class, (
geometry geometry,
class text,
name text,
name_en text,
name_de text,
brunnel text,
intermittent int,
tags hstore
)
AS
$$
SELECT geometry,
class,
NULLIF(name, '') AS name, NULLIF(name, '') AS name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(NULLIF(name_en, ''), name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de,
@ -80,33 +175,51 @@ RETURNS TABLE(geometry geometry, class text, name text, name_en text, name_de te
tags tags
FROM ( FROM (
-- etldoc: waterway_z3 -> layer_waterway:z3 -- etldoc: waterway_z3 -> layer_waterway:z3
SELECT * FROM waterway_z3 WHERE zoom_level = 3 SELECT *
FROM waterway_z3
WHERE zoom_level = 3
UNION ALL UNION ALL
-- etldoc: waterway_z4 -> layer_waterway:z4_5 -- etldoc: waterway_z4 -> layer_waterway:z4_5
SELECT * FROM waterway_z4 WHERE zoom_level BETWEEN 4 AND 5 SELECT *
FROM waterway_z4
WHERE zoom_level BETWEEN 4 AND 5
UNION ALL UNION ALL
-- etldoc: waterway_z6 -> layer_waterway:z6_8 -- etldoc: waterway_z6 -> layer_waterway:z6_8
SELECT * FROM waterway_z6 WHERE zoom_level BETWEEN 6 AND 8 SELECT *
FROM waterway_z6
WHERE zoom_level BETWEEN 6 AND 8
UNION ALL UNION ALL
-- etldoc: waterway_z9 -> layer_waterway:z9 -- etldoc: waterway_z9 -> layer_waterway:z9
SELECT * FROM waterway_z9 WHERE zoom_level = 9 SELECT *
FROM waterway_z9
WHERE zoom_level = 9
UNION ALL UNION ALL
-- etldoc: waterway_z10 -> layer_waterway:z10 -- etldoc: waterway_z10 -> layer_waterway:z10
SELECT * FROM waterway_z10 WHERE zoom_level = 10 SELECT *
FROM waterway_z10
WHERE zoom_level = 10
UNION ALL UNION ALL
-- etldoc: waterway_z11 -> layer_waterway:z11 -- etldoc: waterway_z11 -> layer_waterway:z11
SELECT * FROM waterway_z11 WHERE zoom_level = 11 SELECT *
FROM waterway_z11
WHERE zoom_level = 11
UNION ALL UNION ALL
-- etldoc: waterway_z12 -> layer_waterway:z12 -- etldoc: waterway_z12 -> layer_waterway:z12
SELECT * FROM waterway_z12 WHERE zoom_level = 12 SELECT *
FROM waterway_z12
WHERE zoom_level = 12
UNION ALL UNION ALL
-- etldoc: waterway_z13 -> layer_waterway:z13 -- etldoc: waterway_z13 -> layer_waterway:z13
SELECT * FROM waterway_z13 WHERE zoom_level = 13 SELECT *
FROM waterway_z13
WHERE zoom_level = 13
UNION ALL UNION ALL
-- etldoc: waterway_z14 -> layer_waterway:z14 -- etldoc: waterway_z14 -> layer_waterway:z14
SELECT * FROM waterway_z14 WHERE zoom_level >= 14 SELECT *
FROM waterway_z14
WHERE zoom_level >= 14
) AS zoom_levels ) AS zoom_levels
WHERE geometry && bbox; WHERE geometry && bbox;
$$ $$ LANGUAGE SQL STABLE
LANGUAGE SQL -- STRICT
IMMUTABLE PARALLEL SAFE; PARALLEL SAFE;

View File

@ -33,7 +33,7 @@ set -o nounset
# ./quickstart.sh Adelaide bbbike # ./quickstart.sh Adelaide bbbike
# .... # ....
# #
# to list geofabrik areas: make download-geofabrik-list # to list geofabrik areas: make list-geofabrik or make list-bbbike
# see more QUICKSTART.md # see more QUICKSTART.md
# #
@ -46,32 +46,22 @@ else
fi fi
if [ $# -eq 0 ]; then if [ $# -eq 0 ]; then
osm_area=albania # default test country # default test area
echo "No parameter - set area=$osm_area " export area=albania
echo "No parameter - set area=$area "
else else
osm_area=$1 export area=$1
fi fi
if [ $# -eq 2 ]; then if [ $# -eq 2 ]; then
osm_server=$2 osm_server=$2
else
if [[ ${osm_area} == [[:upper:]]* ]]; then
# Only bbbike area names are capitalized
osm_server=bbbike
else
# default OSM server
osm_server=geofabrik
fi fi
fi
pbf_file="./data/${osm_area##*/}-latest.osm.pbf"
## Min versions ... ## Min versions ...
MIN_COMPOSE_VER=1.7.1 MIN_COMPOSE_VER=1.7.1
MIN_DOCKER_VER=1.12.3 MIN_DOCKER_VER=1.12.3
STARTTIME=$(date +%s) STARTTIME=$(date +%s)
STARTDATE=$(date +"%Y-%m-%dT%H:%M%z") STARTDATE=$(date +"%Y-%m-%dT%H:%M%z")
githash=$( git rev-parse HEAD )
log_file=./quickstart.log log_file=./quickstart.log
rm -f $log_file rm -f $log_file
@ -118,10 +108,10 @@ echo " Start processing
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : OpenMapTiles quickstart! [ https://github.com/openmaptiles/openmaptiles ] " echo "====> : OpenMapTiles quickstart! [ https://github.com/openmaptiles/openmaptiles ] "
echo " : This will be logged to the $log_file file (for debugging) and to the screen" echo " : This will be logged to the $log_file file (for debugging) and to the screen"
echo " : Area : $osm_area " echo " : Area : $area "
echo " : Download Server : $osm_server " echo " : Download Server : ${osm_server:-unset (automatic)} "
echo " : Preloaded Image : $USE_PRELOADED_IMAGE " echo " : Preloaded Image : $USE_PRELOADED_IMAGE "
echo " : Git version : $githash " echo " : Git version : $(git rev-parse HEAD) "
echo " : Started : $STARTDATE " echo " : Started : $STARTDATE "
echo " : Your bash version: $BASH_VERSION" echo " : Your bash version: $BASH_VERSION"
echo " : Your OS : $OSTYPE" echo " : Your OS : $OSTYPE"
@ -169,27 +159,13 @@ make init-dirs
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : Removing old MBTILES if exists ( ./data/*.mbtiles ) " echo "====> : Removing old MBTILES if exists ( ./data/${area}.mbtiles ) "
rm -f ./data/*.mbtiles rm -f "./data/${area}.mbtiles"
if [[ ! -f "${pbf_file}" || ! -f "./data/docker-compose-config.yml" ]]; then
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : Downloading ${osm_area} from ${osm_server}..." echo "====> : Downloading ${area} from ${osm_server:-any source}..."
rm -rf ./data/* make "download${osm_server:+-${osm_server}}"
make download-${osm_server} "area=${osm_area}"
else
echo " "
echo "-------------------------------------------------------------------------------------"
echo "====> : The pbf file $pbf_file exists, we don't need to download!"
fi
if [ ! -f "${pbf_file}" ]; then
echo " "
echo "Missing $pbf_file , Download or Parameter error? "
exit 1
fi
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
@ -244,17 +220,17 @@ fi
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : Start importing OpenStreetMap data: ${pbf_file} -> imposm3[./build/mapping.yaml] -> PostgreSQL" echo "====> : Start importing OpenStreetMap data: ${area} -> imposm3[./build/mapping.yaml] -> PostgreSQL"
echo " : Imposm3 documentation: https://imposm.org/docs/imposm3/latest/index.html " echo " : Imposm3 documentation: https://imposm.org/docs/imposm3/latest/index.html "
echo " : Thank you Omniscale! " echo " : Thank you Omniscale! "
echo " : Source code: https://github.com/openmaptiles/openmaptiles-tools/tree/master/docker/import-osm " echo " : Source code: https://github.com/openmaptiles/openmaptiles-tools/tree/master/docker/import-osm "
echo " : The OpenstreetMap data license: https://www.openstreetmap.org/copyright (ODBL) " echo " : The OpenstreetMap data license: https://www.openstreetmap.org/copyright (ODBL) "
echo " : Thank you OpenStreetMap Contributors ! " echo " : Thank you OpenStreetMap Contributors ! "
make import-osm "PBF_FILE=${pbf_file}" make import-osm
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : Start importing border data from ${pbf_file} into PostgreSQL using osmborder" echo "====> : Start importing border ${area} data into PostgreSQL using osmborder"
echo " : Source code: https://github.com/pnorman/osmborder" echo " : Source code: https://github.com/pnorman/osmborder"
echo " : Data license: http://www.openstreetmap.org/copyright" echo " : Data license: http://www.openstreetmap.org/copyright"
echo " : Thank you: Paul Norman" echo " : Thank you: Paul Norman"
@ -285,11 +261,20 @@ echo "--------------------------------------------------------------------------
echo "====> : Testing PostgreSQL tables to match layer definitions metadata" echo "====> : Testing PostgreSQL tables to match layer definitions metadata"
make test-perf-null make test-perf-null
echo " "
echo "-------------------------------------------------------------------------------------"
if [[ "$area" != "planet" ]]; then
echo "====> : Compute bounding box for tile generation"
make generate-dc-config
else
echo "====> : Skipping bbox calculation when generating the entire planet"
fi
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : Start generating MBTiles (containing gzipped MVT PBF) from a TM2Source project. " echo "====> : Start generating MBTiles (containing gzipped MVT PBF) from a TM2Source project. "
echo " : TM2Source project definitions : ./build/openmaptiles.tm2source/data.yml " echo " : TM2Source project definitions : ./build/openmaptiles.tm2source/data.yml "
echo " : Output MBTiles: ./data/tiles.mbtiles " echo " : Output MBTiles: ./data/${area}.mbtiles "
echo " : Source code: https://github.com/openmaptiles/openmaptiles-tools/tree/master/docker/generate-vectortiles " echo " : Source code: https://github.com/openmaptiles/openmaptiles-tools/tree/master/docker/generate-vectortiles "
echo " : We are using a lot of Mapbox Open Source tools! : https://github.com/mapbox " echo " : We are using a lot of Mapbox Open Source tools! : https://github.com/mapbox "
echo " : Thank you https://www.mapbox.com !" echo " : Thank you https://www.mapbox.com !"
@ -304,27 +289,17 @@ echo "--------------------------------------------------------------------------
echo "====> : Stop PostgreSQL service ( but we keep PostgreSQL data volume for debugging )" echo "====> : Stop PostgreSQL service ( but we keep PostgreSQL data volume for debugging )"
make stop-db make stop-db
echo " "
echo "-------------------------------------------------------------------------------------"
echo "====> : Show generated metadata"
make show-metadata
echo " " echo " "
echo "-------------------------------------------------------------------------------------" 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 -type f | sort | xargs md5sum
find data -type f | sort | xargs md5sum ; 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
ENDTIME=$(date +%s) ENDTIME=$(date +%s)
if stat --help >/dev/null 2>&1; then
MODDATE=$(stat -c %y "${pbf_file}" )
else
MODDATE=$(stat -f%Sm -t '%F %T %z' "${pbf_file}" )
fi
echo " " echo " "
echo " " echo " "
@ -339,15 +314,14 @@ docker images | grep openmaptiles
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "====> : (disk space) We have created the new vectortiles ( ./data/tiles.mbtiles ) " echo "====> : (disk space) We have created the new vectortiles ( ./data/${area}.mbtiles ) "
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 " : Created from $pbf_file ( file moddate: $MODDATE ) " echo " : Data directory content:"
echo " : Size: " ls -la ./data
ls -la ./data/*.mbtiles
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "The ./quickstart.sh $osm_area is finished! " echo "The ./quickstart.sh $area is finished! "
echo "It takes $((ENDTIME - STARTTIME)) seconds to complete" echo "It takes $((ENDTIME - STARTTIME)) seconds to complete"
echo "We saved the log file to $log_file ( for debugging ) You can compare with the travis log !" echo "We saved the log file to $log_file ( for debugging ) You can compare with the travis log !"
echo " " echo " "