Допомога в геометрії полігона PostGIS - незамкнені кільця


10

Я взяв примірник супер-лукавої книги "Геопросторовий розвиток Пітона" Еріка Вестра ( посилання Amazon ), і я над цим працюю. Наразі він навчає мене завантажувати дані берегової лінії GSHHS з файлу форм у базу даних PostGIS, готуючись до створення геопросторового веб-додатку.

Моя проблема полягає в наступному: коли я намагаюся імпортувати дані GSHHS в PostGIS, вони відкидаються через те, що полігони берегової лінії не вважаються "дійсними". Зокрема, мені видається повідомлення про помилку, яке описує деякі (але не всі) багатокутники берегової лінії як "незамкнені кільця".

Я розумію, що ця помилка намагається сказати мені, що перша і остання точки багатокутника не однакові. Однак це просто не відповідає дійсності. Я вивчив уявлення WKT багатьох полігонів, і вони є правильними. Вони безумовно починаються і закінчуються тією ж координацією.

Полігони витягуються з файлів форм за допомогою бібліотеки OGR та експортують кожну функцію багатокутника до WKT. Я спробував відновити багатокутник через Shapely і експериментував з WKB, але безрезультатно. Я вже був в змозі завантажити одні і ті ж дані в PostGIS у вигляді таблиці MultiPolygon, використовуючи shp2pgsql навантажувач.

Мені було цікаво, чи хтось там мав:
(а) можливо, використовував ту саму книгу, застряг у тій же проблемі, і чи є мені відповідь?
(b) зіткнувся з подібною проблемою і знайшов рішення?
(c) якщо цього немає, чи є поради щодо найкращої практики щодо забезпечення дійсної геометрії перед завантаженням у PostGIS?

ОНОВЛЕННЯ: колега припустив, що проблема "незамкнених кілець" може бути лише симптомом іншої проблеми. Можливо, що моя конфігурація PostGIS / PostgreSQL має обмеження розміру (для транзакцій на вставку, отриманих пакетів, текстових рядків тощо).

Оскільки я використовую дуже довгі багатокутники WKT як вхідні дані, PostGIS може скоротити їх занадто рано, щоб кожен полігон міг завершитись. Я перевіряю це завтра, але це здається ймовірним. Моя вставка кордонів країни приймала лише деякі записи, а не інші. З пам’яті прийняті геометрії були для таких маленьких острівних країн, як Антигуа (і тому, ймовірно, мали короткі уявлення про WKT).

Отже, це може бути скоріше адміністративної ниткою бази даних PostGIS, а не недійсною ниткою геометрії.


чи можете ви надати зразок файлу shp?
Маріо Мілер

не хвилюйтесь. Дані про берегові лінії GSHHS, якими я користуюся, завантажуються звідси на 96 Мб . Світ кордону даних я використовую це межа світу Dataset з thematicmapping.org
Тіма

Відповіді:


6

Я розглянув ваші дані та приклад книги. Проблема полягає в тому, що в даних, які обробляються в книзі, є три недійсні багатокутники:

GSHHS_l_L1.shp

ІД = 92-Вт

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

ІД = 486-Вт

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

ID = 7333-Вт

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

Оскільки це приклад, було б найпростіше видалити ці багатокутники з набору даних або просто додати його, якщо заява у вашому коді

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))

Дякую Маріо, схоже, я випереджав себе замість того, щоб правильно перевірити ВСІ мої вхідні багатокутники. Ваша відповідь була правильною - ці багатокутники виявились недійсними під час тестування з OGR. Цікаво, що QGis виглядав чудово, але ArcMap показав, що вони не мають повного кільця. Ці три багатокутники падали на дателіну, і я думаю, що геометрія формного файлу не рахувала краю полігону вздовж дателіни. Ваше рішення - це приємний та простий спосіб виявити недійсні багатокутники. Я відзначу посаду як відповідь.
тиммі

Якщо ви відчуваєте добродійність, чи є у вас хороші рішення для наступного кроку в процесі, який виправляє недійсні багатокутники? Я спробував використовувати функцію .CloseRing () OGR, але безрезультатно. Думаю, він просто ігнорував виклик функції.
Тіммі

Я намагався використовувати "буферний трюк" ( workshop.opengeo.org/postgis-intro/validity.html ) з витонченими та ogr, але не маючи успіху. Я не буду читати недійсні багатокутники та огр не робити операції буфера, на даний момент я не знаю, чому. Якщо я натрапляю на відповідь, я повідомлю вас. Можливо, хтось ще має більший успіх у цій проблемі. Вибачте.
Маріо Мілер

Я думаю, що зараз я перевірив перевірку багатокутника. Я думаю, що я неправильно використовував функцію .CloseRings () OGR. Мене називали це методом багатокутника (тобто poly.CloseRings ()). Натомість мені довелося витягти лінійне кільце з багатокутника, а потім запустити його на тому (тобто lr = poly.GetGeometryRef (0); lr.CloseRings ()). Результати успішно вставляються в PostGIS, і я можу використовувати 3 проблемні полігони в QGis з турботою. Існує лише трохи обчислювальної вартості на перевірку дійсності для КОЖНОГО багатокутника.
тиммі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.