Как избежать проблем с геометрией при импорте данных MapInfo в PostGIS? - PullRequest
3 голосов
/ 27 января 2011

Я столкнулся с проблемой, связанной с формами сбора данных переписи населения Австралии , предоставленными в формате MapInfo Австралийским бюро статистики .Я загружаю их в базу данных PostGIS с помощью инструмента ogr2ogr , который работает для большинства фигур, но не для всех.

Простой пример проблемы, с которой я сталкиваюсь:запрос, подобный этому (требует загрузки набора данных NSW):

SELECT st_union(wkb_geometry) FROM cd06answ WHERE cd_code_2006 LIKE '1291%'

Результатом этого запроса является не ожидаемая форма, а NULL.

В таблице нет нулевых значений,но есть неверные геометрии.Например,

SELECT cd_code_2006 FROM cd06answ 
WHERE cd_code_2006 LIKE '1291%' AND NOT st_isvalid(wkb_geometry)

извлекает значения '1291301' и '1291321'.Если я исключу неверные геометрии, st_union будет успешным.

Подключение Quantum GIS к базе данных позволяет отрисовывать обе фигуры.Они должны быть частью геометрического объединения, поэтому мне нужно как-то решить проблему.

Существуют ли более эффективные способы загрузки данных MapInfo в PostGIS?Или какие-то средства для фиксации данных внутри PostGIS?Так как данные базы данных отображаются нормально, должна быть возможность сохранить их, не так ли?

РЕДАКТИРОВАТЬ: основываясь на отзывах Кристофа, я немного больше экспериментировал с 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_isvalids верны, а средняя - нет.

К сожалению, ни один подход не исправляетобъединение, только

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%'

- нет (ранее я пробовал небольшой буферный прием, но не доводил его до этогоуровень).

Это кажется слишком много для исправления.

Ответы [ 2 ]

2 голосов
/ 27 января 2011

Попробуйте запустить st_buffer (сначала с радиусом 0, а затем с 0,000000001 и т. Д.) Или st_snaptogrid на этих недействительных геометриях, чтобы «починить» их (ссылка на документы здесь и здесь ).

Я видел эти ошибки при импорте из Mapinfo или других источников с ogr2ogr2 (в основном из-за проблем с более высокой точностью и / или округлением). Я думаю, что разработчики Postgis планировали включить определенную функцию снижения точности, но если я правильно помню, ее нет в 1.4.

Если это не поможет, опубликуйте свою текущую версию postgis, а также версию вашего полигона и проекции в формате wkt. Существуют и другие возможные причины недействительности полигонов.

1 голос
/ 29 января 2011

Hallo

Вы пытались ST_IsValidReason (геометрия) , чтобы понять, что не так?

/ Никлас

...