Неверная геометрия зоопарка

9

Много раз и часто я часами боролся с причудливыми ошибками, возникающими из-за неправильной геометрии . Симптомы сильно различаются, в том числе:

  • Замедление работы базы данных
  • Неверные \ пустые результаты запроса
  • Лог файлы перегружены ошибками и предупреждениями
  • Несовместимый результат с геометрическими операторами (например, пересечение)

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

Пожалуйста, ответьте с вашим любимым типом неверной геометрии (один тип за ответ). Приветствуются скриншоты, описания и решения, но постарайтесь, чтобы ваш ответ был коротким.

Adam Matan
источник

Ответы:

6

8-летний золотой рудник с неправильной геометрией предоставлен в результате регрессивных испытаний PostGIS . Многие из этих регрессионных тестов были перенесены в GEOS, например, здесь и здесь , а также в другие карманы в дереве тестов . (Извините, слишком много, чтобы выделить. Выберите несколько и вставьте WKT в JTS Test Builder, чтобы визуализировать их .)

Майк Тоуэс
источник
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(см. Комментарий).

Adam Matan
источник
Та же самая форма эквивалентна действительной:MULTIPOLYGON(((0 0, 0 1, 0.5 0.5, 0 0)),((1 1, 1 0, 0.5 0.5, 1 1)))
Майк Т
@Mike Toews: Правильно, преобразование в MULTIPOLYGON является хорошим решением.
Адам Матан