Replace osmborder with imposm/SQL (#1213)
Fixes #1156 Fixes #810 Fixes #1228 This PR replaces `osmborder`, which is no longer maintained, with `imposm` mappings and SQL code to generate borders. Key features that were moved into the imposm/SQL layer: 1. Grouping by `osm_id` and aggregating by lowest `admin_level` value so that there's only one copy of ways that are members of multiple relations. 2. Filtering out of point features in boundary relations (typically `admin_centre` and `label` roles). 3. Move disputed boundary detection logic into SQL. This will increase the database size slightly because of the limits of what imposm can do, as some of the filtering is done in the SQL layer after importing, rather than being done in `osmborder`.
This commit is contained in:
committed by
GitHub
parent
bfdbd829dc
commit
b4b897999d
@@ -1,23 +1,25 @@
|
||||
DROP TABLE IF EXISTS osm_border_linestring_adm CASCADE;
|
||||
|
||||
-- etldoc: osm_border_linestring -> osm_border_linestring_adm
|
||||
-- etldoc: osm_border_disp_linestring -> osm_border_linestring_adm
|
||||
-- etldoc: ne_10m_admin_0_countries -> 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
|
||||
SELECT osm_id,
|
||||
ST_Node(ST_Collect(geometry)) AS geometry,
|
||||
BOOL_OR(maritime) AS maritime,
|
||||
FALSE AS disputed
|
||||
FROM osm_border_linestring
|
||||
WHERE admin_level = 2
|
||||
WHERE admin_level = 2 AND ST_Dimension(geometry) = 1
|
||||
AND osm_id NOT IN (SELECT DISTINCT osm_id FROM osm_border_disp_linestring)
|
||||
GROUP BY maritime,
|
||||
disputed
|
||||
GROUP BY osm_id
|
||||
),
|
||||
|
||||
mergedline AS (
|
||||
SELECT (ST_Dump(
|
||||
ST_LineMerge(geometry))).geom AS geometry,
|
||||
SELECT osm_id,
|
||||
(ST_Dump(ST_LineMerge(geometry))).geom AS geometry,
|
||||
maritime,
|
||||
disputed
|
||||
FROM multiline
|
||||
@@ -32,7 +34,7 @@ CREATE TABLE IF NOT EXISTS osm_border_linestring_adm AS (
|
||||
FROM (SELECT ST_Node(
|
||||
ST_Collect(geometry)) AS geometry
|
||||
FROM osm_border_linestring
|
||||
WHERE admin_level = 2
|
||||
WHERE admin_level = 2 AND ST_Dimension(geometry) = 1
|
||||
) nodes
|
||||
) linemerge
|
||||
),
|
||||
@@ -55,12 +57,14 @@ CREATE TABLE IF NOT EXISTS osm_border_linestring_adm AS (
|
||||
),
|
||||
|
||||
rights AS (
|
||||
SELECT adm0_r,
|
||||
SELECT osm_id,
|
||||
adm0_r,
|
||||
geometry,
|
||||
maritime,
|
||||
disputed
|
||||
FROM (
|
||||
SELECT b.adm0_a3 AS adm0_r,
|
||||
SELECT a.osm_id AS osm_id,
|
||||
b.adm0_a3 AS adm0_r,
|
||||
a.geometry,
|
||||
a.maritime,
|
||||
a.disputed
|
||||
@@ -73,14 +77,16 @@ CREATE TABLE IF NOT EXISTS osm_border_linestring_adm AS (
|
||||
) line_rights
|
||||
)
|
||||
|
||||
SELECT adm0_l,
|
||||
SELECT osm_id,
|
||||
adm0_l,
|
||||
adm0_r,
|
||||
geometry,
|
||||
maritime,
|
||||
2::integer AS admin_level,
|
||||
disputed
|
||||
FROM (
|
||||
SELECT b.adm0_a3 AS adm0_l,
|
||||
SELECT r.osm_id AS osm_id,
|
||||
b.adm0_a3 AS adm0_l,
|
||||
r.adm0_r AS adm0_r,
|
||||
r.geometry,
|
||||
r.maritime,
|
||||
@@ -96,4 +102,4 @@ CREATE TABLE IF NOT EXISTS osm_border_linestring_adm AS (
|
||||
|
||||
CREATE INDEX IF NOT EXISTS osm_border_linestring_adm_geom_idx
|
||||
ON osm_border_linestring_adm
|
||||
USING GIST (geometry);
|
||||
USING GIST (geometry);
|
||||
|
||||
Reference in New Issue
Block a user