Как я могу избежать проблем с геометрией при импорте данных MapInfo в постгис?

StackOverflow https://stackoverflow.com/questions/4811207

  •  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 вашего многоугольника и проекции. Есть и другие возможные причины недействительности многоугольников.

Другие советы

Залететь

Ты пытался ST_ISValidReason (Геометрия) Чтобы понять, что не так?

/Никлас

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top