从任意点将米转换为纬度和经度

12
在我的项目中,我需要从一个点开始,在距离500米范围内找到一些[纬度、经度]坐标(这些可以是任意的随机坐标或者是该点周围的坐标数组)。请问如何实现?
注意:我需要这样做是为了找到不同于通过Google Maps Directions API返回的最短路径的多条路径。因此,使用我的方法,我将确定从A到B的路中心,并找到该中心位置下方和上方的一些坐标,并将其用作另一个途经点以从A到B移动。我想这可能会帮助我找到多条路径...... 有GIS专业人士有什么建议吗?
编辑:UTM转换是进行此类计算的首选方法,如果有人需要,我已经创建了UTM Java类。
2个回答

6
如果我理解您的问题正确,您有一个已知的经纬度点,并且您需要计算距离起始点500米的另一个或多个点的纬度/经度。
如果是这样,您有几个选项,其中大多数涉及专业的GIS API。 但是,我猜您是一位程序员/数学家,而不是地理学家,因此,您可能更喜欢选择使用Haversine公式。 您可以在这里找到有关此主题的讨论以及公式。
一个注意事项是,您正在处理的距离(500m相当小),而地球远非完美的球体甚至是略微扁平的椭球体。 它在本地是“崎岖不平的”,这可能会影响您的计算。 如果您需要更高的精度,则必须通过使用适当的本地Datum(即地球的模型 - 有许多例如请参阅EPSG列表)来解决这些缺陷,并且否则数学变得非常详细,您可能需要开始使用GIS库。

看起来是个不错的方法。目前我正在尝试使用UTM转换为[纬度,经度]和反向计算方法来查找适当的坐标和经纬度。我认为这种方法与你的方法相同,只是公式不同,但我已经读到UTM公式可以将位置精确转换为厘米...顺便说一句,非常感谢您的回复! - Zaur Guliyev
2
UTM已经通过将地球分成许多带,每个带都有自己的基准,考虑了地球表面的本地变形,因此它比使用单一投影整个地球的WGS精度更高。如果你需要工具来转换笛卡尔坐标系-计算你的点并转换回纬度/经度,而不必担心数学问题,请查看GDAL/OGR(尤其是空间参考API - OSR)。 - MappaGnosis

3

以下是谷歌地图使用的代码(SphericalUtil.java)

  // from  SphericalUtil.java
  // compile 'com.google.maps.android:android-maps-utils:0.4.4'
  public static LatLng computeOffset(LatLng from, double distance, double heading) {
    distance /= 6371009.0D;  //earth_radius = 6371009 # in meters
    heading = Math.toRadians(heading);
    double fromLat = Math.toRadians(from.latitude);
    double fromLng = Math.toRadians(from.longitude);
    double cosDistance = Math.cos(distance);
    double sinDistance = Math.sin(distance);
    double sinFromLat = Math.sin(fromLat);
    double cosFromLat = Math.cos(fromLat);
    double sinLat = cosDistance * sinFromLat + sinDistance * cosFromLat * Math.cos(heading);
    double dLng = Math.atan2(sinDistance * cosFromLat * Math.sin(heading), cosDistance - sinFromLat * sinLat);
    return new LatLng(Math.toDegrees(Math.asin(sinLat)), Math.toDegrees(fromLng + dLng));
}

要使用它,只需输入centerLatLng、距离(以米为单位)和从centerLatLng开始的方向角度。

您可以将公式更改为您喜欢的语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接