Bing 地图中的多边形区域
Polygon Area in Bing Maps
您好,我在计算 Bing 地图中的多边形面积时遇到问题。我正在使用此代码计算面积。
public static double PolygonArea(LocationCollection points, double resolution)
{
int n = points.Count;
var partialSum = 0.0;
var sum = 0.0;
for (int i = 0; i < n - 1; i++)
{
partialSum = (points[i].Longitude * points[i + 1].Latitude) -
(points[i + 1].Longitude * points[i].Latitude);
sum += partialSum;
}
var area = 0.5 * sum / Math.Pow(resolution, 2);
area = Math.Abs(area);
return area;
}
这是解决方法
public static double Resolution(double latitude, double zoomLevel)
{
double groundResolution = Math.Cos(latitude * Math.PI / 180) *
2 * Math.PI * EARTH_RADIUS_METERS / (256 * Math.Pow(2, zoomLevel));
return groundResolution;
}
如何在 m^2 中转换它?
EDIT1:我试过你的回答,但我注意到如果我改变缩放级别,区域会发生变化。
我试着从你的另一个角度来解释我的问题。我必须移植一个使用此算法计算面积
的 iOS 应用程序
-(long double)calcArea :(CLLocationCoordinate2D*) pastureCordinates :(long) count {
long double area = 0.0;
long double scale = 0.0;
for (int cnt = 1; cnt < count; cnt++) {
area += (MKMapPointForCoordinate(pastureCordinates[cnt - 1]).x)
* (MKMapPointForCoordinate(pastureCordinates[cnt]).y)
- (MKMapPointForCoordinate(pastureCordinates[cnt]).x)
* (MKMapPointForCoordinate(pastureCordinates[cnt - 1]).y);
}
area += (MKMapPointForCoordinate(pastureCordinates[count - 1]).x)
* (MKMapPointForCoordinate(pastureCordinates[0]).y)
- (MKMapPointForCoordinate(pastureCordinates[0]).x)
* (MKMapPointForCoordinate(pastureCordinates[count - 1]).y);
scale = MKMapPointsPerMeterAtLatitude(pastureCordinates[count -1].latitude);
area = (area / (long double)2) / pow(scale,2);
area = fabsl(area);
return area;
}
我使用了此处找到的函数:https://msdn.microsoft.com/en-us/library/bb259689.aspx 来计算比例尺、地面分辨率,但结果与 iOS 解决方案不同。
计算地图上多边形的面积非常复杂,因为世界是一个球体,而您实际上是在计算在球体表面拉伸的多边形的面积。由于您使用的是 WPF,我建议让事情变得简单,并利用 SQL 服务器中可用的空间库。 SQL 服务器中的所有空间功能都可以作为 dll 提供,您可以在 WPF 应用程序中使用它。您可以轻松地使用这个库来准确计算多边形的面积,还可以做很多其他非常强大的事情。首先,如果您安装了 SQL,您可以在 C:\Program Files (x86)\Microsoft SQL 中找到 SQL 空间库 (Microsoft.SqlServer.Types) Server0\Shared 目录。如果你没有安装 SQL 服务器,别担心,你不必安装它,这个库在此处作为 Nuget 包提供:https://www.nuget.org/packages/Microsoft.SqlServer.Types
查看此动手实验,了解在 .NET 中使用 SQL 空间工具的信息:http://view.officeapps.live.com/op/view.aspx?src=http%3A%2F%2Fecn.channel9.msdn.com%2Fo9%2Flearn%2FSQL2008R2TrainingKit%2FLabs%2FUsingSpatialDataInManagedCode%2FLab.docx
拥有此库后,您可以从多边形创建 SQL 地理对象。一旦完成,您就可以使用 STArea 方法计算多边形的面积。还有大量其他可用的空间方法,您可以使用它们来创建真正强大的地图应用程序。
好的,我尝试了一些代码并整理了一个简单的方法来相当准确地计算面积,而无需使用非常深入的空间数学。
private double CalculateArea(LocationCollection locs)
{
double area = 0;
for (var i = 0; i < locs.Count - 1; i++)
{
area += Math.Atan(
Math.Tan(Math.PI / 180 * (locs[i + 1].Longitude - locs[i].Longitude) / 2) *
Math.Sin(Math.PI / 180 * (locs[i + 1].Latitude + locs[i].Latitude) / 2) /
Math.Cos(Math.PI / 180 * (locs[i + 1].Latitude - locs[i].Latitude) / 2));
}
if (area < 0)
{
area *= -1;
}
return area * 2 * Math.Pow(6378137.0, 2);
}
用各种多边形对此进行测试,并将它们与 SQL 中的计算面积进行比较,我发现在最坏的情况下,使用大得离谱的多边形时,差异约为 0.673%。当针对大小约为 0.5 平方公里的多边形进行测试时,差异约为 0.06%。请注意,此方法 returns 面积以平方米为单位。
您好,我在计算 Bing 地图中的多边形面积时遇到问题。我正在使用此代码计算面积。
public static double PolygonArea(LocationCollection points, double resolution)
{
int n = points.Count;
var partialSum = 0.0;
var sum = 0.0;
for (int i = 0; i < n - 1; i++)
{
partialSum = (points[i].Longitude * points[i + 1].Latitude) -
(points[i + 1].Longitude * points[i].Latitude);
sum += partialSum;
}
var area = 0.5 * sum / Math.Pow(resolution, 2);
area = Math.Abs(area);
return area;
}
这是解决方法
public static double Resolution(double latitude, double zoomLevel)
{
double groundResolution = Math.Cos(latitude * Math.PI / 180) *
2 * Math.PI * EARTH_RADIUS_METERS / (256 * Math.Pow(2, zoomLevel));
return groundResolution;
}
如何在 m^2 中转换它?
EDIT1:我试过你的回答,但我注意到如果我改变缩放级别,区域会发生变化。
我试着从你的另一个角度来解释我的问题。我必须移植一个使用此算法计算面积
的 iOS 应用程序-(long double)calcArea :(CLLocationCoordinate2D*) pastureCordinates :(long) count {
long double area = 0.0;
long double scale = 0.0;
for (int cnt = 1; cnt < count; cnt++) {
area += (MKMapPointForCoordinate(pastureCordinates[cnt - 1]).x)
* (MKMapPointForCoordinate(pastureCordinates[cnt]).y)
- (MKMapPointForCoordinate(pastureCordinates[cnt]).x)
* (MKMapPointForCoordinate(pastureCordinates[cnt - 1]).y);
}
area += (MKMapPointForCoordinate(pastureCordinates[count - 1]).x)
* (MKMapPointForCoordinate(pastureCordinates[0]).y)
- (MKMapPointForCoordinate(pastureCordinates[0]).x)
* (MKMapPointForCoordinate(pastureCordinates[count - 1]).y);
scale = MKMapPointsPerMeterAtLatitude(pastureCordinates[count -1].latitude);
area = (area / (long double)2) / pow(scale,2);
area = fabsl(area);
return area;
}
我使用了此处找到的函数:https://msdn.microsoft.com/en-us/library/bb259689.aspx 来计算比例尺、地面分辨率,但结果与 iOS 解决方案不同。
计算地图上多边形的面积非常复杂,因为世界是一个球体,而您实际上是在计算在球体表面拉伸的多边形的面积。由于您使用的是 WPF,我建议让事情变得简单,并利用 SQL 服务器中可用的空间库。 SQL 服务器中的所有空间功能都可以作为 dll 提供,您可以在 WPF 应用程序中使用它。您可以轻松地使用这个库来准确计算多边形的面积,还可以做很多其他非常强大的事情。首先,如果您安装了 SQL,您可以在 C:\Program Files (x86)\Microsoft SQL 中找到 SQL 空间库 (Microsoft.SqlServer.Types) Server0\Shared 目录。如果你没有安装 SQL 服务器,别担心,你不必安装它,这个库在此处作为 Nuget 包提供:https://www.nuget.org/packages/Microsoft.SqlServer.Types
查看此动手实验,了解在 .NET 中使用 SQL 空间工具的信息:http://view.officeapps.live.com/op/view.aspx?src=http%3A%2F%2Fecn.channel9.msdn.com%2Fo9%2Flearn%2FSQL2008R2TrainingKit%2FLabs%2FUsingSpatialDataInManagedCode%2FLab.docx
拥有此库后,您可以从多边形创建 SQL 地理对象。一旦完成,您就可以使用 STArea 方法计算多边形的面积。还有大量其他可用的空间方法,您可以使用它们来创建真正强大的地图应用程序。
好的,我尝试了一些代码并整理了一个简单的方法来相当准确地计算面积,而无需使用非常深入的空间数学。
private double CalculateArea(LocationCollection locs)
{
double area = 0;
for (var i = 0; i < locs.Count - 1; i++)
{
area += Math.Atan(
Math.Tan(Math.PI / 180 * (locs[i + 1].Longitude - locs[i].Longitude) / 2) *
Math.Sin(Math.PI / 180 * (locs[i + 1].Latitude + locs[i].Latitude) / 2) /
Math.Cos(Math.PI / 180 * (locs[i + 1].Latitude - locs[i].Latitude) / 2));
}
if (area < 0)
{
area *= -1;
}
return area * 2 * Math.Pow(6378137.0, 2);
}
用各种多边形对此进行测试,并将它们与 SQL 中的计算面积进行比较,我发现在最坏的情况下,使用大得离谱的多边形时,差异约为 0.673%。当针对大小约为 0.5 平方公里的多边形进行测试时,差异约为 0.06%。请注意,此方法 returns 面积以平方米为单位。