计算与Java中的纬度/经度坐标相距一定距离的边界框

Bry*_*mas 36 math trigonometry geospatial bounding-box latitude-longitude

给定一个坐标(lat,long),我试图计算一个与坐标相距给定距离(例如50km)的方形边界框.所以作为输入我有lat,long和distance,作为输出,我想要两个坐标; 一个是西南(左下角),另一个是东北(右上角).我在这里看到了几个试图用Python解决这个问题的答案,但我特别想找一个Java实现.

为了清楚起见,我打算仅在地球上使用该算法,因此我不需要容纳可变半径.

它不一定非常准确(+/- 20%很好),它只能用于计算小距离(不超过150公里)的边界框.所以我很高兴为一个有效的算法牺牲一些准确性.任何帮助深表感谢.

编辑:我应该更清楚,我真的是在一个正方形,而不是一个圆圈.我知道正方形的中心和沿着正方形周长的各个点之间的距离不是像圆圈一样的恒定值.我猜我的意思是一个正方形,如果你从中心画一条直线到周长上的四个点中的任何一个点,导致一条线垂直于周边的边,那么这4条线的长度相同.

小智 55

我写了一篇关于找到边界坐标的文章:

http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates

本文解释了这些公式,并提供了Java实现.(它还说明了为什么IronMan的最小/最大经度公式是不准确的.)

  • 我很困惑为什么这些球面近似被作为标准解决方案.这里涉及一些令人憎恶的三角函数.此外,所有GPS设备都会根据WGS84椭球生成纬度/经度坐标 - 如果您想要完全精确,则无法使用球面近似...在球面近似中调整这些方程以解释椭圆体将导致难以想象的怪物.然后,该方法必须是在3D空间中执行计算和弧长积分. (2认同)

小智 15

double R = 6371;  // earth radius in km

double radius = 50; // km

double x1 = lon - Math.toDegrees(radius/R/Math.cos(Math.toRadians(lat)));

double x2 = lon + Math.toDegrees(radius/R/Math.cos(Math.toRadians(lat)));

double y1 = lat + Math.toDegrees(radius/R);

double y2 = lat - Math.toDegrees(radius/R);
Run Code Online (Sandbox Code Playgroud)

虽然我也会推荐JTS.

  • 什么是`JTS`代表什么? (8认同)

nov*_*lis 5

import com.vividsolutions.jts.geom.Envelope;

...
Envelope env = new Envelope(centerPoint.getCoordinate());
env.expandBy(distance_in_degrees); 
...
Run Code Online (Sandbox Code Playgroud)

现在 env 包含了你的信封。它实际上不是一个“正方形”(无论这在球体表面意味着什么),但它应该是这样。

您应该注意,以度为单位的距离取决于中心点的纬度。在赤道,1度纬度约为111公里,但在纽约,只有约75公里。

真正酷的是,您可以将所有点放入 a 中com.vividsolutions.jts.index.strtree.STRtree,然后使用它快速计算该信封内的点。