2011-12-21 18 views
9

在我的项目,我必须要找到经度纬度[纬度,经度]在500米的距离坐标(S)从一个点(这可能是任何随机坐标或坐标在我的点阵列)。我怎样才能做到这一点?转换米,从任何一点

注意:我需要这个以便找到不同于最短点的多个路径,这个路径是通过谷歌地图方向API返回给我们的。所以使用我的方法,我将定义从A到B的道路中心,然后找到一些坐标低于或高于该中心位置,并以此作为另一个航点从A去到B - 我想这可能会帮助我找到多条路径...

从GIS专业人士有什么建议?

编辑:UTM转换是更好的一个这样的计算,我已经创建了UTM的Java类,如果有人需要..

回答

5

如果我理解你的问题的权利,你有纬度/龙在已知点和你需要计算另一个点的纬度/长度或距离你的起点500米。

如果这是你在做什么,你有几种选择其中大部分涉及专业GIS的API。然而,我猜你是程序员/数学家,而不是地理学家,所以你可能更喜欢使用Haversine公式。你可以在这个主题上找到here加上公式的讨论。

一个需要注意的是,你正在使用的distamce(500米是相当小)与地球远远不是一个完美的球体或者甚至是略微扁平的球体。这是本地“块”,可以把你的计算。如果您需要更高精度,则必须通过使用适当的本地数据(地球模型 - 有许多例如参见EPSG list)来解决这些缺陷,并且要做到这一点,您可能需要开始使用GIS库非常详细,否则。

+0

看起来像一个很好的方法。对于知道我试图使用UTM为[纬度,经度]反之亦然计算方法同样的事情,以便找到合适的坐标和纬度,经度期间的计算。我认为这种方法也与你的方法相同,但只有公式是不同的,但我已经读过UTM公式可以完全以厘米为单位转换位置......顺带一提,非常感谢您的回复! – 2011-12-21 14:19:15

+2

UTM已经通过将地球划分成大量的区域来解释地球表面的局部变形,每个区域都有自己的基准面。这就是为什么它比为所有地球使用单个投影的WGS更精确。如果您需要工具来转换为笛卡尔坐标 - 计算您的积分并转换回Lat/Long而不必担心数学问题,请查看GDAL/OGR(特别是OSR - 这是空间参考API) – MappaGnosis 2011-12-21 14:33:15

0

这是通过谷歌地图(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度航向。

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