我想计算从GPS轨迹得到的多边形面积。所以基本上我会在一段时间后存储设备/用户的位置,比方说5秒。
在此轨道多边形之外,我想计算轨道所在的区域。 对于凸多边形,这应该不是问题,因为我想我只需要计算三角形的面积(当每个三角形在第一点有一个起点)。基本上如左图所示。 (黄色多边形是由GPS-Locations组成的多边形,暗线显示用于区域计算的三角形,浅黄色是所需区域)
但昨晚我发现了这个想法的退缩,即多边形不凸出的时候。不仅将在该区域中计算多边形外部(左上侧)的部分,还将多次测量多边形的某些区域(查看左下方的重叠三角形)。
有没有人知道如何实现这一目标?我的意思是,如果我的多边形像S形一样,我甚至很难知道应该计算哪个区域...(但我可以忍受...只要它在多边形上获得足够公平的结果(几乎)闭合。
如果多边形是非凸的,那么计算多边形的凸包然后对其进行面积计算的另一个想法将无法正常工作。然后,我不会多次计算某些区域,但在正确的图像中,我会计算出比它更大的区域。
如果有人能帮助我,那会很棒!谢谢!
答案 0 :(得分:5)
您可以查看多边形区域的通用公式:http://mathworld.wolfram.com/PolygonArea.html。这也涵盖了非凸多边形的情况(只要它们不是自相交的)。
答案 1 :(得分:2)
我一直这样做,但我不知道算法,因为我在C / C ++中使用GEOS,在Java中使用JTS或在Shapely中使用库蟒。
如果你有能力承担额外的依赖,我强烈推荐它,因为计算是健壮的,经过测试,采用开放标准的输入格式(Well-Known Text)并使用奇怪和不寻常的几何形状(例如带孔的多边形等)。一旦你完成这项工作,你就可以用几何做各种奇怪而奇妙的事情。
答案 2 :(得分:1)
有点晚了,但我刚用Java实现这个gps坐标。您必须按照此处所述标准化gps坐标:Polygon area calculation using Latitude and Longitude generated from Cartesian space and a world file。效果很好,但误差幅度约为0.005%,因为笛卡尔坐标是基于理想地球半径的近似值。下面的注释代码假定geojson样式[经度,纬度]对而不是相反。
public static double area(double[][] polygon) {
Validate.isTrue(polygon.length > 3,"polygon should have at least three elements");
double total=0;
double[] previous=polygon[0];
double[] center = polygonCenter(polygon);
double xRef=center[0];
double yRef=center[1];
for(int i=1; i< polygon.length;i++) {
double[] current = polygon[i];
// convert to cartesian coordinates in meters, note this not very exact
double x1 = ((previous[0]-xRef)*( 6378137*PI/180 ))*Math.cos( yRef*PI/180 );
double y1 = (previous[1]-yRef)*( Math.toRadians( 6378137 ) );
double x2 = ((current[0]-xRef)*( 6378137*PI/180 ))*Math.cos( yRef*PI/180 );
double y2 = (current[1]-yRef)*( Math.toRadians( 6378137 ) );
// calculate crossproduct
total += x1*y2 - x2*y1;
previous=current;
}
return 0.5 * Math.abs(total);
}
答案 3 :(得分:0)
您想要查看空间填充曲线,例如z曲线或希尔伯特曲线。 sfc曲线在许多瓦片中细分表面并将二维问题简化为一维问题。你想搜索关于空间索引希尔伯特曲线和四叉树的尼克博客。