简体   繁体   English

使用纬度和经度计算多边形区域

[英]Polygon area calculation using Latitude and Longitude

I am using a solution I've found in this post: Polygon area calculation using Latitude and Longitude generated from Cartesian space and a world file 我正在使用我在这篇文章中找到的解决方案: 使用从笛卡尔空间和世界文件生成的纬度和经度进行多边形区域计算

丹佛足球场

There is something wrong because the values I am getting are not real. 有些不对劲,因为我得到的价值并不真实。 For example we know a football field should have around 5,300.00 square meters, right? 例如,我们知道一个足球场应该有大约5,300.00平方米,对吗? but the calculation is giving 5,759,154.21. 但计算结果为5,759,154.21。

This is the code: 这是代码:

    private static double CalculatePolygonArea(IList<Position> coordinates)
    {
        double area = 0;

        if (coordinates.Count > 2)
        {
            for (var i = 0; i < coordinates.Count - 1; i++)
            {
                Position p1 = coordinates[i];
                Position p2 = coordinates[i + 1];
                area += (ConvertToRadian(p2.Longitude) - ConvertToRadian(p1.Longitude)) * (2 + Math.Sin(ConvertToRadian(p1.Latitude)) + Math.Sin(ConvertToRadian(p2.Latitude)));
            }

            area = area * 6378137 * 6378137 / 2;
        }

        return Math.Abs(area);
    }

    private static double ConvertToRadian(double input)
    {
        return input * Math.PI / 180;
    }

What can be wrong here? 这可能有什么不对? Any help? 有帮助吗?

The area calculation you are using is just plain wrong.... :-/ 你正在使用的面积计算是完全错误的....: - /

I use the SphericalUtil.ComputeSignedArea method from Google's Android Maps Utils. 我使用Google的Android Maps Utils中的SphericalUtil.ComputeSignedArea方法。

Note: Google's Java code for that is under Apache License Version 2.0, and I converted it to C#. 注意:Google的Java代码是在Apache License Version 2.0下,我将其转换为C#。

Looking up that football field up in one of my apps, I get: 4,461, not quite the actual 5,531 but not bad for using Google Map photos... 在我的一个应用程序中查找该足球场,我得到:4,461,不是实际的 5,531,但使用谷歌地图照片并不坏...

在此输入图像描述

Here is just the ComputeSignedArea : 这里只是ComputeSignedArea

public static class SphericalUtil
{
    const double EARTH_RADIUS = 6371009;

    static double ToRadians(double input)
    {
        return input / 180.0 * Math.PI;
    }

    public static double ComputeSignedArea(IList<LatLng> path)
    {
        return ComputeSignedArea(path, EARTH_RADIUS);
    }

    static double ComputeSignedArea(IList<LatLng> path, double radius)
    {
        int size = path.Count;
        if (size < 3) { return 0; }
        double total = 0;
        var prev = path[size - 1];
        double prevTanLat = Math.Tan((Math.PI / 2 - ToRadians(prev.Latitude)) / 2);
        double prevLng = ToRadians(prev.Longitude);

        foreach (var point in path)
        {
            double tanLat = Math.Tan((Math.PI / 2 - ToRadians(point.Latitude)) / 2);
            double lng = ToRadians(point.Longitude);
            total += PolarTriangleArea(tanLat, lng, prevTanLat, prevLng);
            prevTanLat = tanLat;
            prevLng = lng;
        }
        return total * (radius * radius);
    }

    static double PolarTriangleArea(double tan1, double lng1, double tan2, double lng2)
    {
        double deltaLng = lng1 - lng2;
        double t = tan1 * tan2;
        return 2 * Math.Atan2(t * Math.Sin(deltaLng), 1 + t * Math.Cos(deltaLng));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM