RGeo - исправить самопересечения

У меня есть куча полигонов, которые имеют самопересечение, что вызывает некоторые ошибки при дальнейшей их постобработке (в частности, я не могу вычислить площадь пересечения этих полигонов с другими полигонами). Вот пример ломаного многоугольника:

{
  "type": "MultiPolygon",
  "coordinates": [
    [
      [
        [
          6.881057785381658,
          46.82373306675715
        ],
        [
          6.857171686909481,
          46.81861230543794
        ],
        [
          6.857354659059071,
          46.81856788926046
        ],
        [
          6.856993473052509,
          46.82693029065604
        ],
        [
          6.8612894138116785,
          46.83422796373707
        ],
        [
          6.86720955648855,
          46.835636765630476
        ],
        [
          6.871281147359957,
          46.83078486366309
        ],
        [
          6.871573291317274,
          46.8306215963777
        ],
        [
          6.877608228639841,
          46.82771553607934
        ],
        [
          6.877758462659651,
          46.82772313420989
        ],
        [
          6.877852632482749,
          46.827735617670285
        ],
        [
          6.880928107931434,
          46.82630213148064
        ],
        [
          6.8810399979122305,
          46.82622029042867
        ],
        [
          6.881117606743071,
          46.826115612819855
        ],
        [
          6.881057785381658,
          46.82373306675715
        ]
      ]
    ]
  ]
}

Вот как это выглядит на карте — как видите, есть пересечение двух ребер полигона. RGeo выдает ошибку, указывая координату пересечения (наверное): => "Geos::GEOSException: TopologyException: Input geom 0 is invalid: Self-intersection at or near point 6.8573510795579145 46.818650764080992 at 6.8573510795579145 46.818650764080992". Так у меня по крайней мере есть.

Мой вопрос: есть ли способ исправить это пересечение автоматически? Я читал, что возможное решение - вставить 2 одинаковые точки с координатами самопересечения. Но проблема в том, что полигон имеет определенный порядок, и я не знаю, КУДА вставить эти точки.

Кроме того, возможно, есть какие-то существующие инструменты, помогающие это исправить...

пример самопересечения


person nattfodd    schedule 14.02.2018    source источник
comment
Возможно, две точки просто вышли из строя и их нужно поменять местами. Откуда это искажение?   -  person Stefan    schedule 14.02.2018
comment
@Стефан, спасибо за ответ! Обмен точками — менее желательное решение, так как в других случаях это может резко изменить площадь полигона. Эти данные поступают из производственной БД, они не точны, но я хотел бы сохранить их и просто исправить, чтобы сделать их как-то действительными.   -  person nattfodd    schedule 14.02.2018


Ответы (1)


Решение, которое я бы использовал, это опция ST_MakeValid postgis для postgres, если это вариант для вас, вы могли бы сделайте что-нибудь вроде ST_AsText(ST_MakeValid(geom_column)) или, если вы предпочитаете передать текст, вот пример с использованием примера с бабочкой, показанного в подготовить:

select ST_AsText(ST_MakeValid(ST_GeomFromText('POLYGON((0 0, 0 10, 10 0, 10 10, 0 0))')));
st_astext                         
-----------------------------------------------------------
MULTIPOLYGON(((0 0,0 10,5 5,0 0)),((5 5,10 10,10 0,5 5)))
(1 row)

Если вас это не интересует, вы можете экспортировать эти геометрии и использовать такой инструмент, как prepair, чтобы преобразовать их. . Подводя итог тому, как это работает за кулисами, он разделит эти «бабочки» на несколько полигонов, которые затем будут преобразованы в мультиполигон. Тот же тип исправления будет применяться к мультиполигонам.

person Cody Gustafson    schedule 21.02.2018
comment
Спасибо за ответ! prepair инструмент кажется тем, что мне нужно. Идея разделить галстуки-бабочки выглядит неплохо. Я не могу использовать postgis ST_MakeValid, потому что данные находятся в MongoDB :( - person nattfodd; 23.02.2018