Недійсний зоопарк геометрії


9

Багато часу я часто проводив години, бореться з химерними помилками внаслідок невірних геометрій . Симптоми сильно різняться, включаючи:

  • Уповільнення бази даних
  • Неправильні \ Недійсні результати запиту
  • Файли журналу перевантажені помилками та попередженнями
  • Невідповідний результат з геометричними операторами (наприклад, перетин)

Я б хотів класифікувати типи недійсних геометрій, щоб допомогти всім тут узаконити свої дані.

Будь ласка, відповідайте своїм улюбленим типом недійсної геометрії (один тип на кожну відповідь). Скріншоти, описи та рішення вітаються - але намагайтеся не допустити відповіді.

Відповіді:


6

8-річна золота шахта недійсних геометрій забезпечується невідповідними регресними тестами PostGIS . Багато з цих регресійних тестів було переміщено до GEOS, наприклад, тут і тут , а також до інших кишень у дереві тестів . (Вибачте, занадто багато, щоб виділити. Виберіть декілька та вставте WKT в конструктор тестів JTS для їх візуалізації .)


3

Відрізки нульової довжини

Приклад:

SELECT geomFromEWKT('LINESTRING(1 1, 1 1)');

                                    geomfromewkt                                    
------------------------------------------------------------------------------------
 0102000000020000000000000000000840000000000000104000000000000008400000000000001040

Проблеми: Збереження відрізка нульової довжини може спричинити помилки під час обчислення коефіцієнтів довжини (ділення на нуль) або при спробі обчислити азимути і тригонометричні функції.

Виявлення: в PostGIS сегменти нульової довжини можна виявити за допомогою isValid().

Рішення: Спробуйте зберегти відрізки нульової довжини як точки.


3

Самопересічні багатокутники

введіть тут опис зображення

Приклад:

SELECT isValid(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
NOTICE:  Self-intersection at or near point 0.5 0.5
 isvalid 
---------
 f
(1 row)

Проблеми: неправильні обчислення, наприклад area():

SELECT area(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
 area 
------
    0
(1 row)

Це може спричинити помилки з нульовим поділом з функціями виклику.

Виявлення: у PostGIS сегменти самопересічення можна виявити за допомогою isValid().

Рішення: Перетворення на MULTIPOLYGON(див. Коментар).


Ця ж форма еквівалентна дійсній:MULTIPOLYGON(((0 0, 0 1, 0.5 0.5, 0 0)),((1 1, 1 0, 0.5 0.5, 1 1)))
Майк Т

@Mike Toews: Правильно, перехід на MULTIPOLYGON - хороше рішення.
Адам Матан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.