标题基本上都说明了一切.我需要使用Python计算地球表面多边形内的区域.计算由地球表面任意多边形包围的区域说明了一些内容,但对技术细节仍然模糊:
如果你想用更"GIS"的味道来做这件事,那么你需要为你的区域选择一个度量单位,找到一个保留区域的适当投影(不是所有的).既然你在谈论计算任意多边形,我会使用类似Lambert Azimuthal等面积投影的东西.将投影的原点/中心设置为多边形的中心,将多边形投影到新坐标系,然后使用标准平面技术计算面积.
那么,我如何在Python中执行此操作?
假设我有一组任意的纬度和经度对代表一些简单的闭合曲线上的点.在笛卡尔空间中,我可以使用格林定理轻松计算出这条曲线所包围的区域.计算球体表面区域的类似方法是什么?我想我所追求的是Matlab areaint函数背后的算法(甚至是一些近似).
这就是我的想法.我想用GPS获取用户位置.我想要计算平方公里或米,而不是发送当前位置.
----------------------------------
| |
| |
| |
| |
| . |
| ^ |
| My current position |
| |
| |
| |
----------------------------------
Run Code Online (Sandbox Code Playgroud)
正如您在上图中所看到的,我现在的位置,但我想计算HTML5或Ionic周围的整个区域将是更优选的.
更新
在上面的图像中,红点是我的位置,我需要将整个区域放在红色矩形中.获取数据库中的那个商店.我查看了多边形区域公式,但这需要几个顶点,地理位置我只获得经度和纬度两个坐标.我怎么用这两点呢?
UPDATE
我在这里找到了一个解决方案,但是这个解决方案是跟踪用户的当前位置,并且在calculateDistance功能上公式使用当前位置(经度和纬度)和跟踪位置(经度和纬度),即Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * Math.sin(dLon/2) * Math.sin(dLon/2);
这对我的第二个场景非常好,但首先我不想跟踪用户的位置.首先,我简单地获取当前用户位置(经度和纬度),从中计算区域并将其发送到服务器.现在我不确定我将如何实现这一目标.有帮助吗?
从标题中你可以看到我给出了纬度和经度点.它们存储在csv文件中.最多有4万行.
"45.01234","9.12345"
"46.11111","9.12345"
"47.22222","9.98765"
...
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是如何找到边缘坐标,在完成后,它将滚动到我需要从这些边缘点多边形区域计算的第二个问题.下面是这些点的外观如何,边缘点与蓝线相连.

我搜索谷歌和SO搜索并发现了这些问题:这个,这个,这个和这个.
首先,我将所有纬度和经度点存储到csv文件的arraylist中.我不知道如何找到边缘点.但是在找到边缘点之后,找到多边形区域的一种方法是将其划分为三角形,然后通过Heron公式计算三角形区域.地球是球形的,所以计算我需要在上面给出的链接中使用建议的区域.
我的问题是否有框架可以解决我的问题?有什么方法可以自己做?当然代码应该是内存和CPU效率.
我搜索了解释和算法如何计算地球的多边形表面积.我发现了这个,这
让我们说我已经得到了凸壳
[56.992666,24.126051], [58.00282,25.930147], [58.787955,25.565078], [59.4997,24.861427], [59.463678,24.711365], [59.395767,24.599837], [56.992666,24.126051]
从第二个链接第一个答案使用Python库,即使我们假设地球是球体(我是对的),第二个答案方法也不会给出相当精确的区域?如果我们假设地球是球体,我可以采取什么方法来计算面积(更便宜)?
另外,我已经查找了不同的库(geotools.org等),但在他们的文档中没有找到有关区域计算的信息.
我想计算从GPS轨迹得到的多边形面积.所以基本上我会在一段时间后存储设备/用户的位置,比方说5秒.
在这个轨道多边形之外,我想计算轨道所在的区域.对于凸多边形,这应该不是问题,因为我想我只需要计算三角形的面积(当每个三角形有一个起点时第一点).基本上如左图所示.(黄色多边形是由GPS位置组成的多边形,暗线显示用于区域计算的三角形,浅黄色是所需区域)
但昨晚我发现了这个想法的背面,这是多边形不凸出的时候.不仅将在该区域中计算多边形外部(左上侧)的部分,还将多次测量多边形的某些区域(查看左下方的重叠三角形).

有没有人知道如何实现这一目标?我的意思是,如果我的多边形像S形一样,我甚至很难知道应该计算哪个区域...(但我可以忍受...只要它在多边形上获得足够公平的结果(几乎)关闭.
如果多边形是非凸的,那么我计算多边形的凸包然后对其进行面积计算的另一个想法将无法正常工作.然后,我不会多次计算某些区域,但在正确的图像中,我会计算出比它更大的区域.
如果有人能帮助我,那会很棒!谢谢!
我正在使用我在这篇文章中找到的解决方案: 使用从笛卡尔空间和世界文件生成的纬度和经度的多边形面积计算
有什么地方不对,因为我得到的值不是真实的。例如,我们知道一个足球场应该有大约 5,300.00 平方米,对吗?但计算结果为 5,759,154.21。
这是代码:
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 / …Run Code Online (Sandbox Code Playgroud) 我想计算一个大学项目的地图片段中绘制的多边形的数量.
这就是我画多边形的方法.
@Override
public void onMapClick(LatLng point) {
//tvLocInfo.setText("New marker added@" + point.toString());
map.addMarker(new MarkerOptions().position(point).draggable(true).title(point.toString()));
markerClicked = false;
}
@Override
public void onMapLongClick(LatLng point) {
//tvLocInfo.setText("New marker added@" + point.toString());
map.clear();
}
@Override
public boolean onMarkerClick(Marker marker) {
if(markerClicked){
if(polygon != null){
polygon.remove();
polygon = null;
}
polygonOptions.add(marker.getPosition());
polygonOptions.strokeColor(Color.RED);
polygonOptions.fillColor(Color.BLUE);
polygon = map.addPolygon(polygonOptions);
//Area = google.maps.geometry.spherical.computeArea(polygon.getPath().getArray());
}else{
if(polygon != null){
polygon.remove();
polygon = null;
}
polygonOptions = new PolygonOptions().add(marker.getPosition());
markerClicked = true;
}
Run Code Online (Sandbox Code Playgroud)
我已经看到了如何计算区域的代码,但我不确定如何在我的应用程序中实现它并计算多边形的面积.
我使用此代码计算Android的GPS区域:
private static final double EARTH_RADIUS …Run Code Online (Sandbox Code Playgroud) geolocation ×5
geometry ×3
geography ×2
google-maps ×2
java ×2
polygon ×2
algorithm ×1
android ×1
area ×1
c# ×1
geocoding ×1
geospatial ×1
gis ×1
gps ×1
html5 ×1
javascript ×1
mapping ×1
math ×1
python ×1
xamarin ×1