您如何计算Google Maps V3中两个标记之间的距离? (相似于V2中的distanceFrom
函数。) html
谢谢.. 算法
使用PHP,您能够使用如下简单函数计算距离: api
// to calculate distance between two lat & lon function calculate_distance($lat1, $lon1, $lat2, $lon2, $unit='N') { $theta = $lon1 - $lon2; $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); $dist = acos($dist); $dist = rad2deg($dist); $miles = $dist * 60 * 1.1515; $unit = strtoupper($unit); if ($unit == "K") { return ($miles * 1.609344); } else if ($unit == "N") { return ($miles * 0.8684); } else { return $miles; } } // function ends here
不得不作...动做脚本的方式 函数
//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; }
使用google能够使用球状api , google.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);
。 google
可是,若是球形投影或正弦波解决方案的精度对您来讲不够精确(例如,若是您靠近极点或计算更长的距离),则应使用其余库。 spa
我在这里的 Wikipedia上找到了有关该主题的大多数信息。 code
查看任何给定算法的精度是否足够的一个技巧是填写地球的最大和最小半径,并查看差别是否可能致使您的用例出现问题。 能够在本文中找到更多详细信息 htm
最终,Google API或Haversine能够毫无问题地知足大多数目的。 对象
请参阅GLatLng对象上的distanceFrom函数; 在v2和v3之间,功能参数略有变化。 ip
若是要本身计算,能够使用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 };