从任何点将米转换为纬度经度

时间:2011-12-21 08:02:06

标签: google-maps gis

在我的项目中,我必须从距离为500米的一个点找到[纬度,经度]坐标(这可以是任何随机坐标或我点周围的坐标数组)。我怎样才能做到这一点?

注意:我需要这个以便找到不同于最短点之间的多个路径,这些路径通过Google Maps Directions Api返回给我们。所以使用我的方法我将定义从A到B的道路中心然后找到在中心位置下方和上方的一些坐标,并将其用作从A到B的另一个航路点 - 我想这可能有助于我找到多条路径......

GIS专业人士的任何建议?

编辑:UTM转换是这种计算的最佳选择,如果有人需要,我已经创建了UTM Java类。

2 个答案:

答案 0 :(得分:6)

如果我理解你的问题,那么你有一个Lat / Long的已知点,你需要计算另一个点的纬度/经度或远离起点500米的点。

如果这是您正在做的事情,您有几个选项,其中大多数涉及专业GIS API。但是,我猜你是程序员/数学家而不是地理学家,所以你可能更愿意选择使用Haversine公式。您可以找到关于此主题的讨论here以及公式。

有一点需要注意的是,你正在使用的距离(500米非常小),地球远不是一个完美的球体,甚至是一个稍微扁平的球体。它在本地“块状”,可以计算出来。如果你需要更高的准确度,你必须通过使用适当的本地基准(地球模型 - 有许多例如参见EPSG list)来解释这些不完善之处,为此你可能需要开始使用GIS库因为数学非常详细,否则。

答案 1 :(得分:0)

这是google map(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的以度为单位的标题。

您可以将公式更改为您偏好的语言。