如何计算谷歌地图V3中两个标记之间的距离?(类似于inV2的distanceFrom函数。)
谢谢. .
如何计算谷歌地图V3中两个标记之间的距离?(类似于inV2的distanceFrom函数。)
谢谢. .
当前回答
首先,你指的是整个路径的长度,还是你只想知道位移(直线距离)?我看没人指出距离和位移的区别。对于距离计算JSON/XML数据给出的每个路由点,至于位移,有一个内置的解决方案使用球面类
//calculates distance between two points in km's
function calcDistance(p1, p2) {
return (google.maps.geometry.spherical.computeDistanceBetween(p1, p2) / 1000).toFixed(2);
}
其他回答
首先,你指的是整个路径的长度,还是你只想知道位移(直线距离)?我看没人指出距离和位移的区别。对于距离计算JSON/XML数据给出的每个路由点,至于位移,有一个内置的解决方案使用球面类
//calculates distance between two points in km's
function calcDistance(p1, p2) {
return (google.maps.geometry.spherical.computeDistanceBetween(p1, p2) / 1000).toFixed(2);
}
实际上GMap3中似乎有一个方法。它是google。maps。geometry。spherical命名空间的静态方法。
它以两个LatLng对象作为参数,并将使用默认的地球半径6378137米,尽管在必要时可以使用自定义值覆盖默认半径。
确保你包括:
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&v=3&libraries=geometry"></script>
在你的头部部分。
该呼吁将是:
google.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);
不得不这么做……动作脚本方式
//just make sure you pass a number to the function because it would accept you mother in law...
public var rad = function(x:*) {return x*Math.PI/180;}
protected function distHaversine(p1:Object, p2:Object):Number {
var R:int = 6371; // earth's mean radius in km
var dLat:Number = rad(p2.lat() - p1.lat());
var dLong:Number = rad(p2.lng() - p1.lng());
var a:Number = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) * Math.sin(dLong/2) * Math.sin(dLong/2);
var c:Number = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d:Number = R * c;
return d;
}
对于谷歌,你可以使用球面api, google.maps.geometry. sphere.computedistancebetween (latLngA, latLngB);
然而,如果球面投影或哈弗辛解的精度对你来说不够精确(例如,如果你靠近极点或计算更长的距离),你应该使用不同的库。
关于这个主题的大部分信息我都是在维基百科上找到的。
要查看任何给定算法的精度是否足够,一个技巧是填充地球的最大和最小半径,并查看差异是否会给您的用例带来问题。更多细节可以在本文中找到
最后,谷歌api或haversine将毫无问题地满足大多数目的。
如果你想自己计算,那么你可以使用哈弗辛公式:
var rad = function(x) {
return x * Math.PI / 180;
};
var getDistance = function(p1, p2) {
var R = 6378137; // Earth’s mean radius in meter
var dLat = rad(p2.lat() - p1.lat());
var dLong = rad(p2.lng() - p1.lng());
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) *
Math.sin(dLong / 2) * Math.sin(dLong / 2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var d = R * c;
return d; // returns the distance in meter
};