使用从笛卡尔空间和世界文件生成的纬度和经度计算多边形面积
给定一系列 GPS 坐标对,我需要计算多边形(n 边形)的面积。这是相对较小的(不大于 50,000 平方英尺)。地理编码是通过对世界文件中的数据应用仿射变换来创建的。
我尝试使用两步方法将地理编码转换为笛卡尔坐标:
double xPos = (lon-lonAnchor)*( Math.toRadians( 6378137 ) )*Math.cos( latAnchor );
double yPos = (lat-latAnchor)*( Math.toRadians( 6378137 ) );
然后我使用 叉积< /a> 计算以确定面积。
问题是结果的准确性有点偏差(大约 1%)。我可以研究什么来改善这一点吗?
谢谢。
Given a series of GPS coordinate pairs, I need to calculate the area of a polygon (n-gon). This is relatively small (not larger than 50,000 sqft). The geocodes are created by applying an affine transform with data from a world file.
I have tried to use a two step approach by doing converting the geocodes to cartesian coordinates:
double xPos = (lon-lonAnchor)*( Math.toRadians( 6378137 ) )*Math.cos( latAnchor );
double yPos = (lat-latAnchor)*( Math.toRadians( 6378137 ) );
then I use a cross product calculation to determine the area.
The issue is that the results are a bit off in accuracy (around 1%). Is there anything I can look into to improve this?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
我在互联网上检查了各种多边形面积公式(或代码),但没有找到任何一个好的或易于实现的。
现在我已经编写了代码片段来计算在地球表面绘制的多边形的面积。多边形可以有 n 个顶点,每个顶点都有自己的纬度经度。
几个要点
输出面积单位为平方米
I checked on internet for various polygon area formulas(or code) but did not find any one good or easy to implement.
Now I have written the code snippet to calculate area of a polygon drawn on earth surface. The polygon can have n vertices with each vertex has having its own latitude longitude.
Few Important Points
The output area will have unit of square metres
我正在修改 Google 地图,以便用户可以计算面积
通过单击顶点来绘制多边形。它没有给出正确的
区域,直到我确保 Math.cos(latAnchor) 首先以弧度为单位
所以:
变成:
其中 lon、lonAnchor 和 latAnchor 的单位为度数。现在就像一个魅力。
I am modifying a Google Map so that a user can calculate the area
of a polygon by clicking the vertices. It wasn't giving correct
areas until I made sure the Math.cos(latAnchor) was in radians first
So:
became:
where lon, lonAnchor and latAnchor are in degrees. Works like a charm now.
由于您的近似值,1% 的误差似乎有点高。您是与实际测量值还是理想计算值进行比较?请记住,GPS 也可能存在误差。
如果您想要更准确的方法来执行此操作,这个问题。如果您想要更快的方法,您可以使用 WGS84 大地水准面而不是参考球体来转换为笛卡尔坐标 (ECEF)。以下是该转换的 wiki 链接。
1% error seems a bit high due to just your approximation. Are you comparing against actual measurements or some ideal calculation? Remember that there is error in the GPS as well that might be contributing.
If you want a more accurate method for doing this there's a good answer at this question. If you're going for a faster way you can use the WGS84 geoid instead of your reference sphere for converting to cartesian coordinates (ECEF). Here's the wiki link for that conversion.
造成这种“1%”差异的原因是地球是非常轻微的椭球体,因此通过使用球形模型进行计算,给出或获取位置时,误差通常高达 0.3%。
The reason for this "1%" discrepancy is The earth is very slightly ellipsoidal so by calculating using a spherical model gives errors typically up to 0.3%, give or take the location.
基于 Risky Pathak 的解决方案,这里是 SQL (Redshift) 计算 GeoJSON 多边形(假设线串 0 是最外层的多边形)
Based on the solution by Risky Pathak here is the solution for SQL (Redshift) to calculate areas for GeoJSON multipolygons (with the assumption that linestring 0 is the outermost polygon)
谢谢风险帕塔克!
本着分享的精神,这是我在Delphi中的改编:
Thank you Risky Pathak!
In the spirit of sharing, here's my adaptation in Delphi:
将 RiskyPathak 的代码片段改编为 Ruby
Adapted RiskyPathak's snippet to Ruby
尝试在快速游乐场中执行此操作,但结果却相差甚远
示例坐标:(39.58571008386715,-104.94522892318253) 我正在插入该函数
Tried to do this in swift playground and got results that are way off
Example coord: (39.58571008386715,-104.94522892318253) that I am plugging into the function
我不知道为什么,但我使用上面的公式得到的结果与谷歌地图测量同一区域时返回的结果相差甚远。
因此,我想出了这个 javascript 方法来计算由 GPS 坐标定义的多边形区域:
其中点存储如下值:{lng: -73.462556156587, lat: 45.48566183708046}
I'm not sure why, but the results I'm getting using the formula above , are nowhere near the results google maps is returning when measuring the same area.
So digging around, I've came up with this javascript method to calculate a polygon area defined by GPS coordinates:
Where points stores values like: {lng: -73.462556156587, lat: 45.48566183708046}
将 RiskyPathak 的代码片段改编为 PHP
// mssing 关闭 )
Adapted RiskyPathak's snippet to PHP
// mssing clossing )
Google Maps Utils 库提供了一种计算面积的方法。
您必须添加以下依赖项
,然后调用下面的方法并为其提供您的纬度和经度列表。它将返回以平方米为单位的面积。
Google Maps Utils library provide a method to calculate the Area.
You have to add below dependency
And then call below method and give it yours Latitude and Longitude list. It will return area in square meters.