Как я могу избежать проблем с геометрией при импорте данных MapInfo в постгис?
-
25-10-2019 - |
Вопрос
Я сталкиваюсь с проблемой, связанной с австралийской коллекцией переписей Предоставлено в формате Mapinfo Австралийским бюро статистики. Анкет Я загружаю их в базу данных постгиса, используя инструмент OGR2OGR, который работает для большинства форм, но не все из них.
Простым примером проблемы, с которой я сталкиваюсь, является запрос, подобный этому (требует загрузки набора данных штата Новый Южный Уэльс):
SELECT st_union(wkb_geometry) FROM cd06answ WHERE cd_code_2006 LIKE '1291%'
Результатом этого запроса является не ожидаемая форма, а нулевая.
В таблице нет нулевых значений, но есть недопустимая геометрия. Например
SELECT cd_code_2006 FROM cd06answ
WHERE cd_code_2006 LIKE '1291%' AND NOT st_isvalid(wkb_geometry)
Получает значения «1291301» и «1291321». Если я исключаю неверную геометрию, ST_UNION добится успеха.
Соединение Квантовые ГИС в базу данных позволяет отображать обе формы, о которых идет речь. Они должны быть частью геометрического союза, поэтому мне нужно как -то решить проблему.
Есть ли лучшие способы загрузить данные MapInfo в постгис? Или какое -то средство исправления данных внутри постгиса? Поскольку данные базы данных делают все возможное, чтобы сохранить их, не так ли?
РЕДАКТИРОВАТЬ: Основываясь на обратной связи Кристофа, я немного больше экспериментировал с ST_BUFFER и ST_SNAPTOGRID. Результат этого запроса:
SELECT
cd_code_2006,
st_isvalid(st_buffer(wkb_geometry,0)),
st_isvalid(st_snaptogrid(wkb_geometry, 0.00000001)),
st_isvalid(st_snaptogrid(wkb_geometry, 0.0000001))
FROM
cd06answ
WHERE
cd_code_2006 LIKE '1291%'
AND
NOT st_isvalid(wkb_geometry)
Это то, что для обеих затронутых геометрий первая и последняя из трех ST_ISVALID - это правда, средняя - нет.
К сожалению, ни один подход не исправляет союз, только
SELECT st_union(st_buffer(wkb_geometry,0.4)) FROM cd06answ
WHERE cd_code_2006 LIKE '1291%'
приводит к геометрии, но
SELECT st_union(st_buffer(wkb_geometry,0.3)) FROM cd06answ
WHERE cd_code_2006 LIKE '1291%'
Не имеет (я пробовал маленький буферный трюк раньше, но не подтолкнул его к этому уровню).
Это кажется слишком большим для исправления.
Решение
Попробуйте запустить st_buffer
(Сначала с радиусом 0, а затем 0,000000001 и т. Д.) Или st_snaptogrid
На этих неверных геометриях, чтобы «восстановить» их (ссылка на документы здесь а также здесь).
Я видел, как эти ошибки появлялись при импорте из MapInfo или других источников с ogr2ogr2
(в основном вызвано более высокой точностью и/или закругленными проблемами). Я думаю, что разработчики PostGIS планировали включить конкретную функцию RECYSION REDUCER, но если я правильно помню, нет ни одной из 1.4.
Если это не поможет, пожалуйста, опубликуйте свою текущую версию PostGIS и версию WKT вашего многоугольника и проекции. Есть и другие возможные причины недействительности многоугольников.
Другие советы