OpenStreetMap удалить данные страны - PullRequest
0 голосов
/ 03 марта 2020

Я установил openstreetmap на свой сервер, я импортировал только мою страну при первой установке, но через месяц я добавил к той же карте (postgresql база данных) другую страну, используя эту команду:

 osm2pgsql -a --slim -d osm_map -C 1600 --hstore -S openstreetmap-carto-2.10.0/openstreetmap-carto.style spain-latest.osm.bz2

Но теперь я хочу удалить все данные Испании из базы данных. Возможно ли это с помощью сценария? Я не мог ничего найти в Интернете. Я почти уверен, что мне нужно удалить planet_osm_lines, planet_osm_nodes и т. Д. c. Но, возможно, есть сценарий для этого.

Спасибо !!

1 Ответ

0 голосов
/ 04 марта 2020

Хорошо, я нашел решение, я создаю свой собственный скрипт для удаления узлов из базы данных, используя многоугольник. Единственная таблица, которую я пропустил, это planet_osm_rels, на которой я нашел эту ссылку: отношение в OSM , которое объясняет, как связано planet_osm_rels, но это небольшая таблица, и вам нужно проанализировать текст из членов, извлекающих n и Чтобы найти соответствующие идентификаторы.

delete from planet_osm_line where osm_id in (select id from planet_osm_nodes WHERE st_contains(
ST_GeomFromText('POLYGON((110.59 -11.33484,110.59 -38.50,157 -38.50,157 -11.33484,110.59 -11.33484))',4326),
st_pointfromtext('POINT ('|| (lon / 10000000.0) || ' ' || (lat / 10000000.0) || ')',4326)))

delete from planet_osm_polygon where osm_id in (select id from planet_osm_nodes WHERE st_contains(
ST_GeomFromText('POLYGON((110.59 -11.33484,110.59 -38.50,157 -38.50,157 -11.33484,110.59 -11.33484))',4326),
st_pointfromtext('POINT ('|| (lon / 10000000.0) || ' ' || (lat / 10000000.0) || ')',4326)))

delete from planet_osm_point where osm_id in (select id from planet_osm_nodes WHERE st_contains(
ST_GeomFromText('POLYGON((110.59 -11.33484,110.59 -38.50,157 -38.50,157 -11.33484,110.59 -11.33484))',4326),
st_pointfromtext('POINT ('|| (lon / 10000000.0) || ' ' || (lat / 10000000.0) || ')',4326)))

delete from planet_osm_roads where osm_id in (select id from planet_osm_nodes WHERE st_contains(
ST_GeomFromText('POLYGON((110.59 -11.33484,110.59 -38.50,157 -38.50,157 -11.33484,110.59 -11.33484))',4326),
st_pointfromtext('POINT ('|| (lon / 10000000.0) || ' ' || (lat / 10000000.0) || ')',4326)))

delete from planet_osm_ways where id in (select w.id from planet_osm_nodes n INNER JOIN planet_osm_ways w ON n.id = ANY (w.nodes) WHERE st_contains(
ST_GeomFromText('POLYGON((110.59 -11.33484,110.59 -38.50,157 -38.50,157 -11.33484,110.59 -11.33484))',4326),
st_pointfromtext('POINT ('|| (n.lon / 10000000.0) || ' ' || (n.lat / 10000000.0) || ')',4326)))

И, наконец, мы удаляем узлы:

delete from planet_osm_nodes n where st_contains(ST_GeomFromText('POLYGON((110.59 -11.33484,110.59 -38.50,157 -38.50,157 -11.33484,110.59 -11.33484))',4326),
st_pointfromtext('POINT ('|| (n.lon / 10000000.0) || ' ' || (n.lat / 10000000.0) || ')',4326))
...