рассчитать площадь полигона в рубине - PullRequest
1 голос
/ 08 февраля 2011

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

Ответы [ 5 ]

2 голосов
/ 21 августа 2011

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

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

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

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

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

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

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

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

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

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

2 голосов
/ 28 февраля 2011

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

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

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

1 голос
/ 08 февраля 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)

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

Edit:

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

areaInSqMiles = Area * (60 * 60 * 1.15 * 1.15)
0 голосов
/ 08 февраля 2011

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

0 голосов
/ 08 февраля 2011

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

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

...