2011-02-08 9 views
1

У меня есть массив пар координат широты/долготы, которые представляют собой многоугольник. Я пытаюсь определить общую площадь внутри этого многоугольника. Как я буду заниматься этим в Ruby?вычислить площадь многоугольника в 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]] 
+0

И какие единицы являются входами? Furlongs? – bmargulies

ответ

2

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

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

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

1

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

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

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

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

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

Edit:

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

areaInSqMiles = Area * (60 * 60 * 1.15 * 1.15) 
+0

Опять же, не для длинномерных координат, если только очень маленькая область около экватора. – Spacedman

+0

@Spacedman: Согласен. Я добавлю это к предположениям. –

+0

@Spacedman точно, lat/long являются угловыми координатами, а не линейными, поэтому они не будут работать, если не будут задействованы очень короткие расстояния вдоль экватора. Чем дальше от экватора, тем меньше вы будете точнее. Для этого вам нужны большие функции круга или хаверина. – SRM

0

Существует удивительный пример того, как умножать вертику. По сути, именно то, что вы хотели бы сделать!

http://www.wikihow.com/Calculate-the-Area-of-a-Polygon

+1

Нет, если у вас есть лат-длинные углы и нужна площадь в квадратных метрах. Кроме того, если вы работаете над сферой, то многоугольник делит сферу на две области. Какой вы хотите? Площадь континента или района океана? – Spacedman

0

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

+0

@ user368937 Предполагая, что вы опытный рубиновый программист (если нет, я бы начал с чего-то гораздо более простого), тогда лучший способ сделать это - проанализировать алгоритмы (надеюсь, на каком-то языке агностически) и применить те же алгоритмы, используя языка и синтаксиса по вашему выбору. Это действительно ничем не отличается от любой другой проблемы, которую вы должны решить в технике - определить проблему, определить потенциальные решения, реализовать решения в выбранных вами рамках. Извините, что расплывчаты, но вы просите нас написать программу для вас :). – SRM

2

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

Даны: многоугольник может ВСЕГДА быть составлен п-2 треугольников, которые не перекрывают друг друга (п = числа точек или сторон). 1 треугольник = трехгранный многоугольник = 1 треугольник; 1 квадрат = 4-сторонний многоугольник = 2 треугольника; etc ad tauseam QED

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

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

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

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

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

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

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

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

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