Compare commits

...

83 Commits

Author SHA1 Message Date
2a39e1ebfe Merge branch 'master' into gh-master
# Conflicts:
#	Makefile
#	layers/landuse/landuse.sql
#	layers/poi/poi.sql
2021-04-24 22:47:18 +02:00
Jeremias Volker
76d5d753d8
Fix own OSM instructions (#1101)
Before it was throwing `ERROR:  make generate-bbox-file area=<area-id>` and `Area source has not been specified. Auto-detecting...
ID 'my' was not found in Geofabrik.` `make: *** [download] Error 1`

* Use more meaningful area name

* rename user data example

Co-authored-by: Tomas Pohanka <TomPohys@gmail.com>
2021-04-20 14:59:43 +02:00
Eva Jelinkova
f4a1a2537a
Water - add ogc_fid for NE sources, edit etldoc (#1098)
1) Adding ogc_fid column into materialized views of NE lakes (for having option to filter or compare)
2) Edit bug in etldoc

* add ogc_fid for NE sources, edit etldoc

* etl_diagram update
2021-04-12 12:09:45 +02:00
Rémy Léone
231a1d192c
update docker-compose version (#1091)
update docker-compose version from 2.3 to 3
2021-04-09 13:42:58 +02:00
Yuri Astrakhan
1f6eb7b4a3
Improve logging - show BBOX if exists (#1096)
The generate-bbox target will now show the value of BBOX if it is already generated.
2021-03-30 21:02:34 +02:00
Rémy Léone
d5480d2369
Update naming convention for networks (#1093)
* Update naming convention for networks

* move to postgres
2021-03-30 08:46:42 +02:00
zstadler
2943e9dc8d
Avoid grep errors in clean-unnecessary-docker (#1089)
When `make clean-unnecessary-docker` is run twice, or when there are no docker images tagges as "<none>", make fails because grep fails:

```
Deleting unnecessary container(s)...
Deleting unnecessary image(s)...
make: *** [Makefile:562: clean-unnecessary-docker] Error 1
```

Using `awk` to _also_ search for "<none>", instead of `grep`, solves this issue.
2021-03-16 17:20:25 +01:00
Tomas Pohanka
fadc4a3ba6
Explicit mention for using iso_a2 attribute. (#1073)
Resolve #939
2021-03-16 11:21:25 +01:00
Tomas Pohanka
bf9e6a19cd
osm_route_member bugfix (#1088)
`!=` is not handling `NULL` values.

Then all networks are `road` and not e.g. `us-interstate` or `ca-transcanada`.
2021-03-16 10:55:26 +01:00
Frédéric Rodrigo
50d569dfee
Remove useless indices on osm_transportation_merge_linestring_genX (#1079)
On creation of materialized views `osm_transportation_merge_linestring_gen_zX`, an index is created each time the new view and not used else where than the next generalization step.
It does not worth it to to a scan on the table to create index that will be used only once, while the next generalisation step can also be done in one full scan.
So, removing these indices.
2021-03-05 09:42:27 +01:00
Adam Laža
d69ae015ad
Mount /export dir in docker-compose.yaml (#1071)
Mount /export dir in docker-compose.yaml
This PR allows `using make generate-tiles-pg` without editing `.env`.
Resolves #1070
Related to PR #1069
2021-02-05 14:58:42 +01:00
Jeroen Hoek
295688eb80
Add place=quarter to city subdivisions (#1065)
This adds `place=quarter` which was introduced in 2011 as a subdivision
of villages/towns/cities as a value that sits between `place=suburb` and
`place=neighbourhood`. It has by now been used over 40,000 times and is
rendered in the OSM-Carto.
2021-01-18 14:47:25 +01:00
Adam Laža
c4c3089f40
Update openmaptiles.yaml - set center to 0,0,1 (#1063) 2021-01-14 18:13:00 +01:00
Adam Laža
4b26c63574
Upgrade version to 3.12.1 (#1062)
* Release 3.12 prerequisite

* Upgrade version.

Co-authored-by: Tomáš <tompohys@gmail.com>
2021-01-14 17:21:43 +01:00
tilmanb
077ec78f63
typo and spelling fixes in the output (#1060)
This simply fixes some spelling and/or grammar errors in the quickstart script output
2021-01-10 16:55:52 +01:00
Adam Laža
461043960e
Bugfix landcover osm (#1061)
* Release 3.12 prerequisite

* Add missing osm_id column to osm_landcover_polygon

Co-authored-by: Tomáš <tompohys@gmail.com>
2021-01-08 15:44:11 +01:00
Sergii Golubev
2aa9630b41
add forgotten 'garages' landuse to the docs (#1059)
In https://github.com/openmaptiles/openmaptiles/pull/720 I've forgotten to add the `garages` class to the docs. This PR is fixing that issue,
2020-12-29 14:26:14 +02:00
Tomas Pohanka
485eb6892c
Release 3.12 prerequisite (#1056) 2020-12-16 14:38:58 +02:00
Adam Laža
5772e61244
Bugfix in osm_landcover_gen_z10. (#1054)
Add missing `NOT` in WHERE condition.
It causes there are duplicated features of subclass `wood` and `forest` and features of other subclasses are missing.
2020-12-14 12:47:45 +02:00
Adam Laža
512b3435ad
Bugfix update_aerodrome_label_point() (#1051)
Bug introduced in #944.
Missing exclamation mark in not equal operator caused that tags were not updated thus there were missing `name_int`, `name:latin` and `name:nonlatin`.
2020-12-08 17:27:12 +02:00
Dalibor Janák
b2b8716840
Update links in readme (#1050)
Updated not existing links to openmaptiles.com.
2020-12-08 16:57:40 +02:00
Taro Matsuzawa aka. btm
924558d7d9
Enable pgquery (#1048)
I try to use pgquery, it needs some configuration in .env file.
I think if we use pgquery instead of mapnik, the performace will be good.
2020-12-08 15:56:01 +02:00
Andrii Korzh
01d53a26c6
Fix detected area filename (#1049)
User can be confused that script detected non existing file.
2020-12-07 17:30:16 +02:00
Adam Laža
77f5d76e37
Refactor schema, one _gen_z view per zoom. (#1045)
* Refactor layer aeroway.

* Refactor layer boundary.

* Refactor layer landcover.

* Refactor layer landuse.

* Refactor layer park.

* Refactor layer transportation.

* Refactor layer water.

* Refactor layer waterway.

* Re-generate water* layers etl_diagrams.

* Regenerate etl_diagrams for waterway.

* Cast NULL to text.
2020-11-26 13:54:00 +01:00
Tomas Pohanka
0c6fe2d9ba
Building aggregation fix (#1044)
This PR solving the speed and memory issue with buildings aggregation on zoom level 13. The problem was to create ST_ClusterDBScan which failed after try to cluster a larger area. Now it will make cluster only in "small" polygon using 'country_osm_grid` which covers the world's lands. 

This PR solving #1022 and #974
2020-11-24 12:27:06 +02:00
Tomas Pohanka
24b9328a5f
Remove unused generalization from waterway (#1043)
During the import-osm step, there are three generalized tables for the waterway that are not used for subsequent processing.
Thanks @lazaa32 for the notice.
2020-11-24 11:30:00 +02:00
Adam Laža
da689f9e42
Fix landcover generalization. (#1042)
This PR brings few modification which make it possible to generalize landcover on larger areas. Tested on Europe.

- Use ST_SnapToGrid to avoid ERROR:  GEOSUnaryUnion: TopologyException: found non-noded intersection between LINESTRING.
- Cluster only landcover subclasses: wood and forest.
- Use less generalized tables as a starting point for next step generalization.
2020-11-24 10:33:06 +02:00
Tomas Pohanka
0776cd3eed
README - Rename target for bbox-file by new tool 5.3 (#1040)
Changed in Use 5.3 - new bbox value (#1012)
2020-11-13 14:34:41 +02:00
Tomas Pohanka
3ef364552e
add state name to national borders (#1039)
This PR adds state name to national borders (`admin_level=2`)

From zoom level 3 there is an added `adm0_l` and `adm0_r` attribute for national borders.

There is 3 main steps: 
1) union border lines from OSM and keep separate LineString between intersects
2) create polygons from step 1), create a point in each state polygon, add to this point a state abbreviation from NaturalEarth Data
3) create a short parallel line on the left and right of a small part of the border in 70m distance, and add information about which state overlap this short line.
2020-11-12 12:14:13 +02:00
Tomas Pohanka
d180988f5f
Move "qa" tools from OMT to OMT-T (#1031)
With the new release of OMT-T (5.3) are available tools [`layer-stat`](https://github.com/openmaptiles/openmaptiles-tools/pull/293). 

With the new release of OMT-T can be replaced `make` target `generate-qareports` by `generate-qa`

Used as:
```
make generate-qa STAT_FUNCTION=frequency LAYER=transportation ATTRIBUTE=class
```
2020-11-12 11:23:06 +02:00
Eva Jelinkova
0aa6648bd9
adding brunnel into z<9 (#1038)
Following https://github.com/openmaptiles/openmaptiles/pull/1027, solving https://github.com/openmaptiles/openmaptiles/issues/999.

Adding brunnel attributes to merge tables of `transportation` layer, now it is possible to style/filter tunnels, bridges and fords in all zoom levels. Tested on Switzerland and Europe. Changes in generation speed and filesize minimal.
2020-11-11 15:37:09 +02:00
Tomas Pohanka
4a1b0afa26
reworked landcover layer (#1035)
Instead of using [Douglas-Peucker algorithm](https://postgis.net/docs/ST_SimplifyPreserveTopology.html) which is using for generalized tables [imposm](https://imposm.org/docs/imposm3/latest/mapping.html#generalized-tables) it is used [Visvalingam-Whyatt algorithm](https://postgis.net/docs/ST_SimplifyVW.html).

Solution:
remove imposm generalized tables (during `import-osm`) and create generalization in `import-sql` step for zooms 7-14. Zooms 0-6 are from Natural Earth data.

Upper zoom levels (7 and 8) are ok to merge with no big impact on creation speed. In Canada from z9 it took too long. Between zoom levels 10 - 13 there can be union polygons with less than 300 edge points (empirical number based on a test on Canada forest, can be discussed). Polygons with more than 300 edge points are just simplified. Zoom 14 is from the original dataset `osm_landcover_polygon`.

There is also removed `osm_id` which is never used and not passed into vector tiles.
2020-11-11 15:11:48 +02:00
Adam Laža
0dc8c3256c
Rename generic layer.sql to actual_layer_name .sql (#1034)
Following layers had generic `layer.sql` name.

- `aerodrome_label`
- `aeroway`
- `housenumber`
- `mountain_peak`
- `park`
- `place`
- `poi`
- `transportation`
- `transportation_name`
- `water_name`

This PR renames `layer.sql` to `aerodrome_label.sql`, `aeroway.sql`...
2020-11-09 11:43:35 +02:00
Eva Jelinkova
a36db48a3e
Revert "#766 remove housenumbers inside polygon and same number (#983)" (#1033)
This reverts commit 1685eaccbd0ab9f8e4b32bcd4f4a20fd502a5d13.
2020-11-04 21:53:15 +01:00
Eva Jelinkova
8ba2e18dea
Revert "Housenumbers - diff update, multipolygons (#990)" (#1032)
This reverts commit f7d7a0ced3279597dba49f530b8668f934757988.
2020-11-04 21:07:09 +01:00
Yuri Astrakhan
97ffabcb49
Use 5.3 - new bbox value (#1012)
Migrate to tools 5.3 and use the new bbox value.

* Use 5.3 - new bbox value
* Return correct bbox for meta-generate
mbtiles-tools meta-generate is now able to use bbox from *.bbox file

Thanks @nyurik
2020-10-26 18:39:49 +02:00
Tomas Pohanka
72af34612a
Add gates to airports (#1029) 2020-10-19 12:24:16 +03:00
zstadler
09b68ed1c2
Allow BBOX to be set in .env file (#1013)
* Allow setting `BBOX` to be set in `.env` file

Currently, the `BBOX` setting in `.env` is ignored for all areas except `planet`.
On the other hand, the `planet` area is an overkill for any `BBOX` setting other than the default - `-180.0,-85.0511,180.0,85.0511`.

With this PR, `quickstart.sh` would not override a modified `BBOX` value in `.env`. 

Also, this provides a way to avoid the pessimistic `BBOX` computation for `osmfr` extracts, as described in https://github.com/openmaptiles/openmaptiles-tools/pull/297#issuecomment-700792702

#### Currently
- If the user does not do anything, `quickstart.sh` and `make generate-tiles` create an `mbtiles` file for the full extent of the data source. This applies to `planet` and other data sources.
- If a user sets the `BBOX` value in `.env` and a `planet` data source is used, `quickstart.sh` and `make generate-tiles` create an `mbtiles` file for the extent set in the `.env` file.
- If a user sets the `BBOX` value in `.env` and a non-`planet` data source is used, it is ignored - `quickstart.sh` and `make generate-tiles` create an `mbtiles` file for the full extent of the data source.

#### Problem statement
While users of a `planet` data source have a simple way to override the default extend of the tile generation, users of other data sources have no simple way of doing that. In fact, for such users the `BBOX` setting in the `.env` file is ignored and therefore misleading.

#### Proposal
- If the user does not do anything, `quickstart.sh` and `make generate-tiles` create an `mbtiles` file for the full extent of the data source. This applies to `planet` and other data sources.
- If a user sets the `BBOX` value in `.env`, `quickstart.sh` and `make generate-tiles` create an `mbtiles` file for the extent set in the `.env` file. This applies to `planet` and other data sources.
2020-10-15 11:38:11 +03:00
Eva Jelinkova
341c4df171
Brunnel changes in transportation and transportation_name layers (#1027)
https://github.com/openmaptiles/openmaptiles/issues/999

- Point 1 solved only partially - there is `brunnel` value added into zooms 9, 10, 11. For zooms 8 and smaller it would need change in osm_transportation_merge_ tables - I am going to try it but maybe its SQL costs will be to high.

- Point 2 solved.
2020-10-14 15:26:43 +03:00
Tomas Pohanka
b7429ce6f5
union ocean regular squares into complex polygon (#1021)
The ocean layer (table osm_ocean_polygon insert by `make import-data`) is made from squares that have a 10m buffer. 

This creates extra geometry in vector tiles as:

Union of full ocean squares should decrease the size of the water layer.

there are 8042 polygons (squares, 5 points, more then 100km<sup>2</sup>), which was reduced to 22 polygons - 1184kB vs 40kB respectively. 

In mbtiles should be the size reduction even more significant, due to the creation of more polygons based on a 10m buffer of each square.
2020-10-14 14:56:04 +03:00
Tomas Pohanka
72165933be
add ST_IsValid where ST_PointOnSurface (#1025)
Same as #1015 for another ST_PointOnSurface
2020-10-13 16:28:20 +03:00
Tomas Pohanka
88c13f713f
Korean and Japanese Latin (#1026)
Korean moved from `ko_rm` to `ko-Latn`. Same as Japanese deprecated `ja_rm` in advance of `ja-Latn`, but still have twice more records. For Japanese add Hiragana form.

fix #537 
listed in #930
2020-10-13 15:52:15 +03:00
Frédéric Rodrigo
cfc243e848
Add protocol to postserve --serve paramter (#1007)
The current option of postserve in the docker-compose produce an invalid tilejson.
```json
"tiles": ["localhost:8090/tiles/{z}/{x}/{y}.pbf"]
```
`tiles` should be URL. The protocol is missing.

Not sure about the best way to fix this. Just adding `http://` to the docker-compose.yaml does not allow https usage. But setting protocol in `OMT_HOST` seems weird.

Could add an extra OMT_PROTOCOL with `http` as default.
2020-10-12 16:45:09 +03:00
Eva Jelinkova
7a7e9326b9
adding ST_IsValid to housnumber geometry (#1015)
Adding check of geometry in layers/housenumber/housenumber_centroid.sql.
2020-10-12 15:05:20 +03:00
Eva Jelinkova
3d21523fbe
aerialway class for the transportation layer (#1011)
Co-authored-by: Tomas Pohanka <TomPohys@gmail.com>
2020-10-12 12:44:33 +02:00
Frédéric Rodrigo
36b7533d3b
Add timers to trigger function (#1006)
Add timer to all trigger refresh functions to help point where the time is spend on update.
2020-10-08 16:57:16 +03:00
zstadler
e8bf4aa94a
Update makefile for hierarchical area names (#1009)
- Use `find` instead of `wildcard` to detect existing `.osm.pbf` files
- Use `patsubst` to extract an `area` from a filename
- Clarify messssage, especially for errors

Resolve https://github.com/openmaptiles/openmaptiles/issues/1008
2020-10-01 08:10:01 +03:00
Frédéric Rodrigo
883a997dcf
Remove large unused index osm_highway_linestring_highway_idx (#1002)
The index `osm_highway_linestring_highway_idx` is not used. There is also a used partial index `osm_highway_linestring_highway_partial_idx`.

I cross check the usage of the index from postgres query stats and all SQL query code where the table `osm_highway_linestring` is refered.

This index is relatively big.
2020-09-30 11:30:18 +03:00
Frédéric Rodrigo
a3ce04fe23
Add landuse=salt_pond as water (#1000)
Add salt pond as water.

Most of salt pond are already tagged with natural=water even if it's not required. So the load added by this tag is very light.
2020-09-29 07:53:35 +03:00
zstadler
424c4ee8a3
Remove workaround for quickstart.sh (#998) 2020-09-28 22:28:34 +03:00
Frédéric Rodrigo
c8f919e9d6
Better update of osm_important_waterway_linestring, use frist and last version of osm object (#997)
Current implementation of osm_important_waterway_linestring have two bugs:
* The distinct on is_old keep the oldest version of the old object, and the oldest version of the new object, but need the last version of the new object.
* Delete the old version of the object and rebuild the using the new version of the object. But we need to remove matchings the old and the new version of the object, then rebuild the two.

Then only delete and update using first and last version of the object, intermediate versions are ignored.

Similar implementation of what is done in #996.
2020-09-28 17:07:37 +03:00
Frédéric Rodrigo
8bb77b67a1
Diff update osm transportation name network linestring (#996)
Replacing materialized view by a tables with update from trigger on change only.

Differential update of `osm_transportation_name_linestring`, `osm_transportation_name_linestring` and `osm_transportation_name_linestring_genX`).

At the end of the transaction the dependent rows are updated.

The goal is to update more quickly the content of derivated tables by just updating the changing content. It replaces the update of materialized view because their need a full recompute (with lock issue).

It is the last part of the replacement of materialized view for the transportation layer.

It addresses #814 and a part of #809.
2020-09-28 15:56:10 +03:00
Frédéric Rodrigo
47cdfc2c8b
Move where condition from osm_transportation_name_linestring to materialized view osm_transportation_name_network (fix) (#993)
On PR #991 the differential update was not updated like the main code.

Make similar change to the update code.
2020-09-23 11:10:59 +03:00
zstadler
d8b5e8e82d
openmaptiles-tools: consider MIN_ZOOM/MAX_ZOOM env (#992)
Allow MIN_ZOOM, and MAX_ZOOM to be overwritten from shell for `quickstart.sh`, `make generate-dc-config`, and other `docker-compose openmaptiles-tools` uses.

For example,
```
export MAX_ZOOM=14; ./quickstart.sh monaco
```
ignores the `MAX_ZOOM=14` environment variable and uses the `MAX_ZOOM=7` value from `.env` file

This PR will also make this code unecessary
5c640daf4f/.github/workflows/tests.yml (L26-L28)
2020-09-23 10:09:22 +03:00
swiss-knight
0245b21634
NOOP: Minor Makefile clean up (#994)
Minor fix.
2020-09-22 11:27:45 +03:00
Eva Jelinkova
f7d7a0ced3
Housenumbers - diff update, multipolygons (#990)
Following https://github.com/openmaptiles/openmaptiles/pull/983 - removing points also on multipolygons and checking only new geometry when updated.
2020-09-21 14:47:55 +03:00
zstadler
45f5b53c9c
Stitch transportation_name by all language tags (#989)
When OSM roads in the `transportation_name` layer are stitched together, their grouping does not consider all `name:*` tags.
As a result, roads with different `name:*` tags may be stitched together.

The `waterway` layer performs the grouping properly, for the same purpose:
1685eaccbd/layers/waterway/update_important_waterway.sql (L34)

Co-authored-by: Frédéric Rodrigo <fred.rodrigo@gmail.com>
2020-09-21 12:38:13 +03:00
Frédéric Rodrigo
5c640daf4f
Move where condition from osm_transportation_name_linestring to materialized view osm_transportation_name_network (#991)
Reduce the size of the materialized view osm_transportation_name_network by moving the weare clause.
osm_transportation_name_network is only used for osm_transportation_name_linestring.

Co-authored-by: zstadler <zeev.stadler@gmail.com>
2020-09-21 10:02:20 +03:00
Frédéric Rodrigo
550b1f8f90
Replace materialized view osm_transportation_name_network by a table with diff update (#987)
Replacing materialized view by a tables with update from trigger on change only.

The osm_id of object changing on table osm_route_member and osm_highway_linestring are logged.
At the end of the transaction the dependent row of osm_transportation_name_network are updated.

The goal is to update more quickly the content of derivated tables by just updating the changing content. It replaces the update of materialized view because their need a full recompute (with lock issue).

Note, it is only a part of the materialized view of the transportation layer, I am also working on the other parts, other parts are in #892 (omaterialized view on sm_transportation_name_linestring and osm_transportation_name_linestring_genX).

It addresses #814 and a part of #809.
2020-09-18 16:49:55 +03:00
Taro Matsuzawa aka. btm
1685eaccbd
#766 remove housenumbers inside polygon and same number (#983) 2020-09-16 17:06:48 +02:00
zstadler
fb7c1ef42b
Update Makefile (#984)
Update `make help` according to #750
2020-09-15 08:18:18 +03:00
zstadler
c82c706bc3
Clean output of list-views and list-table (#985)
Avoid printing a fixed `public,` prefix in the output of `make list-views` and `make list-table`.
As `make help` says, `list-views` and `list-table` list only the public schema views and tables.

New output:

```
viewname
boundary_z0
boundary_z1
boundary_z10
boundary_z11
boundary_z12
boundary_z13
boundary_z3
boundary_z4
boundary_z5
boundary_z6
boundary_z7
boundary_z8
boundary_z9
geography_columns
geometry_columns
...
```

Existing output:

```
schemaname,viewname
public,boundary_z0
public,boundary_z1
public,boundary_z10
public,boundary_z11
public,boundary_z12
public,boundary_z13
public,boundary_z3
public,boundary_z4
public,boundary_z5
public,boundary_z6
public,boundary_z7
public,boundary_z8
public,boundary_z9
public,geography_columns
public,geometry_columns
...
```
2020-09-14 15:07:35 -04:00
Frédéric Rodrigo
df56b75719
Clean update_route_member.sql (#981)
Clean and do refactoring on `update_route_member.sql` as first step to replace materialized view osm_transportation_name_network by tables with diff update. See #892.
2020-09-14 19:13:32 +03:00
Taro Matsuzawa aka. btm
7b2df3b64f
write how to generate dc-config (#982)
Added document about how to generate dc-config in QUICKSTART.md.
2020-09-14 18:20:24 +03:00
Jorge Sanz
bd444c0d1a
Show more state borders at low zoom levels (#979)
* Change NE 50m by NE 10m state provinces dataset

* update documentation

Fixes #977 

This PR implements the change discussed at #977 to replace Natural Earth 10m states and provinces by the 50m version, since the 10m only covers state borders for US, Canada, Brazil, and Australia.

A few remarks:

* This change only affects zooms 1 to 4, not making any change in borders based in the `OSM Borders`  source. 
* The `min_zoom<=7` shows the first level regions (level 4 in OSM) as you can check for example for France, Italy, or Spain.
* I don't think it's necessary to simplify the geometries, it would mean adding a new materialized view, or a slower tile generation process.
* This change does not need any change in the styles, even someone could argue it could be interesting to add the country code in this layer as a new field, allowing style editors to filter features by country, but I would prefer to leave that change for another PR.
2020-09-10 09:41:43 +03:00
Eva Jelinkova
1356d724d4
adding disputed_name to NE sources (#976)
`disputed_name` is filled for disputed lines of NaturalEarth sources - it contains `ogc_fid` as suggested in https://github.com/openmaptiles/openmaptiles/issues/964. This way it is possible to filter disputed lines in style.
2020-09-03 21:09:15 +03:00
zstadler
de95843e02
Allow setting TILESET_FILE by shell or Makefile (#975)
Following the 10efc29280 (r41977444) comment
2020-09-02 13:14:55 -04:00
Jorge Sanz
194b2fbb70
Add state labels at low zoom levels (#969)
* Remove state labels zoom, rank, and country conditions from layer function

* Don't add labels for zooms 0 and 1

If we check Bright, Positron, or Dark styles, they all show a huge lack of data about states and regions. At zoom 2, for big countries like Canada, Brazil, China or Australia there are big patches of white space (aka cartographer's *horror vacui* 😅)
2020-09-02 09:02:43 +03:00
David Zhao
a4671b84f0
Expose COPY_CONCURRENCY to users (#972)
Allow users to override how the number of threads used when generating map vector tiles.
2020-09-01 14:46:53 +03:00
naveenkumar
4807ccee24
adding hi(hindi),ta(tamil) and te(telugu) language (#973) 2020-09-01 12:25:17 +03:00
Frédéric Rodrigo
04d1b66e67
Incremental update marine point (#952)
Replacing update on the whole table with an update only on changed rows.

The goal is to update more quickly by just updating the changing content.
The update now focus on osm_id of changed rows, it use index. Add a where clause tags != update_tags(tags, geometry) to ensure only update when changed.

It requires one more trigger and a table to store changed osm_id.

The UPDATE is keep in a function to be reusable for initial setup and trigger update.

It is a based on the already merged https://github.com/openmaptiles/openmaptiles/pull/944

It is a separated PR as less obvious than previous. It replaces the reset of the `rank` field to NULL by missing value resulting of `LEFT JOIN`. It avoid triggering a new update on the table by reset the value then re-seting it to initial or new value.

It addresses #814.

Thanks @frodrigo
2020-08-30 16:16:54 +03:00
Frédéric Rodrigo
82616eaac0
Make update_city_point use incremental update #814 (#951)
Replacing update on the whole table with an update only on changed rows.

The goal is to update more quickly by just updating the changing content.
The update now focus on osm_id of changed rows, it use index. Add a where clause tags != update_tags(tags, geometry) to ensure only update when changed.

It requires one more trigger and a table to store changed osm_id.

The UPDATE is keep in a function to be reusable for initial setup and trigger update.

It is a based on the already merged https://github.com/openmaptiles/openmaptiles/pull/944

It is a separated PR as less obvious than previous. It replaces the reset of the `rank` field to NULL by missing value resulting of `LEFT JOIN`. It avoid triggering a new update on the table by reset the value then re-seting it to initial or new value.

It addresses #814.

Thanks @frodrigo
2020-08-30 15:29:50 +03:00
Frédéric Rodrigo
bb2a4328f3
Make more simple incremental update (#944)
Replacing update on the whole table with an update only on changed rows.

The goal is to update more quickly by just updating the changing content.
The update now focus on osm_id of changed rows, it use index. Add a where clause tags != update_tags(tags, geometry) en ensure only update when changed.

It requires one more trigger and a table to store changed osm_id.

The UPDATE is keep in a function to be reusable for initial setup and trigger update.

I try many code layout before done it in this way with the goal to keep the code for initial pass and for update. It should have low impact on initial data load. Better performance for row update can be achieve with BEFORE UPDATE, but require to duplicate the logic.

It is not based on the already merged https://github.com/openmaptiles/openmaptiles/pull/896 because calling and update within a function for each updated row was not efficient for larger table (like housenumber).

It addresses #814.


* Remake update_peak_point use incremental update #814

* Make update_aerodrome_label_point use incremental update #814

* Make housenumber_centroid use incremental update #814

* Make update_continent_point use incremental update #814

* Make update_island_point use incremental update #814

* Make update_island_polygon use incremental update #814

* Remove dead code in update_state_point.sql

* Make update_state_point use incremental update #814

* Remove dead code in update_country_point.sql

* Make update_country_point use incremental update #814

* Make osm_poi_polygon use incremental update #814

Thanks @frodrigo
2020-08-28 11:03:27 +02:00
Frédéric Rodrigo
10efc29280
Make tileset def openmaptiles.yaml a variable (#968)
Move the hard coded `openmaptiles.yaml` from Makefile to a variable. Allows use other tileset definition.
A step forward easy alternative layer definition.
2020-08-27 12:43:09 -04:00
zstadler
1daacf354e
Use line buffering by awk in make import-sql (#962)
Resolve https://github.com/openmaptiles/openmaptiles/issues/958
2020-08-10 10:41:14 +02:00
Frédéric Rodrigo
232379b3ca
Do insensitive case compare using lower() and not ILIKE (#961)
* Replace ILIKE by lower() for insensitive case compare

* Refactoring SQL insensitive case compare
2020-08-06 09:14:47 +02:00
zstadler
6a512af90f
Special cache handling for Docker Toolbox on Windows (#957)
resolves https://github.com/openmaptiles/openmaptiles/issues/807
2020-08-03 18:12:09 +02:00
zstadler
751551f910
Add $OMT_HOST support to make start-postserve (#956)
Resolve https://github.com/openmaptiles/openmaptiles/issues/955
2020-07-28 18:28:04 +02:00
zstadler
897846380a
Rephrase area detection messages (#954)
Thanks @zstadler.
2020-07-28 07:25:52 +02:00
Frédéric Rodrigo
9bb17792a6
Remove alignment of AS in SQL and few others (#932)
* Remove alignment of AS in SQL

* Remove alignment of CREATE TABLE in SQL
2020-07-22 13:48:25 +02:00
Frédéric Rodrigo
13aaa404d9
Fix More fail safe incremental update on water_lakeline and water_point (#949) (#950) 2020-07-22 12:17:33 +02:00
Frédéric Rodrigo
098f2d1ce2
Fix peak doc (#941) 2020-07-21 18:05:46 +02:00
Frédéric Rodrigo
dd1b2d3b15
More fail safe incremental update on water_lakeline and water_point (#949)
Improve 97216c5c191bf0df3705134cff234ed980f8ac78 and #853

In case of replay update it may fails because of already existing primary key on osm_id.

Add a on conflict clause to make it fail safe.
2020-07-21 17:35:49 +02:00
97 changed files with 4785 additions and 2866 deletions

16
.env
View File

@ -1,7 +1,10 @@
# This file defines default environment variables for all images # This file defines default environment variables for all images
# Layers definition and meta data
TILESET_FILE=openmaptiles.yaml
# 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.2 TOOLS_VERSION=5.3
# 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
@ -11,7 +14,8 @@ PGHOST=postgres
PGPORT=5432 PGPORT=5432
# BBOX may get overwritten by the computed bbox of the specific area: # BBOX may get overwritten by the computed bbox of the specific area:
# make generate-dc-config # make generate-bbox-file
# By default, the Makefile will use the content of data/$(area).bbox file if it exists.
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 # Which zooms to generate in make generate-tiles
@ -41,3 +45,11 @@ BORDERS_CSV_FILE=data/borders/lines.csv
# Number of parallel processes to use when importing sql files # Number of parallel processes to use when importing sql files
MAX_PARALLEL_PSQL=5 MAX_PARALLEL_PSQL=5
# Number of parallel threads to use when generating vector map tiles
COPY_CONCURRENCY=10
# Variables for generate tiles using PGquery
PGHOSTS_LIST=
NO_GZIP=1
USE_KEY_COLUMN=1

View File

@ -22,11 +22,8 @@ jobs:
area: monaco area: monaco
MIN_ZOOM: 0 MIN_ZOOM: 0
MAX_ZOOM: 14 MAX_ZOOM: 14
QUIET: 1
run: | run: |
# For now, change the quickstart values directly in the .env file
# TODO: We should probably use env vars instead
sed -i 's/MAX_ZOOM=7/MAX_ZOOM=14/g' .env
export QUIET=1
./quickstart.sh $area ./quickstart.sh $area
- name: Save quickstart.log - name: Save quickstart.log
@ -106,7 +103,7 @@ jobs:
with: with:
path: perf_cache path: perf_cache
# If profiling result cache has incompatible format, increase this "v" number # If profiling result cache has incompatible format, increase this "v" number
key: "v11-${{ steps.calc.outputs.hash }}-${{ env.TEST_DATA_URL }}" key: "v12-${{ steps.calc.outputs.hash }}-${{ env.TEST_DATA_URL }}"
- name: Load test data into DB and run performance test - name: Load test data into DB and run performance test
id: main id: main

171
Makefile
View File

@ -9,9 +9,12 @@ SHELL = /bin/bash
# Make all .env variables available for make targets # Make all .env variables available for make targets
include .env include .env
# Layers definition and meta data
TILESET_FILE ?= openmaptiles.yaml
# 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 --user=$(shell id -u):$(shell id -g)
DC_USER?=openmaptiles DC_USER?=openmaptiles
DC_PASSWORD?=openmaptiles DC_PASSWORD?=openmaptiles
@ -56,6 +59,7 @@ endif
# 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)
export OMT_HOST
# This defines an easy $(newline) value to act as a "\n". Make sure to keep exactly two empty lines after newline. # This defines an easy $(newline) value to act as a "\n". Make sure to keep exactly two empty lines after newline.
define newline define newline
@ -66,40 +70,66 @@ endef
# #
# Determine area to work on # Determine area to work on
# If $(area) parameter is not set and data/*.osm.pbf finds only one file, use it as $(area). # If $(area) parameter is not set, and only one *.osm.pbf file is found in ./data, use it as $(area).
# Otherwise all make targets requiring area param will show an error. # Otherwise, all make targets requiring an area will show an error.
# Note: If there are no data files, and user calls make download area=... once, # Note: If no *.osm.pbf files are found, once the users call "make download area=..."
# they will not need to use area= parameter after that because there will be just a single file. # they will not need to use an "area=" parameter again because there will be just a single file.
# #
# historically we have been using $(area) rather than $(AREA), so make both work # historically we have been using $(area) rather than $(AREA), so make both work
area ?= $(AREA) area ?= $(AREA)
# Ensure the $(AREA) param is set, or try to automatically determine it based on available data files # Ensure the $(area) param is set, or try to automatically determine it based on available data files
ifeq ($(strip $(area)),) 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 # An $(area) parameter is not set. If only one *.osm.pbf file is found in ./data, use it as $(area).
data_files := $(wildcard data/*.osm.pbf) data_files := $(shell find data -name '*.osm.pbf' 2>/dev/null)
ifneq ($(word 2,$(data_files)),) 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)) define assert_area_is_given
@echo ""
@echo "ERROR: The 'area' parameter or environment variable have not been set, and there several 'area' options:"
@$(patsubst data/%.osm.pbf,echo " '%'";,$(data_files))
@echo ""
@echo "To specify an area use:"
@echo " make $@ area=<area-id>"
@echo ""
@exit 1
endef
else else
ifeq ($(word 1,$(data_files)),) 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 define assert_area_is_given
@echo ""
@echo "ERROR: The 'area' parameter (or env var) has not been set, and there are no data/*.osm.pbf files"
@echo ""
@echo "To specify an area use"
@echo " make $@ area=<area-id>"
@echo ""
@echo "To download an area, use make download area=<area-id>"
@echo "To list downloadable areas, use make list-geofabrik and/or make list-bbbike"
@exit 1
@echo ""
endef
else else
# Keep just the name of the data file, without the .osm.pbf extension # Keep just the name of the data file, without the .osm.pbf extension
area := $(strip $(basename $(basename $(notdir $(data_files))))) area := $(patsubst data/%.osm.pbf,%,$(data_files))
# Rename area-latest.osm.pbf to area.osm.pbf # 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`? # TODO: This if statement could be removed in a few months once everyone is using the file without the `-latest`?
ifneq ($(area),$(area:-latest=)) ifneq ($(area),$(area:-latest=))
$(shell mv "data/$(area).osm.pbf" "data/$(area:-latest=).osm.pbf") $(shell mv "data/$(area).osm.pbf" "data/$(area:-latest=).osm.pbf")
area := $(area:-latest=) area := $(area:-latest=)
$(warning ATTENTION: File data/$(area)-latest.osm.pbf was renamed to $(area).osm.pbf.) $(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. AREA_INFO := Detected area=$(area) based on finding a 'data/$(area)-latest.osm.pbf' file - renamed to '$(area).osm.pbf'. Use 'area' parameter or environment variable to override.
else else
AREA_INFO := Detected area=$(area) based on the found data/ pbf file. Use 'area' parameter (or env var) to override. AREA_INFO := Detected area=$(area) based on finding a 'data/$(area).osm.pbf' file. Use 'area' parameter or environment variable to override.
endif endif
endif endif
endif endif
endif endif
ifneq ($(strip $(AREA_INFO)),)
define assert_area_is_given
@echo "$(AREA_INFO)"
endef
endif
# If set, this file will be downloaded in download-osm and imported in the import-osm targets # If set, this file will be downloaded in download-osm and imported in the import-osm targets
PBF_FILE ?= data/$(area).osm.pbf PBF_FILE ?= data/$(area).osm.pbf
@ -126,8 +156,13 @@ ifeq ($(strip $(DIFF_MODE)),true)
export IMPOSM_CONFIG_FILE = data/$(area).repl.json export IMPOSM_CONFIG_FILE = data/$(area).repl.json
endif endif
# download-osm generates this file with metadata about the file # Load area-specific bbox file that gets generated by the download-osm --bbox
AREA_DC_CONFIG_FILE ?= data/$(area).dc-config.yml AREA_BBOX_FILE ?= data/$(area).bbox
ifneq (,$(wildcard $(AREA_BBOX_FILE)))
cat := $(if $(filter $(OS),Windows_NT),type,cat)
BBOX := $(shell $(cat) ${AREA_BBOX_FILE})
export BBOX
endif
ifeq ($(strip $(area)),) ifeq ($(strip $(area)),)
define assert_area_is_given define assert_area_is_given
@ -148,8 +183,6 @@ else
endif endif
endif endif
# #
# TARGETS # TARGETS
# #
@ -167,7 +200,7 @@ help:
@echo " " @echo " "
@echo "Hints for designers:" @echo "Hints for designers:"
@echo " make start-maputnik # start Maputnik Editor + dynamic tile server [ see $(OMT_HOST):8088 ]" @echo " make start-maputnik # start Maputnik Editor + dynamic tile server [ see $(OMT_HOST):8088 ]"
@echo " make start-postserve # start dynamic tile server [ see $(OMT_HOST):$(PPORT)} ]" @echo " make start-postserve # start dynamic tile server [ see $(OMT_HOST):$(PPORT) ]"
@echo " make start-tileserver # start maptiler/tileserver-gl [ see $(OMT_HOST):$(TPORT) ]" @echo " make start-tileserver # start maptiler/tileserver-gl [ see $(OMT_HOST):$(TPORT) ]"
@echo " " @echo " "
@echo "Hints for developers:" @echo "Hints for developers:"
@ -178,12 +211,12 @@ help:
@echo " make download-geofabrik area=albania # download OSM data from geofabrik.de 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-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 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 generate-bbox-file # compute bounding box of a data file and store it in a file"
@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"
@echo " make analyze-db # PostgreSQL: ANALYZE" @echo " make analyze-db # PostgreSQL: ANALYZE"
@echo " make generate-qareports # generate reports [./build/qareports]" @echo " make generate-qa # statistics for a given layer's field"
@echo " make generate-devdoc # generate devdoc including graphs for all layers [./layers/...]" @echo " make generate-devdoc # generate devdoc including graphs for all layers [./layers/...]"
@echo " make bash # start openmaptiles-tools /bin/bash terminal" @echo " make bash # start openmaptiles-tools /bin/bash terminal"
@echo " make destroy-db # remove docker containers and PostgreSQL data volume" @echo " make destroy-db # remove docker containers and PostgreSQL data volume"
@ -193,8 +226,8 @@ help:
@echo " make clean-unnecessary-docker # clean unnecessary docker image(s) and container(s)" @echo " make clean-unnecessary-docker # clean unnecessary docker image(s) and container(s)"
@echo " make refresh-docker-images # refresh openmaptiles docker images from Docker HUB" @echo " make refresh-docker-images # refresh openmaptiles docker images from Docker HUB"
@echo " make remove-docker-images # remove openmaptiles docker images" @echo " make remove-docker-images # remove openmaptiles docker images"
@echo " make pgclimb-list-views # list PostgreSQL public schema views" @echo " make list-views # list PostgreSQL public schema views"
@echo " make pgclimb-list-tables # list PostgreSQL public schema tables" @echo " make list-tables # list PostgreSQL public schema tables"
@echo " cat .env # list PG database and MIN_ZOOM and MAX_ZOOM information" @echo " cat .env # list PG database and MIN_ZOOM and MAX_ZOOM information"
@echo " cat quickstart.log # transcript of the last ./quickstart.sh run" @echo " cat quickstart.log # transcript of the last ./quickstart.sh run"
@echo " make help # help about available commands" @echo " make help # help about available commands"
@ -209,12 +242,12 @@ init-dirs:
build/openmaptiles.tm2source/data.yml: init-dirs build/openmaptiles.tm2source/data.yml: init-dirs
ifeq (,$(wildcard build/openmaptiles.tm2source/data.yml)) 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 $(TILESET_FILE) --host="postgres" --port=5432 --database="openmaptiles" --user="$(DC_USER)" --password="$(DC_PASSWORD)" > $@
endif endif
build/mapping.yaml: init-dirs build/mapping.yaml: init-dirs
ifeq (,$(wildcard build/mapping.yaml)) 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 $(TILESET_FILE) > $@
endif endif
.PHONY: build-sql .PHONY: build-sql
@ -222,8 +255,8 @@ build-sql: init-dirs
ifeq (,$(wildcard build/sql/run_last.sql)) ifeq (,$(wildcard build/sql/run_last.sql))
@mkdir -p build/sql/parallel @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 $(TILESET_FILE) --dir ./build/sql \
&& generate-sqltomvt openmaptiles.yaml \ && generate-sqltomvt $(TILESET_FILE) \
--key --gzip --postgis-ver 3.0.1 \ --key --gzip --postgis-ver 3.0.1 \
--function --fname=getmvt >> ./build/sql/run_last.sql' --function --fname=getmvt >> ./build/sql/run_last.sql'
endif endif
@ -288,10 +321,12 @@ ifeq (,$(wildcard $(PBF_FILE)))
@echo "Downloading $(DOWNLOAD_AREA) with replication support into $(PBF_FILE) and $(IMPOSM_CONFIG_FILE) from $(if $(OSM_SERVER),$(OSM_SERVER),any source)" @echo "Downloading $(DOWNLOAD_AREA) with replication support into $(PBF_FILE) and $(IMPOSM_CONFIG_FILE) from $(if $(OSM_SERVER),$(OSM_SERVER),any source)"
@$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools download-osm $(OSM_SERVER) "$(DOWNLOAD_AREA)" \ @$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools download-osm $(OSM_SERVER) "$(DOWNLOAD_AREA)" \
--imposm-cfg "$(IMPOSM_CONFIG_FILE)" \ --imposm-cfg "$(IMPOSM_CONFIG_FILE)" \
--bbox "$(AREA_BBOX_FILE)" \
--output "$(PBF_FILE)" --output "$(PBF_FILE)"
else else
@echo "Downloading $(DOWNLOAD_AREA) into $(PBF_FILE) from $(if $(OSM_SERVER),$(OSM_SERVER),any source)" @echo "Downloading $(DOWNLOAD_AREA) into $(PBF_FILE) from $(if $(OSM_SERVER),$(OSM_SERVER),any source)"
@$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools download-osm $(OSM_SERVER) "$(DOWNLOAD_AREA)" \ @$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools download-osm $(OSM_SERVER) "$(DOWNLOAD_AREA)" \
--bbox "$(AREA_BBOX_FILE)" \
--output "$(PBF_FILE)" --output "$(PBF_FILE)"
endif endif
@echo "" @echo ""
@ -313,40 +348,45 @@ else
endif endif
endif endif
.PHONY: generate-dc-config .PHONY: generate-bbox-file
generate-dc-config: generate-bbox-file:
@$(assert_area_is_given) @$(assert_area_is_given)
ifeq (,$(wildcard $(AREA_DC_CONFIG_FILE))) ifeq (,$(wildcard $(AREA_BBOX_FILE)))
@$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools bash -c ' \ @$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools download-osm bbox "$(PBF_FILE)" "$(AREA_BBOX_FILE)"
download-osm make-dc "$(PBF_FILE)" \
--make-dc "$(AREA_DC_CONFIG_FILE)" \
--id "$(area)"'
else else
@echo "Configuration file $(AREA_DC_CONFIG_FILE) already exists, no need to regenerate." @echo "Configuration file $(AREA_BBOX_FILE) already exists, no need to regenerate. BBOX=$(BBOX)"
endif endif
.PHONY: psql .PHONY: psql
psql: start-db-nowait psql: start-db-nowait
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && psql.sh' $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && psql.sh'
# Special cache handling for Docker Toolbox on Windows
ifeq ($(MSYSTEM),MINGW64)
DC_CONFIG_CACHE := -f docker-compose.yml -f docker-compose-$(MSYSTEM).yml
DC_OPTS_CACHE := $(strip $(filter-out --user=%,$(DC_OPTS)))
else
DC_OPTS_CACHE := $(DC_OPTS)
endif
.PHONY: import-osm .PHONY: import-osm
import-osm: all start-db-nowait import-osm: all start-db-nowait
@$(assert_area_is_given) @$(assert_area_is_given)
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-osm $(PBF_FILE)' $(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) 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) @$(assert_area_is_given)
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-update' $(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) 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) @$(assert_area_is_given)
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c 'pgwait && import-diff' $(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) openmaptiles-tools sh -c 'pgwait && import-diff'
.PHONY: import-data .PHONY: import-data
import-data: start-db import-data: start-db
$(DOCKER_COMPOSE) run $(DC_OPTS) import-data $(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) import-data
.PHONY: import-borders .PHONY: import-borders
import-borders: start-db-nowait import-borders: start-db-nowait
@ -358,20 +398,27 @@ import-borders: start-db-nowait
.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:" '1{print; fflush()} $$0~s{print "\n*** WARNING detected, aborting"; exit(1)}'
ifneq ($(wildcard $(AREA_DC_CONFIG_FILE)),)
DC_CONFIG_TILES := -f docker-compose.yml -f $(AREA_DC_CONFIG_FILE)
endif
.PHONY: generate-tiles .PHONY: generate-tiles
generate-tiles: all start-db generate-tiles: all start-db
@$(assert_area_is_given) @$(assert_area_is_given)
@echo "Generating tiles into $(MBTILES_LOCAL_FILE) (will delete if already exists)..." @echo "Generating tiles into $(MBTILES_LOCAL_FILE) (will delete if already exists)..."
@rm -rf "$(MBTILES_LOCAL_FILE)" @rm -rf "$(MBTILES_LOCAL_FILE)"
$(DOCKER_COMPOSE) $(DC_CONFIG_TILES) run $(DC_OPTS) generate-vectortiles $(DOCKER_COMPOSE) run $(DC_OPTS) generate-vectortiles
@echo "Updating generated tile metadata ..." @echo "Updating generated tile metadata ..."
$(DOCKER_COMPOSE) $(DC_CONFIG_TILES) run $(DC_OPTS) openmaptiles-tools \ $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools \
mbtiles-tools meta-generate "$(MBTILES_LOCAL_FILE)" ./openmaptiles.yaml --auto-minmax --show-ranges mbtiles-tools meta-generate "$(MBTILES_LOCAL_FILE)" $(TILESET_FILE) --auto-minmax --show-ranges
.PHONY: generate-tiles-pg
generate-tiles-pg: all start-db
@$(assert_area_is_given)
@echo "Generating tiles into $(MBTILES_LOCAL_FILE) (will delete if already exists)..."
@rm -rf "$(MBTILES_LOCAL_FILE)"
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools generate-tiles
@echo "Updating generated tile metadata ..."
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools \
mbtiles-tools meta-generate "$(MBTILES_LOCAL_FILE)" $(TILESET_FILE) --auto-minmax --show-ranges
.PHONY: start-tileserver .PHONY: start-tileserver
start-tileserver: init-dirs start-tileserver: init-dirs
@ -430,17 +477,22 @@ start-maputnik: stop-maputnik start-postserve
stop-maputnik: stop-maputnik:
-docker rm -f maputnik_editor -docker rm -f maputnik_editor
.PHONY: generate-qareports # STAT_FUNCTION=frequency|toplength|variance
generate-qareports: start-db .PHONY: generate-qa
./qa/run.sh generate-qa: all start-db-nowait
@echo " "
@echo "e.g. make generate-qa STAT_FUNCTION=frequency LAYER=transportation ATTRIBUTE=class"
@echo " "
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools \
layer-stats $(STAT_FUNCTION) $(TILESET_FILE) $(LAYER) $(ATTRIBUTE) -m 0 -n 14 -v
# generate all etl and mapping graphs # generate all etl and mapping graphs
.PHONY: generate-devdoc .PHONY: generate-devdoc
generate-devdoc: init-dirs generate-devdoc: init-dirs
mkdir -p ./build/devdoc && \ mkdir -p ./build/devdoc && \
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c \ $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools sh -c \
'generate-etlgraph openmaptiles.yaml $(GRAPH_PARAMS) && \ 'generate-etlgraph $(TILESET_FILE) $(GRAPH_PARAMS) && \
generate-mapping-graph openmaptiles.yaml $(GRAPH_PARAMS)' generate-mapping-graph $(TILESET_FILE) $(GRAPH_PARAMS)'
.PHONY: bash .PHONY: bash
bash: init-dirs bash: init-dirs
@ -448,7 +500,7 @@ bash: init-dirs
.PHONY: import-wikidata .PHONY: import-wikidata
import-wikidata: init-dirs import-wikidata: init-dirs
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools import-wikidata --cache /cache/wikidata-cache.json openmaptiles.yaml $(DOCKER_COMPOSE) $(DC_CONFIG_CACHE) run $(DC_OPTS_CACHE) openmaptiles-tools import-wikidata --cache /cache/wikidata-cache.json $(TILESET_FILE)
.PHONY: reset-db-stats .PHONY: reset-db-stats
reset-db-stats: init-dirs reset-db-stats: init-dirs
@ -457,12 +509,12 @@ reset-db-stats: init-dirs
.PHONY: list-views .PHONY: list-views
list-views: init-dirs list-views: init-dirs
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools psql.sh -v ON_ERROR_STOP=1 -A -F"," -P pager=off -P footer=off \ $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools psql.sh -v ON_ERROR_STOP=1 -A -F"," -P pager=off -P footer=off \
-c "select schemaname, viewname from pg_views where schemaname='public' order by viewname;" -c "select viewname from pg_views where schemaname='public' order by viewname;"
.PHONY: list-tables .PHONY: list-tables
list-tables: init-dirs list-tables: init-dirs
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools psql.sh -v ON_ERROR_STOP=1 -A -F"," -P pager=off -P footer=off \ $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools psql.sh -v ON_ERROR_STOP=1 -A -F"," -P pager=off -P footer=off \
-c "select schemaname, tablename from pg_tables where schemaname='public' order by tablename;" -c "select tablename from pg_tables where schemaname='public' order by tablename;"
.PHONY: psql-list-tables .PHONY: psql-list-tables
psql-list-tables: init-dirs psql-list-tables: init-dirs
@ -510,12 +562,21 @@ clean-unnecessary-docker:
@echo "Deleting unnecessary container(s)..." @echo "Deleting unnecessary container(s)..."
@docker ps -a -q --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 | awk -F" " '/<none>/{print $$3}' | $(XARGS) docker rmi
.PHONY: test-perf-null .PHONY: test-perf-null
test-perf-null: init-dirs test-perf-null: init-dirs
$(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools test-perf openmaptiles.yaml --test null --no-color $(DOCKER_COMPOSE) run $(DC_OPTS) openmaptiles-tools test-perf $(TILESET_FILE) --test null --no-color
.PHONY: build-test-pbf .PHONY: build-test-pbf
build-test-pbf: init-dirs build-test-pbf: init-dirs
docker-compose run $(DC_OPTS) openmaptiles-tools /tileset/.github/workflows/build-test-data.sh docker-compose run $(DC_OPTS) openmaptiles-tools /tileset/.github/workflows/build-test-data.sh
.PHONY: debug
debug: ## Use this target when developing Makefile itself to verify loaded environment variables
@$(assert_area_is_given)
@echo file_exists = $(wildcard $(AREA_BBOX_FILE))
@echo AREA_BBOX_FILE = $(AREA_BBOX_FILE) , $$AREA_ENV_FILE
@echo BBOX = $(BBOX) , $$BBOX
@echo MIN_ZOOM = $(MIN_ZOOM) , $$MIN_ZOOM
@echo MAX_ZOOM = $(MAX_ZOOM) , $$MAX_ZOOM

View File

@ -363,12 +363,13 @@ This is generating `.mbtiles` for your area : [ MIN_ZOOM: "0" - MAX_ZOOM: "7"
./quickstart.sh yukon # Yukon, Canada ./quickstart.sh yukon # Yukon, Canada
``` ```
### Using your own OSM data ### Using your own OSM data
Mbtiles can be generated from an arbitrary osm.pbf (e.g. for a region that is not covered by an existing extract) by making the `data/` directory and placing an *-latest.osm.pbf inside. Inside of folder have to be `docker-compose-config.yml` file too, otherwize whole folder `data/` will be deleted and `download-osm` will try to download osm.pbf file from `geofabric`, `osmfr` or `bbbike`. Mbtiles can be generated from an arbitrary osm.pbf (e.g. for a region that is not covered by an existing extract) by making the `data/` directory and placing an *.osm.pbf (e.g. `mydata.osm.pbf`) inside.
``` ```
mkdir -p data mkdir -p data
mv my-latest.osm.pbf data/ mv mydata.osm.pbf data/
./quickstart.sh my make generate-bbox-file area=mydata
./quickstart.sh mydata
``` ```
### Check postserve ### Check postserve
@ -390,12 +391,21 @@ modify the settings in the `.env` file, the defaults:
* `MIN_ZOOM=0` * `MIN_ZOOM=0`
* `MAX_ZOOM=7` * `MAX_ZOOM=7`
Delete the `./data/<area>.dc-config.yml` file, and re-start `./quickstart.sh <area>`
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
### Set the bounding box to generate
By default, tile generation is done for the full extent of the area.
If you want to generate a tiles for a smaller extent, modify the settings in the `.env` file, the default:
* `BBOX=-180.0,-85.0511,180.0,85.0511`
Delete the `./data/<area>.bbox` file, and re-start `./quickstart.sh <area>`
Hint:
* The [boundingbox.klokantech.com](https://boundingbox.klokantech.com/) site can be used to find a bounding box (CSV format) using a map.
### Check other commands ### Check other commands
`make help` `make help`
@ -421,7 +431,7 @@ Hints for developers:
make psql-list-tables # list all PostgreSQL tables make psql-list-tables # list all PostgreSQL tables
make psql-vacuum-analyze # PostgreSQL: VACUUM ANALYZE make psql-vacuum-analyze # PostgreSQL: VACUUM ANALYZE
make psql-analyze # PostgreSQL: ANALYZE make psql-analyze # PostgreSQL: ANALYZE
make generate-qareports # generate reports [./build/qareports] make generate-qa # statistics for a given layer's field
make generate-devdoc # generate devdoc [./build/devdoc] make generate-devdoc # generate devdoc [./build/devdoc]
make tools-dev # start import-sql /bin/bash terminal make tools-dev # start import-sql /bin/bash terminal
make db-destroy # remove docker containers, PG data volume make db-destroy # remove docker containers, PG data volume

View File

@ -1,6 +1,6 @@
## OpenMapTiles [![Build Status](https://github.com/openmaptiles/openmaptiles/workflows/OMT_CI/badge.svg?branch=master)](https://github.com/openmaptiles/openmaptiles/actions) ## OpenMapTiles [![Build Status](https://github.com/openmaptiles/openmaptiles/workflows/OMT_CI/badge.svg?branch=master)](https://github.com/openmaptiles/openmaptiles/actions)
OpenMapTiles is an extensible and open tile schema based on the OpenStreetMap. This project is used to generate vector tiles for online zoomable maps. OpenMapTiles is about creating a beautiful basemaps with general layers containing topographic information. More information [openmaptiles.org](https://openmaptiles.org/) and [openmaptiles.com](https://openmaptiles.com/). OpenMapTiles is an extensible and open tile schema based on the OpenStreetMap. This project is used to generate vector tiles for online zoomable maps. OpenMapTiles is about creating a beautiful basemaps with general layers containing topographic information. More information [openmaptiles.org](https://openmaptiles.org/) and [maptiler.com/data/](https://www.maptiler.com/data/).
We encourage you to collaborate, reuse and adapt existing layers, or add your own layers. You may use our approach for your own vector tile project. Feel free to fork the repo and experiment. The repository is built on top of the [openmaptiles/openmaptiles-tools](https://github.com/openmaptiles/openmaptiles-tools) to simplify vector tile creation. We encourage you to collaborate, reuse and adapt existing layers, or add your own layers. You may use our approach for your own vector tile project. Feel free to fork the repo and experiment. The repository is built on top of the [openmaptiles/openmaptiles-tools](https://github.com/openmaptiles/openmaptiles-tools) to simplify vector tile creation.
@ -8,7 +8,7 @@ Please keep in mind that OpenMapTiles schema should display general topographic
- :link: Schema https://openmaptiles.org/schema - :link: Schema https://openmaptiles.org/schema
- :link: Docs https://openmaptiles.org/docs - :link: Docs https://openmaptiles.org/docs
- :link: Production package: https://openmaptiles.com/production-package/ - :link: Data for download: https://www.maptiler.com/data/
- :link: Hosting https://www.maptiler.com/cloud/ - :link: Hosting https://www.maptiler.com/cloud/
- :link: Create own layer https://github.com/openmaptiles/openmaptiles-skiing - :link: Create own layer https://github.com/openmaptiles/openmaptiles-skiing
- :link: Discuss at the #openmaptiles channel at [OSM Slack](https://osmus-slack.herokuapp.com/) - :link: Discuss at the #openmaptiles channel at [OSM Slack](https://osmus-slack.herokuapp.com/)
@ -135,10 +135,10 @@ make
make import-sql make import-sql
``` ```
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. Now you are ready to **generate the vector tiles**. By default, `./.env` specifies the entire planet BBOX for zooms 0-7, but running `generate-bbox-file` will analyze the data file and set the `BBOX` param to limit tile generation.
``` ```
make generate-dc-config # compute data bbox -- not needed for the whole planet make generate-bbox-file # compute data bbox -- not needed for the whole planet
make generate-tiles # generate tiles make generate-tiles # generate tiles
``` ```

View File

@ -0,0 +1,11 @@
# This version must match the MAKE_DC_VERSION in docker-compose.yml
version: "3"
volumes:
cache:
services:
openmaptiles-tools:
volumes:
- cache:/cache

View File

@ -1,11 +1,11 @@
# This version must match the MAKE_DC_VERSION value below # This version must match the MAKE_DC_VERSION value below
version: "2.3" version: "3"
volumes: volumes:
pgdata: pgdata:
networks: networks:
postgres_conn: postgres:
driver: bridge driver: bridge
services: services:
@ -16,7 +16,7 @@ services:
volumes: volumes:
- pgdata:/var/lib/postgresql/data - pgdata:/var/lib/postgresql/data
networks: networks:
- postgres_conn - postgres
ports: ports:
- "5432" - "5432"
env_file: .env-postgres env_file: .env-postgres
@ -25,7 +25,7 @@ services:
image: "openmaptiles/import-data:${TOOLS_VERSION}" image: "openmaptiles/import-data:${TOOLS_VERSION}"
env_file: .env env_file: .env
networks: networks:
- postgres_conn - postgres
openmaptiles-tools: openmaptiles-tools:
image: "openmaptiles/openmaptiles-tools:${TOOLS_VERSION}" image: "openmaptiles/openmaptiles-tools:${TOOLS_VERSION}"
@ -33,9 +33,13 @@ services:
environment: environment:
# Must match the version of this file (first line) # Must match the version of this file (first line)
# download-osm will use it when generating a composer file # download-osm will use it when generating a composer file
MAKE_DC_VERSION: "2.3" MAKE_DC_VERSION: "3"
# Allow DIFF_MODE to be overwritten from shell # Allow DIFF_MODE, MIN_ZOOM, and MAX_ZOOM to be overwritten from shell
DIFF_MODE: ${DIFF_MODE} DIFF_MODE: ${DIFF_MODE}
MIN_ZOOM: ${MIN_ZOOM}
MAX_ZOOM: ${MAX_ZOOM}
#Provide BBOX from *.bbox file if exists, else from .env
BBOX: ${BBOX}
# Imposm configuration file describes how to load updates when enabled # Imposm configuration file describes how to load updates when enabled
IMPOSM_CONFIG_FILE: ${IMPOSM_CONFIG_FILE} IMPOSM_CONFIG_FILE: ${IMPOSM_CONFIG_FILE}
# Which files to use during import-borders processing # Which files to use during import-borders processing
@ -45,10 +49,11 @@ services:
# Control import-sql processes # Control import-sql processes
MAX_PARALLEL_PSQL: ${MAX_PARALLEL_PSQL} MAX_PARALLEL_PSQL: ${MAX_PARALLEL_PSQL}
networks: networks:
- postgres_conn - postgres
volumes: volumes:
- .:/tileset - .:/tileset
- ./data:/import - ./data:/import
- ./data:/export
- ./build/sql:/sql - ./build/sql:/sql
- ./build:/mapping - ./build:/mapping
- ./cache:/cache - ./cache:/cache
@ -60,11 +65,13 @@ services:
- ./data:/export - ./data:/export
- ./build/openmaptiles.tm2source:/tm2source - ./build/openmaptiles.tm2source:/tm2source
networks: networks:
- postgres_conn - postgres
env_file: .env env_file: .env
environment: environment:
FILTER_MAPNIK_OUTPUT: ${FILTER_MAPNIK_OUTPUT} FILTER_MAPNIK_OUTPUT: ${FILTER_MAPNIK_OUTPUT}
MBTILES_NAME: ${MBTILES_FILE} MBTILES_NAME: ${MBTILES_FILE}
# Control tilelive-copy threads
COPY_CONCURRENCY: ${COPY_CONCURRENCY}
generate-vectortiles: generate-vectortiles:
image: "openmaptiles/generate-vectortiles:${TOOLS_VERSION}" image: "openmaptiles/generate-vectortiles:${TOOLS_VERSION}"
@ -72,7 +79,7 @@ services:
- ./data:/export - ./data:/export
- ./build/openmaptiles.tm2source:/tm2source - ./build/openmaptiles.tm2source:/tm2source
networks: networks:
- postgres_conn - postgres
env_file: .env env_file: .env
environment: environment:
FILTER_MAPNIK_OUTPUT: ${FILTER_MAPNIK_OUTPUT} FILTER_MAPNIK_OUTPUT: ${FILTER_MAPNIK_OUTPUT}
@ -80,13 +87,18 @@ services:
BBOX: ${BBOX} BBOX: ${BBOX}
MIN_ZOOM: ${MIN_ZOOM} MIN_ZOOM: ${MIN_ZOOM}
MAX_ZOOM: ${MAX_ZOOM} MAX_ZOOM: ${MAX_ZOOM}
# Control tilelive-copy threads
COPY_CONCURRENCY: ${COPY_CONCURRENCY}
#
postserve: postserve:
image: "openmaptiles/openmaptiles-tools:${TOOLS_VERSION}" image: "openmaptiles/openmaptiles-tools:${TOOLS_VERSION}"
command: "postserve openmaptiles.yaml --verbose --port ${PPORT:-8090}" command: "postserve ${TILESET_FILE} --verbose --serve=${OMT_HOST:-http://localhost}:${PPORT:-8090}"
env_file: .env env_file: .env
environment:
TILESET_FILE: ${TILESET_FILE}
networks: networks:
- postgres_conn - postgres
ports: ports:
- "${PPORT:-8090}:${PPORT:-8090}" - "${PPORT:-8090}:${PPORT:-8090}"
volumes: volumes:

View File

@ -24,16 +24,16 @@ SELECT
osm_id, osm_id,
geometry, geometry,
name, 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,
CASE CASE
%%FIELD_MAPPING: class %% %%FIELD_MAPPING: class %%
ELSE 'other' ELSE 'other'
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 WHERE geometry && bbox

View File

@ -44,7 +44,7 @@ layer:
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 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 - ./aerodrome_label.sql
datasources: datasources:
- type: imposm3 - type: imposm3
mapping_file: ./mapping.yaml mapping_file: ./mapping.yaml

View File

@ -1,30 +1,49 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_aerodrome_label_point; DROP TRIGGER IF EXISTS trigger_flag ON osm_aerodrome_label_point;
DROP TRIGGER IF EXISTS trigger_store 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;
CREATE SCHEMA IF NOT EXISTS aerodrome_label;
CREATE TABLE IF NOT EXISTS aerodrome_label.osm_ids
(
osm_id bigint
);
-- 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(full_update boolean) RETURNS void AS
$$ $$
BEGIN
UPDATE osm_aerodrome_label_point UPDATE osm_aerodrome_label_point
SET geometry = ST_Centroid(geometry) SET geometry = ST_Centroid(geometry)
WHERE ST_GeometryType(geometry) <> 'ST_Point'; WHERE (full_update OR osm_id IN (SELECT osm_id FROM aerodrome_label.osm_ids))
AND ST_GeometryType(geometry) <> 'ST_Point';
UPDATE osm_aerodrome_label_point UPDATE osm_aerodrome_label_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL; WHERE (full_update OR osm_id IN (SELECT osm_id FROM aerodrome_label.osm_ids))
END; AND COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL
$$ LANGUAGE plpgsql; AND tags != update_tags(tags, geometry);
$$ LANGUAGE SQL;
SELECT update_aerodrome_label_point(); SELECT update_aerodrome_label_point(true);
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS aerodrome_label; CREATE OR REPLACE FUNCTION aerodrome_label.store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO aerodrome_label.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO aerodrome_label.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS aerodrome_label.updates CREATE TABLE IF NOT EXISTS aerodrome_label.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION aerodrome_label.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION aerodrome_label.flag() RETURNS trigger AS
@ -37,15 +56,27 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION aerodrome_label.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION aerodrome_label.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh aerodrome_label'; RAISE LOG 'Refresh aerodrome_label';
PERFORM update_aerodrome_label_point(); PERFORM update_aerodrome_label_point(false);
-- noinspection SqlWithoutWhere
DELETE FROM aerodrome_label.osm_ids;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM aerodrome_label.updates; DELETE FROM aerodrome_label.updates;
RAISE LOG 'Refresh aerodrome_label done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_aerodrome_label_point
FOR EACH ROW
EXECUTE PROCEDURE aerodrome_label.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_aerodrome_label_point ON osm_aerodrome_label_point

View File

@ -12,19 +12,19 @@ AS
$$ $$
SELECT geometry, aeroway AS class, ref SELECT geometry, aeroway AS class, ref
FROM ( FROM (
-- etldoc: osm_aeroway_linestring_gen3 -> layer_aeroway:z10 -- etldoc: osm_aeroway_linestring_gen_z10 -> layer_aeroway:z10
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_linestring_gen3 FROM osm_aeroway_linestring_gen_z10
WHERE zoom_level = 10 WHERE zoom_level = 10
UNION ALL UNION ALL
-- etldoc: osm_aeroway_linestring_gen2 -> layer_aeroway:z11 -- etldoc: osm_aeroway_linestring_gen_z11 -> layer_aeroway:z11
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_linestring_gen2 FROM osm_aeroway_linestring_gen_z11
WHERE zoom_level = 11 WHERE zoom_level = 11
UNION ALL UNION ALL
-- etldoc: osm_aeroway_linestring_gen1 -> layer_aeroway:z12 -- etldoc: osm_aeroway_linestring_gen_z12 -> layer_aeroway:z12
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_linestring_gen1 FROM osm_aeroway_linestring_gen_z12
WHERE zoom_level = 12 WHERE zoom_level = 12
UNION ALL UNION ALL
-- etldoc: osm_aeroway_linestring -> layer_aeroway:z13 -- etldoc: osm_aeroway_linestring -> layer_aeroway:z13
@ -33,27 +33,36 @@ FROM (
FROM osm_aeroway_linestring FROM osm_aeroway_linestring
WHERE zoom_level >= 13 WHERE zoom_level >= 13
UNION ALL UNION ALL
-- etldoc: osm_aeroway_polygon_gen_z10 -> layer_aeroway:z10
-- etldoc: osm_aeroway_polygon_gen3 -> layer_aeroway:z10
-- etldoc: osm_aeroway_polygon_gen3 -> layer_aeroway:z11
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_polygon_gen3 FROM osm_aeroway_polygon_gen_z10
WHERE zoom_level BETWEEN 10 AND 11 WHERE zoom_level = 10
UNION ALL UNION ALL
-- etldoc: osm_aeroway_polygon_gen2 -> layer_aeroway:z12 -- etldoc: osm_aeroway_polygon_gen_z11 -> layer_aeroway:z11
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_polygon_gen2 FROM osm_aeroway_polygon_gen_z11
WHERE zoom_level = 11
UNION ALL
-- etldoc: osm_aeroway_polygon_gen_z12 -> layer_aeroway:z12
SELECT geometry, aeroway, ref
FROM osm_aeroway_polygon_gen_z12
WHERE zoom_level = 12 WHERE zoom_level = 12
UNION ALL UNION ALL
-- etldoc: osm_aeroway_polygon_gen1 -> layer_aeroway:z13 -- etldoc: osm_aeroway_polygon_gen_z13 -> layer_aeroway:z13
SELECT geometry, aeroway, ref SELECT geometry, aeroway, ref
FROM osm_aeroway_polygon_gen1 FROM osm_aeroway_polygon_gen_z13
WHERE zoom_level = 13 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 FROM osm_aeroway_polygon
WHERE zoom_level >= 14 WHERE zoom_level >= 14
UNION ALL
-- etldoc: osm_aeroway_point -> layer_aeroway:z14_
SELECT geometry, aeroway, ref
FROM osm_aeroway_point
WHERE zoom_level >= 14
) AS zoom_levels ) AS zoom_levels
WHERE geometry && bbox; WHERE geometry && bbox;
$$ LANGUAGE SQL STABLE $$ LANGUAGE SQL STABLE

View File

@ -19,11 +19,12 @@ layer:
- helipad - helipad
- taxiway - taxiway
- apron - apron
- gate
datasource: datasource:
geometry_field: geometry geometry_field: geometry
query: (SELECT geometry, ref, class FROM layer_aeroway(!bbox!, z(!scale_denominator!))) AS t query: (SELECT geometry, ref, class FROM layer_aeroway(!bbox!, z(!scale_denominator!))) AS t
schema: schema:
- ./layer.sql - ./aeroway.sql
datasources: datasources:
- type: imposm3 - type: imposm3
mapping_file: ./mapping.yaml mapping_file: ./mapping.yaml

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 166 KiB

View File

@ -1,34 +1,40 @@
generalized_tables: generalized_tables:
# etldoc: imposm3 -> osm_aeroway_linestring_gen3 # etldoc: osm_aeroway_linestring_gen_z11 -> osm_aeroway_linestring_gen_z10
aeroway_linestring_gen3: aeroway_linestring_gen_z10:
source: aeroway_linestring_gen2 source: aeroway_linestring_gen_z11
tolerance: ZRES11 tolerance: ZRES11
# etldoc: imposm3 -> osm_aeroway_linestring_gen2 # etldoc: osm_aeroway_linestring_gen_z12 -> osm_aeroway_linestring_gen_z11
aeroway_linestring_gen2: aeroway_linestring_gen_z11:
source: aeroway_linestring_gen1 source: aeroway_linestring_gen_z12
tolerance: ZRES12 tolerance: ZRES12
# etldoc: imposm3 -> osm_aeroway_linestring_gen1 # etldoc: osm_aeroway_linestring -> osm_aeroway_linestring_gen_z12
aeroway_linestring_gen1: aeroway_linestring_gen_z12:
source: aeroway_linestring source: aeroway_linestring
sql_filter: ST_IsValid(geometry) sql_filter: ST_IsValid(geometry)
tolerance: ZRES13 tolerance: ZRES13
# etldoc: imposm3 -> osm_aeroway_polygon_gen3 # etldoc: osm_aeroway_polygon_gen_z11 -> osm_aeroway_polygon_gen_z10
aeroway_polygon_gen3: aeroway_polygon_gen_z10:
source: aeroway_polygon_gen2 source: aeroway_polygon_gen_z11
sql_filter: area>power(ZRES9,2)
tolerance: ZRES10
# etldoc: osm_aeroway_polygon_gen_z12 -> osm_aeroway_polygon_gen_z11
aeroway_polygon_gen_z11:
source: aeroway_polygon_gen_z12
sql_filter: area>power(ZRES10,2) sql_filter: area>power(ZRES10,2)
tolerance: ZRES11 tolerance: ZRES11
# etldoc: imposm3 -> osm_aeroway_polygon_gen2 # etldoc: osm_aeroway_polygon_gen_z13 -> osm_aeroway_polygon_gen_z12
aeroway_polygon_gen2: aeroway_polygon_gen_z12:
source: aeroway_polygon_gen1 source: aeroway_polygon_gen_z13
sql_filter: area>power(ZRES11,2) sql_filter: area>power(ZRES11,2)
tolerance: ZRES12 tolerance: ZRES12
# etldoc: imposm3 -> osm_aeroway_polygon_gen1 # etldoc: osm_aeroway_polygon -> osm_aeroway_polygon_gen_z13
aeroway_polygon_gen1: aeroway_polygon_gen_z13:
source: aeroway_polygon source: aeroway_polygon
sql_filter: area>power(ZRES12,2) AND ST_IsValid(geometry) sql_filter: area>power(ZRES12,2) AND ST_IsValid(geometry)
tolerance: ZRES13 tolerance: ZRES13
@ -80,3 +86,19 @@ tables:
aeroway: aeroway:
- runway - runway
- taxiway - taxiway
# etldoc: imposm3 -> osm_aeroway_point
aeroway_point:
type: point
columns:
- *ref
- name: osm_id
type: id
- name: geometry
type: geometry
- name: aeroway
key: aeroway
type: string
mapping:
aeroway:
- gate

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 32 KiB

File diff suppressed because it is too large Load Diff

View File

@ -14,6 +14,10 @@ layer:
The `admin_level` corresponds to the lowest `admin_level` The `admin_level` corresponds to the lowest `admin_level`
the line participates in. the line participates in.
At low zoom levels the Natural Earth boundaries are mapped to the equivalent admin levels. At low zoom levels the Natural Earth boundaries are mapped to the equivalent admin levels.
adm0_l: |
State name on the left of the border. For country boundaries only (`admin_level = 2`).
adm0_r: |
State name on the right of the border. For country boundaries only (`admin_level = 2`).
disputed: disputed:
description: | description: |
Mark with `1` if the border is disputed. Mark with `1` if the border is disputed.
@ -46,8 +50,9 @@ layer:
buffer_size: 4 buffer_size: 4
datasource: datasource:
geometry_field: geometry geometry_field: geometry
query: (SELECT geometry, admin_level, disputed, disputed_name, claimed_by, maritime FROM layer_boundary(!bbox!, z(!scale_denominator!))) AS t query: (SELECT geometry, admin_level, adm0_l, adm0_r, disputed, disputed_name, claimed_by, maritime FROM layer_boundary(!bbox!, z(!scale_denominator!))) AS t
schema: schema:
- ./boundary_name.sql
- ./boundary.sql - ./boundary.sql
datasources: datasources:
- type: imposm3 - type: imposm3

View File

@ -0,0 +1,99 @@
DROP TABLE IF EXISTS osm_border_linestring_adm CASCADE;
-- etldoc: osm_border_linestring -> osm_border_linestring_adm
CREATE TABLE IF NOT EXISTS osm_border_linestring_adm AS (
WITH
-- Prepare lines from osm to be merged
multiline AS (
SELECT ST_Node(ST_Collect(geometry)) AS geometry,
maritime,
disputed
FROM osm_border_linestring
WHERE admin_level = 2
AND osm_id NOT IN (SELECT DISTINCT osm_id FROM osm_border_disp_linestring)
GROUP BY maritime,
disputed
),
mergedline AS (
SELECT (ST_Dump(
ST_LineMerge(geometry))).geom AS geometry,
maritime,
disputed
FROM multiline
),
-- Create polygons from all boundaries to preserve real shape of country
polyg AS (
SELECT (ST_Dump(
ST_Polygonize(geometry))).geom AS geometry
FROM (
SELECT (ST_Dump(
ST_LineMerge(geometry))).geom AS geometry
FROM (SELECT ST_Node(
ST_Collect(geometry)) AS geometry
FROM osm_border_linestring
WHERE admin_level = 2
) nodes
) linemerge
),
centroids AS (
SELECT polyg.geometry,
ne.adm0_a3
FROM polyg,
ne_10m_admin_0_countries AS ne
WHERE ST_Within(
ST_PointOnSurface(polyg.geometry), ne.geometry)
),
country_osm_polyg AS (
SELECT country.adm0_a3,
border.geometry
FROM polyg border,
centroids country
WHERE ST_Within(country.geometry, border.geometry)
),
rights AS (
SELECT adm0_r,
geometry,
maritime,
disputed
FROM (
SELECT b.adm0_a3 AS adm0_r,
a.geometry,
a.maritime,
a.disputed
FROM mergedline AS a
LEFT JOIN country_osm_polyg AS b
-- Create short line on the right of the boundary (mergedline) and find state where line lies.
ON ST_Within(
ST_OffsetCurve(
(ST_LineSubString(a.geometry, 0.3,0.3004)), 70, 'quad_segs=4 join=mitre'), b.geometry)
) line_rights
)
SELECT adm0_l,
adm0_r,
geometry,
maritime,
2::integer AS admin_level,
disputed
FROM (
SELECT b.adm0_a3 AS adm0_l,
r.adm0_r AS adm0_r,
r.geometry,
r.maritime,
r.disputed
FROM rights AS r
LEFT JOIN country_osm_polyg AS b
-- Create short line on the left of the boundary (mergedline) and find state where line lies.
ON ST_Within(
ST_OffsetCurve(
(ST_LineSubString(r.geometry, 0.4,0.4004)), -70, 'quad_segs=4 join=mitre'), b.geometry)
) both_lines
);
CREATE INDEX IF NOT EXISTS osm_border_linestring_adm_geom_idx
ON osm_border_linestring_adm
USING GIST (geometry);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

After

Width:  |  Height:  |  Size: 668 KiB

View File

@ -1,70 +1,82 @@
generalized_tables: generalized_tables:
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen11 # etldoc: osm_border_disp_linestring_gen_z2 -> osm_border_disp_linestring_gen_z1
border_disp_linestring_gen11: border_disp_linestring_gen_z1:
source: border_disp_linestring source: border_disp_linestring_gen_z2
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 9600 tolerance: ZRES2
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen10 # etldoc: osm_border_disp_linestring_gen_z3 -> osm_border_disp_linestring_gen_z2
border_disp_linestring_gen10: border_disp_linestring_gen_z2:
source: border_disp_linestring source: border_disp_linestring_gen_z3
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 4800 tolerance: ZRES3
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen9 # etldoc: osm_border_disp_linestring_gen_z4 -> osm_border_disp_linestring_gen_z3
border_disp_linestring_gen9: border_disp_linestring_gen_z3:
source: border_disp_linestring source: border_disp_linestring_gen_z4
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 2400 tolerance: ZRES4
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen8 # etldoc: osm_border_disp_linestring_gen_z5 -> osm_border_disp_linestring_gen_z4
border_disp_linestring_gen8: border_disp_linestring_gen_z4:
source: border_disp_linestring source: border_disp_linestring_gen_z5
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 1200 tolerance: ZRES5
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen7 # etldoc: osm_border_disp_linestring_gen_z6 -> osm_border_disp_linestring_gen_z5
border_disp_linestring_gen7: border_disp_linestring_gen_z5:
source: border_disp_linestring source: border_disp_linestring_gen_z6
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 600 tolerance: ZRES6
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen6 # etldoc: osm_border_disp_linestring_gen_z7 -> osm_border_disp_linestring_gen_z6
border_disp_linestring_gen6: border_disp_linestring_gen_z6:
source: border_disp_linestring source: border_disp_linestring_gen_z7
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 300 tolerance: ZRES7
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen5 # etldoc: osm_border_disp_linestring_gen_z8 -> osm_border_disp_linestring_gen_z7
border_disp_linestring_gen5: border_disp_linestring_gen_z7:
source: border_disp_linestring source: border_disp_linestring_gen_z8
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 160 tolerance: ZRES8
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen4 # etldoc: osm_border_disp_linestring_gen_z9 -> osm_border_disp_linestring_gen_z8
border_disp_linestring_gen4: border_disp_linestring_gen_z8:
source: border_disp_linestring source: border_disp_linestring_gen_z9
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 80 tolerance: ZRES9
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen3 # etldoc: osm_border_disp_linestring_gen_z10 -> osm_border_disp_linestring_gen_z9
border_disp_linestring_gen3: border_disp_linestring_gen_z9:
source: border_disp_linestring source: border_disp_linestring_gen_z10
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 40 tolerance: ZRES10
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen2 # etldoc: osm_border_disp_linestring_gen_z11 -> osm_border_disp_linestring_gen_z10
border_disp_linestring_gen2: border_disp_linestring_gen_z10:
source: border_disp_linestring source: border_disp_linestring_gen_z11
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 20 tolerance: ZRES11
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen1 # etldoc: osm_border_disp_linestring_gen_z12 -> osm_border_disp_linestring_gen_z11
border_disp_linestring_gen1: border_disp_linestring_gen_z11:
source: border_disp_linestring_gen_z12
sql_filter: admin_level = 2
tolerance: ZRES12
# etldoc: osm_border_disp_linestring_gen_z13 -> osm_border_disp_linestring_gen_z12
border_disp_linestring_gen_z12:
source: border_disp_linestring_gen_z13
sql_filter: admin_level = 2
tolerance: ZRES13
# etldoc: osm_border_disp_linestring -> osm_border_disp_linestring_gen_z13
border_disp_linestring_gen_z13:
source: border_disp_linestring source: border_disp_linestring
sql_filter: admin_level = 2 sql_filter: admin_level = 2
tolerance: 10 tolerance: ZRES14
# etldoc: osm_border_disp_relation -> osm_border_disp_linestring # etldoc: osm_border_disp_relation -> osm_border_disp_linestring
border_disp_linestring: border_disp_linestring:

View File

@ -9,15 +9,15 @@ CREATE OR REPLACE VIEW osm_all_buildings AS
SELECT SELECT
-- etldoc: osm_building_relation -> layer_building:z14_ -- etldoc: osm_building_relation -> layer_building:z14_
-- Buildings built from relations -- Buildings built from relations
member AS osm_id, member AS osm_id,
geometry, geometry,
COALESCE(CleanNumeric(height), CleanNumeric(buildingheight)) AS height, COALESCE(CleanNumeric(height), CleanNumeric(buildingheight)) AS height,
COALESCE(CleanNumeric(min_height), CleanNumeric(buildingmin_height)) AS min_height, COALESCE(CleanNumeric(min_height), CleanNumeric(buildingmin_height)) AS min_height,
COALESCE(CleanNumeric(levels), CleanNumeric(buildinglevels)) AS levels, COALESCE(CleanNumeric(levels), CleanNumeric(buildinglevels)) AS levels,
COALESCE(CleanNumeric(min_level), CleanNumeric(buildingmin_level)) AS min_level, 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 osm_building_relation FROM osm_building_relation
WHERE building = '' WHERE building = ''
AND ST_GeometryType(geometry) = 'ST_Polygon' AND ST_GeometryType(geometry) = 'ST_Polygon'
@ -28,13 +28,13 @@ SELECT
-- Standalone buildings -- Standalone buildings
obp.osm_id, obp.osm_id,
obp.geometry, obp.geometry,
COALESCE(CleanNumeric(obp.height), CleanNumeric(obp.buildingheight)) AS height, COALESCE(CleanNumeric(obp.height), CleanNumeric(obp.buildingheight)) AS height,
COALESCE(CleanNumeric(obp.min_height), CleanNumeric(obp.buildingmin_height)) AS min_height, COALESCE(CleanNumeric(obp.min_height), CleanNumeric(obp.buildingmin_height)) AS min_height,
COALESCE(CleanNumeric(obp.levels), CleanNumeric(obp.buildinglevels)) AS levels, COALESCE(CleanNumeric(obp.levels), CleanNumeric(obp.buildinglevels)) AS levels,
COALESCE(CleanNumeric(obp.min_level), CleanNumeric(obp.buildingmin_level)) AS min_level, 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 osm_building_polygon obp FROM 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
@ -78,19 +78,19 @@ SELECT geometry,
WHEN 'timber_framing' THEN '#b3b0a9' WHEN 'timber_framing' THEN '#b3b0a9'
WHEN 'sandstone' THEN '#b4a995' -- same as stone WHEN 'sandstone' THEN '#b4a995' -- same as stone
WHEN 'clay' THEN '#9d8b75' -- same as mud WHEN 'clay' THEN '#9d8b75' -- same as mud
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 (
SELECT SELECT
-- etldoc: osm_building_block_gen1 -> layer_building:z13 -- etldoc: osm_building_block_gen_z13 -> layer_building:z13
osm_id, osm_id,
geometry, geometry,
NULL::int AS render_height, NULL::int AS render_height,
NULL::int AS render_min_height, NULL::int AS render_min_height,
NULL::text AS material, NULL::text AS material,
NULL::text AS colour, NULL::text AS colour,
FALSE AS hide_3d FALSE AS hide_3d
FROM osm_building_block_gen1 FROM osm_building_block_gen_z13
WHERE zoom_level = 13 WHERE zoom_level = 13
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
@ -98,7 +98,7 @@ FROM (
-- etldoc: osm_building_polygon -> layer_building:z14_ -- etldoc: osm_building_polygon -> layer_building:z14_
DISTINCT ON (osm_id) osm_id, DISTINCT ON (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,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -1,13 +1,13 @@
DROP TRIGGER IF EXISTS trigger_refresh ON buildings.updates; DROP TRIGGER IF EXISTS trigger_refresh ON buildings.updates;
DROP TRIGGER IF EXISTS trigger_flag ON osm_building_polygon; DROP TRIGGER IF EXISTS trigger_flag ON osm_building_polygon;
--creating aggregated building blocks with removed small polygons and small -- Creating aggregated building blocks with removed small polygons and small
--holes. Aggregated polygons are simplified. -- holes. Aggregated polygons are simplified by Visvalingam-Whyatt algorithm.
-- Aggregating is made block by block using country_osm_grid polygon table.
--function returning recordset for matview -- Function returning recordset for matview.
--returning recordset of buildings aggregates by zres 14, with removed small -- Returning recordset of buildings aggregates by zres 14, with removed small
--holes and with removed small buildings/blocks -- holes and with removed small buildings/blocks.
--
CREATE OR REPLACE FUNCTION osm_building_block_gen1() CREATE OR REPLACE FUNCTION osm_building_block_gen1()
RETURNS table RETURNS table
@ -20,50 +20,68 @@ $$
DECLARE DECLARE
zres14 float := Zres(14); zres14 float := Zres(14);
zres12 float := Zres(12); zres12 float := Zres(12);
zres14vw float := Zres(14) * Zres(14);
polyg_world record;
BEGIN BEGIN
FOR osm_id, geometry IN FOR polyg_world IN
WITH dta AS ( -- CTE is used because of optimization SELECT ST_Transform(country.geometry, 3857) AS geometry
SELECT o.osm_id, o.geometry, ST_ClusterDBSCAN(o.geometry, eps := zres14, minpoints := 1) OVER () cid FROM country_osm_grid country
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 LOOP
-- removing holes smaller than FOR osm_id, geometry IN
IF ST_NumInteriorRings(geometry) > 0 THEN -- only from geometries wih holes WITH dta AS ( -- CTE is used because of optimization
geometry := ( SELECT o.osm_id,
-- there are some multi-geometries in this layer o.geometry,
SELECT ST_Collect(gn) ST_ClusterDBSCAN(o.geometry, eps := zres14, minpoints := 1) OVER () cid
FROM ( FROM osm_building_polygon o
-- in some cases are "holes" NULL, because all holes are smaller than WHERE ST_Intersects(o.geometry, polyg_world.geometry)
SELECT COALESCE( )
-- exterior ring SELECT (array_agg(dta.osm_id))[1] AS osm_id,
ST_MakePolygon(ST_ExteriorRing(dmp.geom), holes), ST_Buffer(
ST_MakePolygon(ST_ExteriorRing(dmp.geom)) ST_Union(
) gn ST_Buffer(
ST_SnapToGrid(dta.geometry, 0.000001)
, zres14, 'join=mitre')
)
, -zres14, 'join=mitre') AS geometry
FROM dta
GROUP BY cid
FROM ST_Dump(geometry) dmp, -- 1 dump polygons LOOP
LATERAL ( -- removing holes smaller than
SELECT array_agg(ST_Boundary(rg.geom)) holes -- 2 create array IF ST_NumInteriorRings(geometry) > 0 THEN -- only from geometries wih holes
FROM ST_DumpRings(dmp.geom) rg -- 3 from rings geometry := (
WHERE rg.path[1] > 0 -- 5 except inner ring -- there are some multi-geometries in this layer
AND ST_Area(rg.geom) >= power(zres12, 2) -- 4 bigger than SELECT ST_Collect(gn)
) holes FROM (
) new_geom -- in some cases are "holes" NULL, because all holes are smaller than
); SELECT COALESCE(
END IF; -- exterior ring
ST_MakePolygon(ST_ExteriorRing(dmp.geom), holes),
ST_MakePolygon(ST_ExteriorRing(dmp.geom))
) gn
IF ST_Area(geometry) < power(zres12, 2) THEN FROM ST_Dump(geometry) dmp, -- 1 dump polygons
CONTINUE; LATERAL (
END IF; 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;
-- simplify IF ST_Area(geometry) < power(zres12, 2) THEN
geometry := ST_SimplifyPreserveTopology(geometry, zres14::float); CONTINUE;
END IF;
RETURN NEXT; -- simplify
geometry := ST_SimplifyVW(geometry, zres14vw);
RETURN NEXT;
END LOOP;
END LOOP; END LOOP;
END; END;
$$ LANGUAGE plpgsql STABLE $$ LANGUAGE plpgsql STABLE
@ -71,15 +89,52 @@ $$ LANGUAGE plpgsql STABLE
PARALLEL SAFE; PARALLEL SAFE;
DROP MATERIALIZED VIEW IF EXISTS osm_building_block_gen1; DROP MATERIALIZED VIEW IF EXISTS osm_building_block_gen1_dup CASCADE;
CREATE MATERIALIZED VIEW osm_building_block_gen1 AS CREATE MATERIALIZED VIEW osm_building_block_gen1_dup AS
SELECT * SELECT *
FROM osm_building_block_gen1(); FROM osm_building_block_gen1();
CREATE INDEX ON osm_building_block_gen1 USING gist (geometry); CREATE INDEX ON osm_building_block_gen1_dup USING gist (geometry);
CREATE UNIQUE INDEX ON osm_building_block_gen1 USING btree (osm_id);
-- etldoc: osm_building_polygon -> osm_building_block_gen_z13
DROP MATERIALIZED VIEW IF EXISTS osm_building_block_gen_z13;
CREATE MATERIALIZED VIEW osm_building_block_gen_z13 AS
(
WITH
counts AS (
SELECT count(osm_id) AS counts,
osm_id
FROM osm_building_block_gen1_dup
GROUP BY osm_id
),
duplicates AS (
SELECT counts.osm_id
FROM counts
WHERE counts.counts > 1
)
SELECT osm.osm_id,
ST_Union(
ST_MakeValid(osm.geometry)) AS geometry
FROM osm_building_block_gen1_dup osm,
duplicates
WHERE osm.osm_id = duplicates.osm_id
GROUP BY osm.osm_id
UNION ALL
SELECT osm.osm_id,
osm.geometry
FROM osm_building_block_gen1_dup osm,
counts
WHERE counts.counts = 1
AND osm.osm_id = counts.osm_id
);
CREATE INDEX ON osm_building_block_gen_z13 USING gist (geometry);
CREATE UNIQUE INDEX ON osm_building_block_gen_z13 USING btree (osm_id);
-- Handle updates -- Handle updates
@ -88,7 +143,7 @@ CREATE SCHEMA IF NOT EXISTS buildings;
CREATE TABLE IF NOT EXISTS buildings.updates CREATE TABLE IF NOT EXISTS buildings.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
@ -102,11 +157,16 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION buildings.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION buildings.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh buildings block'; RAISE LOG 'Refresh buildings block';
REFRESH MATERIALIZED VIEW osm_building_block_gen1; REFRESH MATERIALIZED VIEW osm_building_block_gen1_dup;
REFRESH MATERIALIZED VIEW osm_building_block_gen_z13;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM buildings.updates; DELETE FROM buildings.updates;
RAISE LOG 'Update buildings block done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;

View File

@ -13,7 +13,7 @@ layer:
query: (SELECT geometry, housenumber FROM layer_housenumber(!bbox!, z(!scale_denominator!))) AS t query: (SELECT geometry, housenumber FROM layer_housenumber(!bbox!, z(!scale_denominator!))) AS t
schema: schema:
- ./housenumber_centroid.sql - ./housenumber_centroid.sql
- ./layer.sql - ./housenumber.sql
datasources: datasources:
- type: imposm3 - type: imposm3
mapping_file: ./mapping.yaml mapping_file: ./mapping.yaml

View File

@ -1,10 +1,17 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_housenumber_point; DROP TRIGGER IF EXISTS trigger_flag ON osm_housenumber_point;
DROP TRIGGER IF EXISTS trigger_store ON osm_housenumber_point;
DROP TRIGGER IF EXISTS trigger_refresh ON housenumber.updates; DROP TRIGGER IF EXISTS trigger_refresh ON housenumber.updates;
CREATE SCHEMA IF NOT EXISTS housenumber;
CREATE TABLE IF NOT EXISTS housenumber.osm_ids
(
osm_id bigint
);
-- 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(full_update boolean) RETURNS void AS
$$ $$
BEGIN
UPDATE osm_housenumber_point UPDATE osm_housenumber_point
SET geometry = SET geometry =
CASE CASE
@ -12,20 +19,31 @@ BEGIN
THEN ST_Centroid(geometry) THEN ST_Centroid(geometry)
ELSE ST_PointOnSurface(geometry) ELSE ST_PointOnSurface(geometry)
END END
WHERE ST_GeometryType(geometry) <> 'ST_Point'; WHERE (full_update OR osm_id IN (SELECT osm_id FROM housenumber.osm_ids))
END; AND ST_GeometryType(geometry) <> 'ST_Point'
$$ LANGUAGE plpgsql; AND ST_IsValid(geometry);
$$ LANGUAGE SQL;
SELECT convert_housenumber_point(); SELECT convert_housenumber_point(true);
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS housenumber; CREATE OR REPLACE FUNCTION housenumber.store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO housenumber.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO housenumber.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS housenumber.updates CREATE TABLE IF NOT EXISTS housenumber.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION housenumber.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION housenumber.flag() RETURNS trigger AS
@ -38,15 +56,27 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION housenumber.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION housenumber.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh housenumber'; RAISE LOG 'Refresh housenumber';
PERFORM convert_housenumber_point(); PERFORM convert_housenumber_point(false);
-- noinspection SqlWithoutWhere
DELETE FROM housenumber.osm_ids;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM housenumber.updates; DELETE FROM housenumber.updates;
RAISE LOG 'Refresh housenumber done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_housenumber_point
FOR EACH ROW
EXECUTE PROCEDURE housenumber.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_housenumber_point ON osm_housenumber_point

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 366 KiB

View File

@ -0,0 +1,349 @@
DROP TABLE IF EXISTS osm_landcover_gen_z7;
DROP TABLE IF EXISTS osm_landcover_gen_z8;
DROP TABLE IF EXISTS osm_landcover_gen_z9;
DROP TABLE IF EXISTS osm_landcover_gen_z10;
DROP TABLE IF EXISTS osm_landcover_gen_z11;
DROP TABLE IF EXISTS osm_landcover_gen_z12;
DROP TABLE IF EXISTS osm_landcover_gen_z13;
DROP TABLE IF EXISTS simplify_vw_z7 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z8 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z9 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z10 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z11 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z12 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z13 CASCADE;
-- etldoc: osm_landcover_polygon -> osm_landcover_gen_z13
CREATE TABLE simplify_vw_z13 AS
(
SELECT subclass,
ST_MakeValid(
ST_SnapToGrid(
ST_SimplifyVW(geometry, power(zres(13),2)),
0.001)) AS geometry
FROM osm_landcover_polygon
WHERE ST_Area(geometry) > power(zres(10),2)
);
CREATE INDEX ON simplify_vw_z13 USING GIST (geometry);
CREATE TABLE osm_landcover_gen_z13 AS
(
SELECT subclass,
ST_MakeValid(
(ST_dump(
ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z13
WHERE ST_NPoints(geometry) < 50
AND subclass IN ('wood', 'forest')) union_geom50
GROUP BY subclass,
cid
UNION ALL
SELECT subclass, ST_MakeValid((ST_dump(ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z13
WHERE ST_NPoints(geometry) >= 50
AND ST_NPoints(geometry) < 300
AND subclass IN ('wood', 'forest')) union_geom300
GROUP BY subclass,
cid
UNION ALL
SELECT subclass,
geometry
FROM simplify_vw_z13
WHERE (ST_NPoints(geometry) >= 300 AND subclass IN ('wood', 'forest'))
OR (subclass NOT IN ('wood', 'forest'))
);
CREATE INDEX ON osm_landcover_gen_z13 USING GIST (geometry);
-- etldoc: osm_landcover_gen_z13 -> osm_landcover_gen_z12
CREATE TABLE simplify_vw_z12 AS
(
SELECT subclass,
ST_MakeValid(
ST_SnapToGrid(
ST_SimplifyVW(geometry, power(zres(12),2)),
0.001)) AS geometry
FROM simplify_vw_z13
WHERE ST_Area(geometry) > power(zres(9),2)
);
CREATE INDEX ON simplify_vw_z12 USING GIST (geometry);
CREATE TABLE osm_landcover_gen_z12 AS
(
SELECT subclass,
ST_MakeValid(
(ST_dump(
ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z12
WHERE ST_NPoints(geometry) < 50
AND subclass IN ('wood', 'forest')) union_geom50
GROUP BY subclass,
cid
UNION ALL
SELECT subclass, ST_MakeValid((ST_dump(ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z12
WHERE ST_NPoints(geometry) >= 50
AND ST_NPoints(geometry) < 300
AND subclass IN ('wood', 'forest')) union_geom300
GROUP BY subclass,
cid
UNION ALL
SELECT subclass,
geometry
FROM simplify_vw_z12
WHERE (ST_NPoints(geometry) >= 300 AND subclass IN ('wood', 'forest'))
OR (subclass NOT IN ('wood', 'forest'))
);
CREATE INDEX ON osm_landcover_gen_z12 USING GIST (geometry);
-- etldoc: osm_landcover_gen_z12 -> osm_landcover_gen_z11
CREATE TABLE simplify_vw_z11 AS
(
SELECT subclass,
ST_MakeValid(
ST_SnapToGrid(
ST_SimplifyVW(geometry, power(zres(11),2)),
0.001)) AS geometry
FROM simplify_vw_z12
WHERE ST_Area(geometry) > power(zres(8),2)
);
CREATE INDEX ON simplify_vw_z11 USING GIST (geometry);
CREATE TABLE osm_landcover_gen_z11 AS
(
SELECT subclass,
ST_MakeValid(
(ST_dump(
ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z11
WHERE ST_NPoints(geometry) < 50
AND subclass IN ('wood', 'forest')) union_geom50
GROUP BY subclass,
cid
UNION ALL
SELECT subclass, ST_MakeValid((ST_dump(ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z11
WHERE ST_NPoints(geometry) >= 50
AND ST_NPoints(geometry) < 300
AND subclass IN ('wood', 'forest')) union_geom300
GROUP BY subclass,
cid
UNION ALL
SELECT subclass,
geometry
FROM simplify_vw_z11
WHERE (ST_NPoints(geometry) >= 300 AND subclass IN ('wood', 'forest'))
OR (subclass NOT IN ('wood', 'forest'))
);
CREATE INDEX ON osm_landcover_gen_z11 USING GIST (geometry);
-- etldoc: osm_landcover_gen_z11 -> osm_landcover_gen_z10
CREATE TABLE simplify_vw_z10 AS
(
SELECT subclass,
ST_MakeValid(
ST_SnapToGrid(
ST_SimplifyVW(geometry, power(zres(10),2)),
0.001)) AS geometry
FROM simplify_vw_z11
WHERE ST_Area(geometry) > power(zres(8),2)
);
CREATE INDEX ON simplify_vw_z10 USING GIST (geometry);
CREATE TABLE osm_landcover_gen_z10 AS
(
SELECT subclass,
ST_MakeValid(
(ST_dump(
ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z10
WHERE ST_NPoints(geometry) < 50
AND subclass IN ('wood', 'forest')) union_geom50
GROUP BY subclass,
cid
UNION ALL
SELECT subclass, ST_MakeValid((ST_dump(ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z10
WHERE ST_NPoints(geometry) >= 50
AND ST_NPoints(geometry) < 300
AND subclass IN ('wood', 'forest')) union_geom300
GROUP BY subclass,
cid
UNION ALL
SELECT subclass,
geometry
FROM simplify_vw_z10
WHERE (ST_NPoints(geometry) >= 300 AND subclass IN ('wood', 'forest'))
OR (subclass NOT IN ('wood', 'forest'))
);
CREATE INDEX ON osm_landcover_gen_z10 USING GIST (geometry);
-- etldoc: osm_landcover_gen_z10 -> osm_landcover_gen_z9
CREATE TABLE simplify_vw_z9 AS
(
SELECT subclass,
ST_MakeValid(
ST_SnapToGrid(
ST_SimplifyVW(geometry, power(zres(9),2)),
0.001)) AS geometry
FROM simplify_vw_z10
WHERE ST_Area(geometry) > power(zres(7),2)
);
CREATE INDEX ON simplify_vw_z9 USING GIST (geometry);
CREATE TABLE osm_landcover_gen_z9 AS
(
SELECT subclass,
ST_MakeValid(
(ST_dump(
ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z9
WHERE ST_NPoints(geometry) < 50
AND subclass IN ('wood', 'forest')) union_geom50
GROUP BY subclass,
cid
UNION ALL
SELECT subclass, ST_MakeValid((ST_dump(ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z9
WHERE ST_NPoints(geometry) >= 50
AND ST_NPoints(geometry) < 300
AND subclass IN ('wood', 'forest')) union_geom300
GROUP BY subclass,
cid
UNION ALL
SELECT subclass,
ST_MakeValid(
(ST_Dump(
ST_Union(geometry))).geom) AS geometry
FROM (
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) over () AS cid, geometry
FROM simplify_vw_z9
WHERE ST_NPoints(geometry) >= 300
AND subclass IN ('wood', 'forest')) union_geom_rest
GROUP BY subclass,
cid
UNION ALL
SELECT subclass,
geometry
FROM simplify_vw_z9
WHERE subclass NOT IN ('wood', 'forest')
);
CREATE INDEX ON osm_landcover_gen_z9 USING GIST (geometry);
-- etldoc: osm_landcover_gen_z9 -> osm_landcover_gen_z8
CREATE TABLE simplify_vw_z8 AS
(
SELECT subclass,
ST_MakeValid(
ST_SnapToGrid(
ST_SimplifyVW(geometry, power(zres(8),2)),
0.001)) AS geometry
FROM simplify_vw_z9
WHERE ST_Area(geometry) > power(zres(6),2)
);
CREATE INDEX ON simplify_vw_z8 USING GIST (geometry);
CREATE TABLE osm_landcover_gen_z8 AS
(
SELECT subclass,
ST_MakeValid(
(ST_Dump(
ST_Union(geometry))).geom) AS geometry
FROM
(
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) OVER () AS cid,
geometry
FROM simplify_vw_z8
) union_geom
GROUP BY subclass,
cid
UNION ALL
SELECT subclass,
geometry
FROM simplify_vw_z8
WHERE subclass NOT IN ('wood', 'forest')
);
CREATE INDEX ON osm_landcover_gen_z8 USING GIST (geometry);
-- etldoc: osm_landcover_gen_z8 -> osm_landcover_gen_z7
CREATE TABLE simplify_vw_z7 AS
(
SELECT subclass,
ST_MakeValid(
ST_SnapToGrid(
ST_SimplifyVW(geometry, power(zres(7),2)),
0.001)) AS geometry
FROM simplify_vw_z8
WHERE ST_Area(geometry) > power(zres(5),2)
);
CREATE INDEX ON simplify_vw_z7 USING GIST (geometry);
CREATE TABLE osm_landcover_gen_z7 AS
(
SELECT subclass,
ST_MakeValid(
(ST_Dump(
ST_Union(geometry))).geom) AS geometry
FROM
(
SELECT subclass,
ST_ClusterDBSCAN(geometry, eps := 0, minpoints := 1) OVER () AS cid,
geometry
FROM simplify_vw_z7
) union_geom
GROUP BY subclass,
cid
);
CREATE INDEX ON osm_landcover_gen_z7 USING GIST (geometry);
DROP TABLE IF EXISTS simplify_vw_z7 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z8 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z9 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z10 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z11 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z12 CASCADE;
DROP TABLE IF EXISTS simplify_vw_z13 CASCADE;

View File

@ -18,174 +18,356 @@ $$ LANGUAGE SQL IMMUTABLE
-- STRICT -- STRICT
PARALLEL SAFE; PARALLEL SAFE;
-- etldoc: ne_110m_glaciated_areas -> landcover_z0 -- ne_50m_antarctic_ice_shelves_polys
-- etldoc: ne_50m_antarctic_ice_shelves_polys -> ne_50m_antarctic_ice_shelves_polys_gen_z4
DROP MATERIALIZED VIEW IF EXISTS ne_50m_antarctic_ice_shelves_polys_gen_z4 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_antarctic_ice_shelves_polys_gen_z4 AS
(
SELECT
ST_Simplify(geometry, ZRes(6)) as geometry,
'ice_shelf'::text AS subclass
FROM ne_50m_antarctic_ice_shelves_polys
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_antarctic_ice_shelves_polys_gen_z4_idx ON ne_50m_antarctic_ice_shelves_polys_gen_z4 USING gist (geometry);
-- ne_110m_glaciated_areas
-- etldoc: ne_110m_glaciated_areas -> ne_110m_glaciated_areas_gen_z1
DROP MATERIALIZED VIEW IF EXISTS ne_110m_glaciated_areas_gen_z1 CASCADE;
CREATE MATERIALIZED VIEW ne_110m_glaciated_areas_gen_z1 AS
(
SELECT
ST_Simplify(geometry, ZRes(3)) as geometry,
'glacier'::text AS subclass
FROM ne_110m_glaciated_areas
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_110m_glaciated_areas_gen_z1_idx ON ne_110m_glaciated_areas_gen_z1 USING gist (geometry);
-- etldoc: ne_110m_glaciated_areas_gen_z1 -> ne_110m_glaciated_areas_gen_z0
DROP MATERIALIZED VIEW IF EXISTS ne_110m_glaciated_areas_gen_z0 CASCADE;
CREATE MATERIALIZED VIEW ne_110m_glaciated_areas_gen_z0 AS
(
SELECT
ST_Simplify(geometry, ZRes(2)) as geometry,
subclass
FROM ne_110m_glaciated_areas_gen_z1
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_110m_glaciated_areas_gen_z0_idx ON ne_110m_glaciated_areas_gen_z0 USING gist (geometry);
-- etldoc: ne_50m_antarctic_ice_shelves_polys_gen_z4 -> ne_50m_antarctic_ice_shelves_polys_gen_z3
DROP MATERIALIZED VIEW IF EXISTS ne_50m_antarctic_ice_shelves_polys_gen_z3 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_antarctic_ice_shelves_polys_gen_z3 AS
(
SELECT
ST_Simplify(geometry, ZRes(5)) as geometry,
subclass
FROM ne_50m_antarctic_ice_shelves_polys_gen_z4
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_antarctic_ice_shelves_polys_gen_z3_idx ON ne_50m_antarctic_ice_shelves_polys_gen_z3 USING gist (geometry);
-- etldoc: ne_50m_antarctic_ice_shelves_polys_gen_z3 -> ne_50m_antarctic_ice_shelves_polys_gen_z2
DROP MATERIALIZED VIEW IF EXISTS ne_50m_antarctic_ice_shelves_polys_gen_z2 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_antarctic_ice_shelves_polys_gen_z2 AS
(
SELECT
ST_Simplify(geometry, ZRes(4)) as geometry,
subclass
FROM ne_50m_antarctic_ice_shelves_polys_gen_z3
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_antarctic_ice_shelves_polys_gen_z2_idx ON ne_50m_antarctic_ice_shelves_polys_gen_z2 USING gist (geometry);
-- ne_50m_glaciated_areas
-- etldoc: ne_50m_glaciated_areas -> ne_50m_glaciated_areas_gen_z4
DROP MATERIALIZED VIEW IF EXISTS ne_50m_glaciated_areas_gen_z4 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_glaciated_areas_gen_z4 AS
(
SELECT
ST_Simplify(geometry, ZRes(6)) as geometry,
'glacier'::text AS subclass
FROM ne_50m_glaciated_areas
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_glaciated_areas_gen_z4_idx ON ne_50m_glaciated_areas_gen_z4 USING gist (geometry);
-- etldoc: ne_50m_glaciated_areas_gen_z4 -> ne_50m_glaciated_areas_gen_z3
DROP MATERIALIZED VIEW IF EXISTS ne_50m_glaciated_areas_gen_z3 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_glaciated_areas_gen_z3 AS
(
SELECT
ST_Simplify(geometry, ZRes(5)) as geometry,
subclass
FROM ne_50m_glaciated_areas_gen_z4
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_glaciated_areas_gen_z3_idx ON ne_50m_glaciated_areas_gen_z3 USING gist (geometry);
-- etldoc: ne_50m_glaciated_areas_gen_z3 -> ne_50m_glaciated_areas_gen_z2
DROP MATERIALIZED VIEW IF EXISTS ne_50m_glaciated_areas_gen_z2 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_glaciated_areas_gen_z2 AS
(
SELECT
ST_Simplify(geometry, ZRes(4)) as geometry,
subclass
FROM ne_50m_glaciated_areas_gen_z3
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_glaciated_areas_gen_z2_idx ON ne_50m_glaciated_areas_gen_z2 USING gist (geometry);
-- ne_10m_glaciated_areas
-- etldoc: ne_10m_glaciated_areas -> ne_10m_glaciated_areas_gen_z6
DROP MATERIALIZED VIEW IF EXISTS ne_10m_glaciated_areas_gen_z6 CASCADE;
CREATE MATERIALIZED VIEW ne_10m_glaciated_areas_gen_z6 AS
(
SELECT
ST_Simplify(geometry, ZRes(8)) as geometry,
'glacier'::text AS subclass
FROM ne_10m_glaciated_areas
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_10m_glaciated_areas_gen_z6_idx ON ne_10m_glaciated_areas_gen_z6 USING gist (geometry);
-- etldoc: ne_10m_glaciated_areas_gen_z6 -> ne_10m_glaciated_areas_gen_z5
DROP MATERIALIZED VIEW IF EXISTS ne_10m_glaciated_areas_gen_z5 CASCADE;
CREATE MATERIALIZED VIEW ne_10m_glaciated_areas_gen_z5 AS
(
SELECT
ST_Simplify(geometry, ZRes(7)) as geometry,
subclass
FROM ne_10m_glaciated_areas_gen_z6
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_10m_glaciated_areas_gen_z5_idx ON ne_10m_glaciated_areas_gen_z5 USING gist (geometry);
-- ne_10m_antarctic_ice_shelves_polys
-- etldoc: ne_10m_antarctic_ice_shelves_polys -> ne_10m_antarctic_ice_shelves_polys_gen_z6
DROP MATERIALIZED VIEW IF EXISTS ne_10m_antarctic_ice_shelves_polys_gen_z6 CASCADE;
CREATE MATERIALIZED VIEW ne_10m_antarctic_ice_shelves_polys_gen_z6 AS
(
SELECT
ST_Simplify(geometry, ZRes(8)) as geometry,
'ice_shelf'::text AS subclass
FROM ne_10m_antarctic_ice_shelves_polys
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_10m_antarctic_ice_shelves_polys_gen_z6_idx ON ne_10m_antarctic_ice_shelves_polys_gen_z6 USING gist (geometry);
-- etldoc: ne_10m_antarctic_ice_shelves_polys_gen_z6 -> ne_10m_antarctic_ice_shelves_polys_gen_z5
DROP MATERIALIZED VIEW IF EXISTS ne_10m_antarctic_ice_shelves_polys_gen_z5 CASCADE;
CREATE MATERIALIZED VIEW ne_10m_antarctic_ice_shelves_polys_gen_z5 AS
(
SELECT
ST_Simplify(geometry, ZRes(7)) as geometry,
subclass
FROM ne_10m_antarctic_ice_shelves_polys_gen_z6
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_10m_antarctic_ice_shelves_polys_gen_z5_idx ON ne_10m_antarctic_ice_shelves_polys_gen_z5 USING gist (geometry);
-- etldoc: ne_110m_glaciated_areas_gen_z0 -> 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 SELECT
FROM ne_110m_glaciated_areas geometry,
subclass
FROM ne_110m_glaciated_areas_gen_z0
);
-- etldoc: ne_110m_glaciated_areas_gen_z1 -> landcover_z1
CREATE OR REPLACE VIEW landcover_z1 AS
(
SELECT
geometry,
subclass
FROM ne_110m_glaciated_areas_gen_z1
); );
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_gen_z2 -> landcover_z2
SELECT NULL::bigint AS osm_id, geometry, 'glacier'::text AS subclass SELECT
FROM ne_50m_glaciated_areas geometry,
subclass
FROM ne_50m_glaciated_areas_gen_z2
UNION ALL UNION ALL
-- etldoc: ne_50m_antarctic_ice_shelves_polys -> landcover_z2 -- etldoc: ne_50m_antarctic_ice_shelves_polys_gen_z2 -> landcover_z2
SELECT NULL::bigint AS osm_id, geometry, 'ice_shelf'::text AS subclass SELECT
FROM ne_50m_antarctic_ice_shelves_polys geometry,
subclass
FROM ne_50m_antarctic_ice_shelves_polys_gen_z2
);
CREATE OR REPLACE VIEW landcover_z3 AS
(
-- etldoc: ne_50m_glaciated_areas_gen_z3 -> landcover_z3
SELECT
geometry,
subclass
FROM ne_50m_glaciated_areas_gen_z3
UNION ALL
-- etldoc: ne_50m_antarctic_ice_shelves_polys_gen_z3 -> landcover_z3
SELECT
geometry,
subclass
FROM ne_50m_antarctic_ice_shelves_polys_gen_z3
);
CREATE OR REPLACE VIEW landcover_z4 AS
(
-- etldoc: ne_50m_glaciated_areas_gen_z4 -> landcover_z4
SELECT
geometry,
subclass
FROM ne_50m_glaciated_areas_gen_z4
UNION ALL
-- etldoc: ne_50m_antarctic_ice_shelves_polys_gen_z4 -> landcover_z4
SELECT
geometry,
subclass
FROM ne_50m_antarctic_ice_shelves_polys_gen_z4
); );
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_gen_z5 -> landcover_z5
SELECT NULL::bigint AS osm_id, geometry, 'glacier'::text AS subclass SELECT
FROM ne_10m_glaciated_areas geometry,
subclass
FROM ne_10m_glaciated_areas_gen_z5
UNION ALL UNION ALL
-- etldoc: ne_10m_antarctic_ice_shelves_polys -> landcover_z5 -- etldoc: ne_10m_antarctic_ice_shelves_polys_gen_z5 -> landcover_z5
SELECT NULL::bigint AS osm_id, geometry, 'ice_shelf'::text AS subclass SELECT
FROM ne_10m_antarctic_ice_shelves_polys geometry,
subclass
FROM ne_10m_antarctic_ice_shelves_polys_gen_z5
); );
CREATE OR REPLACE VIEW landcover_z7 AS CREATE OR REPLACE VIEW landcover_z6 AS
( (
-- etldoc: osm_landcover_polygon_gen7 -> landcover_z7 -- etldoc: ne_10m_glaciated_areas_gen_z6 -> landcover_z6
SELECT osm_id, geometry, subclass SELECT
FROM osm_landcover_polygon_gen7 geometry,
subclass
FROM ne_10m_glaciated_areas_gen_z6
UNION ALL
-- etldoc: ne_10m_antarctic_ice_shelves_polys_gen_z6 -> landcover_z6
SELECT
geometry,
subclass
FROM ne_10m_antarctic_ice_shelves_polys_gen_z6
); );
CREATE OR REPLACE VIEW landcover_z8 AS -- etldoc: layer_landcover[shape=record fillcolor=lightpink, style="rounded, filled", label="layer_landcover | <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: osm_landcover_polygon_gen6 -> landcover_z8
SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen6
);
CREATE OR REPLACE VIEW landcover_z9 AS
(
-- etldoc: osm_landcover_polygon_gen5 -> landcover_z9
SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen5
);
CREATE OR REPLACE VIEW landcover_z10 AS
(
-- etldoc: osm_landcover_polygon_gen4 -> landcover_z10
SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen4
);
CREATE OR REPLACE VIEW landcover_z11 AS
(
-- etldoc: osm_landcover_polygon_gen3 -> landcover_z11
SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen3
);
CREATE OR REPLACE VIEW landcover_z12 AS
(
-- etldoc: osm_landcover_polygon_gen2 -> landcover_z12
SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen2
);
CREATE OR REPLACE VIEW landcover_z13 AS
(
-- etldoc: osm_landcover_polygon_gen1 -> landcover_z13
SELECT osm_id, geometry, subclass
FROM osm_landcover_polygon_gen1
);
CREATE OR REPLACE VIEW landcover_z14 AS
(
-- etldoc: osm_landcover_polygon -> landcover_z14
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+" ] ;
CREATE OR REPLACE FUNCTION layer_landcover(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_landcover(bbox geometry, zoom_level int)
RETURNS TABLE RETURNS TABLE
( (
osm_id bigint,
geometry geometry, geometry geometry,
class text, class text,
subclass text subclass text
) )
AS AS
$$ $$
SELECT osm_id, SELECT geometry,
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
SELECT * SELECT geometry,
subclass
FROM landcover_z0 FROM landcover_z0
WHERE zoom_level BETWEEN 0 AND 1 WHERE zoom_level = 0
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z2 -> layer_landcover:z2_4 -- etldoc: landcover_z1 -> layer_landcover:z1
SELECT * SELECT geometry,
subclass
FROM landcover_z1
WHERE zoom_level = 1
AND geometry && bbox
UNION ALL
-- etldoc: landcover_z2 -> layer_landcover:z2
SELECT geometry,
subclass
FROM landcover_z2 FROM landcover_z2
WHERE zoom_level BETWEEN 2 AND 4 WHERE zoom_level = 2
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z5 -> layer_landcover:z5_6 -- etldoc: landcover_z3 -> layer_landcover:z3
SELECT * SELECT geometry,
subclass
FROM landcover_z3
WHERE zoom_level = 3
AND geometry && bbox
UNION ALL
-- etldoc: landcover_z4 -> layer_landcover:z4
SELECT geometry,
subclass
FROM landcover_z4
WHERE zoom_level = 4
AND geometry && bbox
UNION ALL
-- etldoc: landcover_z5 -> layer_landcover:z5
SELECT geometry,
subclass
FROM landcover_z5 FROM landcover_z5
WHERE zoom_level BETWEEN 5 AND 6 WHERE zoom_level = 5
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z7 -> layer_landcover:z7 -- etldoc: landcover_z6 -> layer_landcover:z6
SELECT * SELECT geometry,
FROM landcover_z7 subclass
FROM landcover_z6
WHERE zoom_level = 6
AND geometry && bbox
UNION ALL
-- etldoc: osm_landcover_gen_z7 -> layer_landcover:z7
SELECT geometry,
subclass
FROM osm_landcover_gen_z7
WHERE zoom_level = 7 WHERE zoom_level = 7
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z8 -> layer_landcover:z8 -- etldoc: osm_landcover_gen_z8 -> layer_landcover:z8
SELECT * SELECT geometry,
FROM landcover_z8 subclass
FROM osm_landcover_gen_z8
WHERE zoom_level = 8 WHERE zoom_level = 8
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z9 -> layer_landcover:z9 -- etldoc: osm_landcover_gen_z9 -> layer_landcover:z9
SELECT * SELECT geometry,
FROM landcover_z9 subclass
FROM osm_landcover_gen_z9
WHERE zoom_level = 9 WHERE zoom_level = 9
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z10 -> layer_landcover:z10 -- etldoc: osm_landcover_gen_z10 -> layer_landcover:z10
SELECT * SELECT geometry,
FROM landcover_z10 subclass
FROM osm_landcover_gen_z10
WHERE zoom_level = 10 WHERE zoom_level = 10
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z11 -> layer_landcover:z11 -- etldoc: osm_landcover_gen_z11 -> layer_landcover:z11
SELECT * SELECT geometry,
FROM landcover_z11 subclass
FROM osm_landcover_gen_z11
WHERE zoom_level = 11 WHERE zoom_level = 11
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z12 -> layer_landcover:z12 -- etldoc: osm_landcover_gen_z12 -> layer_landcover:z12
SELECT * SELECT geometry,
FROM landcover_z12 subclass
FROM osm_landcover_gen_z12
WHERE zoom_level = 12 WHERE zoom_level = 12
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z13 -> layer_landcover:z13 -- etldoc: osm_landcover_gen_z13 -> layer_landcover:z13
SELECT * SELECT geometry,
FROM landcover_z13 subclass
FROM osm_landcover_gen_z13
WHERE zoom_level = 13 WHERE zoom_level = 13
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: landcover_z14 -> layer_landcover:z14_ -- etldoc: osm_landcover_polygon -> layer_landcover:z14_
SELECT * SELECT geometry,
FROM landcover_z14 subclass
FROM osm_landcover_polygon
WHERE zoom_level >= 14 WHERE zoom_level >= 14
AND geometry && bbox AND geometry && bbox
) AS zoom_levels; ) AS zoom_levels;
$$ LANGUAGE SQL STABLE $$ LANGUAGE SQL STABLE
-- STRICT -- STRICT
PARALLEL SAFE; PARALLEL SAFE;

View File

@ -73,6 +73,7 @@ layer:
geometry_field: geometry geometry_field: geometry
query: (SELECT geometry, class, subclass FROM layer_landcover(!bbox!, z(!scale_denominator!))) AS t query: (SELECT geometry, class, subclass FROM layer_landcover(!bbox!, z(!scale_denominator!))) AS t
schema: schema:
- ./generalized.sql
- ./landcover.sql - ./landcover.sql
datasources: datasources:
- type: imposm3 - type: imposm3

View File

@ -1,48 +1,3 @@
generalized_tables:
# etldoc: imposm3 -> osm_landcover_polygon_gen7
landcover_polygon_gen7:
source: landcover_polygon_gen6
sql_filter: area>power(ZRES5,2)
tolerance: ZRES7
# etldoc: imposm3 -> osm_landcover_polygon_gen6
landcover_polygon_gen6:
source: landcover_polygon_gen5
sql_filter: area>power(ZRES6,2)
tolerance: ZRES8
# etldoc: imposm3 -> osm_landcover_polygon_gen5
landcover_polygon_gen5:
source: landcover_polygon_gen4
sql_filter: area>power(ZRES7,2)
tolerance: ZRES9
# etldoc: imposm3 -> osm_landcover_polygon_gen4
landcover_polygon_gen4:
source: landcover_polygon_gen3
sql_filter: area>power(ZRES8,2)
tolerance: ZRES10
# etldoc: imposm3 -> osm_landcover_polygon_gen3
landcover_polygon_gen3:
source: landcover_polygon_gen2
sql_filter: area>power(ZRES8,2)
tolerance: ZRES11
# etldoc: imposm3 -> osm_landcover_polygon_gen2
landcover_polygon_gen2:
source: landcover_polygon_gen1
sql_filter: area>power(ZRES9,2)
tolerance: ZRES12
# etldoc: imposm3 -> osm_landcover_polygon_gen1
landcover_polygon_gen1:
source: landcover_polygon
sql_filter: area>power(ZRES10,2) AND ST_IsValid(geometry)
tolerance: ZRES13
tables: tables:
# etldoc: imposm3 -> osm_landcover_polygon # etldoc: imposm3 -> osm_landcover_polygon
landcover_polygon: landcover_polygon:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 176 KiB

View File

@ -1,156 +1,44 @@
-- etldoc: ne_50m_urban_areas -> landuse_z4 -- ne_50m_urban_areas
CREATE OR REPLACE VIEW landuse_z4 AS -- etldoc: ne_50m_urban_areas -> ne_50m_urban_areas_gen_z5
DROP MATERIALIZED VIEW IF EXISTS ne_50m_urban_areas_gen_z5 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_urban_areas_gen_z5 AS
( (
SELECT NULL::bigint AS osm_id, SELECT
geometry, NULL::bigint AS osm_id,
ST_Simplify(geometry, ZRes(7)) as geometry,
'residential'::text AS landuse, 'residential'::text AS landuse,
NULL::text AS amenity, NULL::text AS amenity,
NULL::text AS leisure, NULL::text AS leisure,
NULL::text AS tourism, NULL::text AS tourism,
NULL::text AS place, NULL::text AS place,
NULL::text AS waterway, NULL::text AS waterway,
NULL::text AS man_made NULL::text AS man_made,
scalerank
FROM ne_50m_urban_areas FROM ne_50m_urban_areas
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_urban_areas_gen_z5_idx ON ne_50m_urban_areas_gen_z5 USING gist (geometry);
-- etldoc: ne_50m_urban_areas_gen_z5 -> ne_50m_urban_areas_gen_z4
DROP MATERIALIZED VIEW IF EXISTS ne_50m_urban_areas_gen_z4 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_urban_areas_gen_z4 AS
(
SELECT
osm_id,
ST_Simplify(geometry, ZRes(6)) as geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM ne_50m_urban_areas_gen_z5
WHERE scalerank <= 2 WHERE scalerank <= 2
); ) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_urban_areas_gen_z4_idx ON ne_50m_urban_areas_gen_z4 USING gist (geometry);
-- etldoc: ne_50m_urban_areas -> landuse_z5
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,
NULL::text AS man_made
FROM ne_50m_urban_areas
);
-- etldoc: osm_landuse_polygon_gen7 -> landuse_z6
CREATE OR REPLACE VIEW landuse_z6 AS
(
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen7
);
-- etldoc: osm_landuse_polygon_gen6 -> landuse_z8
CREATE OR REPLACE VIEW landuse_z8 AS
(
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen6
);
-- etldoc: osm_landuse_polygon_gen5 -> landuse_z9
CREATE OR REPLACE VIEW landuse_z9 AS
(
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen5
);
-- etldoc: osm_landuse_polygon_gen4 -> landuse_z10
CREATE OR REPLACE VIEW landuse_z10 AS
(
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen4
);
-- etldoc: osm_landuse_polygon_gen3 -> landuse_z11
CREATE OR REPLACE VIEW landuse_z11 AS
(
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen3
);
-- etldoc: osm_landuse_polygon_gen2 -> landuse_z12
CREATE OR REPLACE VIEW landuse_z12 AS
(
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen2
);
-- etldoc: osm_landuse_polygon_gen1 -> landuse_z13
CREATE OR REPLACE VIEW landuse_z13 AS
(
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen1
);
-- etldoc: osm_landuse_polygon -> landuse_z14
CREATE OR REPLACE VIEW landuse_z14 AS
(
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon
);
-- etldoc: layer_landuse[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_landuse[shape=record fillcolor=lightpink, style="rounded,filled",
-- 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 RETURNS TABLE
@ -173,55 +61,147 @@ SELECT osm_id,
NULLIF(man_made, '') NULLIF(man_made, '')
) AS class ) AS class
FROM ( FROM (
-- etldoc: landuse_z4 -> layer_landuse:z4 -- etldoc: ne_50m_urban_areas_gen_z4 -> layer_landuse:z4
SELECT * SELECT osm_id,
FROM landuse_z4 geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM ne_50m_urban_areas_gen_z4
WHERE zoom_level = 4 WHERE zoom_level = 4
UNION ALL UNION ALL
-- etldoc: landuse_z5 -> layer_landuse:z5 -- etldoc: ne_50m_urban_areas_gen_z5 -> layer_landuse:z5
SELECT * SELECT osm_id,
FROM landuse_z5 geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM ne_50m_urban_areas_gen_z5
WHERE zoom_level = 5 WHERE zoom_level = 5
UNION ALL UNION ALL
-- etldoc: landuse_z6 -> layer_landuse:z6 -- etldoc: osm_landuse_polygon_gen_z6 -> layer_landuse:z6
-- etldoc: landuse_z6 -> layer_landuse:z7 SELECT osm_id,
SELECT * geometry,
FROM landuse_z6 landuse,
WHERE zoom_level BETWEEN 6 AND 7 amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen_z6
WHERE zoom_level = 6
UNION ALL UNION ALL
-- etldoc: landuse_z8 -> layer_landuse:z8 -- etldoc: osm_landuse_polygon_gen_z7 -> layer_landuse:z7
SELECT * SELECT osm_id,
FROM landuse_z8 geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen_z7
WHERE zoom_level = 7
UNION ALL
-- etldoc: osm_landuse_polygon_gen_z8 -> layer_landuse:z8
SELECT osm_id,
geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen_z8
WHERE zoom_level = 8 WHERE zoom_level = 8
UNION ALL UNION ALL
-- etldoc: landuse_z9 -> layer_landuse:z9 -- etldoc: osm_landuse_polygon_gen_z9 -> layer_landuse:z9
SELECT * SELECT osm_id,
FROM landuse_z9 geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen_z9
WHERE zoom_level = 9 WHERE zoom_level = 9
UNION ALL UNION ALL
-- etldoc: landuse_z10 -> layer_landuse:z10 -- etldoc: osm_landuse_polygon_gen_z10 -> layer_landuse:z10
SELECT * SELECT osm_id,
FROM landuse_z10 geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen_z10
WHERE zoom_level = 10 WHERE zoom_level = 10
UNION ALL UNION ALL
-- etldoc: landuse_z11 -> layer_landuse:z11 -- etldoc: osm_landuse_polygon_gen_z11 -> layer_landuse:z11
SELECT * SELECT osm_id,
FROM landuse_z11 geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen_z11
WHERE zoom_level = 11 WHERE zoom_level = 11
UNION ALL UNION ALL
-- etldoc: landuse_z12 -> layer_landuse:z12 -- etldoc: osm_landuse_polygon_gen_z12 -> layer_landuse:z12
SELECT * SELECT osm_id,
FROM landuse_z12 geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen_z12
WHERE zoom_level = 12 WHERE zoom_level = 12
UNION ALL UNION ALL
-- etldoc: landuse_z13 -> layer_landuse:z13 -- etldoc: osm_landuse_polygon_gen_z13 -> layer_landuse:z13
SELECT * SELECT osm_id,
FROM landuse_z13 geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon_gen_z13
WHERE zoom_level = 13 WHERE zoom_level = 13
UNION ALL UNION ALL
-- etldoc: landuse_z14 -> layer_landuse:z14 -- etldoc: osm_landuse_polygon -> layer_landuse:z14
SELECT * SELECT osm_id,
FROM landuse_z14 geometry,
landuse,
amenity,
leisure,
tourism,
place,
waterway,
man_made
FROM osm_landuse_polygon
WHERE zoom_level >= 14 WHERE zoom_level >= 14
) AS zoom_levels ) AS zoom_levels
WHERE geometry && bbox; WHERE geometry && bbox;

View File

@ -22,6 +22,7 @@ layer:
- residential - residential
- commercial - commercial
- industrial - industrial
- garages
- retail - retail
- bus_station - bus_station
- school - school
@ -37,6 +38,7 @@ layer:
- theme_park - theme_park
- zoo - zoo
- suburb - suburb
- quarter
- neighbourhood - neighbourhood
- dam - dam
- sports_centre - sports_centre

View File

@ -1,35 +1,41 @@
generalized_tables: generalized_tables:
# etldoc: imposm3 -> osm_landuse_polygon_gen7 # etldoc: osm_landuse_polygon_gen_z7 -> osm_landuse_polygon_gen_z6
landuse_polygon_gen7: landuse_polygon_gen_z6:
source: landuse_polygon_gen6 source: landuse_polygon_gen_z7
tolerance: ZRES6
sql_filter: area>power(ZRES6,2)
# etldoc: osm_landuse_polygon_gen_z8 -> osm_landuse_polygon_gen_z7
landuse_polygon_gen_z7:
source: landuse_polygon_gen_z8
tolerance: ZRES7 tolerance: ZRES7
# etldoc: imposm3 -> osm_landuse_polygon_gen6 sql_filter: area>power(ZRES6,2)
landuse_polygon_gen6: # etldoc: osm_landuse_polygon_gen_z9 -> osm_landuse_polygon_gen_z8
source: landuse_polygon_gen5 landuse_polygon_gen_z8:
sql_filter: area>power(ZRES6,2) AND (landuse='residential' OR place='suburb' OR place='neighbourhood') source: landuse_polygon_gen_z9
sql_filter: area>power(ZRES6,2) AND (landuse='residential' OR place='suburb' OR place='quarter' OR place='neighbourhood')
tolerance: ZRES8 tolerance: ZRES8
# etldoc: imposm3 -> osm_landuse_polygon_gen5 # etldoc: osm_landuse_polygon_gen_z10 -> osm_landuse_polygon_gen_z9
landuse_polygon_gen5: landuse_polygon_gen_z9:
source: landuse_polygon_gen4 source: landuse_polygon_gen_z10
sql_filter: area>power(ZRES7,2) sql_filter: area>power(ZRES7,2)
tolerance: ZRES9 tolerance: ZRES9
# etldoc: imposm3 -> osm_landuse_polygon_gen4 # etldoc: osm_landuse_polygon_gen_z11 -> osm_landuse_polygon_gen_z10
landuse_polygon_gen4: landuse_polygon_gen_z10:
source: landuse_polygon_gen3 source: landuse_polygon_gen_z11
sql_filter: area>power(ZRES8,2) sql_filter: area>power(ZRES8,2)
tolerance: ZRES10 tolerance: ZRES10
# etldoc: imposm3 -> osm_landuse_polygon_gen3 # etldoc: osm_landuse_polygon_gen_z12 -> osm_landuse_polygon_gen_z11
landuse_polygon_gen3: landuse_polygon_gen_z11:
source: landuse_polygon_gen2 source: landuse_polygon_gen_z12
sql_filter: area>power(ZRES9,2) sql_filter: area>power(ZRES9,2)
tolerance: ZRES11 tolerance: ZRES11
# etldoc: imposm3 -> osm_landuse_polygon_gen2 # etldoc: osm_landuse_polygon_gen_z13 -> osm_landuse_polygon_gen_z12
landuse_polygon_gen2: landuse_polygon_gen_z12:
source: landuse_polygon_gen1 source: landuse_polygon_gen_z13
sql_filter: area>power(ZRES10,2) sql_filter: area>power(ZRES10,2)
tolerance: ZRES12 tolerance: ZRES12
# etldoc: imposm3 -> osm_landuse_polygon_gen1 # etldoc: osm_landuse_polygon -> osm_landuse_polygon_gen_z13
landuse_polygon_gen1: landuse_polygon_gen_z13:
source: landuse_polygon source: landuse_polygon
sql_filter: area>power(ZRES11,2) AND ST_IsValid(geometry) sql_filter: area>power(ZRES11,2) AND ST_IsValid(geometry)
tolerance: ZRES13 tolerance: ZRES13
@ -104,6 +110,7 @@ tables:
- picnic_site - picnic_site
place: place:
- suburb - suburb
- quarter
- neighbourhood - neighbourhood
waterway: waterway:
- dam - dam

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

@ -35,10 +35,10 @@ FROM (
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, 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)
@ -47,7 +47,7 @@ FROM (
(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

View File

@ -25,7 +25,7 @@ layer:
query: (SELECT osm_id, geometry, name, name_en, name_de, {name_languages}, class, ele, ele_ft, rank FROM layer_mountain_peak(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t query: (SELECT osm_id, geometry, name, name_en, name_de, {name_languages}, class, ele, ele_ft, rank FROM layer_mountain_peak(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t
schema: schema:
- ./update_peak_point.sql - ./update_peak_point.sql
- ./layer.sql - ./mountain_peak.sql
datasources: datasources:
- type: imposm3 - type: imposm3
mapping_file: ./mapping.yaml mapping_file: ./mapping.yaml

View File

@ -1,33 +1,86 @@
DROP TRIGGER IF EXISTS trigger_update_point ON osm_peak_point; DROP TRIGGER IF EXISTS trigger_flag ON osm_peak_point;
DROP TRIGGER IF EXISTS trigger_store ON osm_peak_point;
-- etldoc: osm_peak_point -> osm_peak_point DROP TRIGGER IF EXISTS trigger_refresh ON mountain_peak_point.updates;
-- etldoc: osm_peak_point -> osm_peak_point
CREATE OR REPLACE FUNCTION update_osm_peak_point(new_osm_id bigint) RETURNS void AS
$$
UPDATE osm_peak_point
SET tags = update_tags(tags, geometry)
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;
SELECT update_osm_peak_point(NULL);
-- Handle updates
CREATE SCHEMA IF NOT EXISTS mountain_peak_point; CREATE SCHEMA IF NOT EXISTS mountain_peak_point;
CREATE OR REPLACE FUNCTION mountain_peak_point.update() RETURNS trigger AS CREATE TABLE IF NOT EXISTS mountain_peak_point.osm_ids
(
osm_id bigint
);
-- etldoc: osm_peak_point -> osm_peak_point
CREATE OR REPLACE FUNCTION update_osm_peak_point(full_update boolean) RETURNS void AS
$$
UPDATE osm_peak_point
SET tags = update_tags(tags, geometry)
WHERE (full_update OR osm_id IN (SELECT osm_id FROM mountain_peak_point.osm_ids))
AND COALESCE(tags -> 'name:latin', tags -> 'name:nonlatin', tags -> 'name_int') IS NULL
AND tags != update_tags(tags, geometry)
$$ LANGUAGE SQL;
SELECT update_osm_peak_point(true);
-- Handle updates
CREATE OR REPLACE FUNCTION mountain_peak_point.store() RETURNS trigger AS
$$ $$
BEGIN BEGIN
PERFORM update_osm_peak_point(new.osm_id); IF (tg_op = 'DELETE') THEN
INSERT INTO mountain_peak_point.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO mountain_peak_point.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE CONSTRAINT TRIGGER trigger_update_point CREATE TABLE IF NOT EXISTS mountain_peak_point.updates
AFTER INSERT OR UPDATE (
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION mountain_peak_point.flag() RETURNS trigger AS
$$
BEGIN
INSERT INTO mountain_peak_point.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION mountain_peak_point.refresh() RETURNS trigger AS
$$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN
RAISE LOG 'Refresh mountain_peak_point';
PERFORM update_osm_peak_point(false);
-- noinspection SqlWithoutWhere
DELETE FROM mountain_peak_point.osm_ids;
-- noinspection SqlWithoutWhere
DELETE FROM mountain_peak_point.updates;
RAISE LOG 'Refresh mountain_peak_point done in %', age(clock_timestamp(), t);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_peak_point ON osm_peak_point
FOR EACH ROW
EXECUTE PROCEDURE mountain_peak_point.store();
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.update(); EXECUTE PROCEDURE mountain_peak_point.refresh();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 144 KiB

View File

@ -1,48 +1,48 @@
generalized_tables: generalized_tables:
# etldoc: imposm3 -> osm_park_polygon_gen8 # etldoc: osm_park_polygon_gen_z7 -> osm_park_polygon_gen_z6
park_polygon_gen8: park_polygon_gen_z6:
source: park_polygon_gen7 source: park_polygon_gen_z7
sql_filter: area>power(ZRES5,2) sql_filter: area>power(ZRES5,2)
tolerance: ZRES8 tolerance: ZRES8
# etldoc: imposm3 -> osm_park_polygon_gen7 # etldoc: osm_park_polygon_gen_z8 -> osm_park_polygon_gen_z7
park_polygon_gen7: park_polygon_gen_z7:
source: park_polygon_gen6 source: park_polygon_gen_z8
sql_filter: area>power(ZRES6,2) sql_filter: area>power(ZRES6,2)
tolerance: ZRES8 tolerance: ZRES8
# etldoc: imposm3 -> osm_park_polygon_gen6 # etldoc: osm_park_polygon_gen_z9 -> osm_park_polygon_gen_z8
park_polygon_gen6: park_polygon_gen_z8:
source: park_polygon_gen5 source: park_polygon_gen_z9
sql_filter: area>power(ZRES7,2) sql_filter: area>power(ZRES7,2)
tolerance: ZRES9 tolerance: ZRES9
# etldoc: imposm3 -> osm_park_polygon_gen5 # etldoc: osm_park_polygon_gen_z10 -> osm_park_polygon_gen_z9
park_polygon_gen5: park_polygon_gen_z9:
source: park_polygon_gen4 source: park_polygon_gen_z10
sql_filter: area>power(ZRES8,2) sql_filter: area>power(ZRES8,2)
tolerance: ZRES10 tolerance: ZRES10
# etldoc: imposm3 -> osm_park_polygon_gen4 # etldoc: osm_park_polygon_gen_z11 -> osm_park_polygon_gen_z10
park_polygon_gen4: park_polygon_gen_z10:
source: park_polygon_gen3 source: park_polygon_gen_z11
sql_filter: area>power(ZRES9,2) sql_filter: area>power(ZRES9,2)
tolerance: ZRES11 tolerance: ZRES11
# etldoc: imposm3 -> osm_park_polygon_gen3 # etldoc: osm_park_polygon_gen_z12 -> osm_park_polygon_gen_z11
park_polygon_gen3: park_polygon_gen_z11:
source: park_polygon_gen2 source: park_polygon_gen_z12
sql_filter: area>power(ZRES10,2) sql_filter: area>power(ZRES10,2)
tolerance: ZRES11 tolerance: ZRES11
# etldoc: imposm3 -> osm_park_polygon_gen2 # etldoc: osm_park_polygon_gen_z13 -> osm_park_polygon_gen_z12
park_polygon_gen2: park_polygon_gen_z12:
source: park_polygon_gen1 source: park_polygon_gen_z13
sql_filter: area>power(ZRES11,2) sql_filter: area>power(ZRES11,2)
tolerance: ZRES12 tolerance: ZRES12
# etldoc: imposm3 -> osm_park_polygon_gen1 # etldoc: osm_park_polygon -> osm_park_polygon_gen_z13
park_polygon_gen1: park_polygon_gen_z13:
source: park_polygon source: park_polygon
sql_filter: area>power(ZRES12,2) AND ST_IsValid(geometry) sql_filter: area>power(ZRES12,2) AND ST_IsValid(geometry)
tolerance: ZRES13 tolerance: ZRES13

View File

@ -30,14 +30,14 @@ FROM (
LOWER(REPLACE(NULLIF(protection_title, ''), ' ', '_')), LOWER(REPLACE(NULLIF(protection_title, ''), ' ', '_')),
NULLIF(boundary, ''), NULLIF(boundary, ''),
NULLIF(leisure, '') NULLIF(leisure, '')
) AS class, ) AS class,
name, name,
name_en, name_en,
name_de, name_de,
tags, tags,
NULL::int AS rank NULL::int AS rank
FROM ( FROM (
-- etldoc: osm_park_polygon_gen8 -> layer_park:z6 -- etldoc: osm_park_polygon_gen_z6 -> layer_park:z6
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, name,
@ -47,11 +47,11 @@ FROM (
leisure, leisure,
boundary, boundary,
protection_title protection_title
FROM osm_park_polygon_gen8 FROM osm_park_polygon_gen_z6
WHERE zoom_level = 6 WHERE zoom_level = 6
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen7 -> layer_park:z7 -- etldoc: osm_park_polygon_gen_z7 -> layer_park:z7
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, name,
@ -61,11 +61,11 @@ FROM (
leisure, leisure,
boundary, boundary,
protection_title protection_title
FROM osm_park_polygon_gen7 FROM osm_park_polygon_gen_z7
WHERE zoom_level = 7 WHERE zoom_level = 7
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen6 -> layer_park:z8 -- etldoc: osm_park_polygon_gen_z8 -> layer_park:z8
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, name,
@ -75,11 +75,11 @@ FROM (
leisure, leisure,
boundary, boundary,
protection_title protection_title
FROM osm_park_polygon_gen6 FROM osm_park_polygon_gen_z8
WHERE zoom_level = 8 WHERE zoom_level = 8
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen5 -> layer_park:z9 -- etldoc: osm_park_polygon_gen_z9 -> layer_park:z9
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, name,
@ -89,11 +89,11 @@ FROM (
leisure, leisure,
boundary, boundary,
protection_title protection_title
FROM osm_park_polygon_gen5 FROM osm_park_polygon_gen_z9
WHERE zoom_level = 9 WHERE zoom_level = 9
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen4 -> layer_park:z10 -- etldoc: osm_park_polygon_gen_z10 -> layer_park:z10
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, name,
@ -103,11 +103,11 @@ FROM (
leisure, leisure,
boundary, boundary,
protection_title protection_title
FROM osm_park_polygon_gen4 FROM osm_park_polygon_gen_z10
WHERE zoom_level = 10 WHERE zoom_level = 10
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen3 -> layer_park:z11 -- etldoc: osm_park_polygon_gen_z11 -> layer_park:z11
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, name,
@ -117,11 +117,11 @@ FROM (
leisure, leisure,
boundary, boundary,
protection_title protection_title
FROM osm_park_polygon_gen3 FROM osm_park_polygon_gen_z11
WHERE zoom_level = 11 WHERE zoom_level = 11
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen2 -> layer_park:z12 -- etldoc: osm_park_polygon_gen_z12 -> layer_park:z12
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, name,
@ -131,11 +131,11 @@ FROM (
leisure, leisure,
boundary, boundary,
protection_title protection_title
FROM osm_park_polygon_gen2 FROM osm_park_polygon_gen_z12
WHERE zoom_level = 12 WHERE zoom_level = 12
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen1 -> layer_park:z13 -- etldoc: osm_park_polygon_gen_z13 -> layer_park:z13
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, name,
@ -145,7 +145,7 @@ FROM (
leisure, leisure,
boundary, boundary,
protection_title protection_title
FROM osm_park_polygon_gen1 FROM osm_park_polygon_gen_z13
WHERE zoom_level = 13 WHERE zoom_level = 13
AND geometry && bbox AND geometry && bbox
UNION ALL UNION ALL
@ -171,7 +171,7 @@ FROM (
LOWER(REPLACE(NULLIF(protection_title, ''), ' ', '_')), LOWER(REPLACE(NULLIF(protection_title, ''), ' ', '_')),
NULLIF(boundary, ''), NULLIF(boundary, ''),
NULLIF(leisure, '') NULLIF(leisure, '')
) AS class, ) AS class,
name, name,
name_en, name_en,
name_de, name_de,
@ -182,9 +182,9 @@ FROM (
(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_gen_z6 -> layer_park:z6
SELECT osm_id, SELECT osm_id,
geometry_point, geometry_point,
name, name,
@ -195,13 +195,13 @@ FROM (
boundary, boundary,
protection_title, protection_title,
area area
FROM osm_park_polygon_gen8 FROM osm_park_polygon_gen_z6
WHERE zoom_level = 6 WHERE zoom_level = 6
AND geometry_point && bbox AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level) AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen7 -> layer_park:z7 -- etldoc: osm_park_polygon_gen_z7 -> layer_park:z7
SELECT osm_id, SELECT osm_id,
geometry_point, geometry_point,
name, name,
@ -212,13 +212,13 @@ FROM (
boundary, boundary,
protection_title, protection_title,
area area
FROM osm_park_polygon_gen7 FROM osm_park_polygon_gen_z7
WHERE zoom_level = 7 WHERE zoom_level = 7
AND geometry_point && bbox AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level) AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen6 -> layer_park:z8 -- etldoc: osm_park_polygon_gen_z8 -> layer_park:z8
SELECT osm_id, SELECT osm_id,
geometry_point, geometry_point,
name, name,
@ -229,13 +229,13 @@ FROM (
boundary, boundary,
protection_title, protection_title,
area area
FROM osm_park_polygon_gen6 FROM osm_park_polygon_gen_z8
WHERE zoom_level = 8 WHERE zoom_level = 8
AND geometry_point && bbox AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level) AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen5 -> layer_park:z9 -- etldoc: osm_park_polygon_gen_z9 -> layer_park:z9
SELECT osm_id, SELECT osm_id,
geometry_point, geometry_point,
name, name,
@ -246,13 +246,13 @@ FROM (
boundary, boundary,
protection_title, protection_title,
area area
FROM osm_park_polygon_gen5 FROM osm_park_polygon_gen_z9
WHERE zoom_level = 9 WHERE zoom_level = 9
AND geometry_point && bbox AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level) AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen4 -> layer_park:z10 -- etldoc: osm_park_polygon_gen_z10 -> layer_park:z10
SELECT osm_id, SELECT osm_id,
geometry_point, geometry_point,
name, name,
@ -263,13 +263,13 @@ FROM (
boundary, boundary,
protection_title, protection_title,
area area
FROM osm_park_polygon_gen4 FROM osm_park_polygon_gen_z10
WHERE zoom_level = 10 WHERE zoom_level = 10
AND geometry_point && bbox AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level) AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen3 -> layer_park:z11 -- etldoc: osm_park_polygon_gen_z11 -> layer_park:z11
SELECT osm_id, SELECT osm_id,
geometry_point, geometry_point,
name, name,
@ -280,13 +280,13 @@ FROM (
boundary, boundary,
protection_title, protection_title,
area area
FROM osm_park_polygon_gen3 FROM osm_park_polygon_gen_z11
WHERE zoom_level = 11 WHERE zoom_level = 11
AND geometry_point && bbox AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level) AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen2 -> layer_park:z12 -- etldoc: osm_park_polygon_gen_z12 -> layer_park:z12
SELECT osm_id, SELECT osm_id,
geometry_point, geometry_point,
name, name,
@ -297,13 +297,13 @@ FROM (
boundary, boundary,
protection_title, protection_title,
area area
FROM osm_park_polygon_gen2 FROM osm_park_polygon_gen_z12
WHERE zoom_level = 12 WHERE zoom_level = 12
AND geometry_point && bbox AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level) AND area > 70000*2^(20-zoom_level)
UNION ALL UNION ALL
-- etldoc: osm_park_polygon_gen1 -> layer_park:z13 -- etldoc: osm_park_polygon_gen_z13 -> layer_park:z13
SELECT osm_id, SELECT osm_id,
geometry_point, geometry_point,
name, name,
@ -314,7 +314,7 @@ FROM (
boundary, boundary,
protection_title, protection_title,
area area
FROM osm_park_polygon_gen1 FROM osm_park_polygon_gen_z13
WHERE zoom_level = 13 WHERE zoom_level = 13
AND geometry_point && bbox AND geometry_point && bbox
AND area > 70000*2^(20-zoom_level) AND area > 70000*2^(20-zoom_level)

View File

@ -26,7 +26,7 @@ layer:
query: (SELECT geometry, class, name, name_en, name_de, {name_languages}, rank FROM layer_park(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t query: (SELECT geometry, class, name, name_en, name_de, {name_languages}, rank FROM layer_park(!bbox!, z(!scale_denominator!), !pixel_width!)) AS t
schema: schema:
- ./update_park_polygon.sql - ./update_park_polygon.sql
- ./layer.sql - ./park.sql
datasources: datasources:
- type: imposm3 - type: imposm3
mapping_file: ./mapping.yaml mapping_file: ./mapping.yaml

View File

@ -1,41 +1,41 @@
ALTER TABLE osm_park_polygon ALTER TABLE osm_park_polygon
ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen1 ALTER TABLE osm_park_polygon_gen_z13
ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen2 ALTER TABLE osm_park_polygon_gen_z12
ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen3 ALTER TABLE osm_park_polygon_gen_z11
ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen4 ALTER TABLE osm_park_polygon_gen_z10
ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen5 ALTER TABLE osm_park_polygon_gen_z9
ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen6 ALTER TABLE osm_park_polygon_gen_z8
ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen7 ALTER TABLE osm_park_polygon_gen_z7
ADD COLUMN IF NOT EXISTS geometry_point geometry; ADD COLUMN IF NOT EXISTS geometry_point geometry;
ALTER TABLE osm_park_polygon_gen8 ALTER TABLE osm_park_polygon_gen_z6
ADD COLUMN IF NOT EXISTS geometry_point geometry; 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_gen_z13;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen2; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z12;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen3; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z11;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen4; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z10;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen5; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z9;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen6; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z8;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen7; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z7;
DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen8; DROP TRIGGER IF EXISTS update_row ON osm_park_polygon_gen_z6;
-- etldoc: osm_park_polygon -> osm_park_polygon -- etldoc: osm_park_polygon -> osm_park_polygon
-- etldoc: osm_park_polygon_gen1 -> osm_park_polygon_gen1 -- etldoc: osm_park_polygon_gen_z13 -> osm_park_polygon_gen_z13
-- etldoc: osm_park_polygon_gen2 -> osm_park_polygon_gen2 -- etldoc: osm_park_polygon_gen_z12 -> osm_park_polygon_gen_z12
-- etldoc: osm_park_polygon_gen3 -> osm_park_polygon_gen3 -- etldoc: osm_park_polygon_gen_z11 -> osm_park_polygon_gen_z11
-- etldoc: osm_park_polygon_gen4 -> osm_park_polygon_gen4 -- etldoc: osm_park_polygon_gen_z10 -> osm_park_polygon_gen_z10
-- etldoc: osm_park_polygon_gen5 -> osm_park_polygon_gen5 -- etldoc: osm_park_polygon_gen_z9 -> osm_park_polygon_gen_z9
-- etldoc: osm_park_polygon_gen6 -> osm_park_polygon_gen6 -- etldoc: osm_park_polygon_gen_z8 -> osm_park_polygon_gen_z8
-- etldoc: osm_park_polygon_gen7 -> osm_park_polygon_gen7 -- etldoc: osm_park_polygon_gen_z7 -> osm_park_polygon_gen_z7
-- etldoc: osm_park_polygon_gen8 -> osm_park_polygon_gen8 -- etldoc: osm_park_polygon_gen_z6 -> osm_park_polygon_gen_z6
CREATE OR REPLACE FUNCTION update_osm_park_polygon() RETURNS void AS CREATE OR REPLACE FUNCTION update_osm_park_polygon() RETURNS void AS
$$ $$
BEGIN BEGIN
@ -43,35 +43,35 @@ BEGIN
SET tags = update_tags(tags, geometry), SET tags = update_tags(tags, geometry),
geometry_point = st_centroid(geometry); geometry_point = st_centroid(geometry);
UPDATE osm_park_polygon_gen1 UPDATE osm_park_polygon_gen_z13
SET tags = update_tags(tags, geometry), SET tags = update_tags(tags, geometry),
geometry_point = st_centroid(geometry); geometry_point = st_centroid(geometry);
UPDATE osm_park_polygon_gen2 UPDATE osm_park_polygon_gen_z12
SET tags = update_tags(tags, geometry), SET tags = update_tags(tags, geometry),
geometry_point = st_centroid(geometry); geometry_point = st_centroid(geometry);
UPDATE osm_park_polygon_gen3 UPDATE osm_park_polygon_gen_z11
SET tags = update_tags(tags, geometry), SET tags = update_tags(tags, geometry),
geometry_point = st_centroid(geometry); geometry_point = st_centroid(geometry);
UPDATE osm_park_polygon_gen4 UPDATE osm_park_polygon_gen_z10
SET tags = update_tags(tags, geometry), SET tags = update_tags(tags, geometry),
geometry_point = st_centroid(geometry); geometry_point = st_centroid(geometry);
UPDATE osm_park_polygon_gen5 UPDATE osm_park_polygon_gen_z9
SET tags = update_tags(tags, geometry), SET tags = update_tags(tags, geometry),
geometry_point = st_centroid(geometry); geometry_point = st_centroid(geometry);
UPDATE osm_park_polygon_gen6 UPDATE osm_park_polygon_gen_z8
SET tags = update_tags(tags, geometry), SET tags = update_tags(tags, geometry),
geometry_point = st_centroid(geometry); geometry_point = st_centroid(geometry);
UPDATE osm_park_polygon_gen7 UPDATE osm_park_polygon_gen_z7
SET tags = update_tags(tags, geometry), SET tags = update_tags(tags, geometry),
geometry_point = st_centroid(geometry); geometry_point = st_centroid(geometry);
UPDATE osm_park_polygon_gen8 UPDATE osm_park_polygon_gen_z6
SET tags = update_tags(tags, geometry), SET tags = update_tags(tags, geometry),
geometry_point = st_centroid(geometry); geometry_point = st_centroid(geometry);
@ -80,14 +80,14 @@ $$ LANGUAGE plpgsql;
SELECT update_osm_park_polygon(); SELECT update_osm_park_polygon();
CREATE INDEX IF NOT EXISTS osm_park_polygon_point_geom_idx ON osm_park_polygon USING gist (geometry_point); CREATE INDEX IF NOT EXISTS osm_park_polygon_point_geom_idx ON osm_park_polygon USING gist (geometry_point);
CREATE INDEX IF NOT EXISTS osm_park_polygon_gen1_point_geom_idx ON osm_park_polygon_gen1 USING gist (geometry_point); CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z13_point_geom_idx ON osm_park_polygon_gen_z13 USING gist (geometry_point);
CREATE INDEX IF NOT EXISTS osm_park_polygon_gen2_point_geom_idx ON osm_park_polygon_gen2 USING gist (geometry_point); CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z12_point_geom_idx ON osm_park_polygon_gen_z12 USING gist (geometry_point);
CREATE INDEX IF NOT EXISTS osm_park_polygon_gen3_point_geom_idx ON osm_park_polygon_gen3 USING gist (geometry_point); CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z11_point_geom_idx ON osm_park_polygon_gen_z11 USING gist (geometry_point);
CREATE INDEX IF NOT EXISTS osm_park_polygon_gen4_point_geom_idx ON osm_park_polygon_gen4 USING gist (geometry_point); CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z10_point_geom_idx ON osm_park_polygon_gen_z10 USING gist (geometry_point);
CREATE INDEX IF NOT EXISTS osm_park_polygon_gen5_point_geom_idx ON osm_park_polygon_gen5 USING gist (geometry_point); CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z9_point_geom_idx ON osm_park_polygon_gen_z9 USING gist (geometry_point);
CREATE INDEX IF NOT EXISTS osm_park_polygon_gen6_point_geom_idx ON osm_park_polygon_gen6 USING gist (geometry_point); CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z8_point_geom_idx ON osm_park_polygon_gen_z8 USING gist (geometry_point);
CREATE INDEX IF NOT EXISTS osm_park_polygon_gen7_point_geom_idx ON osm_park_polygon_gen7 USING gist (geometry_point); CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z7_point_geom_idx ON osm_park_polygon_gen_z7 USING gist (geometry_point);
CREATE INDEX IF NOT EXISTS osm_park_polygon_gen8_point_geom_idx ON osm_park_polygon_gen8 USING gist (geometry_point); CREATE INDEX IF NOT EXISTS osm_park_polygon_gen_z6_point_geom_idx ON osm_park_polygon_gen_z6 USING gist (geometry_point);
CREATE OR REPLACE FUNCTION update_osm_park_polygon_row() CREATE OR REPLACE FUNCTION update_osm_park_polygon_row()
@ -109,48 +109,48 @@ EXECUTE PROCEDURE update_osm_park_polygon_row();
CREATE TRIGGER update_row CREATE TRIGGER update_row
BEFORE INSERT OR UPDATE BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen1 ON osm_park_polygon_gen_z13
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 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen2 ON osm_park_polygon_gen_z12
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 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen3 ON osm_park_polygon_gen_z11
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 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen4 ON osm_park_polygon_gen_z10
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 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen5 ON osm_park_polygon_gen_z9
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 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen6 ON osm_park_polygon_gen_z8
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 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen7 ON osm_park_polygon_gen_z7
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 BEFORE INSERT OR UPDATE
ON osm_park_polygon_gen8 ON osm_park_polygon_gen_z6
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE update_osm_park_polygon_row(); EXECUTE PROCEDURE update_osm_park_polygon_row();

View File

@ -22,12 +22,12 @@ FROM (
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, 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, place,
"rank", "rank",
normalize_capital_level(capital) AS capital 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)
@ -37,17 +37,17 @@ FROM (
SELECT osm_id, SELECT osm_id,
geometry, geometry,
name, 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, place,
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, SELECT osm_id,
geometry, geometry,
name, 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, place,
@ -59,7 +59,7 @@ FROM (
place ASC NULLS LAST, place ASC NULLS LAST,
population DESC NULLS LAST, population DESC NULLS LAST,
length(name) ASC length(name) ASC
)::int AS gridrank )::int AS gridrank
FROM osm_city_point FROM osm_city_point
WHERE geometry && bbox WHERE geometry && bbox
AND ((zoom_level = 7 AND place <= 'town'::city_place AND ((zoom_level = 7 AND place <= 'town'::city_place

View File

@ -174,5 +174,6 @@ tables:
- village - village
- hamlet - hamlet
- suburb - suburb
- quarter
- neighbourhood - neighbourhood
- isolated_dwelling - isolated_dwelling

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -21,16 +21,16 @@ SELECT *
FROM ( FROM (
SELECT SELECT
-- etldoc: osm_continent_point -> layer_place:z0_3 -- etldoc: osm_continent_point -> layer_place:z0_3
osm_id * 10 AS osm_id, osm_id * 10 AS osm_id,
geometry, geometry,
name, 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, 'continent' AS class,
1 AS "rank", 1 AS "rank",
NULL::int AS capital, 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 WHERE geometry && bbox
AND zoom_level < 4 AND zoom_level < 4
@ -42,16 +42,16 @@ FROM (
-- 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
osm_id * 10 AS osm_id, osm_id * 10 AS osm_id,
geometry, geometry,
name, 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, 'country' AS class,
"rank", "rank",
NULL::int AS capital, 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 WHERE geometry && bbox
AND "rank" <= zoom_level + 1 AND "rank" <= zoom_level + 1
@ -64,39 +64,35 @@ FROM (
-- 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
osm_id * 10 AS osm_id, osm_id * 10 AS osm_id,
geometry, geometry,
name, 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, 'state' AS class,
"rank", "rank",
NULL::int AS capital, 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 WHERE geometry && bbox
AND name <> '' AND name <> ''
AND ("rank" + 2 <= zoom_level) AND zoom_level > 1
AND (
zoom_level >= 5 OR
is_in_country IN ('United Kingdom', 'USA', 'Россия', 'Brasil', 'China', 'India') OR
is_in_country_code IN ('AU', 'CN', 'IN', 'BR', 'US'))
UNION ALL UNION ALL
SELECT SELECT
-- etldoc: osm_island_point -> layer_place:z12_14 -- etldoc: osm_island_point -> layer_place:z12_14
osm_id * 10 AS osm_id, osm_id * 10 AS osm_id,
geometry, geometry,
name, 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' AS class,
7 AS "rank", 7 AS "rank",
NULL::int AS capital, 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
@ -106,16 +102,16 @@ FROM (
SELECT 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
osm_id * 10 AS osm_id, osm_id * 10 AS osm_id,
geometry, geometry,
name, 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' AS class,
island_rank(area) AS "rank", island_rank(area) AS "rank",
NULL::int AS capital, 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 WHERE geometry && bbox
AND ((zoom_level = 8 AND island_rank(area) <= 3) AND ((zoom_level = 8 AND island_rank(area) <= 3)
@ -138,7 +134,7 @@ FROM (
place::text AS class, place::text AS class,
"rank", "rank",
capital, 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

View File

@ -32,11 +32,12 @@ layer:
- village - village
- hamlet - hamlet
- suburb - suburb
- quarter
- neighbourhood - neighbourhood
- isolated_dwelling - isolated_dwelling
iso_a2: iso_a2:
description: | description: |
Two-letter country code [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Two-letter country code [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Available only for `class=country`.
Original value of the Original value of the
[`country_code_iso3166_1_alpha_2`](http://wiki.openstreetmap.org/wiki/Tag:place%3Dcountry) tag. [`country_code_iso3166_1_alpha_2`](http://wiki.openstreetmap.org/wiki/Tag:place%3Dcountry) tag.
rank: rank:
@ -72,7 +73,7 @@ schema:
- ./update_island_point.sql - ./update_island_point.sql
- ./update_state_point.sql - ./update_state_point.sql
- ./update_city_point.sql - ./update_city_point.sql
- ./layer.sql - ./place.sql
datasources: datasources:
- type: imposm3 - type: imposm3
mapping_file: ./mapping.yaml mapping_file: ./mapping.yaml

View File

@ -2,7 +2,7 @@ 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', 'quarter', 'neighbourhood', 'isolated_dwelling');
END IF; END IF;
END END
$$; $$;

View File

@ -1,35 +1,30 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_city_point; DROP TRIGGER IF EXISTS trigger_flag ON osm_city_point;
DROP TRIGGER IF EXISTS trigger_store ON osm_city_point;
DROP TRIGGER IF EXISTS trigger_refresh ON place_city.updates; 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 SCHEMA IF NOT EXISTS place_city;
CREATE TABLE IF NOT EXISTS place_city.osm_ids
(
osm_id bigint
);
CREATE OR REPLACE FUNCTION update_osm_city_point(full_update boolean) RETURNS void AS
$$ $$
BEGIN
-- Clear OSM key:rank ( https://github.com/openmaptiles/openmaptiles/issues/108 )
-- etldoc: osm_city_point -> osm_city_point
UPDATE osm_city_point AS osm SET "rank" = NULL WHERE "rank" IS NOT NULL;
-- etldoc: ne_10m_populated_places -> osm_city_point -- etldoc: ne_10m_populated_places -> osm_city_point
-- etldoc: osm_city_point -> osm_city_point -- etldoc: osm_city_point -> osm_city_point
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.osm_id, ne.scalerank
FROM ne_10m_populated_places AS ne, FROM osm_city_point AS osm
osm_city_point AS osm -- Clear OSM key:rank ( https://github.com/openmaptiles/openmaptiles/issues/108 )
WHERE ( LEFT JOIN ne_10m_populated_places AS ne ON
(
(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 lower(osm.name) IN (lower(ne.name), lower(ne.namealt), lower(ne.meganame), lower(ne.gn_ascii), lower(ne.nameascii)) OR
ne.name ILIKE osm.name_en OR lower(osm.name_en) IN (lower(ne.name), lower(ne.namealt), lower(ne.meganame), lower(ne.gn_ascii), lower(ne.nameascii)) OR
ne.namealt ILIKE osm.name OR
ne.namealt ILIKE osm.name_en OR
ne.meganame ILIKE osm.name OR
ne.meganame ILIKE osm.name_en OR
ne.gn_ascii ILIKE osm.name OR
ne.gn_ascii ILIKE osm.name_en OR
ne.nameascii ILIKE osm.name OR
ne.nameascii ILIKE osm.name_en OR
ne.name = unaccent(osm.name) ne.name = unaccent(osm.name)
) )
AND osm.place IN ('city', 'town', 'village') AND osm.place IN ('city', 'town', 'village')
@ -40,27 +35,40 @@ BEGIN
-- are in the scalerank 5 bucket -- are in the scalerank 5 bucket
SET "rank" = CASE WHEN scalerank <= 5 THEN scalerank + 1 ELSE scalerank END SET "rank" = CASE WHEN scalerank <= 5 THEN scalerank + 1 ELSE scalerank END
FROM important_city_point AS ne FROM important_city_point AS ne
WHERE osm.osm_id = ne.osm_id; WHERE (full_update OR osm.osm_id IN (SELECT osm_id FROM place_city.osm_ids))
AND rank IS DISTINCT FROM CASE WHEN scalerank <= 5 THEN scalerank + 1 ELSE scalerank END
AND osm.osm_id = ne.osm_id;
UPDATE osm_city_point UPDATE osm_city_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL; WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_city.osm_ids))
AND COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL
AND tags != update_tags(tags, geometry);
END; $$ LANGUAGE SQL;
$$ LANGUAGE plpgsql;
SELECT update_osm_city_point(); SELECT update_osm_city_point(true);
CREATE INDEX IF NOT EXISTS osm_city_point_rank_idx ON osm_city_point ("rank"); CREATE INDEX IF NOT EXISTS osm_city_point_rank_idx ON osm_city_point ("rank");
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS place_city; CREATE OR REPLACE FUNCTION place_city.store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO place_city.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_city.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS place_city.updates CREATE TABLE IF NOT EXISTS place_city.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION place_city.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_city.flag() RETURNS trigger AS
@ -73,15 +81,27 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_city.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_city.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_city rank'; RAISE LOG 'Refresh place_city rank';
PERFORM update_osm_city_point(); PERFORM update_osm_city_point(false);
-- noinspection SqlWithoutWhere
DELETE FROM place_city.osm_ids;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_city.updates; DELETE FROM place_city.updates;
RAISE LOG 'Refresh place_city done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_city_point
FOR EACH ROW
EXECUTE PROCEDURE place_city.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_city_point ON osm_city_point

View File

@ -1,27 +1,44 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_continent_point; DROP TRIGGER IF EXISTS trigger_flag ON osm_continent_point;
DROP TRIGGER IF EXISTS trigger_store 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;
CREATE SCHEMA IF NOT EXISTS place_continent_point;
CREATE TABLE IF NOT EXISTS place_continent_point.osm_ids
(
osm_id bigint
);
-- 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(full_update boolean) RETURNS void AS
$$ $$
BEGIN
UPDATE osm_continent_point UPDATE osm_continent_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL; WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_continent_point.osm_ids))
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_continent_point(true);
$$ LANGUAGE plpgsql;
SELECT update_osm_continent_point();
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS place_continent_point; CREATE OR REPLACE FUNCTION place_continent_point.store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO place_continent_point.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_continent_point.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS place_continent_point.updates CREATE TABLE IF NOT EXISTS place_continent_point.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION place_continent_point.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_continent_point.flag() RETURNS trigger AS
@ -34,15 +51,27 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_continent_point.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_continent_point.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_continent_point'; RAISE LOG 'Refresh place_continent_point';
PERFORM update_osm_continent_point(); PERFORM update_osm_continent_point(false);
-- noinspection SqlWithoutWhere
DELETE FROM place_continent_point.osm_ids;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_continent_point.updates; DELETE FROM place_continent_point.updates;
RAISE LOG 'Refresh place_continent_point done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_continent_point
FOR EACH ROW
EXECUTE PROCEDURE place_continent_point.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_continent_point ON osm_continent_point

View File

@ -1,23 +1,28 @@
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_store 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 CREATE SCHEMA IF NOT EXISTS place_country;
DROP CONSTRAINT IF EXISTS osm_country_point_rank_constraint;
CREATE TABLE IF NOT EXISTS place_country.osm_ids
(
osm_id bigint
);
-- 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(full_update boolean) RETURNS void AS
$$ $$
BEGIN
UPDATE osm_country_point AS osm UPDATE osm_country_point AS osm
SET "rank" = 7, SET "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, '')
); )
WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_country.osm_ids))
AND rank IS NULL;
WITH important_country_point AS ( WITH important_country_point AS (
SELECT osm.geometry, SELECT osm.geometry,
@ -39,7 +44,9 @@ 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((scalerank + labelrank) / 2.0)) SET "rank" = LEAST(6, CEILING((scalerank + labelrank) / 2.0))
FROM important_country_point AS ne FROM important_country_point AS ne
WHERE osm.osm_id = ne.osm_id; WHERE (full_update OR osm.osm_id IN (SELECT osm_id FROM place_country.osm_ids))
AND rank = 7
AND osm.osm_id = ne.osm_id;
-- 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
@ -65,38 +72,52 @@ 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 WHERE (full_update OR osm.osm_id IN (SELECT osm_id FROM place_country.osm_ids))
AND rank = 7
AND osm.osm_id = ne.osm_id
AND ne.rk = 1; AND ne.rk = 1;
UPDATE osm_country_point AS osm UPDATE osm_country_point AS osm
SET "rank" = 6 SET "rank" = 6
WHERE "rank" = 7; WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_country.osm_ids))
AND "rank" = 7;
-- TODO: This shouldn't be necessary? The rank function makes something wrong... -- TODO: This shouldn't be necessary? The rank function makes something wrong...
UPDATE osm_country_point AS osm UPDATE osm_country_point AS osm
SET "rank" = 1 SET "rank" = 1
WHERE "rank" = 0; WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_country.osm_ids))
AND "rank" = 0;
UPDATE osm_country_point UPDATE osm_country_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL; WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_country.osm_ids))
AND COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL
AND tags != update_tags(tags, geometry);
END; $$ LANGUAGE SQL;
$$ LANGUAGE plpgsql;
SELECT update_osm_country_point(); SELECT update_osm_country_point(true);
-- ALTER TABLE osm_country_point ADD CONSTRAINT osm_country_point_rank_constraint CHECK("rank" BETWEEN 1 AND 6);
CREATE INDEX IF NOT EXISTS osm_country_point_rank_idx ON osm_country_point ("rank"); CREATE INDEX IF NOT EXISTS osm_country_point_rank_idx ON osm_country_point ("rank");
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS place_country; CREATE OR REPLACE FUNCTION place_country.store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO place_country.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_country.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS place_country.updates CREATE TABLE IF NOT EXISTS place_country.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION place_country.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_country.flag() RETURNS trigger AS
@ -109,15 +130,27 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_country.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_country.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_country rank'; RAISE LOG 'Refresh place_country rank';
PERFORM update_osm_country_point(); PERFORM update_osm_country_point(false);
-- noinspection SqlWithoutWhere
DELETE FROM place_country.osm_ids;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_country.updates; DELETE FROM place_country.updates;
RAISE LOG 'Refresh place_country done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_country_point
FOR EACH ROW
EXECUTE PROCEDURE place_country.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_country_point ON osm_country_point

View File

@ -1,27 +1,44 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_island_point; DROP TRIGGER IF EXISTS trigger_flag ON osm_island_point;
DROP TRIGGER IF EXISTS trigger_store 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;
CREATE SCHEMA IF NOT EXISTS place_island_point;
CREATE TABLE IF NOT EXISTS place_island_point.osm_ids
(
osm_id bigint
);
-- 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(full_update boolean) RETURNS void AS
$$ $$
BEGIN
UPDATE osm_island_point UPDATE osm_island_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL; WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_island_point.osm_ids))
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_island_point(true);
$$ LANGUAGE plpgsql;
SELECT update_osm_island_point();
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS place_island_point; CREATE OR REPLACE FUNCTION place_island_point.store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO place_island_point.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_island_point.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS place_island_point.updates CREATE TABLE IF NOT EXISTS place_island_point.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION place_island_point.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_island_point.flag() RETURNS trigger AS
@ -34,15 +51,27 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_island_point.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_island_point.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_island_point'; RAISE LOG 'Refresh place_island_point';
PERFORM update_osm_island_point(); PERFORM update_osm_island_point(false);
-- noinspection SqlWithoutWhere
DELETE FROM place_island_point.osm_ids;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_island_point.updates; DELETE FROM place_island_point.updates;
RAISE LOG 'Refresh place_island_point done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_island_point
FOR EACH ROW
EXECUTE PROCEDURE place_island_point.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_island_point ON osm_island_point

View File

@ -1,30 +1,51 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_island_polygon; DROP TRIGGER IF EXISTS trigger_flag ON osm_island_polygon;
DROP TRIGGER IF EXISTS trigger_store 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;
CREATE SCHEMA IF NOT EXISTS place_island_polygon;
CREATE TABLE IF NOT EXISTS place_island_polygon.osm_ids
(
osm_id bigint
);
-- 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(full_update boolean) RETURNS void AS
$$ $$
BEGIN UPDATE osm_island_polygon
UPDATE osm_island_polygon SET geometry=ST_PointOnSurface(geometry) WHERE ST_GeometryType(geometry) <> 'ST_Point'; SET geometry = ST_PointOnSurface(geometry)
WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_island_polygon.osm_ids))
AND ST_GeometryType(geometry) <> 'ST_Point'
AND ST_IsValid(geometry);
UPDATE osm_island_polygon UPDATE osm_island_polygon
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL; WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_island_polygon.osm_ids))
AND COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL
AND tags != update_tags(tags, geometry);
ANALYZE osm_island_polygon; $$ LANGUAGE SQL;
END;
$$ LANGUAGE plpgsql;
SELECT update_osm_island_polygon(); SELECT update_osm_island_polygon(true);
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS place_island_polygon; CREATE OR REPLACE FUNCTION place_island_polygon.store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO place_island_polygon.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_island_polygon.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS place_island_polygon.updates CREATE TABLE IF NOT EXISTS place_island_polygon.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION place_island_polygon.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_island_polygon.flag() RETURNS trigger AS
@ -37,15 +58,27 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_island_polygon.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_island_polygon.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_island_polygon'; RAISE LOG 'Refresh place_island_polygon';
PERFORM update_osm_island_polygon(); PERFORM update_osm_island_polygon(false);
-- noinspection SqlWithoutWhere
DELETE FROM place_island_polygon.osm_ids;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_island_polygon.updates; DELETE FROM place_island_polygon.updates;
RAISE LOG 'Refresh place_island_polygon done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_island_polygon
FOR EACH ROW
EXECUTE PROCEDURE place_island_polygon.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_island_polygon ON osm_island_polygon

View File

@ -1,16 +1,19 @@
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_store 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 CREATE SCHEMA IF NOT EXISTS place_state;
DROP CONSTRAINT IF EXISTS osm_state_point_rank_constraint;
CREATE TABLE IF NOT EXISTS place_state.osm_ids
(
osm_id bigint
);
-- 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(full_update boolean) RETURNS void AS
$$ $$
BEGIN
WITH important_state_point AS ( WITH important_state_point AS (
SELECT osm.geometry, SELECT osm.geometry,
osm.osm_id, osm.osm_id,
@ -33,35 +36,50 @@ BEGIN
-- 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.
SET "rank" = LEAST(6, CEILING((scalerank + labelrank + datarank) / 3.0)) SET "rank" = LEAST(6, CEILING((scalerank + labelrank + datarank) / 3.0))
FROM important_state_point AS ne FROM important_state_point AS ne
WHERE osm.osm_id = ne.osm_id; WHERE (full_update OR osm.osm_id IN (SELECT osm_id FROM place_state.osm_ids))
AND rank IS NULL
AND osm.osm_id = ne.osm_id;
-- TODO: This shouldn't be necessary? The rank function makes something wrong... -- TODO: This shouldn't be necessary? The rank function makes something wrong...
UPDATE osm_state_point AS osm UPDATE osm_state_point AS osm
SET "rank" = 1 SET "rank" = 1
WHERE "rank" = 0; WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_state.osm_ids))
AND "rank" = 0;
DELETE FROM osm_state_point WHERE "rank" IS NULL; DELETE FROM osm_state_point
WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_state.osm_ids))
AND "rank" IS NULL;
UPDATE osm_state_point UPDATE osm_state_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL; WHERE (full_update OR osm_id IN (SELECT osm_id FROM place_state.osm_ids))
AND COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL
AND tags != update_tags(tags, geometry);
END; $$ LANGUAGE SQL;
$$ LANGUAGE plpgsql;
SELECT update_osm_state_point(); SELECT update_osm_state_point(true);
-- ALTER TABLE osm_state_point ADD CONSTRAINT osm_state_point_rank_constraint CHECK("rank" BETWEEN 1 AND 6);
CREATE INDEX IF NOT EXISTS osm_state_point_rank_idx ON osm_state_point ("rank"); CREATE INDEX IF NOT EXISTS osm_state_point_rank_idx ON osm_state_point ("rank");
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS place_state; CREATE OR REPLACE FUNCTION place_state.store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO place_state.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO place_state.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS place_state.updates CREATE TABLE IF NOT EXISTS place_state.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION place_state.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_state.flag() RETURNS trigger AS
@ -74,15 +92,27 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION place_state.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION place_state.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh place_state rank'; RAISE LOG 'Refresh place_state rank';
PERFORM update_osm_state_point(); PERFORM update_osm_state_point(false);
-- noinspection SqlWithoutWhere
DELETE FROM place_state.osm_ids;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM place_state.updates; DELETE FROM place_state.updates;
RAISE LOG 'Refresh place_state done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_state_point
FOR EACH ROW
EXECUTE PROCEDURE place_state.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_state_point ON osm_state_point

View File

@ -20,17 +20,13 @@ CREATE OR REPLACE FUNCTION layer_poi(bbox geometry, zoom_level integer, pixel_wi
) )
AS AS
$$ $$
SELECT osm_id_hash AS osm_id, SELECT osm_id_hash AS osm_id,
geometry, 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,
poi_class( poi_class(subclass, mapping_key, subtype) AS class,
subclass,
mapping_key,
subtype
) AS class,
CASE CASE
WHEN subclass = 'information' WHEN subclass = 'information'
THEN NULLIF(information, '') THEN NULLIF(information, '')
@ -41,11 +37,11 @@ SELECT osm_id_hash AS osm_id,
WHEN subclass = 'sports_centre' WHEN subclass = 'sports_centre'
THEN NULLIF(sport, subclass) THEN NULLIF(sport, subclass)
ELSE subclass ELSE subclass
END AS subclass, END AS subclass,
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 ORDER BY
@ -103,7 +99,7 @@ FROM (
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
FROM osm_poi_polygon FROM osm_poi_polygon
WHERE geometry && bbox WHERE geometry && bbox
AND zoom_level BETWEEN 12 AND 13 AND zoom_level BETWEEN 12 AND 13
@ -118,7 +114,7 @@ FROM (
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
FROM osm_poi_polygon FROM osm_poi_polygon
WHERE geometry && bbox WHERE geometry && bbox
AND zoom_level >= 14 AND zoom_level >= 14

View File

@ -201,7 +201,7 @@ schema:
- ./poi_stop_agg.sql - ./poi_stop_agg.sql
- ./update_poi_polygon.sql - ./update_poi_polygon.sql
- ./update_poi_point.sql - ./update_poi_point.sql
- ./layer.sql - ./poi.sql
datasources: datasources:
- type: imposm3 - type: imposm3
mapping_file: ./mapping.yaml mapping_file: ./mapping.yaml

View File

@ -2,7 +2,7 @@ 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 nullif(uic_ref, '') IS NOT NULL WHERE nullif(uic_ref, '') IS NOT NULL

View File

@ -57,7 +57,7 @@ CREATE SCHEMA IF NOT EXISTS poi_point;
CREATE TABLE IF NOT EXISTS poi_point.updates CREATE TABLE IF NOT EXISTS poi_point.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION poi_point.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION poi_point.flag() RETURNS trigger AS
@ -70,6 +70,8 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION poi_point.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION poi_point.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh poi_point'; RAISE LOG 'Refresh poi_point';
PERFORM update_osm_poi_point(); PERFORM update_osm_poi_point();
@ -78,6 +80,8 @@ BEGIN
PERFORM update_osm_poi_point_agg(); PERFORM update_osm_poi_point_agg();
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM poi_point.updates; DELETE FROM poi_point.updates;
RAISE LOG 'Refresh poi_point done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;

View File

@ -1,11 +1,18 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_poi_polygon; DROP TRIGGER IF EXISTS trigger_flag ON osm_poi_polygon;
DROP TRIGGER IF EXISTS trigger_store ON osm_poi_polygon;
DROP TRIGGER IF EXISTS trigger_refresh ON poi_polygon.updates; DROP TRIGGER IF EXISTS trigger_refresh ON poi_polygon.updates;
CREATE SCHEMA IF NOT EXISTS poi_polygon;
CREATE TABLE IF NOT EXISTS poi_polygon.osm_ids
(
osm_id bigint
);
-- 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(full_update boolean) RETURNS void AS
$$ $$
BEGIN
UPDATE osm_poi_polygon UPDATE osm_poi_polygon
SET geometry = SET geometry =
CASE CASE
@ -13,36 +20,50 @@ BEGIN
THEN ST_Centroid(geometry) THEN ST_Centroid(geometry)
ELSE ST_PointOnSurface(geometry) ELSE ST_PointOnSurface(geometry)
END END
WHERE ST_GeometryType(geometry) <> 'ST_Point'; WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_polygon.osm_ids))
AND ST_GeometryType(geometry) <> 'ST_Point'
AND ST_IsValid(geometry);
UPDATE osm_poi_polygon UPDATE osm_poi_polygon
SET subclass = 'subway' SET subclass = 'subway'
WHERE station = 'subway' WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_polygon.osm_ids))
AND station = 'subway'
AND subclass = 'station'; AND subclass = 'station';
UPDATE osm_poi_polygon UPDATE osm_poi_polygon
SET subclass = 'halt' SET subclass = 'halt'
WHERE funicular = 'yes' WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_polygon.osm_ids))
AND funicular = 'yes'
AND subclass = 'station'; AND subclass = 'station';
UPDATE osm_poi_polygon UPDATE osm_poi_polygon
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL; WHERE (full_update OR osm_id IN (SELECT osm_id FROM poi_polygon.osm_ids))
AND COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL
AND tags != update_tags(tags, geometry);
ANALYZE osm_poi_polygon; $$ LANGUAGE SQL;
END;
$$ LANGUAGE plpgsql;
SELECT update_poi_polygon(); SELECT update_poi_polygon(true);
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS poi_polygon; CREATE OR REPLACE FUNCTION poi_polygon.store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO poi_polygon.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO poi_polygon.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS poi_polygon.updates CREATE TABLE IF NOT EXISTS poi_polygon.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION poi_polygon.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION poi_polygon.flag() RETURNS trigger AS
@ -55,15 +76,27 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION poi_polygon.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION poi_polygon.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh poi_polygon'; RAISE LOG 'Refresh poi_polygon';
PERFORM update_poi_polygon(); PERFORM update_poi_polygon(false);
-- noinspection SqlWithoutWhere
DELETE FROM poi_polygon.osm_ids;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM poi_polygon.updates; DELETE FROM poi_polygon.updates;
RAISE LOG 'Refresh poi_polygon done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_poi_polygon
FOR EACH ROW
EXECUTE PROCEDURE poi_polygon.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_poi_polygon ON osm_poi_polygon

Binary file not shown.

Before

Width:  |  Height:  |  Size: 491 KiB

After

Width:  |  Height:  |  Size: 531 KiB

View File

@ -1,703 +0,0 @@
CREATE OR REPLACE FUNCTION highway_is_link(highway text) RETURNS boolean AS
$$
SELECT highway LIKE '%_link';
$$ LANGUAGE SQL IMMUTABLE
STRICT
PARALLEL SAFE;
-- 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+" ] ;
CREATE OR REPLACE FUNCTION layer_transportation(bbox geometry, zoom_level int)
RETURNS TABLE
(
osm_id bigint,
geometry 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
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(aerialway, '') IS NOT NULL THEN aerialway
WHEN NULLIF(shipway, '') IS NOT NULL THEN shipway
WHEN NULLIF(man_made, '') IS NOT NULL THEN man_made
END AS class,
CASE
WHEN railway IS NOT NULL THEN railway
WHEN (highway IS NOT NULL OR public_transport IS NOT NULL)
AND highway_class(highway, public_transport, construction) = 'path'
THEN COALESCE(NULLIF(public_transport, ''), highway)
END AS subclass,
-- All links are considered as ramps as well
CASE
WHEN highway_is_link(highway) OR highway = 'steps'
THEN 1
ELSE is_ramp::int END AS ramp,
is_oneway::int AS oneway,
brunnel(is_bridge, is_tunnel, is_ford) AS brunnel,
NULLIF(service, '') AS service,
NULLIF(layer, 0) AS layer,
"level",
CASE WHEN indoor = TRUE THEN 1 END AS indoor,
NULLIF(bicycle, '') AS bicycle,
NULLIF(foot, '') AS foot,
NULLIF(horse, '') AS horse,
NULLIF(mtb_scale, '') AS mtb_scale,
NULLIF(surface, '') AS surface
FROM (
-- etldoc: osm_transportation_merge_linestring_gen7 -> layer_transportation:z4
SELECT osm_id,
geometry,
highway,
construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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
WHERE zoom_level = 4
UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen6 -> layer_transportation:z5
SELECT osm_id,
geometry,
highway,
construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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
WHERE zoom_level = 5
UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen5 -> layer_transportation:z6
SELECT osm_id,
geometry,
highway,
construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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
WHERE zoom_level = 6
UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen4 -> layer_transportation:z7
SELECT osm_id,
geometry,
highway,
construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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
WHERE zoom_level = 7
UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen3 -> layer_transportation:z8
SELECT osm_id,
geometry,
highway,
construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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
WHERE zoom_level = 8
UNION ALL
-- etldoc: osm_highway_linestring_gen2 -> layer_transportation:z9
-- etldoc: osm_highway_linestring_gen2 -> layer_transportation:z10
SELECT osm_id,
geometry,
highway,
construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
bicycle,
foot,
horse,
mtb_scale,
NULL AS surface,
z_order
FROM osm_highway_linestring_gen2
WHERE zoom_level BETWEEN 9 AND 10
AND st_length(geometry) > zres(11)
UNION ALL
-- etldoc: osm_highway_linestring_gen1 -> layer_transportation:z11
SELECT osm_id,
geometry,
highway,
construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
bicycle,
foot,
horse,
mtb_scale,
NULL AS surface,
z_order
FROM osm_highway_linestring_gen1
WHERE zoom_level = 11
AND st_length(geometry) > zres(12)
UNION ALL
-- etldoc: osm_highway_linestring -> layer_transportation:z12
-- etldoc: osm_highway_linestring -> layer_transportation:z13
-- etldoc: osm_highway_linestring -> layer_transportation:z14_
SELECT osm_id,
geometry,
highway,
construction,
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,
CASE WHEN highway IN ('footway', 'steps') THEN "level" END AS "level",
CASE WHEN highway IN ('footway', 'steps') THEN indoor END AS indoor,
bicycle,
foot,
horse,
mtb_scale,
surface_value(surface) AS "surface",
z_order
FROM osm_highway_linestring
WHERE NOT is_area
AND (
zoom_level = 12 AND (
highway_class(highway, public_transport, construction) NOT IN ('track', 'path', 'minor')
OR highway IN ('unclassified', 'residential')
) AND man_made <> 'pier'
OR zoom_level = 13
AND (
highway_class(highway, public_transport, construction) NOT IN ('track', 'path') AND
man_made <> 'pier'
OR
man_made = 'pier' AND NOT ST_IsClosed(geometry)
)
OR zoom_level >= 14
AND (
man_made <> 'pier'
OR
NOT ST_IsClosed(geometry)
)
)
UNION ALL
-- etldoc: osm_railway_linestring_gen5 -> layer_transportation:z8
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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
WHERE zoom_level = 8
AND railway = 'rail'
AND service = ''
AND usage = 'main'
UNION ALL
-- etldoc: osm_railway_linestring_gen4 -> layer_transportation:z9
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
NULL AS bicycle,
NULL AS foot,
NULL AS horse,
NULL AS mtb_scale,
NULL AS surface,
z_order
FROM osm_railway_linestring_gen4
WHERE zoom_level = 9
AND railway = 'rail'
AND service = ''
AND usage = 'main'
UNION ALL
-- etldoc: osm_railway_linestring_gen3 -> layer_transportation:z10
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
railway,
NULL AS aerialway,
NULL AS shipway,
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
WHERE zoom_level = 10
AND railway IN ('rail', 'narrow_gauge')
AND service = ''
UNION ALL
-- etldoc: osm_railway_linestring_gen2 -> layer_transportation:z11
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
railway,
NULL AS aerialway,
NULL AS shipway,
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
WHERE zoom_level = 11
AND railway IN ('rail', 'narrow_gauge', 'light_rail')
AND service = ''
UNION ALL
-- etldoc: osm_railway_linestring_gen1 -> layer_transportation:z12
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
railway,
NULL AS aerialway,
NULL AS shipway,
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
WHERE zoom_level = 12
AND railway IN ('rail', 'narrow_gauge', 'light_rail')
AND service = ''
UNION ALL
-- etldoc: osm_railway_linestring -> layer_transportation:z13
-- etldoc: osm_railway_linestring -> layer_transportation:z14_
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
railway,
NULL AS aerialway,
NULL AS shipway,
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
WHERE zoom_level = 13
AND railway IN ('rail', 'narrow_gauge', 'light_rail') AND service = ''
OR zoom_level >= 14
UNION ALL
-- etldoc: osm_aerialway_linestring_gen1 -> layer_transportation:z12
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS railway,
aerialway,
NULL AS shipway,
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
WHERE zoom_level = 12
UNION ALL
-- etldoc: osm_aerialway_linestring -> layer_transportation:z13
-- etldoc: osm_aerialway_linestring -> layer_transportation:z14_
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS railway,
aerialway,
NULL AS shipway,
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
WHERE zoom_level >= 13
UNION ALL
-- etldoc: osm_shipway_linestring_gen2 -> layer_transportation:z11
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS railway,
NULL AS aerialway,
shipway,
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
WHERE zoom_level = 11
UNION ALL
-- etldoc: osm_shipway_linestring_gen1 -> layer_transportation:z12
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS railway,
NULL AS aerialway,
shipway,
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
WHERE zoom_level = 12
UNION ALL
-- etldoc: osm_shipway_linestring -> layer_transportation:z13
-- etldoc: osm_shipway_linestring -> layer_transportation:z14_
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS railway,
NULL AS aerialway,
shipway,
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
WHERE zoom_level >= 13
UNION ALL
-- NOTE: We limit the selection of polys because we need to be
-- careful to net get false positives here because
-- it is possible that closed linestrings appear both as
-- highway linestrings and as polygon
-- etldoc: osm_highway_polygon -> layer_transportation:z13
-- etldoc: osm_highway_polygon -> layer_transportation:z14_
SELECT osm_id,
geometry,
highway,
NULL AS construction,
NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
public_transport,
NULL AS service,
CASE
WHEN man_made IN ('bridge') THEN TRUE
ELSE FALSE
END AS is_bridge,
FALSE AS is_tunnel,
FALSE AS is_ford,
FALSE AS is_ramp,
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
-- We do not want underground pedestrian areas for now
WHERE zoom_level >= 13
AND (
man_made IN ('bridge', 'pier')
OR (is_area AND COALESCE(layer, 0) >= 0)
)
) AS zoom_levels
WHERE geometry && bbox
ORDER BY z_order ASC;
$$ LANGUAGE SQL STABLE
-- STRICT
PARALLEL SAFE;

View File

@ -1,55 +1,61 @@
generalized_tables: generalized_tables:
# etldoc: imposm3 -> osm_railway_linestring_gen5 # etldoc: osm_railway_linestring_gen_z9 -> osm_railway_linestring_gen_z8
railway_linestring_gen5: railway_linestring_gen_z8:
source: railway_linestring_gen4 source: railway_linestring_gen_z9
tolerance: ZRES9 tolerance: ZRES9
# etldoc: imposm3 -> osm_railway_linestring_gen4 # etldoc: osm_railway_linestring_gen_z10 -> osm_railway_linestring_gen_z9
railway_linestring_gen4: railway_linestring_gen_z9:
source: railway_linestring_gen3 source: railway_linestring_gen_z10
tolerance: ZRES10 tolerance: ZRES10
# etldoc: imposm3 -> osm_railway_linestring_gen3 # etldoc: osm_railway_linestring_gen_z11 -> osm_railway_linestring_gen_z10
railway_linestring_gen3: railway_linestring_gen_z10:
source: railway_linestring_gen2 source: railway_linestring_gen_z11
tolerance: ZRES11 tolerance: ZRES11
# etldoc: imposm3 -> osm_railway_linestring_gen2 # etldoc: osm_railway_linestring_gen_z12 -> osm_railway_linestring_gen_z11
railway_linestring_gen2: railway_linestring_gen_z11:
source: railway_linestring_gen1 source: railway_linestring_gen_z12
tolerance: ZRES12 tolerance: ZRES12
# etldoc: imposm3 -> osm_railway_linestring_gen1 # etldoc: osm_railway_linestring -> osm_railway_linestring_gen_z12
railway_linestring_gen1: railway_linestring_gen_z12:
source: railway_linestring source: railway_linestring
sql_filter: railway IN ('rail', 'narrow_gauge', 'light_rail') AND service='' AND ST_IsValid(geometry) sql_filter: railway IN ('rail', 'narrow_gauge', 'light_rail') AND service='' AND ST_IsValid(geometry)
tolerance: ZRES13 tolerance: ZRES13
# etldoc: imposm3 -> osm_aerialway_linestring_gen1 # etldoc: osm_aerialway_linestring -> osm_aerialway_linestring_gen_z12
aerialway_linestring_gen1: aerialway_linestring_gen_z12:
source: aerialway_linestring source: aerialway_linestring
sql_filter: ST_IsValid(geometry) sql_filter: ST_IsValid(geometry)
tolerance: ZRES13 tolerance: ZRES13
# etldoc: imposm3 -> osm_shipway_linestring_gen2 # etldoc: osm_shipway_linestring_gen_z12 -> osm_shipway_linestring_gen_z11
shipway_linestring_gen2: shipway_linestring_gen_z11:
source: shipway_linestring_gen1 source: shipway_linestring_gen_z12
tolerance: ZRES12 tolerance: ZRES12
# etldoc: imposm3 -> osm_shipway_linestring_gen1 # etldoc: osm_shipway_linestring -> osm_shipway_linestring_gen_z12
shipway_linestring_gen1: shipway_linestring_gen_z12:
source: shipway_linestring source: shipway_linestring
sql_filter: ST_IsValid(geometry) sql_filter: ST_IsValid(geometry)
tolerance: ZRES13 tolerance: ZRES13
# etldoc: imposm3 -> osm_highway_linestring_gen2 # etldoc: osm_highway_linestring_gen_z10 -> osm_highway_linestring_gen_z9
highway_linestring_gen2: highway_linestring_gen_z9:
source: highway_linestring_gen1 source: highway_linestring_gen_z10
sql_filter: (highway IN ('motorway', 'trunk', 'primary', 'secondary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link') OR highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary', 'secondary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link')) AND NOT is_area
tolerance: ZRES10
# etldoc: osm_highway_linestring_gen_z11 -> osm_highway_linestring_gen_z10
highway_linestring_gen_z10:
source: highway_linestring_gen_z11
sql_filter: (highway IN ('motorway', 'trunk', 'primary', 'secondary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link') OR highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary', 'secondary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link')) AND NOT is_area sql_filter: (highway IN ('motorway', 'trunk', 'primary', 'secondary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link') OR highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary', 'secondary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link')) AND NOT is_area
tolerance: ZRES11 tolerance: ZRES11
# etldoc: imposm3 -> osm_highway_linestring_gen1 # etldoc: osm_highway_linestring -> osm_highway_linestring_gen_z11
highway_linestring_gen1: highway_linestring_gen_z11:
source: highway_linestring source: highway_linestring
sql_filter: (highway IN ('motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link', 'tertiary_link') OR highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link', 'tertiary_link')) AND NOT is_area AND ST_IsValid(geometry) sql_filter: (highway IN ('motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link', 'tertiary_link') OR highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary', 'secondary', 'tertiary', 'motorway_link', 'trunk_link', 'primary_link', 'secondary_link', 'tertiary_link')) AND NOT is_area AND ST_IsValid(geometry)
tolerance: ZRES12 tolerance: ZRES12

View File

@ -0,0 +1,734 @@
CREATE OR REPLACE FUNCTION highway_is_link(highway text) RETURNS boolean AS
$$
SELECT highway LIKE '%_link';
$$ LANGUAGE SQL IMMUTABLE
STRICT
PARALLEL SAFE;
-- 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+" ] ;
CREATE OR REPLACE FUNCTION layer_transportation(bbox geometry, zoom_level int)
RETURNS TABLE
(
osm_id bigint,
geometry 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
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(aerialway, '') IS NOT NULL THEN 'aerialway'
WHEN NULLIF(shipway, '') IS NOT NULL THEN shipway
WHEN NULLIF(man_made, '') IS NOT NULL THEN man_made
END AS class,
CASE
WHEN railway IS NOT NULL THEN railway
WHEN (highway IS NOT NULL OR public_transport IS NOT NULL)
AND highway_class(highway, public_transport, construction) = 'path'
THEN COALESCE(NULLIF(public_transport, ''), highway)
WHEN aerialway IS NOT NULL THEN aerialway
END AS subclass,
-- All links are considered as ramps as well
CASE
WHEN highway_is_link(highway) OR highway = 'steps'
THEN 1
ELSE is_ramp::int END AS ramp,
is_oneway::int AS oneway,
brunnel(is_bridge, is_tunnel, is_ford) AS brunnel,
NULLIF(service, '') AS service,
NULLIF(layer, 0) AS layer,
"level",
CASE WHEN indoor = TRUE THEN 1 END AS indoor,
NULLIF(bicycle, '') AS bicycle,
NULLIF(foot, '') AS foot,
NULLIF(horse, '') AS horse,
NULLIF(mtb_scale, '') AS mtb_scale,
NULLIF(surface, '') AS surface
FROM (
-- etldoc: osm_transportation_merge_linestring_gen_z4 -> layer_transportation:z4
SELECT osm_id,
geometry,
highway,
construction,
NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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_gen_z4
WHERE zoom_level = 4
UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen_z5 -> layer_transportation:z5
SELECT osm_id,
geometry,
highway,
construction,
NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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_gen_z5
WHERE zoom_level = 5
UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen_z6 -> layer_transportation:z6
SELECT osm_id,
geometry,
highway,
construction,
NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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_gen_z6
WHERE zoom_level = 6
UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen_z7 -> layer_transportation:z7
SELECT osm_id,
geometry,
highway,
construction,
NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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_gen_z7
WHERE zoom_level = 7
UNION ALL
-- etldoc: osm_transportation_merge_linestring_gen_z8 -> layer_transportation:z8
SELECT osm_id,
geometry,
highway,
construction,
NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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_gen_z8
WHERE zoom_level = 8
UNION ALL
-- etldoc: osm_highway_linestring_gen_z9 -> layer_transportation:z9
SELECT osm_id,
geometry,
highway,
construction,
NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
bicycle,
foot,
horse,
mtb_scale,
NULL AS surface,
z_order
FROM osm_highway_linestring_gen_z9
WHERE zoom_level = 9
AND ST_Length(geometry) > ZRes(11)
UNION ALL
-- etldoc: osm_highway_linestring_gen_z10 -> layer_transportation:z10
SELECT osm_id,
geometry,
highway,
construction,
NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
bicycle,
foot,
horse,
mtb_scale,
NULL AS surface,
z_order
FROM osm_highway_linestring_gen_z10
WHERE zoom_level = 10
AND ST_Length(geometry) > ZRes(11)
UNION ALL
-- etldoc: osm_highway_linestring_gen_z11 -> layer_transportation:z11
SELECT osm_id,
geometry,
highway,
construction,
NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
NULL AS public_transport,
NULL AS service,
is_bridge,
is_tunnel,
is_ford,
NULL::boolean AS is_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
bicycle,
foot,
horse,
mtb_scale,
NULL AS surface,
z_order
FROM osm_highway_linestring_gen_z11
WHERE zoom_level = 11
AND ST_Length(geometry) > ZRes(12)
UNION ALL
-- etldoc: osm_highway_linestring -> layer_transportation:z12
-- etldoc: osm_highway_linestring -> layer_transportation:z13
-- etldoc: osm_highway_linestring -> layer_transportation:z14_
SELECT osm_id,
geometry,
highway,
construction,
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,
CASE WHEN highway IN ('footway', 'steps') THEN "level" END AS "level",
CASE WHEN highway IN ('footway', 'steps') THEN indoor END AS indoor,
bicycle,
foot,
horse,
mtb_scale,
surface_value(surface) AS "surface",
z_order
FROM osm_highway_linestring
WHERE NOT is_area
AND (
zoom_level = 12 AND (
highway_class(highway, public_transport, construction) NOT IN ('track', 'path', 'minor')
OR highway IN ('unclassified', 'residential')
) AND man_made <> 'pier'
OR zoom_level = 13
AND (
highway_class(highway, public_transport, construction) NOT IN ('track', 'path') AND
man_made <> 'pier'
OR
man_made = 'pier' AND NOT ST_IsClosed(geometry)
)
OR zoom_level >= 14
AND (
man_made <> 'pier'
OR
NOT ST_IsClosed(geometry)
)
)
UNION ALL
-- etldoc: osm_railway_linestring_gen_z8 -> layer_transportation:z8
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
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_gen_z8
WHERE zoom_level = 8
AND railway = 'rail'
AND service = ''
AND usage = 'main'
UNION ALL
-- etldoc: osm_railway_linestring_gen_z9 -> layer_transportation:z9
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
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_ramp,
NULL::int AS is_oneway,
NULL AS man_made,
layer,
NULL::int AS level,
NULL::boolean AS indoor,
NULL AS bicycle,
NULL AS foot,
NULL AS horse,
NULL AS mtb_scale,
NULL AS surface,
z_order
FROM osm_railway_linestring_gen_z9
WHERE zoom_level = 9
AND railway = 'rail'
AND service = ''
AND usage = 'main'
UNION ALL
-- etldoc: osm_railway_linestring_gen_z10 -> layer_transportation:z10
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
railway,
NULL AS aerialway,
NULL AS shipway,
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_gen_z10
WHERE zoom_level = 10
AND railway IN ('rail', 'narrow_gauge')
AND service = ''
UNION ALL
-- etldoc: osm_railway_linestring_gen_z11 -> layer_transportation:z11
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
railway,
NULL AS aerialway,
NULL AS shipway,
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_gen_z11
WHERE zoom_level = 11
AND railway IN ('rail', 'narrow_gauge', 'light_rail')
AND service = ''
UNION ALL
-- etldoc: osm_railway_linestring_gen_z12 -> layer_transportation:z12
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
railway,
NULL AS aerialway,
NULL AS shipway,
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_gen_z12
WHERE zoom_level = 12
AND railway IN ('rail', 'narrow_gauge', 'light_rail')
AND service = ''
UNION ALL
-- etldoc: osm_railway_linestring -> layer_transportation:z13
-- etldoc: osm_railway_linestring -> layer_transportation:z14_
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
railway,
NULL AS aerialway,
NULL AS shipway,
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
WHERE zoom_level = 13
AND railway IN ('rail', 'narrow_gauge', 'light_rail')
AND service = ''
OR zoom_level >= 14
UNION ALL
-- etldoc: osm_aerialway_linestring_gen_z12 -> layer_transportation:z12
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS railway,
aerialway,
NULL AS shipway,
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_gen_z12
WHERE zoom_level = 12
UNION ALL
-- etldoc: osm_aerialway_linestring -> layer_transportation:z13
-- etldoc: osm_aerialway_linestring -> layer_transportation:z14_
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS railway,
aerialway,
NULL AS shipway,
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
WHERE zoom_level >= 13
UNION ALL
-- etldoc: osm_shipway_linestring_gen_z11 -> layer_transportation:z11
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS railway,
NULL AS aerialway,
shipway,
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_gen_z11
WHERE zoom_level = 11
UNION ALL
-- etldoc: osm_shipway_linestring_gen_z12 -> layer_transportation:z12
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS railway,
NULL AS aerialway,
shipway,
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_gen_z12
WHERE zoom_level = 12
UNION ALL
-- etldoc: osm_shipway_linestring -> layer_transportation:z13
-- etldoc: osm_shipway_linestring -> layer_transportation:z14_
SELECT osm_id,
geometry,
NULL AS highway,
NULL AS construction,
NULL AS railway,
NULL AS aerialway,
shipway,
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
WHERE zoom_level >= 13
UNION ALL
-- NOTE: We limit the selection of polys because we need to be
-- careful to net get false positives here because
-- it is possible that closed linestrings appear both as
-- highway linestrings and as polygon
-- etldoc: osm_highway_polygon -> layer_transportation:z13
-- etldoc: osm_highway_polygon -> layer_transportation:z14_
SELECT osm_id,
geometry,
highway,
NULL AS construction,
NULL AS railway,
NULL AS aerialway,
NULL AS shipway,
public_transport,
NULL AS service,
CASE
WHEN man_made IN ('bridge') THEN TRUE
ELSE FALSE
END AS is_bridge,
FALSE AS is_tunnel,
FALSE AS is_ford,
FALSE AS is_ramp,
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
-- We do not want underground pedestrian areas for now
WHERE zoom_level >= 13
AND (
man_made IN ('bridge', 'pier')
OR (is_area AND COALESCE(layer, 0) >= 0)
)
) AS zoom_levels
WHERE geometry && bbox
ORDER BY z_order ASC;
$$ LANGUAGE SQL STABLE
-- STRICT
PARALLEL SAFE;

View File

@ -178,7 +178,7 @@ layer:
schema: schema:
- ./class.sql - ./class.sql
- ./update_transportation_merge.sql - ./update_transportation_merge.sql
- ./layer.sql - ./transportation.sql
datasources: datasources:
- type: imposm3 - type: imposm3
mapping_file: ./mapping.yaml mapping_file: ./mapping.yaml

View File

@ -1,11 +1,3 @@
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring CASCADE;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring_gen3 CASCADE;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring_gen4 CASCADE;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring_gen5 CASCADE;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring_gen6 CASCADE;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring_gen7 CASCADE;
DROP TRIGGER IF EXISTS trigger_flag_transportation ON osm_highway_linestring; DROP TRIGGER IF EXISTS trigger_flag_transportation ON osm_highway_linestring;
DROP TRIGGER IF EXISTS trigger_refresh ON transportation.updates; DROP TRIGGER IF EXISTS trigger_refresh ON transportation.updates;
@ -16,107 +8,135 @@ DROP TRIGGER IF EXISTS trigger_refresh ON transportation.updates;
-- Improve performance of the sql in transportation_name/network_type.sql -- Improve performance of the sql in transportation_name/network_type.sql
CREATE INDEX IF NOT EXISTS osm_highway_linestring_highway_idx
ON osm_highway_linestring (highway);
-- Improve performance of the sql below
CREATE INDEX IF NOT EXISTS osm_highway_linestring_highway_partial_idx CREATE INDEX IF NOT EXISTS osm_highway_linestring_highway_partial_idx
ON osm_highway_linestring (highway) ON osm_highway_linestring (highway)
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
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring CASCADE;
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, highway,
construction, construction,
is_bridge,
is_tunnel,
is_ford,
z_order z_order
FROM ( FROM (
SELECT ST_LineMerge(ST_Collect(geometry)) AS geometry, SELECT ST_LineMerge(ST_Collect(geometry)) AS geometry,
highway, highway,
construction, construction,
min(z_order) AS z_order is_bridge,
is_tunnel,
is_ford,
min(z_order) AS z_order
FROM osm_highway_linestring FROM osm_highway_linestring
WHERE (highway IN ('motorway', 'trunk', 'primary') OR WHERE (highway IN ('motorway', 'trunk', 'primary') OR
highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary')) highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary'))
AND ST_IsValid(geometry) AND ST_IsValid(geometry)
GROUP BY highway, construction GROUP BY highway, construction, is_bridge, is_tunnel, is_ford
) 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
ON osm_transportation_merge_linestring USING gist (geometry); ON osm_transportation_merge_linestring USING gist (geometry);
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_highway_partial_idx
ON osm_transportation_merge_linestring (highway, 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_gen_z8
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen3 AS DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring_gen_z8 CASCADE;
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen_z8 AS
( (
SELECT ST_Simplify(geometry, 120) AS geometry, osm_id, highway, construction, z_order SELECT ST_Simplify(geometry, ZRes(10)) AS geometry,
osm_id,
highway,
construction,
is_bridge,
is_tunnel,
is_ford,
z_order
FROM osm_transportation_merge_linestring FROM osm_transportation_merge_linestring
WHERE highway IN ('motorway', 'trunk', 'primary') WHERE highway IN ('motorway', 'trunk', 'primary')
OR highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary') OR highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary')
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen3_geometry_idx CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen_z8_geometry_idx
ON osm_transportation_merge_linestring_gen3 USING gist (geometry); ON osm_transportation_merge_linestring_gen_z8 USING gist (geometry);
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen3_highway_partial_idx
ON osm_transportation_merge_linestring_gen3 (highway, construction)
WHERE highway IN ('motorway', 'trunk', 'primary', 'construction');
-- etldoc: osm_transportation_merge_linestring_gen3 -> osm_transportation_merge_linestring_gen4 -- etldoc: osm_transportation_merge_linestring_gen_z8 -> osm_transportation_merge_linestring_gen_z7
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen4 AS DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring_gen_z7 CASCADE;
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen_z7 AS
( (
SELECT ST_Simplify(geometry, 200) AS geometry, osm_id, highway, construction, z_order SELECT ST_Simplify(geometry, ZRes(9)) AS geometry,
FROM osm_transportation_merge_linestring_gen3 osm_id,
highway,
construction,
is_bridge,
is_tunnel,
is_ford,
z_order
FROM osm_transportation_merge_linestring_gen_z8
WHERE (highway IN ('motorway', 'trunk', 'primary') OR WHERE (highway IN ('motorway', 'trunk', 'primary') OR
highway = 'construction' AND construction IN ('motorway', 'trunk', 'primary')) 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_gen_z7_geometry_idx
ON osm_transportation_merge_linestring_gen4 USING gist (geometry); ON osm_transportation_merge_linestring_gen_z7 USING gist (geometry);
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen4_highway_partial_idx
ON osm_transportation_merge_linestring_gen4 (highway, construction)
WHERE highway IN ('motorway', 'trunk', 'primary', 'construction');
-- etldoc: osm_transportation_merge_linestring_gen4 -> osm_transportation_merge_linestring_gen5 -- etldoc: osm_transportation_merge_linestring_gen_z7 -> osm_transportation_merge_linestring_gen_z6
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen5 AS DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring_gen_z6 CASCADE;
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen_z6 AS
( (
SELECT ST_Simplify(geometry, 500) AS geometry, osm_id, highway, construction, z_order SELECT ST_Simplify(geometry, ZRes(8)) AS geometry,
FROM osm_transportation_merge_linestring_gen4 osm_id,
highway,
construction,
is_bridge,
is_tunnel,
is_ford,
z_order
FROM osm_transportation_merge_linestring_gen_z7
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'))
AND ST_Length(geometry) > 100 AND ST_Length(geometry) > 100
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ) /* DELAY_MATERIALIZED_VIEW_CREATION */;
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen5_geometry_idx CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen_z6_geometry_idx
ON osm_transportation_merge_linestring_gen5 USING gist (geometry); ON osm_transportation_merge_linestring_gen_z6 USING gist (geometry);
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen5_highway_partial_idx
ON osm_transportation_merge_linestring_gen5 (highway, construction)
WHERE highway IN ('motorway', 'trunk', 'construction');
-- etldoc: osm_transportation_merge_linestring_gen5 -> osm_transportation_merge_linestring_gen6 -- etldoc: osm_transportation_merge_linestring_gen_z6 -> osm_transportation_merge_linestring_gen_z5
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen6 AS DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring_gen_z5 CASCADE;
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen_z5 AS
( (
SELECT ST_Simplify(geometry, 1000) AS geometry, osm_id, highway, construction, z_order SELECT ST_Simplify(geometry, ZRes(7)) AS geometry,
FROM osm_transportation_merge_linestring_gen5 osm_id,
highway,
construction,
is_bridge,
is_tunnel,
is_ford,
z_order
FROM osm_transportation_merge_linestring_gen_z6
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'))
AND ST_Length(geometry) > 500 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_gen_z5_geometry_idx
ON osm_transportation_merge_linestring_gen6 USING gist (geometry); ON osm_transportation_merge_linestring_gen_z5 USING gist (geometry);
CREATE INDEX IF NOT EXISTS osm_transportation_merge_linestring_gen6_highway_partial_idx
ON osm_transportation_merge_linestring_gen6 (highway, construction)
WHERE highway IN ('motorway', 'trunk', 'construction');
-- etldoc: osm_transportation_merge_linestring_gen6 -> osm_transportation_merge_linestring_gen7 -- etldoc: osm_transportation_merge_linestring_gen_z5 -> osm_transportation_merge_linestring_gen_z4
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen7 AS DROP MATERIALIZED VIEW IF EXISTS osm_transportation_merge_linestring_gen_z4 CASCADE;
CREATE MATERIALIZED VIEW osm_transportation_merge_linestring_gen_z4 AS
( (
SELECT ST_Simplify(geometry, 2000) AS geometry, osm_id, highway, construction, z_order SELECT ST_Simplify(geometry, ZRes(6)) AS geometry,
FROM osm_transportation_merge_linestring_gen6 osm_id,
highway,
construction,
is_bridge,
is_tunnel,
is_ford,
z_order
FROM osm_transportation_merge_linestring_gen_z5
WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway') WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway')
AND ST_Length(geometry) > 1000 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_gen_z4_geometry_idx
ON osm_transportation_merge_linestring_gen7 USING gist (geometry); ON osm_transportation_merge_linestring_gen_z4 USING gist (geometry);
-- Handle updates -- Handle updates
@ -126,7 +146,7 @@ CREATE SCHEMA IF NOT EXISTS transportation;
CREATE TABLE IF NOT EXISTS transportation.updates CREATE TABLE IF NOT EXISTS transportation.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION transportation.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION transportation.flag() RETURNS trigger AS
@ -139,16 +159,20 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION transportation.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION transportation.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE NOTICE 'Refresh transportation'; RAISE LOG 'Refresh transportation';
REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring; REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring;
REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen3; REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen_z8;
REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen4; REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen_z7;
REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen5; REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen_z6;
REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen6; REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen_z5;
REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen7; REFRESH MATERIALIZED VIEW osm_transportation_merge_linestring_gen_z4;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM transportation.updates; DELETE FROM transportation.updates;
RAISE LOG 'Refresh transportation done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -164,4 +188,4 @@ CREATE CONSTRAINT TRIGGER trigger_refresh
ON transportation.updates ON transportation.updates
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE transportation.refresh(); EXECUTE PROCEDURE transportation.refresh();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 KiB

After

Width:  |  Height:  |  Size: 225 KiB

View File

@ -1,9 +1,11 @@
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_network CASCADE; DROP TRIGGER IF EXISTS trigger_store_transportation_route_member ON osm_route_member;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_linestring CASCADE; DROP TRIGGER IF EXISTS trigger_store_transportation_highway_linestring ON osm_highway_linestring;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_linestring_gen1 CASCADE; DROP TRIGGER IF EXISTS trigger_flag_transportation_name ON transportation_name.network_changes;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_linestring_gen2 CASCADE; DROP TRIGGER IF EXISTS trigger_refresh_network ON transportation_name.updates_network;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_linestring_gen3 CASCADE;
DROP MATERIALIZED VIEW IF EXISTS osm_transportation_name_linestring_gen4 CASCADE; DROP TRIGGER IF EXISTS trigger_store_transportation_name_network ON osm_transportation_name_network;
DROP TRIGGER IF EXISTS trigger_flag_name ON transportation_name.name_changes;
DROP TRIGGER IF EXISTS trigger_refresh_name ON transportation_name.updates_name;
DO DO
$$ $$

View File

@ -15,6 +15,7 @@ CREATE OR REPLACE FUNCTION layer_transportation_name(bbox geometry, zoom_level i
network text, network text,
class text, class text,
subclass text, subclass text,
brunnel text,
layer int, layer int,
level int, level int,
indoor int indoor int
@ -23,33 +24,34 @@ AS
$$ $$
SELECT osm_id, SELECT osm_id,
geometry, geometry,
NULLIF(name, '') AS name, name,
COALESCE(NULLIF(name_en, ''), name) AS name_en, COALESCE(name_en, name) AS name_en,
COALESCE(NULLIF(name_de, ''), name, name_en) AS name_de, COALESCE(name_de, name, name_en) AS name_de,
tags, tags,
NULLIF(ref, ''), ref,
NULLIF(LENGTH(ref), 0) AS ref_length, 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'
THEN highway THEN highway
END AS subclass, END AS subclass,
NULLIF(layer, 0) AS layer, brunnel,
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 layer,
NULL::int AS level, NULL::int AS level,
NULL::boolean AS indoor NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen4 FROM osm_transportation_name_linestring_gen4
WHERE zoom_level = 6 WHERE zoom_level = 6
@ -57,8 +59,8 @@ FROM (
-- 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 layer,
NULL::int AS level, NULL::int AS level,
NULL::boolean AS indoor NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen3 FROM osm_transportation_name_linestring_gen3
WHERE zoom_level = 7 WHERE zoom_level = 7
@ -66,8 +68,8 @@ FROM (
-- 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 layer,
NULL::int AS level, NULL::int AS level,
NULL::boolean AS indoor NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen2 FROM osm_transportation_name_linestring_gen2
WHERE zoom_level = 8 WHERE zoom_level = 8
@ -77,8 +79,8 @@ FROM (
-- 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 layer,
NULL::int AS level, NULL::int AS level,
NULL::boolean AS indoor NULL::boolean AS indoor
FROM osm_transportation_name_linestring_gen1 FROM osm_transportation_name_linestring_gen1
WHERE zoom_level BETWEEN 9 AND 11 WHERE zoom_level BETWEEN 9 AND 11
@ -94,6 +96,7 @@ FROM (
ref, ref,
highway, highway,
construction, construction,
brunnel,
network, network,
z_order, z_order,
layer, layer,
@ -101,7 +104,7 @@ FROM (
indoor indoor
FROM osm_transportation_name_linestring FROM osm_transportation_name_linestring
WHERE zoom_level = 12 WHERE zoom_level = 12
AND LineLabel(zoom_level, COALESCE(NULLIF(name, ''), ref), geometry) AND LineLabel(zoom_level, COALESCE(name, ref), geometry)
AND highway_class(highway, '', construction) NOT IN ('minor', 'track', 'path') AND highway_class(highway, '', construction) NOT IN ('minor', 'track', 'path')
AND NOT highway_is_link(highway) AND NOT highway_is_link(highway)
UNION ALL UNION ALL
@ -116,6 +119,7 @@ FROM (
ref, ref,
highway, highway,
construction, construction,
brunnel,
network, network,
z_order, z_order,
layer, layer,
@ -123,7 +127,7 @@ FROM (
indoor indoor
FROM osm_transportation_name_linestring FROM osm_transportation_name_linestring
WHERE zoom_level = 13 WHERE zoom_level = 13
AND LineLabel(zoom_level, COALESCE(NULLIF(name, ''), ref), geometry) AND LineLabel(zoom_level, COALESCE(name, ref), geometry)
AND highway_class(highway, '', construction) NOT IN ('track', 'path') AND highway_class(highway, '', construction) NOT IN ('track', 'path')
UNION ALL UNION ALL
@ -137,6 +141,7 @@ FROM (
ref, ref,
highway, highway,
construction, construction,
brunnel,
network, network,
z_order, z_order,
layer, layer,

View File

@ -69,6 +69,13 @@ layer:
- bridleway - bridleway
- corridor - corridor
- platform - platform
brunnel:
description: |
Mark whether way is a bridge, a tunnel or a ford.
values:
- bridge
- tunnel
- ford
level: level:
description: | description: |
Experimental feature! Filled only for steps and footways. Original Experimental feature! Filled only for steps and footways. Original
@ -86,12 +93,12 @@ layer:
datasource: datasource:
geometry_field: geometry geometry_field: geometry
srid: 900913 srid: 900913
query: (SELECT geometry, name, name_en, name_de, {name_languages}, ref, ref_length, network::text, class::text, subclass, layer, level, indoor FROM layer_transportation_name(!bbox!, z(!scale_denominator!))) AS t query: (SELECT geometry, name, name_en, name_de, {name_languages}, ref, ref_length, network::text, class::text, subclass, brunnel, layer, level, indoor FROM layer_transportation_name(!bbox!, z(!scale_denominator!))) AS t
schema: schema:
- ./network_type.sql - ./network_type.sql
- ./update_route_member.sql - ./update_route_member.sql
- ./update_transportation_name.sql - ./update_transportation_name.sql
- ./layer.sql - ./transportation_name.sql
datasources: datasources:
- type: imposm3 - type: imposm3
mapping_file: ../transportation/mapping.yaml mapping_file: ../transportation/mapping.yaml

View File

@ -1,62 +1,87 @@
DROP TRIGGER IF EXISTS trigger_flag_transportation_name ON osm_route_member; CREATE TABLE IF NOT EXISTS ne_10m_admin_0_bg_buffer AS
SELECT ST_Buffer(geometry, 10000)
FROM ne_10m_admin_0_countries
WHERE iso_a2 = 'GB';
CREATE OR REPLACE VIEW gbr_route_members_view AS
SELECT 0,
osm_id,
substring(ref FROM E'^[AM][0-9AM()]+'),
CASE WHEN highway = 'motorway' THEN 'omt-gb-motorway' ELSE 'omt-gb-trunk' END
FROM osm_highway_linestring
WHERE length(ref) > 0
AND ST_Intersects(geometry, (SELECT * FROM ne_10m_admin_0_bg_buffer))
AND highway IN ('motorway', 'trunk')
;
-- Create GBR relations (so we can use it in the same way as other relations)
DELETE
FROM osm_route_member
WHERE network IN ('omt-gb-motorway', 'omt-gb-trunk');
-- etldoc: osm_highway_linestring -> osm_route_member
INSERT INTO osm_route_member (osm_id, member, ref, network)
SELECT *
FROM gbr_route_members_view;
-- create GBR relations (so we can use it in the same way as other relations) CREATE OR REPLACE FUNCTION osm_route_member_network_type(network text, name text, ref text) RETURNS route_network_type AS
CREATE OR REPLACE FUNCTION update_gbr_route_members() RETURNS void AS
$$ $$
DECLARE SELECT CASE
gbr_geom geometry; WHEN network = 'US:I' THEN 'us-interstate'::route_network_type
BEGIN WHEN network = 'US:US' THEN 'us-highway'::route_network_type
SELECT st_buffer(geometry, 10000) INTO gbr_geom FROM ne_10m_admin_0_countries WHERE iso_a2 = 'GB'; WHEN network LIKE 'US:__' THEN 'us-state'::route_network_type
DELETE FROM osm_route_member WHERE network IN ('omt-gb-motorway', 'omt-gb-trunk'); -- https://en.wikipedia.org/wiki/Trans-Canada_Highway
-- TODO: improve hierarchical queries using
INSERT INTO osm_route_member (osm_id, member, ref, network) -- http://www.openstreetmap.org/relation/1307243
SELECT 0, -- however the relation does not cover the whole Trans-Canada_Highway
osm_id, WHEN
substring(ref FROM E'^[AM][0-9AM()]+'), (network = 'CA:transcanada') OR
CASE WHEN highway = 'motorway' THEN 'omt-gb-motorway' ELSE 'omt-gb-trunk' END (network = 'CA:BC:primary' AND ref IN ('16')) OR
FROM osm_highway_linestring (name = 'Yellowhead Highway (AB)' AND ref IN ('16')) OR
WHERE length(ref) > 0 (network = 'CA:SK:primary' AND ref IN ('16')) OR
AND ST_Intersects(geometry, gbr_geom) (network = 'CA:ON:primary' AND ref IN ('17', '417')) OR
AND highway IN ('motorway', 'trunk'); (name = 'Route Transcanadienne') OR
END; (network = 'CA:NB:primary' AND ref IN ('2', '16')) OR
$$ LANGUAGE plpgsql; (network = 'CA:PE' AND ref IN ('1')) OR
(network = 'CA:NS' AND ref IN ('104', '105')) OR
(network = 'CA:NL:R' AND ref IN ('1')) OR
(name = 'Trans-Canada Highway')
THEN 'ca-transcanada'::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
END;
$$ LANGUAGE sql IMMUTABLE
PARALLEL SAFE;
-- etldoc: osm_route_member -> osm_route_member -- etldoc: osm_route_member -> osm_route_member
-- see http://wiki.openstreetmap.org/wiki/Relation:route#Road_routes
UPDATE osm_route_member
SET network_type = osm_route_member_network_type(network, name, ref)
WHERE network != ''
AND network_type IS DISTINCT FROM osm_route_member_network_type(network, name, ref)
;
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(); DELETE
FROM osm_route_member AS r
USING
transportation_name.network_changes AS c
WHERE network IN ('omt-gb-motorway', 'omt-gb-trunk')
AND r.osm_id = c.osm_id;
-- see http://wiki.openstreetmap.org/wiki/Relation:route#Road_routes INSERT INTO osm_route_member (osm_id, member, ref, network)
UPDATE osm_route_member SELECT r.*
SET network_type = FROM gbr_route_members_view AS r
CASE JOIN transportation_name.network_changes AS c ON
WHEN network = 'US:I' THEN 'us-interstate'::route_network_type r.osm_id = c.osm_id;
WHEN network = 'US:US' THEN 'us-highway'::route_network_type
WHEN network LIKE 'US:__' THEN 'us-state'::route_network_type
-- https://en.wikipedia.org/wiki/Trans-Canada_Highway
-- TODO: improve hierarchical queries using
-- http://www.openstreetmap.org/relation/1307243
-- however the relation does not cover the whole Trans-Canada_Highway
WHEN
(network = 'CA:transcanada') OR
(network = 'CA:BC:primary' AND ref IN ('16')) OR
(name = 'Yellowhead Highway (AB)' AND ref IN ('16')) OR
(network = 'CA:SK:primary' AND ref IN ('16')) OR
(network = 'CA:ON:primary' AND ref IN ('17', '417')) OR
(name = 'Route Transcanadienne') OR
(network = 'CA:NB:primary' AND ref IN ('2', '16')) OR
(network = 'CA:PE' AND ref IN ('1')) OR
(network = 'CA:NS' AND ref IN ('104', '105')) OR
(network = 'CA:NL:R' AND ref IN ('1')) OR
(name = 'Trans-Canada Highway')
THEN 'ca-transcanada'::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
END;
UPDATE
osm_route_member AS r
SET network_type = osm_route_member_network_type(network, name, ref)
FROM transportation_name.network_changes AS c
WHERE network != ''
AND network_type IS DISTINCT FROM osm_route_member_network_type(network, name, ref)
AND r.member = c.osm_id;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@ -65,6 +90,4 @@ CREATE INDEX IF NOT EXISTS osm_route_member_member_idx ON osm_route_member ("mem
CREATE INDEX IF NOT EXISTS osm_route_member_name_idx ON osm_route_member ("name"); CREATE INDEX IF NOT EXISTS osm_route_member_name_idx ON osm_route_member ("name");
CREATE INDEX IF NOT EXISTS osm_route_member_ref_idx ON osm_route_member ("ref"); CREATE INDEX IF NOT EXISTS osm_route_member_ref_idx ON osm_route_member ("ref");
SELECT update_osm_route_member();
CREATE INDEX IF NOT EXISTS osm_route_member_network_type_idx ON osm_route_member ("network_type"); CREATE INDEX IF NOT EXISTS osm_route_member_network_type_idx ON osm_route_member ("network_type");

View File

@ -1,6 +1,3 @@
DROP TRIGGER IF EXISTS trigger_flag_transportation_name ON osm_highway_linestring;
DROP TRIGGER IF EXISTS trigger_refresh ON transportation_name.updates;
-- Instead of using relations to find out the road names we -- Instead of using relations to find out the road names we
-- stitch together the touching ways with the same name -- stitch together the touching ways with the same name
-- to allow for nice label rendering -- to allow for nice label rendering
@ -9,39 +6,61 @@ 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 TABLE IF NOT EXISTS osm_transportation_name_network AS
( SELECT
SELECT hl.geometry, geometry,
hl.osm_id, osm_id,
CASE WHEN length(hl.name) > 15 THEN osml10n_street_abbrev_all(hl.name) ELSE hl.name END AS "name", name,
CASE WHEN length(hl.name_en) > 15 THEN osml10n_street_abbrev_en(hl.name_en) ELSE hl.name_en END AS "name_en", name_en,
CASE WHEN length(hl.name_de) > 15 THEN osml10n_street_abbrev_de(hl.name_de) ELSE hl.name_de END AS "name_de", name_de,
hl.tags, tags,
rm.network_type, ref,
CASE highway,
WHEN (rm.network_type IS NOT NULL AND nullif(rm.ref::text, '') IS NOT NULL) construction,
THEN rm.ref::text brunnel,
ELSE hl.ref "level",
END AS ref, layer,
hl.highway, indoor,
hl.construction, network_type,
CASE WHEN highway IN ('footway', 'steps') THEN layer END AS layer, z_order
CASE WHEN highway IN ('footway', 'steps') THEN "level" END AS "level", FROM (
CASE WHEN highway IN ('footway', 'steps') THEN indoor END AS indoor, SELECT hl.geometry,
ROW_NUMBER() OVER (PARTITION BY hl.osm_id hl.osm_id,
ORDER BY rm.network_type) AS "rank", CASE WHEN length(hl.name) > 15 THEN osml10n_street_abbrev_all(hl.name) ELSE NULLIF(hl.name, '') END AS "name",
hl.z_order CASE WHEN length(hl.name_en) > 15 THEN osml10n_street_abbrev_en(hl.name_en) ELSE NULLIF(hl.name_en, '') END AS "name_en",
FROM osm_highway_linestring hl CASE WHEN length(hl.name_de) > 15 THEN osml10n_street_abbrev_de(hl.name_de) ELSE NULLIF(hl.name_de, '') END AS "name_de",
LEFT JOIN osm_route_member rm ON (rm.member = hl.osm_id) slice_language_tags(hl.tags) AS tags,
) /* DELAY_MATERIALIZED_VIEW_CREATION */; rm.network_type,
CASE
WHEN rm.network_type IS NOT NULL AND nullif(rm.ref::text, '') IS NOT NULL
THEN rm.ref::text
ELSE NULLIF(hl.ref, '')
END AS ref,
hl.highway,
hl.construction,
brunnel(hl.is_bridge, hl.is_tunnel, hl.is_ford) AS brunnel,
CASE WHEN highway IN ('footway', 'steps') THEN layer END AS layer,
CASE WHEN highway IN ('footway', 'steps') THEN level END AS level,
CASE WHEN highway IN ('footway', 'steps') THEN indoor END AS indoor,
ROW_NUMBER() OVER (PARTITION BY hl.osm_id
ORDER BY rm.network_type) AS "rank",
hl.z_order
FROM osm_highway_linestring hl
LEFT JOIN osm_route_member rm ON
rm.member = hl.osm_id
WHERE (hl.name <> '' OR hl.ref <> '')
AND NULLIF(hl.highway, '') IS NOT NULL
) AS t
WHERE ("rank" = 1 OR "rank" IS NULL);
CREATE INDEX IF NOT EXISTS osm_transportation_name_network_osm_id_idx ON osm_transportation_name_network (osm_id);
CREATE INDEX IF NOT EXISTS osm_transportation_name_network_name_ref_idx ON osm_transportation_name_network (coalesce(name, ''), coalesce(ref, ''));
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 TABLE IF NOT EXISTS 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,
name_de, name_de,
@ -49,35 +68,33 @@ SELECT (ST_Dump(geometry)).geom AS geometry,
ref, ref,
highway, highway,
construction, construction,
brunnel,
"level", "level",
layer, layer,
indoor, indoor,
network_type AS network, network_type AS network,
z_order z_order
FROM ( FROM (
SELECT ST_LineMerge(ST_Collect(geometry)) AS geometry, SELECT 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 || tags || hstore( -- store results of osml10n_street_abbrev_* above
hstore(ARRAY ['name', name, 'name:en', name_en, 'name:de', name_de]))::text, ARRAY ['name', name, 'name:en', name_en, 'name:de', name_de]) AS tags,
''), ','))
AS "tags",
ref, ref,
highway, highway,
construction, construction,
brunnel,
"level", "level",
layer, layer,
indoor, indoor,
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) GROUP BY name, name_en, name_de, tags, ref, highway, construction, brunnel, "level", layer, indoor, network_type
AND (name <> '' OR ref <> '')
AND NULLIF(highway, '') IS NOT NULL
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 */; ;
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_name_ref_idx ON osm_transportation_name_linestring (coalesce(name, ''), coalesce(ref, ''));
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);
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_highway_partial_idx CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_highway_partial_idx
@ -85,8 +102,7 @@ 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 OR REPLACE VIEW osm_transportation_name_linestring_gen1_view AS
(
SELECT ST_Simplify(geometry, 50) AS geometry, SELECT ST_Simplify(geometry, 50) AS geometry,
osm_id, osm_id,
name, name,
@ -96,12 +112,17 @@ SELECT ST_Simplify(geometry, 50) AS geometry,
ref, ref,
highway, highway,
construction, construction,
brunnel,
network, network,
z_order 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')) WHERE (highway IN ('motorway', 'trunk') OR highway = 'construction' AND construction IN ('motorway', 'trunk'))
AND ST_Length(geometry) > 8000 AND ST_Length(geometry) > 8000
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ;
CREATE TABLE IF NOT EXISTS osm_transportation_name_linestring_gen1 AS
SELECT *
FROM osm_transportation_name_linestring_gen1_view;
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen1_name_ref_idx ON osm_transportation_name_linestring_gen1((coalesce(name, ref)));
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);
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen1_highway_partial_idx CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen1_highway_partial_idx
@ -109,8 +130,7 @@ 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 OR REPLACE VIEW osm_transportation_name_linestring_gen2_view AS
(
SELECT ST_Simplify(geometry, 120) AS geometry, SELECT ST_Simplify(geometry, 120) AS geometry,
osm_id, osm_id,
name, name,
@ -120,12 +140,17 @@ SELECT ST_Simplify(geometry, 120) AS geometry,
ref, ref,
highway, highway,
construction, construction,
brunnel,
network, network,
z_order 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')) WHERE (highway IN ('motorway', 'trunk') OR highway = 'construction' AND construction IN ('motorway', 'trunk'))
AND ST_Length(geometry) > 14000 AND ST_Length(geometry) > 14000
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ;
CREATE TABLE IF NOT EXISTS osm_transportation_name_linestring_gen2 AS
SELECT *
FROM osm_transportation_name_linestring_gen2_view;
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen2_name_ref_idx ON osm_transportation_name_linestring_gen2((coalesce(name, ref)));
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);
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen2_highway_partial_idx CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen2_highway_partial_idx
@ -133,8 +158,7 @@ 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 OR REPLACE VIEW osm_transportation_name_linestring_gen3_view AS
(
SELECT ST_Simplify(geometry, 200) AS geometry, SELECT ST_Simplify(geometry, 200) AS geometry,
osm_id, osm_id,
name, name,
@ -144,12 +168,17 @@ SELECT ST_Simplify(geometry, 200) AS geometry,
ref, ref,
highway, highway,
construction, construction,
brunnel,
network, network,
z_order z_order
FROM osm_transportation_name_linestring_gen2 FROM osm_transportation_name_linestring_gen2
WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway') WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway')
AND ST_Length(geometry) > 20000 AND ST_Length(geometry) > 20000
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ;
CREATE TABLE IF NOT EXISTS osm_transportation_name_linestring_gen3 AS
SELECT *
FROM osm_transportation_name_linestring_gen3_view;
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen3_name_ref_idx ON osm_transportation_name_linestring_gen3((coalesce(name, ref)));
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);
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen3_highway_partial_idx CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen3_highway_partial_idx
@ -157,8 +186,7 @@ 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 OR REPLACE VIEW osm_transportation_name_linestring_gen4_view AS
(
SELECT ST_Simplify(geometry, 500) AS geometry, SELECT ST_Simplify(geometry, 500) AS geometry,
osm_id, osm_id,
name, name,
@ -168,64 +196,464 @@ SELECT ST_Simplify(geometry, 500) AS geometry,
ref, ref,
highway, highway,
construction, construction,
brunnel,
network, network,
z_order z_order
FROM osm_transportation_name_linestring_gen3 FROM osm_transportation_name_linestring_gen3
WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway') WHERE (highway = 'motorway' OR highway = 'construction' AND construction = 'motorway')
AND ST_Length(geometry) > 20000 AND ST_Length(geometry) > 20000
) /* DELAY_MATERIALIZED_VIEW_CREATION */; ;
CREATE TABLE IF NOT EXISTS osm_transportation_name_linestring_gen4 AS
SELECT *
FROM osm_transportation_name_linestring_gen4_view;
CREATE INDEX IF NOT EXISTS osm_transportation_name_linestring_gen4_name_ref_idx ON osm_transportation_name_linestring_gen4((coalesce(name, ref)));
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);
-- Handle updates -- Handle updates
CREATE SCHEMA IF NOT EXISTS transportation_name; CREATE SCHEMA IF NOT EXISTS transportation_name;
CREATE TABLE IF NOT EXISTS transportation_name.updates -- Trigger to update "osm_transportation_name_network" from "osm_route_member" and "osm_highway_linestring"
CREATE TABLE IF NOT EXISTS transportation_name.network_changes
(
osm_id bigint,
UNIQUE (osm_id)
);
CREATE OR REPLACE FUNCTION transportation_name.route_member_store() RETURNS trigger AS
$$
BEGIN
INSERT INTO transportation_name.network_changes(osm_id)
VALUES (CASE WHEN tg_op IN ('DELETE', 'UPDATE') THEN old.member ELSE new.member END)
ON CONFLICT(osm_id) DO NOTHING;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION transportation_name.highway_linestring_store() RETURNS trigger AS
$$
BEGIN
INSERT INTO transportation_name.network_changes(osm_id)
VALUES (CASE WHEN tg_op IN ('DELETE', 'UPDATE') THEN old.osm_id ELSE new.osm_id END)
ON CONFLICT(osm_id) DO NOTHING;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS transportation_name.updates_network
(
id serial PRIMARY KEY,
t text,
UNIQUE (t)
);
CREATE OR REPLACE FUNCTION transportation_name.flag_network() RETURNS trigger AS
$$
BEGIN
INSERT INTO transportation_name.updates_network(t) VALUES ('y') ON CONFLICT(t) DO NOTHING;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION transportation_name.refresh_network() RETURNS trigger AS
$$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN
RAISE LOG 'Refresh transportation_name_network';
PERFORM update_osm_route_member();
-- REFRESH osm_transportation_name_network
DELETE
FROM osm_transportation_name_network AS n
USING
transportation_name.network_changes AS c
WHERE n.osm_id = c.osm_id;
INSERT INTO osm_transportation_name_network
SELECT
geometry,
osm_id,
name,
name_en,
name_de,
tags,
ref,
highway,
construction,
brunnel,
level,
layer,
indoor,
network_type,
z_order
FROM (
SELECT hl.geometry,
hl.osm_id,
CASE WHEN length(hl.name) > 15 THEN osml10n_street_abbrev_all(hl.name) ELSE NULLIF(hl.name, '') END AS name,
CASE WHEN length(hl.name_en) > 15 THEN osml10n_street_abbrev_en(hl.name_en) ELSE NULLIF(hl.name_en, '') END AS name_en,
CASE WHEN length(hl.name_de) > 15 THEN osml10n_street_abbrev_de(hl.name_de) ELSE NULLIF(hl.name_de, '') END AS name_de,
slice_language_tags(hl.tags) AS tags,
rm.network_type,
CASE
WHEN rm.network_type IS NOT NULL AND NULLIF(rm.ref::text, '') IS NOT NULL
THEN rm.ref::text
ELSE NULLIF(hl.ref, '')
END AS ref,
hl.highway,
hl.construction,
brunnel(hl.is_bridge, hl.is_tunnel, hl.is_ford) AS brunnel,
CASE WHEN highway IN ('footway', 'steps') THEN layer END AS layer,
CASE WHEN highway IN ('footway', 'steps') THEN level END AS level,
CASE WHEN highway IN ('footway', 'steps') THEN indoor END AS indoor,
ROW_NUMBER() OVER (PARTITION BY hl.osm_id
ORDER BY rm.network_type) AS "rank",
hl.z_order
FROM osm_highway_linestring hl
JOIN transportation_name.network_changes AS c ON
hl.osm_id = c.osm_id
LEFT JOIN osm_route_member rm ON
rm.member = hl.osm_id
WHERE (hl.name <> '' OR hl.ref <> '')
AND NULLIF(hl.highway, '') IS NOT NULL
) AS t
WHERE ("rank" = 1 OR "rank" IS NULL);
-- noinspection SqlWithoutWhere
DELETE FROM transportation_name.network_changes;
-- noinspection SqlWithoutWhere
DELETE FROM transportation_name.updates_network;
RAISE LOG 'Refresh transportation_name network done in %', age(clock_timestamp(), t);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store_transportation_route_member
AFTER INSERT OR UPDATE OR DELETE
ON osm_route_member
FOR EACH ROW
EXECUTE PROCEDURE transportation_name.route_member_store();
CREATE TRIGGER trigger_store_transportation_highway_linestring
AFTER INSERT OR UPDATE OR DELETE
ON osm_highway_linestring
FOR EACH ROW
EXECUTE PROCEDURE transportation_name.highway_linestring_store();
CREATE TRIGGER trigger_flag_transportation_name
AFTER INSERT
ON transportation_name.network_changes
FOR EACH STATEMENT
EXECUTE PROCEDURE transportation_name.flag_network();
CREATE CONSTRAINT TRIGGER trigger_refresh_network
AFTER INSERT
ON transportation_name.updates_network
INITIALLY DEFERRED
FOR EACH ROW
EXECUTE PROCEDURE transportation_name.refresh_network();
-- Trigger to update "osm_transportation_name_linestring" from "osm_transportation_name_network"
CREATE TABLE IF NOT EXISTS transportation_name.name_changes
(
id serial PRIMARY KEY,
is_old boolean,
osm_id bigint,
name character varying,
name_en character varying,
name_de character varying,
ref character varying,
highway character varying,
construction character varying,
brunnel character varying,
level integer,
layer integer,
indoor boolean,
network_type route_network_type
);
CREATE OR REPLACE FUNCTION transportation_name.name_network_store() RETURNS trigger AS
$$
BEGIN
IF (tg_op IN ('DELETE', 'UPDATE'))
THEN
INSERT INTO transportation_name.name_changes(is_old, osm_id, name, name_en, name_de, ref, highway, construction,
brunnel, level, layer, indoor, network_type)
VALUES (TRUE, old.osm_id, old.name, old.name_en, old.name_de, old.ref, old.highway, old.construction,
old.brunnel, old.level, old.layer, old.indoor, old.network_type);
END IF;
IF (tg_op IN ('UPDATE', 'INSERT'))
THEN
INSERT INTO transportation_name.name_changes(is_old, osm_id, name, name_en, name_de, ref, highway, construction,
brunnel, level, layer, indoor, network_type)
VALUES (FALSE, new.osm_id, new.name, new.name_en, new.name_de, new.ref, new.highway, new.construction,
new.brunnel, new.level, new.layer, new.indoor, new.network_type);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS transportation_name.updates_name
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION transportation_name.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION transportation_name.flag_name() RETURNS trigger AS
$$ $$
BEGIN BEGIN
INSERT INTO transportation_name.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; INSERT INTO transportation_name.updates_name(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_name() RETURNS trigger AS
$$ $BODY$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh transportation_name'; RAISE LOG 'Refresh transportation_name';
PERFORM update_osm_route_member();
REFRESH MATERIALIZED VIEW osm_transportation_name_network; -- REFRESH osm_transportation_name_linestring
REFRESH MATERIALIZED VIEW osm_transportation_name_linestring;
REFRESH MATERIALIZED VIEW osm_transportation_name_linestring_gen1; -- Compact the change history to keep only the first and last version, and then uniq version of row
REFRESH MATERIALIZED VIEW osm_transportation_name_linestring_gen2; CREATE TEMP TABLE name_changes_compact AS
REFRESH MATERIALIZED VIEW osm_transportation_name_linestring_gen3; SELECT DISTINCT ON (name, name_en, name_de, ref, highway, construction, brunnel, level, layer, indoor, network_type)
REFRESH MATERIALIZED VIEW osm_transportation_name_linestring_gen4; name,
-- noinspection SqlWithoutWhere name_en,
DELETE FROM transportation_name.updates; name_de,
ref,
highway,
construction,
brunnel,
level,
layer,
indoor,
network_type,
coalesce(name, ref) AS name_ref
FROM ((
SELECT DISTINCT ON (osm_id) *
FROM transportation_name.name_changes
WHERE is_old
ORDER BY osm_id,
id ASC
)
UNION ALL
(
SELECT DISTINCT ON (osm_id) *
FROM transportation_name.name_changes
WHERE NOT is_old
ORDER BY osm_id,
id DESC
)) AS t;
DELETE
FROM osm_transportation_name_linestring AS n
USING name_changes_compact AS c
WHERE coalesce(n.name, '') = coalesce(c.name, '')
AND coalesce(n.ref, '') = coalesce(c.ref, '')
AND n.name_en IS NOT DISTINCT FROM c.name_en
AND n.name_de IS NOT DISTINCT FROM c.name_de
AND n.highway IS NOT DISTINCT FROM c.highway
AND n.construction IS NOT DISTINCT FROM c.construction
AND n.brunnel IS NOT DISTINCT FROM c.brunnel
AND n.level IS NOT DISTINCT FROM c.level
AND n.layer IS NOT DISTINCT FROM c.layer
AND n.indoor IS NOT DISTINCT FROM c.indoor
AND n.network IS NOT DISTINCT FROM c.network_type;
INSERT INTO osm_transportation_name_linestring
SELECT (ST_Dump(geometry)).geom AS geometry,
NULL::bigint AS osm_id,
name,
name_en,
name_de,
tags || get_basic_names(tags, geometry) AS tags,
ref,
highway,
construction,
brunnel,
level,
layer,
indoor,
network_type AS network,
z_order
FROM (
SELECT ST_LineMerge(ST_Collect(n.geometry)) AS geometry,
n.name,
n.name_en,
n.name_de,
hstore(string_agg(nullif(slice_language_tags(tags ||
hstore(ARRAY ['name', n.name, 'name:en', n.name_en, 'name:de', n.name_de]))::text,
''), ',')) AS tags,
n.ref,
n.highway,
n.construction,
n.brunnel,
n.level,
n.layer,
n.indoor,
n.network_type,
min(n.z_order) AS z_order
FROM osm_transportation_name_network AS n
JOIN name_changes_compact AS c ON
coalesce(n.name, '') = coalesce(c.name, '')
AND coalesce(n.ref, '') = coalesce(c.ref, '')
AND n.name_en IS NOT DISTINCT FROM c.name_en
AND n.name_de IS NOT DISTINCT FROM c.name_de
AND n.highway IS NOT DISTINCT FROM c.highway
AND n.construction IS NOT DISTINCT FROM c.construction
AND n.brunnel IS NOT DISTINCT FROM c.brunnel
AND n.level IS NOT DISTINCT FROM c.level
AND n.layer IS NOT DISTINCT FROM c.layer
AND n.indoor IS NOT DISTINCT FROM c.indoor
AND n.network_type IS NOT DISTINCT FROM c.network_type
GROUP BY n.name, n.name_en, n.name_de, n.ref, n.highway, n.construction, n.brunnel, n.level, n.layer, n.indoor, n.network_type
) AS highway_union;
-- REFRESH osm_transportation_name_linestring_gen1
DELETE FROM osm_transportation_name_linestring_gen1 AS n
USING name_changes_compact AS c
WHERE
coalesce(n.name, n.ref) = c.name_ref
AND n.name IS NOT DISTINCT FROM c.name
AND n.name_en IS NOT DISTINCT FROM c.name_en
AND n.name_de IS NOT DISTINCT FROM c.name_de
AND n.ref IS NOT DISTINCT FROM c.ref
AND n.highway IS NOT DISTINCT FROM c.highway
AND n.construction IS NOT DISTINCT FROM c.construction
AND n.brunnel IS NOT DISTINCT FROM c.brunnel
AND n.network IS NOT DISTINCT FROM c.network_type;
INSERT INTO osm_transportation_name_linestring_gen1
SELECT n.*
FROM osm_transportation_name_linestring_gen1_view AS n
JOIN name_changes_compact AS c ON
coalesce(n.name, n.ref) = c.name_ref
AND n.name IS NOT DISTINCT FROM c.name
AND n.name_en IS NOT DISTINCT FROM c.name_en
AND n.name_de IS NOT DISTINCT FROM c.name_de
AND n.ref IS NOT DISTINCT FROM c.ref
AND n.highway IS NOT DISTINCT FROM c.highway
AND n.construction IS NOT DISTINCT FROM c.construction
AND n.brunnel IS NOT DISTINCT FROM c.brunnel
AND n.network IS NOT DISTINCT FROM c.network_type;
-- REFRESH osm_transportation_name_linestring_gen2
DELETE FROM osm_transportation_name_linestring_gen2 AS n
USING name_changes_compact AS c
WHERE
coalesce(n.name, n.ref) = c.name_ref
AND n.name IS NOT DISTINCT FROM c.name
AND n.name_en IS NOT DISTINCT FROM c.name_en
AND n.name_de IS NOT DISTINCT FROM c.name_de
AND n.ref IS NOT DISTINCT FROM c.ref
AND n.highway IS NOT DISTINCT FROM c.highway
AND n.construction IS NOT DISTINCT FROM c.construction
AND n.brunnel IS NOT DISTINCT FROM c.brunnel
AND n.network IS NOT DISTINCT FROM c.network_type;
INSERT INTO osm_transportation_name_linestring_gen2
SELECT n.*
FROM osm_transportation_name_linestring_gen2_view AS n
JOIN name_changes_compact AS c ON
coalesce(n.name, n.ref) = c.name_ref
AND n.name IS NOT DISTINCT FROM c.name
AND n.name_en IS NOT DISTINCT FROM c.name_en
AND n.name_de IS NOT DISTINCT FROM c.name_de
AND n.ref IS NOT DISTINCT FROM c.ref
AND n.highway IS NOT DISTINCT FROM c.highway
AND n.construction IS NOT DISTINCT FROM c.construction
AND n.brunnel IS NOT DISTINCT FROM c.brunnel
AND n.network IS NOT DISTINCT FROM c.network_type;
-- REFRESH osm_transportation_name_linestring_gen3
DELETE FROM osm_transportation_name_linestring_gen3 AS n
USING name_changes_compact AS c
WHERE
coalesce(n.name, n.ref) = c.name_ref
AND n.name IS NOT DISTINCT FROM c.name
AND n.name_en IS NOT DISTINCT FROM c.name_en
AND n.name_de IS NOT DISTINCT FROM c.name_de
AND n.ref IS NOT DISTINCT FROM c.ref
AND n.highway IS NOT DISTINCT FROM c.highway
AND n.construction IS NOT DISTINCT FROM c.construction
AND n.brunnel IS NOT DISTINCT FROM c.brunnel
AND n.network IS NOT DISTINCT FROM c.network_type;
INSERT INTO osm_transportation_name_linestring_gen3
SELECT n.*
FROM osm_transportation_name_linestring_gen3_view AS n
JOIN name_changes_compact AS c ON
coalesce(n.name, n.ref) = c.name_ref
AND n.name IS NOT DISTINCT FROM c.name
AND n.name_en IS NOT DISTINCT FROM c.name_en
AND n.name_de IS NOT DISTINCT FROM c.name_de
AND n.ref IS NOT DISTINCT FROM c.ref
AND n.highway IS NOT DISTINCT FROM c.highway
AND n.construction IS NOT DISTINCT FROM c.construction
AND n.brunnel IS NOT DISTINCT FROM c.brunnel
AND n.network IS NOT DISTINCT FROM c.network_type;
-- REFRESH osm_transportation_name_linestring_gen4
DELETE FROM osm_transportation_name_linestring_gen4 AS n
USING name_changes_compact AS c
WHERE
coalesce(n.name, n.ref) = c.name_ref
AND n.name IS NOT DISTINCT FROM c.name
AND n.name_en IS NOT DISTINCT FROM c.name_en
AND n.name_de IS NOT DISTINCT FROM c.name_de
AND n.ref IS NOT DISTINCT FROM c.ref
AND n.highway IS NOT DISTINCT FROM c.highway
AND n.construction IS NOT DISTINCT FROM c.construction
AND n.brunnel IS NOT DISTINCT FROM c.brunnel
AND n.network IS NOT DISTINCT FROM c.network_type;
INSERT INTO osm_transportation_name_linestring_gen4
SELECT n.*
FROM osm_transportation_name_linestring_gen4_view AS n
JOIN name_changes_compact AS c ON
coalesce(n.name, n.ref) = c.name_ref
AND n.name IS NOT DISTINCT FROM c.name
AND n.name_en IS NOT DISTINCT FROM c.name_en
AND n.name_de IS NOT DISTINCT FROM c.name_de
AND n.ref IS NOT DISTINCT FROM c.ref
AND n.highway IS NOT DISTINCT FROM c.highway
AND n.construction IS NOT DISTINCT FROM c.construction
AND n.brunnel IS NOT DISTINCT FROM c.brunnel
AND n.network IS NOT DISTINCT FROM c.network_type;
DROP TABLE name_changes_compact;
DELETE FROM transportation_name.name_changes;
DELETE FROM transportation_name.updates_name;
RAISE LOG 'Refresh transportation_name done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $BODY$
LANGUAGE plpgsql;
CREATE TRIGGER trigger_flag_transportation_name
CREATE TRIGGER trigger_store_transportation_name_network
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_route_member ON osm_transportation_name_network
FOR EACH STATEMENT FOR EACH ROW
EXECUTE PROCEDURE transportation_name.flag(); EXECUTE PROCEDURE transportation_name.name_network_store();
CREATE TRIGGER trigger_flag_transportation_name CREATE TRIGGER trigger_flag_name
AFTER INSERT OR UPDATE OR DELETE
ON osm_highway_linestring
FOR EACH STATEMENT
EXECUTE PROCEDURE transportation_name.flag();
CREATE CONSTRAINT TRIGGER trigger_refresh
AFTER INSERT AFTER INSERT
ON transportation_name.updates ON transportation_name.name_changes
FOR EACH STATEMENT
EXECUTE PROCEDURE transportation_name.flag_name();
CREATE CONSTRAINT TRIGGER trigger_refresh_name
AFTER INSERT
ON transportation_name.updates_name
INITIALLY DEFERRED INITIALLY DEFERRED
FOR EACH ROW FOR EACH ROW
EXECUTE PROCEDURE transportation_name.refresh(); EXECUTE PROCEDURE transportation_name.refresh_name();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 KiB

After

Width:  |  Height:  |  Size: 406 KiB

View File

@ -1,39 +1,38 @@
generalized_tables: generalized_tables:
# etldoc: osm_water_polygon_gen_z7 -> osm_water_polygon_gen_z6
# etldoc: imposm3 -> osm_water_polygon_gen6 water_polygon_gen_z6:
water_polygon_gen6: source: water_polygon_gen_z7
source: water_polygon_gen5
sql_filter: area>power(ZRES5,2) sql_filter: area>power(ZRES5,2)
tolerance: ZRES7 tolerance: ZRES7
# etldoc: imposm3 -> osm_water_polygon_gen5 # etldoc: osm_water_polygon_gen_z8 -> osm_water_polygon_gen_z7
water_polygon_gen5: water_polygon_gen_z7:
source: water_polygon_gen4 source: water_polygon_gen_z8
sql_filter: area>power(ZRES6,2) sql_filter: area>power(ZRES6,2)
tolerance: ZRES8 tolerance: ZRES8
# etldoc: imposm3 -> osm_water_polygon_gen4 # etldoc: osm_water_polygon_gen_z9 -> osm_water_polygon_gen_z8
water_polygon_gen4: water_polygon_gen_z8:
source: water_polygon_gen3 source: water_polygon_gen_z9
sql_filter: area>power(ZRES7,2) sql_filter: area>power(ZRES7,2)
tolerance: ZRES9 tolerance: ZRES9
# etldoc: imposm3 -> osm_water_polygon_gen3 # etldoc: osm_water_polygon_gen_z10 -> osm_water_polygon_gen_z9
water_polygon_gen3: water_polygon_gen_z9:
source: water_polygon_gen2 source: water_polygon_gen_z10
sql_filter: area>power(ZRES8,2) sql_filter: area>power(ZRES8,2)
tolerance: ZRES10 tolerance: ZRES10
# etldoc: imposm3 -> osm_water_polygon_gen2 # etldoc: osm_water_polygon_gen_z11 -> osm_water_polygon_gen_z10
water_polygon_gen2: water_polygon_gen_z10:
source: water_polygon_gen1 source: water_polygon_gen_z11
sql_filter: area>power(ZRES9,2) sql_filter: area>power(ZRES9,2)
tolerance: ZRES11 tolerance: ZRES11
# etldoc: imposm3 -> osm_water_polygon_gen1 # etldoc: osm_water_polygon -> osm_water_polygon_gen_z11
water_polygon_gen1: water_polygon_gen_z11:
source: water_polygon source: water_polygon
sql_filter: area>power(ZRES10,2) AND ST_IsValid(geometry) sql_filter: area>power(ZRES10,2)
tolerance: ZRES12 tolerance: ZRES12
tunnel_field: &tunnel tunnel_field: &tunnel
@ -88,6 +87,7 @@ tables:
landuse: landuse:
- reservoir - reservoir
- basin - basin
- salt_pond
leisure: leisure:
- swimming_pool - swimming_pool
natural: natural:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,78 +1,142 @@
-- Recreate ocean layer by union regular squares into larger polygons
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_union
CREATE TABLE IF NOT EXISTS osm_ocean_polygon_union AS
(
SELECT (ST_Dump(ST_Union(ST_MakeValid(geometry)))).geom::geometry(Polygon, 3857) AS geometry
FROM osm_ocean_polygon
--for union select just full square (not big triangles)
WHERE ST_Area(geometry) > 100000000 AND
ST_NPoints(geometry) = 5
UNION ALL
SELECT geometry
FROM osm_ocean_polygon
-- as 321 records have less then 5 coordinates (triangle)
-- bigger then 5 coordinates have squares with holes from island and coastline
WHERE ST_NPoints(geometry) <> 5
);
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_union_geom_idx
ON osm_ocean_polygon_union
USING GIST (geometry);
--Drop data from original table but keep table as `CREATE TABLE IF NOT EXISTS` still test if query is valid
TRUNCATE TABLE osm_ocean_polygon;
-- This statement can be deleted after the water importer image stops creating this object as a table -- This statement can be deleted after the water importer image stops creating this object as a table
DO DO
$$ $$
BEGIN BEGIN
DROP TABLE IF EXISTS osm_ocean_polygon_gen1 CASCADE; DROP TABLE IF EXISTS osm_ocean_polygon_gen_z11 CASCADE;
EXCEPTION EXCEPTION
WHEN wrong_object_type THEN WHEN wrong_object_type THEN
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen1 -- etldoc: osm_ocean_polygon_union -> osm_ocean_polygon_gen_z11
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen1 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen_z11 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen1 AS CREATE MATERIALIZED VIEW osm_ocean_polygon_gen_z11 AS
( (
SELECT ST_Simplify(geometry, 20) AS geometry SELECT ST_Simplify(geometry, ZRes(13)) AS geometry
FROM osm_ocean_polygon FROM osm_ocean_polygon_union
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ; ) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen1_idx ON osm_ocean_polygon_gen1 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen_z11_idx ON osm_ocean_polygon_gen_z11 USING gist (geometry);
-- This statement can be deleted after the water importer image stops creating this object as a table -- This statement can be deleted after the water importer image stops creating this object as a table
DO DO
$$ $$
BEGIN BEGIN
DROP TABLE IF EXISTS osm_ocean_polygon_gen2 CASCADE; DROP TABLE IF EXISTS osm_ocean_polygon_gen_z10 CASCADE;
EXCEPTION EXCEPTION
WHEN wrong_object_type THEN WHEN wrong_object_type THEN
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen2 -- etldoc: osm_ocean_polygon_gen_z11 -> osm_ocean_polygon_gen_z10
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen2 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen_z10 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen2 AS CREATE MATERIALIZED VIEW osm_ocean_polygon_gen_z10 AS
( (
SELECT ST_Simplify(geometry, 40) AS geometry SELECT ST_Simplify(geometry, ZRes(12)) AS geometry
FROM osm_ocean_polygon FROM osm_ocean_polygon_gen_z11
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ; ) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen2_idx ON osm_ocean_polygon_gen2 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen_z10_idx ON osm_ocean_polygon_gen_z10 USING gist (geometry);
-- This statement can be deleted after the water importer image stops creating this object as a table -- This statement can be deleted after the water importer image stops creating this object as a table
DO DO
$$ $$
BEGIN BEGIN
DROP TABLE IF EXISTS osm_ocean_polygon_gen3 CASCADE; DROP TABLE IF EXISTS osm_ocean_polygon_gen_z9 CASCADE;
EXCEPTION EXCEPTION
WHEN wrong_object_type THEN WHEN wrong_object_type THEN
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen3 -- etldoc: osm_ocean_polygon_gen_z10 -> osm_ocean_polygon_gen_z9
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen3 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen_z9 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen3 AS CREATE MATERIALIZED VIEW osm_ocean_polygon_gen_z9 AS
( (
SELECT ST_Simplify(geometry, 80) AS geometry SELECT ST_Simplify(geometry, ZRes(11)) AS geometry
FROM osm_ocean_polygon FROM osm_ocean_polygon_gen_z10
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ; ) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen3_idx ON osm_ocean_polygon_gen3 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen_z9_idx ON osm_ocean_polygon_gen_z9 USING gist (geometry);
-- This statement can be deleted after the water importer image stops creating this object as a table -- This statement can be deleted after the water importer image stops creating this object as a table
DO DO
$$ $$
BEGIN BEGIN
DROP TABLE IF EXISTS osm_ocean_polygon_gen4 CASCADE; DROP TABLE IF EXISTS osm_ocean_polygon_gen_z8 CASCADE;
EXCEPTION EXCEPTION
WHEN wrong_object_type THEN WHEN wrong_object_type THEN
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
-- etldoc: osm_ocean_polygon -> osm_ocean_polygon_gen4 -- etldoc: osm_ocean_polygon_gen_z9 -> osm_ocean_polygon_gen_z8
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen4 CASCADE; DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen_z8 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen4 AS CREATE MATERIALIZED VIEW osm_ocean_polygon_gen_z8 AS
( (
SELECT ST_Simplify(geometry, 160) AS geometry SELECT ST_Simplify(geometry, ZRes(10)) AS geometry
FROM osm_ocean_polygon FROM osm_ocean_polygon_gen_z9
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ; ) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen4_idx ON osm_ocean_polygon_gen4 USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen_z8_idx ON osm_ocean_polygon_gen_z8 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_gen_z7 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_ocean_polygon_gen_z8 -> osm_ocean_polygon_gen_z7
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen_z7 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen_z7 AS
(
SELECT ST_Simplify(geometry, ZRes(9)) AS geometry
FROM osm_ocean_polygon_gen_z8
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen_z7_idx ON osm_ocean_polygon_gen_z7 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_gen_z6 CASCADE;
EXCEPTION
WHEN wrong_object_type THEN
END;
$$ LANGUAGE plpgsql;
-- etldoc: osm_ocean_polygon_gen_z7 -> osm_ocean_polygon_gen_z6
DROP MATERIALIZED VIEW IF EXISTS osm_ocean_polygon_gen_z6 CASCADE;
CREATE MATERIALIZED VIEW osm_ocean_polygon_gen_z6 AS
(
SELECT ST_Simplify(geometry, ZRes(8)) AS geometry
FROM osm_ocean_polygon_gen_z7
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS osm_ocean_polygon_gen_z6_idx ON osm_ocean_polygon_gen_z6 USING gist (geometry);

View File

@ -18,232 +18,419 @@ $$ LANGUAGE SQL IMMUTABLE
STRICT STRICT
PARALLEL SAFE; PARALLEL SAFE;
-- ne_10m_ocean
-- etldoc: ne_10m_ocean -> ne_10m_ocean_gen_z5
CREATE OR REPLACE VIEW water_z0 AS DROP MATERIALIZED VIEW IF EXISTS ne_10m_ocean_gen_z5 CASCADE;
CREATE MATERIALIZED VIEW ne_10m_ocean_gen_z5 AS
( (
-- etldoc: ne_110m_ocean -> water_z0 SELECT ST_Simplify(geometry, ZRes(7)) AS geometry,
SELECT geometry,
'ocean'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_110m_ocean
UNION ALL
-- etldoc: ne_110m_lakes -> water_z0
SELECT geometry,
'lake'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_110m_lakes
);
CREATE OR REPLACE VIEW water_z1 AS
(
-- etldoc: ne_110m_ocean -> water_z1
SELECT geometry,
'ocean'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_110m_ocean
UNION ALL
-- etldoc: ne_110m_lakes -> water_z1
SELECT geometry,
'lake'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_110m_lakes
);
CREATE OR REPLACE VIEW water_z2 AS
(
-- etldoc: ne_50m_ocean -> water_z2
SELECT geometry,
'ocean'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_50m_ocean
UNION ALL
-- etldoc: ne_50m_lakes -> water_z2
SELECT geometry,
'lake'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_50m_lakes
);
CREATE OR REPLACE VIEW water_z4 AS
(
-- etldoc: ne_50m_ocean -> water_z4
SELECT geometry,
'ocean'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_50m_ocean
UNION ALL
-- etldoc: ne_10m_lakes -> water_z4
SELECT geometry,
'lake'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_10m_lakes
);
CREATE OR REPLACE VIEW water_z5 AS
(
-- etldoc: ne_10m_ocean -> water_z5
SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
NULL::boolean AS is_intermittent, NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM ne_10m_ocean FROM ne_10m_ocean
UNION ALL ) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
-- etldoc: ne_10m_lakes -> water_z5 CREATE INDEX IF NOT EXISTS ne_10m_ocean_gen_z5_idx ON ne_10m_ocean_gen_z5 USING gist (geometry);
SELECT geometry,
'lake'::text AS class, -- ne_10m_lakes
-- etldoc: ne_10m_lakes -> ne_10m_lakes_gen_z5
DROP MATERIALIZED VIEW IF EXISTS ne_10m_lakes_gen_z5 CASCADE;
CREATE MATERIALIZED VIEW ne_10m_lakes_gen_z5 AS
(
SELECT ogc_fid,
ST_MakeValid(ST_Simplify(geometry, ZRes(7))) AS geometry,
'lake'::text AS class,
NULL::boolean AS is_intermittent, NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM ne_10m_lakes FROM ne_10m_lakes
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_10m_lakes_gen_z5_idx ON ne_10m_lakes_gen_z5 USING gist (geometry);
-- etldoc: ne_10m_lakes_gen_z5 -> ne_10m_lakes_gen_z4
DROP MATERIALIZED VIEW IF EXISTS ne_10m_lakes_gen_z4 CASCADE;
CREATE MATERIALIZED VIEW ne_10m_lakes_gen_z4 AS
(
SELECT ogc_fid,
ST_MakeValid(ST_Simplify(geometry, ZRes(6))) AS geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_10m_lakes_gen_z5
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_10m_lakes_gen_z4_idx ON ne_10m_lakes_gen_z4 USING gist (geometry);
-- ne_50m_ocean
-- etldoc: ne_50m_ocean -> ne_50m_ocean_gen_z4
DROP MATERIALIZED VIEW IF EXISTS ne_50m_ocean_gen_z4 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_ocean_gen_z4 AS
(
SELECT ST_Simplify(geometry, ZRes(6)) AS geometry,
'ocean'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_50m_ocean
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_ocean_gen_z4_idx ON ne_50m_ocean_gen_z4 USING gist (geometry);
-- etldoc: ne_50m_ocean_gen_z4 -> ne_50m_ocean_gen_z3
DROP MATERIALIZED VIEW IF EXISTS ne_50m_ocean_gen_z3 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_ocean_gen_z3 AS
(
SELECT ST_Simplify(geometry, ZRes(5)) AS geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_50m_ocean_gen_z4
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_ocean_gen_z3_idx ON ne_50m_ocean_gen_z3 USING gist (geometry);
-- etldoc: ne_50m_ocean_gen_z3 -> ne_50m_ocean_gen_z2
DROP MATERIALIZED VIEW IF EXISTS ne_50m_ocean_gen_z2 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_ocean_gen_z2 AS
(
SELECT ST_Simplify(geometry, ZRes(4)) AS geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_50m_ocean_gen_z3
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_ocean_gen_z2_idx ON ne_50m_ocean_gen_z2 USING gist (geometry);
-- ne_50m_lakes
-- etldoc: ne_50m_lakes -> ne_50m_lakes_gen_z3
DROP MATERIALIZED VIEW IF EXISTS ne_50m_lakes_gen_z3 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_lakes_gen_z3 AS
(
SELECT ogc_fid,
ST_MakeValid(ST_Simplify(geometry, ZRes(5))) AS geometry,
'lakes'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_50m_lakes
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_lakes_gen_z3_idx ON ne_50m_lakes_gen_z3 USING gist (geometry);
-- etldoc: ne_50m_lakes_gen_z3 -> ne_50m_lakes_gen_z2
DROP MATERIALIZED VIEW IF EXISTS ne_50m_lakes_gen_z2 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_lakes_gen_z2 AS
(
SELECT ogc_fid,
ST_MakeValid(ST_Simplify(geometry, ZRes(4))) AS geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_50m_lakes_gen_z3
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_lakes_gen_z2_idx ON ne_50m_lakes_gen_z2 USING gist (geometry);
--ne_110m_ocean
-- etldoc: ne_110m_ocean -> ne_110m_ocean_gen_z1
DROP MATERIALIZED VIEW IF EXISTS ne_110m_ocean_gen_z1 CASCADE;
CREATE MATERIALIZED VIEW ne_110m_ocean_gen_z1 AS
(
SELECT ST_Simplify(geometry, ZRes(3)) AS geometry,
'ocean'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_110m_ocean
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_110m_ocean_gen_z1_idx ON ne_110m_ocean_gen_z1 USING gist (geometry);
-- etldoc: ne_110m_ocean_gen_z1 -> ne_110m_ocean_gen_z0
DROP MATERIALIZED VIEW IF EXISTS ne_110m_ocean_gen_z0 CASCADE;
CREATE MATERIALIZED VIEW ne_110m_ocean_gen_z0 AS
(
SELECT ST_Simplify(geometry, ZRes(2)) AS geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_110m_ocean_gen_z1
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_110m_ocean_gen_z0_idx ON ne_110m_ocean_gen_z0 USING gist (geometry);
-- ne_110m_lakes
-- etldoc: ne_110m_lakes -> ne_110m_lakes_gen_z1
DROP MATERIALIZED VIEW IF EXISTS ne_110m_lakes_gen_z1 CASCADE;
CREATE MATERIALIZED VIEW ne_110m_lakes_gen_z1 AS
(
SELECT ogc_fid,
ST_Simplify(geometry, ZRes(3)) AS geometry,
'lakes'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM ne_110m_lakes
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_110m_lakes_gen_z1_idx ON ne_110m_lakes_gen_z1 USING gist (geometry);
-- etldoc: ne_110m_lakes_gen_z1 -> ne_110m_lakes_gen_z0
DROP MATERIALIZED VIEW IF EXISTS ne_110m_lakes_gen_z0 CASCADE;
CREATE MATERIALIZED VIEW ne_110m_lakes_gen_z0 AS
(
SELECT ogc_fid,
ST_Simplify(geometry, ZRes(2)) AS geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_110m_lakes_gen_z1
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_110m_lakes_gen_z0_idx ON ne_110m_lakes_gen_z0 USING gist (geometry);
CREATE OR REPLACE VIEW water_z0 AS
(
-- etldoc: ne_110m_ocean_gen_z0 -> water_z0
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_110m_ocean_gen_z0
UNION ALL
-- etldoc: ne_110m_lakes_gen_z0 -> water_z0
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_110m_lakes_gen_z0
);
CREATE OR REPLACE VIEW water_z1 AS
(
-- etldoc: ne_110m_ocean_gen_z1 -> water_z1
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_110m_ocean_gen_z1
UNION ALL
-- etldoc: ne_110m_lakes_gen_z1 -> water_z1
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_110m_lakes_gen_z1
);
CREATE OR REPLACE VIEW water_z2 AS
(
-- etldoc: ne_50m_ocean_gen_z2 -> water_z2
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_50m_ocean_gen_z2
UNION ALL
-- etldoc: ne_50m_lakes_gen_z2 -> water_z2
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_50m_lakes_gen_z2
);
CREATE OR REPLACE VIEW water_z3 AS
(
-- etldoc: ne_50m_ocean_gen_z3 -> water_z3
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_50m_ocean_gen_z3
UNION ALL
-- etldoc: ne_50m_lakes_gen_z3 -> water_z3
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_50m_lakes_gen_z3
);
CREATE OR REPLACE VIEW water_z4 AS
(
-- etldoc: ne_50m_ocean_gen_z4 -> water_z4
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_50m_ocean_gen_z4
UNION ALL
-- etldoc: ne_10m_lakes_gen_z4 -> water_z4
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_10m_lakes_gen_z4
);
CREATE OR REPLACE VIEW water_z5 AS
(
-- etldoc: ne_10m_ocean_gen_z5 -> water_z5
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_10m_ocean_gen_z5
UNION ALL
-- etldoc: ne_10m_lakes_gen_z5 -> water_z5
SELECT geometry,
class,
is_intermittent,
is_bridge,
is_tunnel
FROM ne_10m_lakes_gen_z5
); );
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_gen_z6 -> water_z6
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
NULL::boolean AS is_intermittent, NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_ocean_polygon_gen4 FROM osm_ocean_polygon_gen_z6
UNION ALL UNION ALL
-- etldoc: osm_water_polygon_gen6 -> water_z6 -- etldoc: osm_water_polygon_gen_z6 -> water_z6
SELECT geometry, SELECT geometry,
water_class(waterway) AS class, water_class(waterway) AS class,
is_intermittent, is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_water_polygon_gen6 FROM osm_water_polygon_gen_z6
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_gen_z7 -> water_z7
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
NULL::boolean AS is_intermittent, NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_ocean_polygon_gen4 FROM osm_ocean_polygon_gen_z7
UNION ALL UNION ALL
-- etldoc: osm_water_polygon_gen5 -> water_z7 -- etldoc: osm_water_polygon_gen_z7 -> water_z7
SELECT geometry, SELECT geometry,
water_class(waterway) AS class, water_class(waterway) AS class,
is_intermittent, is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_water_polygon_gen5 FROM osm_water_polygon_gen_z7
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_gen_z8 -> water_z8
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
NULL::boolean AS is_intermittent, NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_ocean_polygon_gen4 FROM osm_ocean_polygon_gen_z8
UNION ALL UNION ALL
-- etldoc: osm_water_polygon_gen4 -> water_z8 -- etldoc: osm_water_polygon_gen_z8 -> water_z8
SELECT geometry, SELECT geometry,
water_class(waterway) AS class, water_class(waterway) AS class,
is_intermittent, is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_water_polygon_gen4 FROM osm_water_polygon_gen_z8
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_gen_z9 -> water_z9
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
NULL::boolean AS is_intermittent, NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_ocean_polygon_gen3 FROM osm_ocean_polygon_gen_z9
UNION ALL UNION ALL
-- etldoc: osm_water_polygon_gen3 -> water_z9 -- etldoc: osm_water_polygon_gen_z9 -> water_z9
SELECT geometry, SELECT geometry,
water_class(waterway) AS class, water_class(waterway) AS class,
is_intermittent, is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_water_polygon_gen3 FROM osm_water_polygon_gen_z9
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_gen_z10 -> water_z10
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
NULL::boolean AS is_intermittent, NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_ocean_polygon_gen2 FROM osm_ocean_polygon_gen_z10
UNION ALL UNION ALL
-- etldoc: osm_water_polygon_gen2 -> water_z10 -- etldoc: osm_water_polygon_gen_z10 -> water_z10
SELECT geometry, SELECT geometry,
water_class(waterway) AS class, water_class(waterway) AS class,
is_intermittent, is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_water_polygon_gen2 FROM osm_water_polygon_gen_z10
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_gen_z11 -> water_z11
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
NULL::boolean AS is_intermittent, NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_ocean_polygon_gen1 FROM osm_ocean_polygon_gen_z11
UNION ALL UNION ALL
-- etldoc: osm_water_polygon_gen1 -> water_z11 -- etldoc: osm_water_polygon_gen_z11 -> water_z11
SELECT geometry, SELECT geometry,
water_class(waterway) AS class, water_class(waterway) AS class,
is_intermittent, is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_water_polygon_gen1 FROM osm_water_polygon_gen_z11
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_union -> water_z12
SELECT geometry, SELECT geometry,
'ocean'::text AS class, 'ocean'::text AS class,
NULL::boolean AS is_intermittent, NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel NULL::boolean AS is_tunnel
FROM osm_ocean_polygon FROM osm_ocean_polygon_union
UNION ALL UNION ALL
-- etldoc: osm_water_polygon -> water_z12 -- etldoc: osm_water_polygon -> water_z12
SELECT geometry, SELECT geometry,
@ -255,48 +442,8 @@ FROM osm_water_polygon
WHERE "natural" != 'bay' WHERE "natural" != 'bay'
); );
CREATE OR REPLACE VIEW water_z13 AS
(
-- etldoc: osm_ocean_polygon -> water_z13
SELECT geometry,
'ocean'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM osm_ocean_polygon
UNION ALL
-- etldoc: osm_water_polygon -> water_z13
SELECT geometry,
water_class(waterway) AS class,
is_intermittent,
is_bridge,
is_tunnel
FROM osm_water_polygon
WHERE "natural" != 'bay'
);
CREATE OR REPLACE VIEW water_z14 AS
(
-- etldoc: osm_ocean_polygon -> water_z14
SELECT geometry,
'ocean'::text AS class,
NULL::boolean AS is_intermittent,
NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel
FROM osm_ocean_polygon
UNION ALL
-- etldoc: osm_water_polygon -> water_z14
SELECT geometry,
water_class(waterway) AS class,
is_intermittent,
is_bridge,
is_tunnel
FROM osm_water_polygon
WHERE "natural" != 'bay'
);
-- etldoc: layer_water [shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_water [shape=record fillcolor=lightpink, style="rounded,filled",
-- 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+" ] ;
CREATE OR REPLACE FUNCTION layer_water(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_water(bbox geometry, zoom_level int)
RETURNS TABLE RETURNS TABLE
@ -311,7 +458,7 @@ $$
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 * SELECT *
@ -324,10 +471,14 @@ FROM (
WHERE zoom_level = 1 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
SELECT * SELECT *
FROM water_z2 FROM water_z2
WHERE zoom_level BETWEEN 2 AND 3 WHERE zoom_level = 2
UNION ALL
-- etldoc: water_z3 -> layer_water:z3
SELECT *
FROM water_z3
WHERE zoom_level = 3
UNION ALL UNION ALL
-- etldoc: water_z4 -> layer_water:z4 -- etldoc: water_z4 -> layer_water:z4
SELECT * SELECT *
@ -372,17 +523,7 @@ FROM (
-- etldoc: water_z12 -> layer_water:z12 -- etldoc: water_z12 -> layer_water:z12
SELECT * SELECT *
FROM water_z12 FROM water_z12
WHERE zoom_level = 12 WHERE zoom_level >= 12
UNION ALL
-- etldoc: water_z13 -> layer_water:z13
SELECT *
FROM water_z13
WHERE zoom_level = 13
UNION ALL
-- etldoc: water_z14 -> layer_water:z14_
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 STABLE

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

@ -1,49 +1,63 @@
DROP TRIGGER IF EXISTS trigger_flag ON osm_marine_point; DROP TRIGGER IF EXISTS trigger_flag ON osm_marine_point;
DROP TRIGGER IF EXISTS trigger_store ON osm_marine_point;
DROP TRIGGER IF EXISTS trigger_refresh ON water_name_marine.updates; DROP TRIGGER IF EXISTS trigger_refresh ON water_name_marine.updates;
CREATE EXTENSION IF NOT EXISTS unaccent; CREATE SCHEMA IF NOT EXISTS water_name_marine;
CREATE OR REPLACE FUNCTION update_osm_marine_point() RETURNS void AS CREATE TABLE IF NOT EXISTS water_name_marine.osm_ids
(
osm_id bigint
);
CREATE OR REPLACE FUNCTION update_osm_marine_point(full_update boolean) RETURNS void AS
$$ $$
BEGIN
-- etldoc: osm_marine_point -> osm_marine_point
UPDATE osm_marine_point AS osm SET "rank" = NULL WHERE "rank" IS NOT NULL;
-- etldoc: ne_10m_geography_marine_polys -> osm_marine_point -- etldoc: ne_10m_geography_marine_polys -> osm_marine_point
-- etldoc: osm_marine_point -> osm_marine_point -- etldoc: osm_marine_point -> osm_marine_point
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.osm_id, ne.scalerank
FROM ne_10m_geography_marine_polys AS ne, FROM osm_marine_point AS osm
osm_marine_point AS osm LEFT JOIN ne_10m_geography_marine_polys AS ne ON
WHERE trim(regexp_replace(ne.name, '\\s+', ' ', 'g')) ILIKE osm.name lower(trim(regexp_replace(ne.name, '\\s+', ' ', 'g'))) IN (lower(osm.name), lower(osm.tags->'name:en'), lower(osm.tags->'name:es'))
OR trim(regexp_replace(ne.name, '\\s+', ' ', 'g')) ILIKE osm.tags->'name:en' OR substring(lower(trim(regexp_replace(ne.name, '\\s+', ' ', 'g'))) FROM 1 FOR length(lower(osm.name))) = lower(osm.name)
OR trim(regexp_replace(ne.name, '\\s+', ' ', 'g')) ILIKE osm.tags->'name:es'
OR osm.name ILIKE trim(regexp_replace(ne.name, '\\s+', ' ', 'g')) || ' %'
) )
UPDATE osm_marine_point AS osm UPDATE osm_marine_point AS osm
SET "rank" = scalerank SET "rank" = scalerank
FROM important_marine_point AS ne FROM important_marine_point AS ne
WHERE osm.osm_id = ne.osm_id; WHERE (full_update OR osm.osm_id IN (SELECT osm_id FROM water_name_marine.osm_ids))
AND osm.osm_id = ne.osm_id
AND "rank" IS DISTINCT FROM scalerank;
UPDATE osm_marine_point UPDATE osm_marine_point
SET tags = update_tags(tags, geometry) SET tags = update_tags(tags, geometry)
WHERE COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL; WHERE (full_update OR osm_id IN (SELECT osm_id FROM water_name_marine.osm_ids))
AND COALESCE(tags->'name:latin', tags->'name:nonlatin', tags->'name_int') IS NULL
AND tags != update_tags(tags, geometry);
END; $$ LANGUAGE SQL;
$$ LANGUAGE plpgsql;
SELECT update_osm_marine_point(); SELECT update_osm_marine_point(true);
CREATE INDEX IF NOT EXISTS osm_marine_point_rank_idx ON osm_marine_point ("rank"); 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 OR REPLACE FUNCTION water_name_marine.store() RETURNS trigger AS
$$
BEGIN
IF (tg_op = 'DELETE') THEN
INSERT INTO water_name_marine.osm_ids VALUES (OLD.osm_id);
ELSE
INSERT INTO water_name_marine.osm_ids VALUES (NEW.osm_id);
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS water_name_marine.updates CREATE TABLE IF NOT EXISTS water_name_marine.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION water_name_marine.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION water_name_marine.flag() RETURNS trigger AS
@ -56,15 +70,27 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION water_name_marine.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION water_name_marine.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
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(false);
-- noinspection SqlWithoutWhere
DELETE FROM water_name_marine.osm_ids;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM water_name_marine.updates; DELETE FROM water_name_marine.updates;
RAISE LOG 'Refresh water_name_marine done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_store
AFTER INSERT OR UPDATE OR DELETE
ON osm_marine_point
FOR EACH ROW
EXECUTE PROCEDURE water_name_marine.store();
CREATE TRIGGER trigger_flag CREATE TRIGGER trigger_flag
AFTER INSERT OR UPDATE OR DELETE AFTER INSERT OR UPDATE OR DELETE
ON osm_marine_point ON osm_marine_point

View File

@ -4,12 +4,12 @@ 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,
name_en, name_en,
name_de, 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
@ -66,7 +66,10 @@ 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
-- May happen in case we replay update
ON CONFLICT ON CONSTRAINT osm_water_lakeline_pk
DO NOTHING;
RETURN NULL; RETURN NULL;
END; END;

View File

@ -4,17 +4,18 @@ 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 wp.osm_id, SELECT wp.osm_id,
ST_PointOnSurface(wp.geometry) AS geometry, ST_PointOnSurface(wp.geometry) AS geometry,
wp.name, wp.name,
wp.name_en, wp.name_en,
wp.name_de, 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 WHERE ll.osm_id IS NULL
AND wp.name <> ''; AND wp.name <> ''
AND ST_IsValid(wp.geometry);
-- 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
@ -66,7 +67,10 @@ 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
-- May happen in case we replay update
ON CONFLICT ON CONSTRAINT osm_water_point_pk
DO NOTHING;
RETURN NULL; RETURN NULL;
END; END;

View File

@ -21,14 +21,14 @@ 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, geometry,
name, 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_lakeline FROM osm_water_lakeline
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))
@ -40,14 +40,14 @@ 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, geometry,
name, 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 WHERE geometry && bbox
AND ( AND (
@ -59,14 +59,14 @@ 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_
osm_id * 10 AS osm_id_hash, osm_id * 10 AS osm_id_hash,
geometry, geometry,
name, 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 WHERE geometry && bbox
AND ( AND (

View File

@ -29,7 +29,7 @@ schema:
- ./update_marine_point.sql - ./update_marine_point.sql
- ./update_water_lakeline.sql - ./update_water_lakeline.sql
- ./update_water_point.sql - ./update_water_point.sql
- ./layer.sql - ./water_name.sql
datasources: datasources:
- type: imposm3 - type: imposm3
mapping_file: ../water/mapping.yaml mapping_file: ../water/mapping.yaml

Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 KiB

After

Width:  |  Height:  |  Size: 249 KiB

View File

@ -1,20 +1,3 @@
generalized_tables:
# etldoc: imposm3 -> osm_waterway_linestring_gen3
waterway_linestring_gen3:
source: waterway_linestring_gen2
sql_filter: waterway IN ('river')
tolerance: ZRES9
# etldoc: imposm3 -> osm_waterway_linestring_gen2
waterway_linestring_gen2:
source: waterway_linestring_gen1
sql_filter: waterway IN ('river')
tolerance: ZRES10
# etldoc: imposm3 -> osm_waterway_linestring_gen1
waterway_linestring_gen1:
source: waterway_linestring
sql_filter: waterway IN ('river') AND ST_IsValid(geometry)
tolerance: ZRES11
tunnel_field: &tunnel tunnel_field: &tunnel
key: tunnel key: tunnel
name: is_tunnel name: is_tunnel

View File

@ -26,7 +26,7 @@ FROM (
name, name,
name_en, name_en,
name_de, name_de,
slice_language_tags(tags) AS tags slice_language_tags(tags) AS tags
FROM osm_waterway_linestring FROM osm_waterway_linestring
WHERE name <> '' WHERE name <> ''
AND waterway = 'river' AND waterway = 'river'
@ -36,41 +36,50 @@ FROM (
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);
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_geometry_idx ON osm_important_waterway_linestring USING gist (geometry); CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_geometry_idx ON osm_important_waterway_linestring USING gist (geometry);
-- etldoc: osm_important_waterway_linestring -> osm_important_waterway_linestring_gen1 -- etldoc: osm_important_waterway_linestring -> osm_important_waterway_linestring_gen_z11
CREATE OR REPLACE VIEW osm_important_waterway_linestring_gen1_view AS DROP MATERIALIZED VIEW IF EXISTS osm_important_waterway_linestring_gen_z11 CASCADE;
SELECT ST_Simplify(geometry, 60) AS geometry, name, name_en, name_de, tags CREATE MATERIALIZED VIEW osm_important_waterway_linestring_gen_z11 AS
(
SELECT ST_Simplify(geometry, ZRes(12)) 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 INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z11_name_idx ON osm_important_waterway_linestring_gen_z11 (name);
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z11_geometry_idx ON osm_important_waterway_linestring_gen_z11 USING gist (geometry);
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen1 AS -- etldoc: osm_important_waterway_linestring_gen_z11 -> osm_important_waterway_linestring_gen_z10
SELECT * DROP MATERIALIZED VIEW IF EXISTS osm_important_waterway_linestring_gen_z10 CASCADE;
FROM osm_important_waterway_linestring_gen1_view; CREATE MATERIALIZED VIEW osm_important_waterway_linestring_gen_z10 AS
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); SELECT ST_Simplify(geometry, ZRes(11)) AS geometry,
name,
name_en,
name_de,
tags
FROM osm_important_waterway_linestring_gen_z11
WHERE ST_Length(geometry) > 4000
);
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z10_name_idx ON osm_important_waterway_linestring_gen_z10 (name);
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z10_geometry_idx ON osm_important_waterway_linestring_gen_z10 USING gist (geometry);
-- etldoc: osm_important_waterway_linestring_gen1 -> osm_important_waterway_linestring_gen2 -- etldoc: osm_important_waterway_linestring_gen_z10 -> osm_important_waterway_linestring_gen_z9
CREATE OR REPLACE VIEW osm_important_waterway_linestring_gen2_view AS DROP MATERIALIZED VIEW IF EXISTS osm_important_waterway_linestring_gen_z9 CASCADE;
SELECT ST_Simplify(geometry, 100) AS geometry, name, name_en, name_de, tags CREATE MATERIALIZED VIEW osm_important_waterway_linestring_gen_z9 AS
FROM osm_important_waterway_linestring_gen1 (
WHERE ST_Length(geometry) > 4000; SELECT ST_Simplify(geometry, ZRes(10)) AS geometry,
name,
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen2 AS name_en,
SELECT * name_de,
FROM osm_important_waterway_linestring_gen2_view; tags
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen2_name_idx ON osm_important_waterway_linestring_gen2 (name); FROM osm_important_waterway_linestring_gen_z10
CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen2_geometry_idx ON osm_important_waterway_linestring_gen2 USING gist (geometry); WHERE ST_Length(geometry) > 8000
);
-- etldoc: osm_important_waterway_linestring_gen2 -> osm_important_waterway_linestring_gen3 CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z9_name_idx ON osm_important_waterway_linestring_gen_z9 (name);
CREATE OR REPLACE VIEW osm_important_waterway_linestring_gen3_view AS CREATE INDEX IF NOT EXISTS osm_important_waterway_linestring_gen_z9_geometry_idx ON osm_important_waterway_linestring_gen_z9 USING gist (geometry);
SELECT ST_Simplify(geometry, 200) AS geometry, name, name_en, name_de, tags
FROM osm_important_waterway_linestring_gen2
WHERE ST_Length(geometry) > 8000;
CREATE TABLE IF NOT EXISTS osm_important_waterway_linestring_gen3 AS
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_geometry_idx ON osm_important_waterway_linestring_gen3 USING gist (geometry);
-- Handle updates -- Handle updates
@ -78,26 +87,24 @@ 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, osm_id bigint,
name character varying, is_old boolean,
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)
); );
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;
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;
END IF; END IF;
RETURN NULL; RETURN NULL;
END; END;
@ -106,7 +113,7 @@ $$ LANGUAGE plpgsql;
CREATE TABLE IF NOT EXISTS waterway_important.updates CREATE TABLE IF NOT EXISTS waterway_important.updates
( (
id serial PRIMARY KEY, id serial PRIMARY KEY,
t text, t text,
UNIQUE (t) UNIQUE (t)
); );
CREATE OR REPLACE FUNCTION waterway_important.flag() RETURNS trigger AS CREATE OR REPLACE FUNCTION waterway_important.flag() RETURNS trigger AS
@ -119,15 +126,40 @@ $$ LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION waterway_important.refresh() RETURNS trigger AS CREATE OR REPLACE FUNCTION waterway_important.refresh() RETURNS trigger AS
$$ $$
DECLARE
t TIMESTAMP WITH TIME ZONE := clock_timestamp();
BEGIN BEGIN
RAISE LOG 'Refresh waterway'; RAISE LOG 'Refresh waterway';
-- REFRESH osm_important_waterway_linestring -- REFRESH osm_important_waterway_linestring
-- Compact the change history to keep only the first and last version, and then uniq version of row
CREATE TEMP TABLE changes_compact AS
SELECT DISTINCT ON (name, name_en, name_de, tags)
name,
name_en,
name_de,
tags
FROM ((
SELECT DISTINCT ON (osm_id) *
FROM waterway_important.changes
WHERE is_old
ORDER BY osm_id,
id ASC
)
UNION ALL
(
SELECT DISTINCT ON (osm_id) *
FROM waterway_important.changes
WHERE NOT is_old
ORDER BY osm_id,
id DESC
)) AS t;
DELETE DELETE
FROM osm_important_waterway_linestring AS w FROM osm_important_waterway_linestring AS w
USING waterway_important.changes AS c USING changes_compact AS c
WHERE c.is_old WHERE w.name = c.name
AND w.name = c.name
AND w.name_en IS NOT DISTINCT FROM c.name_en AND w.name_en IS NOT DISTINCT FROM c.name_en
AND w.name_de IS NOT DISTINCT FROM c.name_de AND w.name_de IS NOT DISTINCT FROM c.name_de
AND w.tags IS NOT DISTINCT FROM c.tags; AND w.tags IS NOT DISTINCT FROM c.tags;
@ -143,72 +175,34 @@ BEGIN
w.name, w.name,
w.name_en, w.name_en,
w.name_de, w.name_de,
slice_language_tags(w.tags) AS tags 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 changes_compact AS c ON
w.name = c.name AND w.name_en IS NOT DISTINCT FROM c.name_en AND 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.name_de IS NOT DISTINCT FROM c.name_de AND
slice_language_tags(w.tags) IS NOT DISTINCT FROM c.tags slice_language_tags(w.tags) IS NOT DISTINCT FROM c.tags
WHERE w.name <> '' WHERE w.name <> ''
AND w.waterway = 'river' AND w.waterway = 'river'
AND ST_IsValid(geometry) 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 osm_important_waterway_linestring_gen_z11
DELETE REFRESH MATERIALIZED VIEW osm_important_waterway_linestring_gen_z11;
FROM osm_important_waterway_linestring_gen1 AS w
USING waterway_important.changes AS c
WHERE c.is_old
AND 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;
INSERT INTO osm_important_waterway_linestring_gen1 -- REFRESH osm_important_waterway_linestring_gen_z10
SELECT w.* REFRESH MATERIALIZED VIEW osm_important_waterway_linestring_gen_z10;
FROM osm_important_waterway_linestring_gen1_view AS w
NATURAL JOIN waterway_important.changes AS c
WHERE NOT c.is_old;
-- REFRESH osm_important_waterway_linestring_gen2 -- REFRESH osm_important_waterway_linestring_gen_z9
DELETE REFRESH MATERIALIZED VIEW osm_important_waterway_linestring_gen_z9;
FROM osm_important_waterway_linestring_gen2 AS w
USING waterway_important.changes AS c
WHERE c.is_old
AND 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;
INSERT INTO osm_important_waterway_linestring_gen2
SELECT w.*
FROM osm_important_waterway_linestring_gen2_view AS w
NATURAL JOIN waterway_important.changes AS c
WHERE NOT c.is_old;
-- REFRESH osm_important_waterway_linestring_gen3
DELETE
FROM osm_important_waterway_linestring_gen3 AS w
USING waterway_important.changes AS c
WHERE c.is_old
AND 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;
INSERT INTO osm_important_waterway_linestring_gen3
SELECT w.*
FROM osm_important_waterway_linestring_gen3_view AS w
NATURAL JOIN waterway_important.changes AS c
WHERE NOT c.is_old;
DROP TABLE changes_compact;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM waterway_important.changes; DELETE FROM waterway_important.changes;
-- noinspection SqlWithoutWhere -- noinspection SqlWithoutWhere
DELETE FROM waterway_important.updates; DELETE FROM waterway_important.updates;
RAISE LOG 'Refresh waterway done in %', age(clock_timestamp(), t);
RETURN NULL; RETURN NULL;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;

View File

@ -6,15 +6,6 @@ $$
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
SET tags = update_tags(tags, geometry);
UPDATE osm_waterway_linestring_gen2
SET tags = update_tags(tags, geometry);
UPDATE osm_waterway_linestring_gen3
SET tags = update_tags(tags, geometry);
END END
$$; $$;

View File

@ -7,56 +7,206 @@ SELECT CASE
$$ LANGUAGE SQL IMMUTABLE $$ LANGUAGE SQL IMMUTABLE
STRICT STRICT
PARALLEL SAFE; PARALLEL SAFE;
-- ne_110m_rivers_lake_centerlines
-- etldoc: ne_110m_rivers_lake_centerlines -> waterway_z3 -- etldoc: ne_110m_rivers_lake_centerlines -> ne_110m_rivers_lake_centerlines_gen_z3
CREATE OR REPLACE VIEW waterway_z3 AS DROP MATERIALIZED VIEW IF EXISTS ne_110m_rivers_lake_centerlines_gen_z3 CASCADE;
CREATE MATERIALIZED VIEW ne_110m_rivers_lake_centerlines_gen_z3 AS
( (
SELECT geometry, SELECT ST_Simplify(geometry, ZRes(5)) as geometry,
'river'::text AS class, 'river'::text AS class,
NULL::text AS name, NULL::text AS name,
NULL::text AS name_en, NULL::text AS name_en,
NULL::text AS name_de, NULL::text AS name_de,
NULL::hstore AS tags, NULL::hstore AS tags,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel, NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent NULL::boolean AS is_intermittent
FROM ne_110m_rivers_lake_centerlines FROM ne_110m_rivers_lake_centerlines
WHERE featurecla = 'River' WHERE featurecla = 'River'
); ) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_110m_rivers_lake_centerlines_gen_z3_idx ON ne_110m_rivers_lake_centerlines_gen_z3 USING gist (geometry);
-- etldoc: ne_50m_rivers_lake_centerlines -> waterway_z4 -- ne_50m_rivers_lake_centerlines
CREATE OR REPLACE VIEW waterway_z4 AS -- etldoc: ne_50m_rivers_lake_centerlines -> ne_50m_rivers_lake_centerlines_gen_z5
DROP MATERIALIZED VIEW IF EXISTS ne_50m_rivers_lake_centerlines_gen_z5 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_rivers_lake_centerlines_gen_z5 AS
( (
SELECT geometry, SELECT ST_Simplify(geometry, ZRes(7)) as geometry,
'river'::text AS class, 'river'::text AS class,
NULL::text AS name, NULL::text AS name,
NULL::text AS name_en, NULL::text AS name_en,
NULL::text AS name_de, NULL::text AS name_de,
NULL::hstore AS tags, NULL::hstore AS tags,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel, NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent NULL::boolean AS is_intermittent
FROM ne_50m_rivers_lake_centerlines FROM ne_50m_rivers_lake_centerlines
WHERE featurecla = 'River' WHERE featurecla = 'River'
); ) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_rivers_lake_centerlines_gen_z5_idx ON ne_50m_rivers_lake_centerlines_gen_z5 USING gist (geometry);
-- etldoc: ne_10m_rivers_lake_centerlines -> waterway_z6 -- etldoc: ne_50m_rivers_lake_centerlines_gen_z5 -> ne_50m_rivers_lake_centerlines_gen_z4
CREATE OR REPLACE VIEW waterway_z6 AS DROP MATERIALIZED VIEW IF EXISTS ne_50m_rivers_lake_centerlines_gen_z4 CASCADE;
CREATE MATERIALIZED VIEW ne_50m_rivers_lake_centerlines_gen_z4 AS
( (
SELECT geometry, SELECT ST_Simplify(geometry, ZRes(6)) as geometry,
class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM ne_50m_rivers_lake_centerlines_gen_z5
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_50m_rivers_lake_centerlines_gen_z4_idx ON ne_50m_rivers_lake_centerlines_gen_z4 USING gist (geometry);
-- ne_10m_rivers_lake_centerlines
-- etldoc: ne_10m_rivers_lake_centerlines -> ne_10m_rivers_lake_centerlines_gen_z8
DROP MATERIALIZED VIEW IF EXISTS ne_10m_rivers_lake_centerlines_gen_z8 CASCADE;
CREATE MATERIALIZED VIEW ne_10m_rivers_lake_centerlines_gen_z8 AS
(
SELECT ST_Simplify(geometry, ZRes(10)) as geometry,
'river'::text AS class, 'river'::text AS class,
NULL::text AS name, NULL::text AS name,
NULL::text AS name_en, NULL::text AS name_en,
NULL::text AS name_de, NULL::text AS name_de,
NULL::hstore AS tags, NULL::hstore AS tags,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel, NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent NULL::boolean AS is_intermittent
FROM ne_10m_rivers_lake_centerlines FROM ne_10m_rivers_lake_centerlines
WHERE featurecla = 'River' WHERE featurecla = 'River'
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_10m_rivers_lake_centerlines_gen_z8_idx ON ne_10m_rivers_lake_centerlines_gen_z8 USING gist (geometry);
-- etldoc: ne_10m_rivers_lake_centerlines_gen_z8 -> ne_10m_rivers_lake_centerlines_gen_z7
DROP MATERIALIZED VIEW IF EXISTS ne_10m_rivers_lake_centerlines_gen_z7 CASCADE;
CREATE MATERIALIZED VIEW ne_10m_rivers_lake_centerlines_gen_z7 AS
(
SELECT ST_Simplify(geometry, ZRes(9)) as geometry,
class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM ne_10m_rivers_lake_centerlines_gen_z8
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_10m_rivers_lake_centerlines_gen_z7_idx ON ne_10m_rivers_lake_centerlines_gen_z7 USING gist (geometry);
-- etldoc: ne_10m_rivers_lake_centerlines_gen_z7 -> ne_10m_rivers_lake_centerlines_gen_z6
DROP MATERIALIZED VIEW IF EXISTS ne_10m_rivers_lake_centerlines_gen_z6 CASCADE;
CREATE MATERIALIZED VIEW ne_10m_rivers_lake_centerlines_gen_z6 AS
(
SELECT ST_Simplify(geometry, ZRes(8)) as geometry,
class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM ne_10m_rivers_lake_centerlines_gen_z7
) /* DELAY_MATERIALIZED_VIEW_CREATION */ ;
CREATE INDEX IF NOT EXISTS ne_10m_rivers_lake_centerlines_gen_z6_idx ON ne_10m_rivers_lake_centerlines_gen_z6 USING gist (geometry);
-- etldoc: ne_110m_rivers_lake_centerlines_gen_z3 -> waterway_z3
CREATE OR REPLACE VIEW waterway_z3 AS
(
SELECT geometry,
class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM ne_110m_rivers_lake_centerlines_gen_z3
); );
-- etldoc: osm_important_waterway_linestring_gen3 -> waterway_z9 -- etldoc: ne_50m_rivers_lake_centerlines_gen_z4 -> waterway_z4
CREATE OR REPLACE VIEW waterway_z4 AS
(
SELECT geometry,
class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM ne_50m_rivers_lake_centerlines_gen_z4
);
-- etldoc: ne_50m_rivers_lake_centerlines_gen_z5 -> waterway_z5
CREATE OR REPLACE VIEW waterway_z5 AS
(
SELECT geometry,
class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM ne_50m_rivers_lake_centerlines_gen_z5
);
-- etldoc: ne_10m_rivers_lake_centerlines_gen_z6 -> waterway_z6
CREATE OR REPLACE VIEW waterway_z6 AS
(
SELECT geometry,
class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM ne_10m_rivers_lake_centerlines_gen_z6
);
-- etldoc: ne_10m_rivers_lake_centerlines_gen_z7 -> waterway_z7
CREATE OR REPLACE VIEW waterway_z7 AS
(
SELECT geometry,
class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM ne_10m_rivers_lake_centerlines_gen_z7
);
-- etldoc: ne_10m_rivers_lake_centerlines_gen_z8 -> waterway_z8
CREATE OR REPLACE VIEW waterway_z8 AS
(
SELECT geometry,
class,
name,
name_en,
name_de,
tags,
is_bridge,
is_tunnel,
is_intermittent
FROM ne_10m_rivers_lake_centerlines_gen_z8
);
-- etldoc: osm_important_waterway_linestring_gen_z9 -> waterway_z9
CREATE OR REPLACE VIEW waterway_z9 AS CREATE OR REPLACE VIEW waterway_z9 AS
( (
SELECT geometry, SELECT geometry,
@ -68,10 +218,10 @@ SELECT geometry,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel, NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent NULL::boolean AS is_intermittent
FROM osm_important_waterway_linestring_gen3 FROM osm_important_waterway_linestring_gen_z9
); );
-- etldoc: osm_important_waterway_linestring_gen2 -> waterway_z10 -- etldoc: osm_important_waterway_linestring_gen_z10 -> waterway_z10
CREATE OR REPLACE VIEW waterway_z10 AS CREATE OR REPLACE VIEW waterway_z10 AS
( (
SELECT geometry, SELECT geometry,
@ -83,10 +233,10 @@ SELECT geometry,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel, NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent NULL::boolean AS is_intermittent
FROM osm_important_waterway_linestring_gen2 FROM osm_important_waterway_linestring_gen_z10
); );
-- etldoc:osm_important_waterway_linestring_gen1 -> waterway_z11 -- etldoc:osm_important_waterway_linestring_gen_z11 -> waterway_z11
CREATE OR REPLACE VIEW waterway_z11 AS CREATE OR REPLACE VIEW waterway_z11 AS
( (
SELECT geometry, SELECT geometry,
@ -98,7 +248,7 @@ SELECT geometry,
NULL::boolean AS is_bridge, NULL::boolean AS is_bridge,
NULL::boolean AS is_tunnel, NULL::boolean AS is_tunnel,
NULL::boolean AS is_intermittent NULL::boolean AS is_intermittent
FROM osm_important_waterway_linestring_gen1 FROM osm_important_waterway_linestring_gen_z11
); );
-- etldoc: osm_waterway_linestring -> waterway_z12 -- etldoc: osm_waterway_linestring -> waterway_z12
@ -149,7 +299,7 @@ FROM osm_waterway_linestring
); );
-- etldoc: layer_waterway[shape=record fillcolor=lightpink, style="rounded,filled", -- etldoc: layer_waterway[shape=record fillcolor=lightpink, style="rounded,filled",
-- 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> 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_waterway(bbox geometry, zoom_level int) CREATE OR REPLACE FUNCTION layer_waterway(bbox geometry, zoom_level int)
RETURNS TABLE RETURNS TABLE
@ -167,11 +317,11 @@ AS
$$ $$
SELECT geometry, SELECT geometry,
class, 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,
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,
tags tags
FROM ( FROM (
-- etldoc: waterway_z3 -> layer_waterway:z3 -- etldoc: waterway_z3 -> layer_waterway:z3
@ -179,15 +329,30 @@ FROM (
FROM waterway_z3 FROM waterway_z3
WHERE zoom_level = 3 WHERE zoom_level = 3
UNION ALL UNION ALL
-- etldoc: waterway_z4 -> layer_waterway:z4_5 -- etldoc: waterway_z4 -> layer_waterway:z4
SELECT * SELECT *
FROM waterway_z4 FROM waterway_z4
WHERE zoom_level BETWEEN 4 AND 5 WHERE zoom_level = 4
UNION ALL UNION ALL
-- etldoc: waterway_z6 -> layer_waterway:z6_8 -- etldoc: waterway_z5 -> layer_waterway:z5
SELECT *
FROM waterway_z5
WHERE zoom_level = 5
UNION ALL
-- etldoc: waterway_z6 -> layer_waterway:z6
SELECT * SELECT *
FROM waterway_z6 FROM waterway_z6
WHERE zoom_level BETWEEN 6 AND 8 WHERE zoom_level = 6
UNION ALL
-- etldoc: waterway_z7 -> layer_waterway:z7
SELECT *
FROM waterway_z7
WHERE zoom_level = 7
UNION ALL
-- etldoc: waterway_z8 -> layer_waterway:z8
SELECT *
FROM waterway_z8
WHERE zoom_level = 8
UNION ALL UNION ALL
-- etldoc: waterway_z9 -> layer_waterway:z9 -- etldoc: waterway_z9 -> layer_waterway:z9
SELECT * SELECT *

View File

@ -18,11 +18,11 @@ tileset:
- layers/landmarks/landmark.yaml - layers/landmarks/landmark.yaml
- layers/aerodrome_label/aerodrome_label.yaml - layers/aerodrome_label/aerodrome_label.yaml
name: OpenMapTiles name: OpenMapTiles
version: 3.11.0 version: 3.12.1
id: openmaptiles id: openmaptiles
description: "A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org" description: "A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org"
attribution: '<a href="https://www.openmaptiles.org/" target="_blank">&copy; OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a>' attribution: '<a href="https://www.openmaptiles.org/" target="_blank">&copy; OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a>'
center: [-12.2168, 28.6135, 4] center: [0, 0, 1]
bounds: [-180.0,-85.0511,180.0,85.0511] bounds: [-180.0,-85.0511,180.0,85.0511]
maxzoom: 14 maxzoom: 14
minzoom: 0 minzoom: 0
@ -53,6 +53,7 @@ tileset:
- ga # Irish, Latin - ga # Irish, Latin
- gd # Scottish Gaelic, Latin - gd # Scottish Gaelic, Latin
- he # Hebrew - he # Hebrew
- hi # Hindi
- hr # Croatian, Latin - hr # Croatian, Latin
- hu # Hungarian, Latin - hu # Hungarian, Latin
- hy # Armenian - hy # Armenian
@ -62,11 +63,13 @@ tileset:
- ja # Japanese - ja # Japanese
- ja_kana # Japanese Kana form - ja_kana # Japanese Kana form
- ja_rm # romanization of Japanese, Latin - ja_rm # romanization of Japanese, Latin
- ja-Latn # romanisation of Japanese, Latin since 2018
- ja-Hira # Japanese Hiragana form
- ka # Georgian - ka # Georgian
- kk # Kazakh - kk # Kazakh
- kn # Kannada - kn # Kannada
- ko # Korean - ko # Korean
- ko_rm # romanization of Korean, Latin - ko-Latn # romanization of Korean, Latin
- ku # Kurdish, Latin - ku # Kurdish, Latin
- la # Latin, Latin - la # Latin, Latin
- lb # Luxembourgish, Latin - lb # Luxembourgish, Latin
@ -89,6 +92,8 @@ tileset:
- sr # Serbian, Cyrillic - sr # Serbian, Cyrillic
- sr-Latn # Serbian, Latin - sr-Latn # Serbian, Latin
- sv # Swedish, Latin - sv # Swedish, Latin
- ta # Tamil
- te # Telugu
- th # Thai - th # Thai
- tr # Turkish, Latin - tr # Turkish, Latin
- uk # Ukrainian - uk # Ukrainian

View File

@ -1,35 +0,0 @@
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
layerid=$1
classvars=$2
echo "# FREQ - $layerid group by : $classvars "
for z in {0..15}
do
echo " "
echo "## $layerid z$z - freq"
SQL=$(docker-compose run --rm openmaptiles-tools generate-sqlquery layers/${layerid}/${layerid}.yaml $z )
SQLCODE=$(cat <<-END
select $classvars , count(*) as _count_ from
( $SQL ) as t
GROUP BY $classvars
ORDER BY $classvars
;
END
)
#echo "\`\`\`sql"
#echo "$SQLCODE"
#echo "\`\`\`"
docker-compose run --rm import-osm /usr/src/app/psql.sh -q -P pager=off -P border=2 -P footer=off -P null='(null)' -c "$SQLCODE" \
| sed '1d;$d' | sed '$d' | sed 's/+--/|--/g' | sed 's/--+/--|/g'
done

View File

@ -1,40 +0,0 @@
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
layerid=$1
var=$2
echo "# NUMVAR-ANALYZE - $layerid - $var "
for z in {0..15}
do
echo " "
echo "## $layerid z$z - $var "
SQL=$(docker-compose run --rm openmaptiles-tools generate-sqlquery layers/${layerid}/${layerid}.yaml $z )
SQLCODE=$(cat <<-END
SELECT
count($var) as count
,min($var) as min
,max($var) as max
,avg($var) as avg
,stddev($var) as stddev
,variance($var) as variance
FROM
( $SQL ) as t
;
END
)
#echo "\`\`\`sql"
#echo "$SQLCODE"
#echo "\`\`\`"
docker-compose run --rm import-osm /usr/src/app/psql.sh -q -P pager=off -P border=2 -P footer=off -P null='(null)' -c "$SQLCODE" \
| sed '1d;$d' | sed '$d' | sed 's/+--/|--/g' | sed 's/--+/--|/g'
done

View File

@ -1,34 +0,0 @@
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
layerid=$1
classvar=$2
for z in {0..15}
do
echo " "
echo "## $layerid z$z max length ($classvar)"
SQL=$(docker-compose run --rm openmaptiles-tools generate-sqlquery layers/${layerid}/${layerid}.yaml $z )
SQLCODE=$(cat <<-END
SELECT DISTINCT $classvar , length( $classvar ) AS _length_ from
( $SQL ) as t
WHERE length( $classvar ) > 0
ORDER BY length( $classvar ) DESC NULLS LAST
LIMIT 30
;
END
)
#echo "\`\`\`sql"
#echo "$SQLCODE"
#echo "\`\`\`"
docker-compose run --rm import-osm /usr/src/app/psql.sh -q -P pager=off -P border=2 -P footer=off -P null='(null)' -c "$SQLCODE" \
| sed '1d;$d' | sed '$d' | sed 's/+--/|--/g' | sed 's/--+/--|/g'
done

View File

@ -1,83 +0,0 @@
#!/bin/bash
set -o errexit
set -o pipefail
set -o nounset
# example call from the parent folder : ./qa/run.sh
# or make generate-qareports
# ---- freq ---------------------------------------------------------------
mkdir -p ./build/qareports
rm -f ./build/qareports/*.md
# -----
./qa/layer_freq.sh aeroway "class" > ./build/qareports/freq_aeroway__class.md
###Todo:./qa/layer_freq.sh boundary "admin_level,disputed" > ./build/qareports/freq_boundary__admin_level_disputed.md
./qa/layer_freq.sh boundary "admin_level" > ./build/qareports/freq_boundary__admin_level.md
###Todo: ./qa/layer_freq.sh boundary "disputed" > ./build/qareports/freq_boundary__disputed.md
./qa/layer_freq.sh building "render_min_height" > ./build/qareports/freq_building__render_min_height.md
#./qa/layer_freq.sh housenumber "housenumber " > ./build/qadocfreq_housenumber.md
./qa/layer_freq.sh landcover "class, subclass" > ./build/qareports/freq_landcover__class_subclass.md
./qa/layer_freq.sh landuse "class " > ./build/qareports/freq_landuse__class.md
./qa/layer_freq.sh park "class " > ./build/qareports/freq_park__class.md
./qa/layer_freq.sh place "class " > ./build/qareports/freq_place__class.md
./qa/layer_freq.sh place "class,capital " > ./build/qareports/freq_place__class_capital.md
./qa/layer_freq.sh place "capital " > ./build/qareports/freq_place__capital.md
./qa/layer_freq.sh place "class,capital,rank " > ./build/qareports/freq_place__class_capital_rank.md
./qa/layer_freq.sh place "rank " > ./build/qareports/freq_place__rank.md
./qa/layer_freq.sh poi "class " > ./build/qareports/freq_poi__class.md
./qa/layer_freq.sh poi "subclass " > ./build/qareports/freq_poi__subclass.md
./qa/layer_freq.sh poi "rank " > ./build/qareports/freq_poi__rank.md
./qa/layer_freq.sh poi "class,subclass " > ./build/qareports/freq_poi__class_subclass.md
./qa/layer_freq.sh poi "class,subclass,rank" > ./build/qareports/freq_poi__class_subclass_rank.md
./qa/layer_freq.sh poi "class,rank " > ./build/qareports/freq_poi__class_rank.md
./qa/layer_freq.sh transportation "class, oneway, ramp, brunnel, service" > ./build/qareports/freq_transportation__class_oneway_ramp_brunnel_service.md
./qa/layer_freq.sh transportation "oneway, ramp, brunnel, service " > ./build/qareports/freq_transportation__oneway_ramp_brunnel_service.md
./qa/layer_freq.sh transportation "class " > ./build/qareports/freq_transportation__class.md
./qa/layer_freq.sh transportation_name "class " > ./build/qareports/freq_transportation_name__class.md
./qa/layer_freq.sh transportation_name "ref_length" > ./build/qareports/freq_transportation_name__ref_length.md
./qa/layer_freq.sh water "class " > ./build/qareports/freq_water__class.md
./qa/layer_freq.sh water_name "class " > ./build/qareports/freq_water_name__class.md
./qa/layer_freq.sh waterway "class " > ./build/qareports/freq_waterway__class.md
# ---- toplength -------------------------------------------
./qa/layer_toplength.sh housenumber "housenumber" > ./build/qareports/toplength_housenumber__housenumber.md
./qa/layer_toplength.sh place "name" > ./build/qareports/toplength_place__name.md
./qa/layer_toplength.sh place "name_en" > ./build/qareports/toplength_place__name_en.md
./qa/layer_toplength.sh poi "name" > ./build/qareports/toplength_poi__name.md
./qa/layer_toplength.sh poi "name_en" > ./build/qareports/toplength_poi__name_en.md
./qa/layer_toplength.sh transportation_name "name" > ./build/qareports/toplength_transportation_name__name.md
./qa/layer_toplength.sh transportation_name "ref" > ./build/qareports/toplength_transportation_name__ref.md
###Todo: ./qa/layer_toplength.sh transportation_name "network" > ./build/qareports/toplength_transportation_name__network.md
./qa/layer_toplength.sh water_name "name" > ./build/qareports/toplength_water_name__name.md
./qa/layer_toplength.sh water_name "name_en" > ./build/qareports/toplength_water_name__name_en.md
./qa/layer_toplength.sh waterway "name" > ./build/qareports/toplength_waterway__name.md
# ---- numvar analyze -------------------------------------
./qa/layer_numvar_analyze.sh building "render_min_height" > ./build/qareports/numvara_building__render_min_height.md
./qa/layer_numvar_analyze.sh building "render_height" > ./build/qareports/numvara_building__render_height.md
./qa/layer_numvar_analyze.sh transportation_name "ref_length" > ./build/qareports/numvara_transportation_name__ref_length.md

View File

@ -1,140 +0,0 @@
#!/usr/bin/env python
import sys
import argparse
import subprocess
parser = argparse.ArgumentParser()
parser.add_argument('--noan', action='store_true', help='Not to run make psql-analyze')
TOTAL_SIZE_SQL = """SELECT
pg_size_pretty(sum(size)) AS size
FROM (
SELECT
relname as "Table",
pg_total_relation_size(relid) as "size"
FROM pg_catalog.pg_statio_user_tables
WHERE schemaname='public'
) a
;""".replace('\"', '\\\"')
TABLE_SIZES_SQL = """SELECT
a.relname as "table",
pg_table_size(a.relid) as "size",
b.n_live_tup as "rows"
FROM pg_catalog.pg_statio_user_tables a
LEFT JOIN pg_stat_user_tables b ON (a.relid = b.relid)
WHERE
a.schemaname='public'
ORDER BY a.relname;
""".replace('\"', '\\\"')
TABLES_SQL = """SELECT
a.relname
FROM pg_catalog.pg_statio_user_tables a
WHERE
a.schemaname='public'
ORDER BY a.relname;
"""
COLUMN_NAMES_SQL = """SELECT a.attname
FROM pg_class As c
INNER JOIN pg_attribute As a ON c.oid = a.attrelid
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
WHERE
c.relkind IN('r', 'v', 'm') AND
a.attnum > 0 AND
n.nspname = 'public' AND
c.relname = '{0}' AND
a.attisdropped = FALSE
ORDER BY a.attname;
"""
COLUMNS_SQL = """select
sum(pg_column_size(t.*)) as "all",
{0}
from {1} t;
""".replace('\"', '\\\"')
def print_column_sizes(tables):
for table in tables:
print("Column sizes of table " + table)
cmds = [
'docker-compose run --rm import-osm',
'/usr/src/app/psql.sh -t -A -F\",\" -P pager=off',
'-c \"' + COLUMN_NAMES_SQL.format(table).replace('\n', ' ').replace('\r',
'') + '\"'
]
# print " ".join(cmds)
output = subprocess.check_output(" ".join(cmds), shell=True)
columns = filter(lambda c: len(c) > 0,
map(lambda l: l.strip(), output.split('\n')))
# print columns
col_sql = ",\n".join(
map(lambda c: "sum(pg_column_size(\\\"" + c + "\\\")) as \\\"" + c + "\\\"",
columns))
# print COLUMNS_SQL.format(col_sql, table);
cmds = [
'docker-compose run --rm import-osm',
'/usr/src/app/psql.sh -F\",\" --no-align -P pager=off',
'-c \"' + COLUMNS_SQL.format(col_sql, table).replace('\n', ' ').replace(
'\r', '') + '\"'
]
# print " ".join(cmds)
col_csv = subprocess.check_output(" ".join(cmds), shell=True)
print(col_csv)
if __name__ == "__main__":
args = parser.parse_args()
try:
if not args.noan:
print("Running make psql-analyze")
subprocess.check_output("make psql-analyze", shell=True)
print("Total size of tables")
cmds = [
'docker-compose run --rm import-osm',
'/usr/src/app/psql.sh -F\",\" --no-align -P pager=off',
'-c \"' + TOTAL_SIZE_SQL.replace('\n', ' ').replace('\r', '') + '\"'
]
# print " ".join(cmds)
TOTAL_SIZE_CSV = subprocess.check_output(" ".join(cmds), shell=True)
print(TOTAL_SIZE_CSV)
print("\n")
print("Table sizes")
cmds = [
'docker-compose run --rm import-osm',
'/usr/src/app/psql.sh -F\",\" --no-align -P pager=off',
'-c \"' + TABLE_SIZES_SQL.replace('\n', ' ').replace('\r', '') + '\"'
]
# print " ".join(cmds)
TABLE_SIZES_CSV = subprocess.check_output(" ".join(cmds), shell=True)
print(TABLE_SIZES_CSV)
print("\n")
print("Column sizes")
cmds = [
'docker-compose run --rm import-osm',
'/usr/src/app/psql.sh -t -A -F\",\" -P pager=off',
'-c \"' + TABLES_SQL.replace('\n', ' ').replace('\r', '') + '\"'
]
# print " ".join(cmds)
output = subprocess.check_output(" ".join(cmds), shell=True)
tables = filter(lambda t: len(t) > 0,
map(lambda l: l.strip(), output.split('\n')))
print_column_sizes(tables);
# print tables
except subprocess.CalledProcessError as e:
print("Error:\n", e.output)
sys.exit(0)

View File

@ -83,7 +83,7 @@ function version { echo "$@" | tr -cs '0-9.' '.' | awk -F. '{ printf("%03d%03d%0
COMPOSE_VER=$(docker-compose version --short) COMPOSE_VER=$(docker-compose version --short)
if [ "$(version "$COMPOSE_VER")" -lt "$(version "$MIN_COMPOSE_VER")" ]; then if [ "$(version "$COMPOSE_VER")" -lt "$(version "$MIN_COMPOSE_VER")" ]; then
echo "ERR: Your Docker-compose version is Known to have bugs , Please Update docker-compose!" echo "ERR: Your Docker-compose version is known to have bugs, please update docker-compose!"
exit 1 exit 1
fi fi
@ -109,8 +109,8 @@ 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 : $area " echo " : Area : $area "
echo " : Download Server : ${osm_server:-unset (automatic)} " echo " : Download server : ${osm_server:-unset (automatic)} "
echo " : Preloaded Image : $USE_PRELOADED_IMAGE " echo " : Preloaded image : $USE_PRELOADED_IMAGE "
echo " : Git version : $(git rev-parse HEAD) " 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"
@ -132,9 +132,9 @@ if [[ "$OSTYPE" == "linux-gnu" ]]; then
fi fi
echo " : --- Memory, CPU info ---- " echo " : --- Memory, CPU info ---- "
mem=$( grep MemTotal /proc/meminfo | awk '{print $2}' | xargs -I {} echo "scale=4; {}/1024^2" | bc ) mem=$( grep MemTotal /proc/meminfo | awk '{print $2}' | xargs -I {} echo "scale=4; {}/1024^2" | bc )
echo "system memory (GB): ${mem}" echo "System memory (GB): ${mem}"
grep SwapTotal /proc/meminfo grep SwapTotal /proc/meminfo
echo "cpu number: $(grep -c processor /proc/cpuinfo) x $(grep "bogomips" /proc/cpuinfo | head -1)" echo "CPU number: $(grep -c processor /proc/cpuinfo) x $(grep "bogomips" /proc/cpuinfo | head -1)"
grep Free /proc/meminfo grep Free /proc/meminfo
else else
echo " " echo " "
@ -200,7 +200,7 @@ if [[ "$USE_PRELOADED_IMAGE" == true ]]; then
echo " : make import-data" echo " : make import-data"
echo " :" echo " :"
echo " : Source code: https://github.com/openmaptiles/openmaptiles-tools/tree/master/docker/postgis-preloaded" echo " : Source code: https://github.com/openmaptiles/openmaptiles-tools/tree/master/docker/postgis-preloaded"
echo " : Thank you: https://www.postgresql.org ! Thank you http://postgis.org !" echo " : Thank you https://www.postgresql.org ! Thank you http://postgis.org !"
make start-db-preloaded make start-db-preloaded
else else
echo "====> : Start PostgreSQL service using empty database and importing all the data:" echo "====> : Start PostgreSQL service using empty database and importing all the data:"
@ -213,7 +213,7 @@ else
echo " : Source code: https://github.com/openmaptiles/openmaptiles-tools/tree/master/docker/import-data" echo " : Source code: https://github.com/openmaptiles/openmaptiles-tools/tree/master/docker/import-data"
echo " : includes all data from the import-data image" echo " : includes all data from the import-data image"
echo " :" echo " :"
echo " : Thank you: https://www.postgresql.org ! Thank you http://postgis.org !" echo " : Thank you https://www.postgresql.org ! Thank you http://postgis.org !"
make start-db make start-db
make import-data make import-data
fi fi
@ -233,7 +233,7 @@ echo "--------------------------------------------------------------------------
echo "====> : Start importing border ${area} data 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"
make import-borders make import-borders
echo " " echo " "
@ -263,11 +263,17 @@ make test-perf-null
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
if [[ "$area" != "planet" ]]; then
echo "====> : Compute bounding box for tile generation" if [[ "$(source .env ; echo "$BBOX")" = "-180.0,-85.0511,180.0,85.0511" ]]; then
make generate-dc-config if [[ "$area" != "planet" ]]; then
echo "====> : Compute bounding box for tile generation"
make generate-bbox-file ${MIN_ZOOM:+MIN_ZOOM="${MIN_ZOOM}"} ${MAX_ZOOM:+MAX_ZOOM="${MAX_ZOOM}"}
else
echo "====> : Skipping bbox calculation when generating the entire planet"
fi
else else
echo "====> : Skipping bbox calculation when generating the entire planet" echo "====> : Bounding box is set in .env file"
fi fi
echo " " echo " "
@ -322,10 +328,10 @@ ls -la ./data
echo " " echo " "
echo "-------------------------------------------------------------------------------------" echo "-------------------------------------------------------------------------------------"
echo "The ./quickstart.sh $area is finished! " echo "The ./quickstart.sh $area is finished! "
echo "It takes $((ENDTIME - STARTTIME)) seconds to complete" echo "It took $((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 " "
echo "Start experimenting! And check the QUICKSTART.MD file!" echo "Start experimenting and check the QUICKSTART.MD file!"
echo " " echo " "
echo "* Use make start-maputnik to explore tile generation on request" echo "* Use make start-maputnik to explore tile generation on request"
echo "* Use make start-tileserver to view pre-generated tiles" echo "* Use make start-tileserver to view pre-generated tiles"