вычислить площадь многоугольника в рубине

У меня есть массив пар координат широты/долготы, которые представляют многоугольник. Я пытаюсь определить общую площадь внутри этого многоугольника. Как мне это сделать в Ruby?

Вот пример массива многоугольника:

[[37.7663613767094, -122.452969210084], [37.7674219449606, -122.444718340349], [37.7701838510542, -122.445330289514], [37.7709974013834, -122.439159589248], [37.7700761930893, -122.438861402472], [37.7703501163684, -122.436868738421], [37.7712650571321, -122.437078116573], [37.7736056746515, -122.437533130227], [37.7714671036087, -122.453964210266], [37.7663613767094, -122.452969210084]]

person sybind    schedule 08.02.2011    source источник
comment
И какие единицы являются входами? Ферлонги?   -  person bmargulies    schedule 10.02.2011


Ответы (5)


Вы можете использовать эту библиотеку, которая является оболочкой GEOS (геопространственная библиотека C сама по себе является портом JTS). https://github.com/dark-panda/ffi-geos

Эта библиотека может обрабатывать вычисления в координатном пространстве и заботится о приближениях.

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

person TheSteve0    schedule 28.02.2011

Наверное, язык не так уж и важен. Вы можете использовать приведенную здесь формулу для вычисления площади многоугольника:

http://mathworld.wolfram.com/PolygonArea.html

Предполагая, что ваши точки (x1, y1) (x2, y2) .. (xn, yn) и они охватывают небольшую область:

Area = 0.5 * (x1 * y2 - x2 * y1 + x2 * y3 - x3 * y2 ..... + xn * y1 - x1 * yn)

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

Редактировать:

Чтобы получить площадь в квадратных милях, вы можете сделать следующее, оттуда преобразовать в любые единицы, которые вы хотите.

areaInSqMiles = Area * (60 * 60 * 1.15 * 1.15)
person Mahesh Velaga    schedule 08.02.2011
comment
Опять же, не для координат широта-долгота, если только не очень маленькая область около экватора. - person Spacedman; 08.02.2011
comment
@Spacedman точно, широта / долгота - это угловые координаты, а не линейные, поэтому они не будут работать, если не задействованы очень короткие расстояния вдоль экватора. Чем дальше от экватора вы идете, тем менее точны ваши результаты. Для этого вам нужны функции большого круга или гаверсинуса. - person SRM; 08.02.2011

независимое от языка решение:

ДАННО: многоугольник ВСЕГДА может состоять из n-2 треугольников, которые не перекрываются (n = количество точек ИЛИ сторон). 1 треугольник = 3-сторонний многоугольник = 1 треугольник; 1 квадрат = 4-сторонний многоугольник = 2 треугольника; и т.д. до тошноты QED

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

если вы возьмете любые 3 последовательные точки на пути многоугольников и создадите треугольник с этими точками, у вас будет один и только один из трех возможных сценариев:

  1. полученный треугольник полностью находится внутри исходного многоугольника
  2. полученный треугольник полностью выходит за пределы исходного многоугольника
  3. полученный треугольник частично содержится в исходном многоугольнике

нас интересуют только случаи, подпадающие под первый вариант (полностью содержащиеся).

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

как реализовать это программно:

создать массив точек. запустите массив, составляя треугольники из точек x, x+1 и x+2. преобразовать каждый треугольник из фигуры в область и пересечь его с областью, созданной из многоугольника. ЕСЛИ получившееся пересечение идентично исходному треугольнику, то указанный треугольник полностью содержится в многоугольнике и может быть отсечен. удалить x+1 из массива и начать заново с x=0. в противном случае перейти к следующей точке x+1 в массиве.

Кроме того, если вы хотите интегрироваться с отображением и начинаете с геоточек, вы должны преобразовать геоточки в экранные. это требует выбора модели и формулы для формы земли (хотя мы склонны думать о земле как о сфере, на самом деле это неправильный овоид (яйцевидная форма) с вмятинами. существует много моделей, для получения дополнительной информации вики.

person user836725    schedule 21.08.2011

Есть отличный пример умножения вершин. По сути именно то, что вы хотели бы сделать!!

http://www.wikihow.com/Рассчитать-площадь-полигона

person user608669    schedule 08.02.2011
comment
Нет, если у вас есть координаты широты и долготы и вам нужна площадь в квадратных метрах. Кроме того, если вы работаете со сферой, то многоугольник делит сферу на две области. Какую ты хочешь? Площадь континента или площадь океана? - person Spacedman; 08.02.2011

Некоторые методы для этого включают интеграцию (разделите многоугольник на полосы по широте и интегрируйте. Вы также можете спроецировать на плоскую поверхность и вычислить эту площадь.

person SRM    schedule 08.02.2011
comment
@user368937 user368937 Предполагая, что вы опытный программист на ruby ​​(если нет, я бы начал с чего-то гораздо более простого), тогда лучший способ сделать это — проанализировать алгоритмы (надеюсь, каким-то образом, не зависящим от языка) и применить те же алгоритмы, используя язык и синтаксис на ваш выбор. На самом деле это ничем не отличается от любой другой проблемы, которую вам нужно решить в инженерии — определите проблему, определите потенциальные решения, внедрите решения в выбранную вами структуру. Извините за расплывчатость, но вы просите нас написать программу для вас :). - person SRM; 10.02.2011