2014-01-13 6 views
1

Я пытаюсь найти область самопересекающихся (сложных) многоугольников на Земле. Есть ли библиотека, которая правильно выполняет вычисления площадей для таких геометрий?Как рассчитать площадь самопересекающихся многоугольников на Земле

До сих пор я пробовал geographiclib и Polygon2 (на основе gpc), но они дают неправильные результаты для сложных полигонов.

В альтернативном варианте есть простой способ преобразования самопересекающихся многоугольников в множество простых многоугольников, так что я могу использовать алгоритмы для простых геометрий, а затем суммировать все полигоны? Я знаю, что решением было бы реализовать Bentley-Ottman algorithm, чтобы найти точки пересечения, а затем разделить многоугольник на множество простых полигонов, но если есть библиотека, которую я мог бы использовать, я бы с удовольствием избегал изобретать колесо (и, возможно, вводить ошибки).

Обновление: Координаты, которые я использую, не содержат явные точки пересечения. Поэтому библиотеки отсечения, похоже, не обрабатывают их должным образом. Например, в следующем коде coords_1 и coords_2 определяют один и тот же полигон. Использование библиотеки обрезки Polygon2.

>>> coords_1 = [(0,0), (1,1), (1,0), (0,1)] 
>>> coords_2 = [(0,0), (0.5, 0.5), (1,0), (1,1), (0.5,0.5), (0,1)] 
>>> Polygon(coords_1).area() 
0 
>>> Polygon(coords_2).area() 
0.5 

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

+0

Я пытаюсь выяснить, как различные две траектории на Земле измеряют площадь, определенную полигоном между ними. – themiurgo

+0

Далеко, но вы можете найти это интересно: http://www.cambridge.org/us/academic/subjects/computer-science/knowledge-management-databases-and-data-mining/mobility-data-modeling- менеджмент и понимание (вчера мне это показалось) –

ответ

3

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

Я не думаю, что, к сожалению, существует большая функциональность библиотеки для операций с сферической сферой.

Edit: здесь есть стройное решение, которое я думаю, что делает то, что вы хотите:

from shapely.geometry.polygon import LinearRing, Polygon 

coords_1 = [(0,0), (1,1), (1,0), (0,1)] 
##coords_1 = [(0,0), (0,1), (1,1), (1,0)] 

lr = LinearRing(coords_1) 

if lr.is_valid: 
    print Polygon(lr).area 
else: 
    print Polygon(coords_1).buffer(0).area + Polygon(coords_1[::-1]).buffer(0).area 
+0

Спасибо. Однако проблема, похоже, изменилась, и я соответствующим образом обновил этот вопрос. Библиотеки отсечения/вычислительной геометрии, по-видимому, не обрабатывают многоугольники с неявными точками пересечения. Любое предложение? – themiurgo

+0

Я знаю, что python прекрасно справляется с подобными вещами с учетом правильных команд (который является оберткой вокруг GEOS, не уверен, работаете ли вы на python или C?) –

+0

отредактировал ответ; неявные пересечения разрешаются буфером; отрицательные участки области отклоняются таким образом, поэтому я вычисляю их для обеих ориентаций. Кажется, нужно работать, но я задаюсь вопросом, нет ли лучшего способа решить ваш endgoal, делая шаг назад. –

1

Преобразования широты/долготы многоугольники, чтобы играть хорошо на евклидовой плоскости. Затем используйте что-то вроде: http://sourceforge.net/projects/polyclipping/.

+0

Спасибо. К сожалению, библиотеки отсечения не обрабатывают многоугольники с неявными точками пересечения. Я уточнил вопрос, чтобы прояснить проблему. – themiurgo

+0

Я не уверен, что вы подразумеваете под «неявными точками пересечения», но, тем не менее, отсечения библиотек, таких как Clipper (ссылка выше), могут удалять самопересечения простой операцией «union». Затем это позволяет получить значимые результаты из расчета площадей. –

Смежные вопросы