Sign inSign up

tkachenkoivan/road-data

By tkachenkoivan

•Updated over 4 years ago

PostgreSQL с расширением PostGIS, и геоданными дорог Калининградской области

Image
0

871

tkachenkoivan/road-data repository overview

⁠Назначение

Создан для тестирования построения автомобильных маршрутов. Ожидается что в качестве источника дорог, для построения маршрутов, будет использована БД 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⁠

Tag summary

Content type

Image

Digest

Size

221.7 MB

Last updated

over 4 years ago

docker pull tkachenkoivan/road-data