Каковы последствия неправильной геометрии

15

Я импортировал некоторые данные в базу данных Postgis, и некоторые геометрии были объявлены неверными (ST_IsValidReason сообщает о самопересечении или кольцевом самопересечении).

На запросы, которые я выполняю, похоже, не влияет неверный аспект этих геометрий (я использую только запросы ST_Distance).

Какие вещи ломаются, когда геометрия неверна?

Является ли исправление этих геометрий «автоматическим» (буфер (geom, 0) или ST_SimplifyPreserveTopology (geom, 0.0001)), как вариант?

diciu
источник

Ответы:

19

Хранение искаженных данных - плохая идея, потому что вы никогда не сможете предсказать, когда и где произойдет сбой. Кроме того, неправильно сформированные данные могут вызвать Heisenbugs , самый порочный и иллюзорный тип ошибок.

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

  • Неправильные результаты (то есть ST_Distanceвернутся неточные или просто неверные цифры)
  • Проблемы производительности базы данных. Хранение искаженных данных может серьезно повредить производительности базы данных и создать огромный файл журнала, потому что каждый вызов функции будет записывать в журнал ошибку и нарушать обычную работу базы данных.
  • База данных падает.
  • Сбои приложения - либо вызванные получением неверных данных из базы данных, либо получением необоснованного результата (например, отрицательное расстояние).
  • Фантомное поведение (см. Ссылку выше). Это худшее последствие из всех. У вас будут происходить странные вещи. Замедления, потеря данных, сбои, необоснованные результаты, длинные паузы, отсутствие реакции и многие другие проклятия. Возможно, вам не удастся их обнаружить или воспроизвести, потому что все они попадают в категорию «неопределенные» в каждой документации.

Мой совет - если небольшие буферы не наносят существенного вреда целостности ваших данных, используйте их, чтобы предотвратить возникновение любого из вышеперечисленных. Держите ваши данные в силе.

Адам Матан
источник
Можете ли вы немного рассказать об использовании небольших буферов? Как мне это сделать?
diciu
1
ST_Buffer(the_geom, 0.0000001)может сделать трюк для самопересечения. Используйте его только в том случае, если последствия немного большей геометрии не являются серьезными.
Адам Матан
1
Мой опыт показывает, что исправление искаженных данных - это настоящее расследование. Но хотя это отнимает много времени, оно, как правило, стоит усилий. ST_Buffer(the_geom, 0.0000001)Трюк определенно помогает.
Чау
Дело в том, что ST_Buffer исправляет геометрию, но результат не совсем то, что я ожидал - для этого недопустимого многоугольника здесь ( openstreetmap.org/browse/way/51954364 ) ST_Buffer возвращает только верхний левый прямоугольник. ST_SimplifyPreserveTopology, кажется, ближе к тому, что мне нужно (допустимая геометрия, но как можно ближе к неверному оригиналу). Есть ли недостатки в использовании ST_SimplifyPreserveTopology?
diciu
Эта геометрия должна обрабатываться как MULTIPOLYGONдва полигона, а не как один POLYGON. Попробуйте получить оригинальный WKT, если это возможно.
Адам Матан
13

Вы можете предотвратить попадание неверной геометрии в вашу базу данных. Для пользователей PostgreSQL / PostGIS это просто сделать с проверочными ограничениями . Например, рассмотрим таблицу public.my_valid_tableсо столбцом геометрии многоугольника geom, используйте следующий SQL / DDL:

ALTER TABLE public.my_valid_table
  ADD CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom));

Примечание: эта таблица должна иметь допустимые полигоны, прежде чем применять ограничение.

Если вы затем попытаетесь вставить / добавить неверную геометрию, вы увидите ошибку:

ERROR:  new row for relation "my_valid_table" violates check constraint "enforce_valid_geom"
Майк Т
источник