PostgreSQL с расширением PostGIS, и геоданными дорог Калининградской области
871
Создан для тестирования построения автомобильных маршрутов. Ожидается что в качестве источника дорог, для построения маршрутов, будет использована БД PostgreSQL, с установленным расширением PostGIS, см.:
В БД загружены данные дорог Калининградской области.
version: '3.1'
services:
db:
container_name: route-postgres
image: tkachenkoivan/road-data
restart: always
environment:
POSTGRES_PASSWORD: RoutePass
ports:
- 5432:5432
Пример подключения в JAVA:
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres?currentSchema=public
spring.datasource.username=postgres
spring.datasource.password=RoutePass
spring.datasource.driver-class-name=org.postgresql.Driver
Создан на основе образа postgis/postgis, см. postgis.net, репозиторий образа на GitHub: postgis/docker-postgis.
version: '3.1'
services:
db:
container_name: route-postgres
image: postgis/postgis
restart: always
environment:
POSTGRES_PASSWORD: RoutePass
PGDATA: /var/lib/postgresql/pgdata
ports:
- 5432:5432
Затем была создана временная таблица для загрузки данных OSM (поля соответствуют тем, что представлены в shape файле):
CREATE TABLE public.gis_osm_roads (
osm_id varchar(10) NULL,
code int2 NULL,
fclass varchar(28) NULL,
"name" varchar(100) NULL,
ref varchar(100) NULL,
oneway varchar(1) NULL,
maxspeed int2 NULL,
layer float8 NULL,
bridge varchar(1) NULL,
tunnel varchar(1) NULL,
geom geometry(MULTILINESTRING, 4326) NULL,
CONSTRAINT gis_osm_roads_pkey PRIMARY KEY (osm_id)
);
CREATE INDEX gis_osm_roads_geom_idx ON public.gis_osm_roads USING gist (geom);
Источник shape файла с данными: Geofabrik - загружен файл kaliningrad-latest-free.shp/gis_osm_roads_free_1.shp.
В fclass содержится значение тега highway, были удалены лишние типы дорог:
DELETE FROM gis_osm_roads WHERE fclass IN ('path', 'steps', 'cycleway', 'footway', 'unknown', 'pedestrian')
Скачанные геоданные имеют тип MULTILINESTRING, гораздо удобнее работать с LINESTRING, поэтому взамен временного слоя gis_osm_roads, создаю gis_roads:
CREATE SEQUENCE gis_roads_seq;
CREATE TABLE public.gis_roads (
gid int8 NOT NULL DEFAULT nextval('gis_roads_seq'::regclass),
fclass varchar(28) NULL,
"name" varchar(100) NULL,
oneway varchar(1) NULL,
maxspeed int2 NULL,
bridge varchar(1) NULL,
tunnel varchar(1) NULL,
date_load date,
geom geometry(LINESTRING, 4326) NULL,
CONSTRAINT gis_roads_pkey PRIMARY KEY (gid)
);
CREATE INDEX gis_roads_geom_idx ON public.gis_roads USING gist (geom);
После чего делаю конвертацию данных с помощью ST_LineMerge :
INSERT INTO gis_roads (fclass,"name",oneway,maxspeed,bridge,tunnel,geom)
(SELECT fclass,"name",oneway,maxspeed,bridge,tunnel,ST_LineMerge(geom) FROM gis_osm_roads)
Временная таблица gis_osm_roads была удалена.
Таблица не обязательно должна однозначно соответствовать полям в скачанном файле, я добавил в неё несколько дополнительных полей, например дата загрузки date_load, и удалил то, что посчитал лишним, например ref. Ключ создал свой - gid (т.к. вставка данных предполагается не только за счёт импорта с OSM, но и из своих источников), osm_id по сути уже и не нужен. Вы можете аналогично создавать и удалять поля, для построения в первую очередь важны fclass, geom, maxspeed, oneway, на основе которых создадим представление:
CREATE OR REPLACE VIEW public.roads_view
AS SELECT gis_roads.gid AS osm_id,
gis_roads.maxspeed,
gis_roads.oneway,
gis_roads.fclass,
gis_roads.name,
gis_roads.geom
FROM gis_roads;
Пример работы с данными есть в репозитории GitHub Tkachenko-Ivan/graphhopper-reader-postgis
Content type
Image
Digest
Size
221.7 MB
Last updated
over 4 years ago
docker pull tkachenkoivan/road-data