Вычисление площади многоугольника, когда точки многоугольника представляют собой широту и долготу: какая функция более точна?

Я пытаюсь найти способ вычислить площадь многоугольника, используя длинные координаты широты на сайте Flex 3. Hong007 в группе Google Maps for Flash был достаточно крут, чтобы опубликовать следующую функцию:

private function GetPolygonArea (polygon : Polygon):Number 
        { 
            var nVer : int = polygon.getOuterVertexCount(); 
            var sz : Number =0; 
            var s : Number =0; 
            var x : Number =0; 
            var y0 : Number =0; 
            var y1 : Number =0; 
            var Maplatlng:LatLng; 
            if (nVer>=3){ 
               for (var i:int=0; i<nVer; i++){ 
                   Maplatlng = polygon.getOuterVertex(i); 
                   x = Maplatlng.lng(); 
                   if (i>0){ 
                      Maplatlng = polygon.getOuterVertex(i-1); 
                      y0 = Maplatlng.lat(); 
                   } 
                   else{ 
                      Maplatlng = polygon.getOuterVertex(nVer-1); 
                      y0 = Maplatlng.lat(); 
                   }; 
                   if (i<(nVer-1)){ 
                      Maplatlng = polygon.getOuterVertex(i+1); 
                      y1 = Maplatlng.lat(); 
                   } 
                   else{ 
                      Maplatlng = polygon.getOuterVertex(0); 
                      y1 = Maplatlng.lat(); 
                   }; 
                   s = x * (y0-y1); 
                   sz+=s; 
               }; 
               //경위도시 1도의 m값을 곱한다(대략 면적 환산) 
               Maplatlng = polygon.getOuterVertex(0); 
               var Maplatlng1:LatLng = new 
com.google.maps.LatLng(Maplatlng.lat()+1, Maplatlng.lng()+1); 
               var TempDISTANCE:Number = 
Maplatlng.distanceFrom(Maplatlng1) / Math.sqrt(2); 
               return Math.abs((sz/2.0) * Math.pow(TempDISTANCE, 2)); 
            }; 
            return 0.0; 
        }

Я также играл с калькулятором площади на http://www.freemaptools.com/area-calculator.htm .

Эти функции дают немного разные результаты. Я пытаюсь выяснить, какой из них более точен. Кажется, что функция hong007 дает результаты, которые в среднем немного больше, чем функция freemaptools. Однако я не знаю, какой из них более точен. Любой совет?


person Laxmidi    schedule 28.07.2010    source источник


Ответы (2)


Я добавил строку в этот алгоритм. Для карт google экспериментальным путем я нашел эти числа:

are = area-(area*0.2187);

и у меня это работает для максимального (масштаб = 5 метров) и минимального (500 км) уровней масштабирования.

person Billion    schedule 16.04.2012

Метод, реализованный здесь, довольно быстрый и грязный. Он делает пару предположений, которые могут привести к неправильным результатам.

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

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

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

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

person bshields    schedule 28.07.2010
comment
Привет bshields, Спасибо за очень подробный ответ. Теперь я лучше понимаю, как работает эта функция и в чем ее слабые места. Мои полигоны — это районы в одном городе на восточном побережье США. В среднем полигоны составляют от 1-3 кв. км. Так что, надеюсь, проблемы, которые вы изложили, не вызовут больших неточностей. К сожалению, калькулятор площади не предоставляет используемой функции. Поэтому мне пришлось бы вводить каждый полигон отдельно, и это было бы проблемой. Считаете ли вы, что функция hong007 достаточно точна на уровне города? Спасибо! - person Laxmidi; 28.07.2010
comment
@Laxmidi Только первое, что я упомянул, связано с размером полигона. Более важной проблемой является метод усреднения масштаба между двумя осями. Это даст правильные результаты для квадрата, но многоугольники неправильной формы будут иметь неправильную площадь, причем в худшем случае это будут очень продолговатые и ориентированные вдоль одной из осей. Если вы хотите сделать это правильно, я думаю, вам нужно спроецировать эти точки в проекционную систему координат, такую ​​​​как UTM, и вычислить площадь в этом пространстве. - person bshields; 28.07.2010