在我的项目中,我必须从距离为500米的一个点找到[纬度,经度]坐标(这可以是任何随机坐标或我点周围的坐标数组)。我怎样才能做到这一点?
注意:我需要这个以便找到不同于最短点之间的多个路径,这些路径通过Google Maps Directions Api返回给我们。所以使用我的方法我将定义从A到B的道路中心然后找到在中心位置下方和上方的一些坐标,并将其用作从A到B的另一个航路点 - 我想这可能有助于我找到多条路径......
GIS专业人士的任何建议?
编辑:UTM转换是这种计算的最佳选择,如果有人需要,我已经创建了UTM Java类。
答案 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的以度为单位的标题。
您可以将公式更改为您偏好的语言。