Догрузка карт osm в одну базу Postgresql

Ответить
Михаил Ильин
Новоприбывший
Сообщения: 4
Зарегистрирован: 05 окт 2012, 13:44
Репутация: 0

Догрузка карт osm в одну базу Postgresql

Сообщение Михаил Ильин » 05 окт 2012, 13:58

Добрый день!
Не подскажете как загрузить карту России и Казахстана в одну базу PostgreSQL\PostGIS:
Загрузил карту России из файла RU.osm.pbf, затем в эту же базу хочу подгрузить карту Казахстана:
osm2pgsql/osm2pgsql --slim -a --exclude-invalid-polygon --host localhost --port 5432 -d menfismap -r pbf -C 3000M -S osm2pgsql/default.style KZ.osm.pbf

Возникает ошибка:

failed: ERROR: duplicate key value violates unique constraint "planet_osm_nodes_pkey"
DETAIL: Key (id)=(36725955) already exists.
CONTEXT: COPY planet_osm_nodes, line 2228: "36725955 532316674 528392196 \N"

osm2pgsql SVN version 0.81.0 (64bit id space)

Аватара пользователя
Aleksandr Dezhin
Активный участник
Сообщения: 244
Зарегистрирован: 03 фев 2010, 10:47
Статьи: 3
Проекты: 1
Репутация: 14
Откуда: Москва

Re: Догрузка карт osm в одну базу Postgresql

Сообщение Aleksandr Dezhin » 05 окт 2012, 14:26

Нужно предварительно объединить дампы при помощи osmosis:

Код: Выделить всё

$ osmosis/bin/osmosis --read-pbf RU.osm.pbf --read-pbf KZ.osm.pbf --merge --write-pbf local.osm.pbf
И только после этого загружать

Михаил Ильин
Новоприбывший
Сообщения: 4
Зарегистрирован: 05 окт 2012, 13:44
Репутация: 0

Re: Догрузка карт osm в одну базу Postgresql

Сообщение Михаил Ильин » 07 окт 2012, 13:36

Спасибо! Все получилось.

denny123
Интересующийся
Сообщения: 18
Зарегистрирован: 20 июл 2012, 16:08
Репутация: 0

Re: Догрузка карт osm в одну базу Postgresql

Сообщение denny123 » 18 фев 2013, 08:55

osm2pgsql -m -s -W -d geoserver rayony_centry.osm
....
Reading in file: rayony_centry.osm
Processing: Node(50k) Way(0k) Relation(0)insert_node failed: ERROR: duplicate key value violates unique constraint "planet_osm_nodes_pkey"
(7)
Arguments were: 2147483647, 787135879, 319991308, (null),
Error occurred, cleaning up

Файл содержит 26 отношений(районы области) и все. База пустая(без таблиц planet_....).

Alex_SHA
Новоприбывший
Сообщения: 5
Зарегистрирован: 11 июн 2013, 14:32
Репутация: 0

Re: Догрузка карт osm в одну базу Postgresql

Сообщение Alex_SHA » 11 июн 2013, 15:24

У меня подобная проблема... не знаю как решить.

C:\Program Files\HOTOSM\bin>osm2pgsql RU-PER.osm.bz2 -H localhost -d osm -p osm
-U postgres -P 5432 -W -S default.style -C 512 -s -l
osm2pgsql SVN version 0.69-21289M

Using projection SRS 4326 (Latlong)
Setting up table: osm_point
Setting up table: osm_line
Setting up table: osm_polygon
Setting up table: osm_roads
Mid: pgsql, scale=10000000, cache=512MB, maxblocks=65537*8192
Setting up table: osm_nodes
*** WARNING: intarray contrib module not installed
*** The resulting database will not be usable for applying diffs.
Setting up table: osm_ways
Setting up table: osm_rels

!! You are running this on 32bit system, so at most
!! 3GB of RAM can be used. If you encounter unexpected
!! exceptions during import, you should try running in slim
!! mode using parameter -s.

Reading in file: RU-PER.osm.bz2
Processing: Node(3750k) Way(85k) Relation(0k)COPY_END for COPY osm_nodes FROM ST
DIN;
failed: ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности
"osm_nodes_pkey"
DETAIL: Ключ "(id)=(2147483647)" уже существует.
CONTEXT: COPY osm_nodes, строка 3599746: "2147483647 583142904 56835881
2 \N"

Error occurred, cleaning up

C:\Program Files\HOTOSM\bin>


Помогите пожалуйста

Alex_SHA
Новоприбывший
Сообщения: 5
Зарегистрирован: 11 июн 2013, 14:32
Репутация: 0

Re: Догрузка карт osm в одну базу Postgresql

Сообщение Alex_SHA » 13 июн 2013, 16:35

У меня был не последний osm2pgsql, последняя сборка HOTOSM трехлетней давности. Этот баг пофиксен в новых версиях.

Правильная строка для конвертации:
C:\Program Files\HOTOSM\bin>osm2pgsql moscow.osm -H localhost -d osm -U postgres -P 5432 -W -S default.style -C 512 --hstore --cache-strategy sparse

snaker
Новоприбывший
Сообщения: 1
Зарегистрирован: 06 июл 2013, 11:31
Репутация: 0

Re: Догрузка карт osm в одну базу Postgresql

Сообщение snaker » 06 июл 2013, 11:37

Та же самая ошибка. И возможности объединять файлы перед загрузкой нет :(
Версия osm2pgsql — osm2pgsql SVN version 0.83.0 (64bit id space), собирал из https://github.com/openstreetmap/osm2pgsql
Загружаю карту Москвы, потом пытаюсь подгрузить область (с ключом -а).
Вываливается на

Код: Выделить всё

failed: ERROR:  duplicate key value violates unique constraint "planet_osm_nodes_pkey"
Чего делать-то?

Recky
Новоприбывший
Сообщения: 2
Зарегистрирован: 09 окт 2015, 15:34
Репутация: 0

Re: Догрузка карт osm в одну базу Postgresql

Сообщение Recky » 20 фев 2017, 13:52

Используйте Osmconvert

Для загрузки нового региона без ошибок дубликатов есть 2 варианта:

1) Объединить новые регионы со старыми (уже загруженными) в один pbf файл:

Код: Выделить всё

osmconvert new_region.pbf --out-o5m | osmconvert.exe - already_loaded_map.pbf -o=map_with_new_region.pbf
затем загрузить новый объединенный файл в базу:

Код: Выделить всё

osm2pgsql --create ... map_with_new_region.pbf
Однако этот способ перезаписывает все данные в базе и может занять длительное время.

2) И второй способ: вычесть из нового файла региона данные уже содержащиеся в базе:

Код: Выделить всё

osmconvert new_region.pbf -o=new_region.o5m
osmconvert already_loaded_map.pbf -o=already_loaded_map.o5m
osmconvert new_region.o5m --subtract already_loaded_map.o5m -o=new_region_cleaned.o5m
osmconvert new_region_cleaned.o5m -o=new_region_cleaned.pbf
Затем загрузить очищенный файл в базу PostgreSQL используя:

Код: Выделить всё

osm2pgsql --append ...  new_region_cleaned.pbf
без ошибок дубликатов.

freeExec
Гуру
Сообщения: 808
Зарегистрирован: 23 апр 2011, 10:32
Проекты: 1
Репутация: 118
Откуда: Ульяновск

Re: Догрузка карт osm в одну базу Postgresql

Сообщение freeExec » 20 фев 2017, 15:01

Recky писал(а):Используйте Osmconvert
1) Объединить новые регионы со старыми (уже загруженными) в один pbf файл:

Код: Выделить всё

osmconvert new_region.pbf --out-o5m | osmconvert.exe - already_loaded_map.pbf -o=map_with_new_region.pbf
Какой-то извращённый вариант, так же вот наглядней:

Код: Выделить всё

osmconvert already_loaded_map.pbf new_region.pbf -o=map_with_new_region.pbf
Если же преследуется цель частых обновлений, то куда логичней загружать их в базу с опцией --slim, тогда в базе остаются сырые данные OSM и база сама разберётся где новое, где старое.

Ответить

Вернуться в «PostGIS/PostgreSQL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя