计算谷歌地图V3中两点之间的距离

IT技术 javascript google-maps-api-3
2021-02-03 17:07:56

你如何计算谷歌地图V3中两个标记之间的距离?(类似于distanceFromV2中函数。)

谢谢..

6个回答

如果你想自己计算,那么你可以使用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
};
@EmanuelePaolini - 在数学上,atan2(sqrt(a),sqrt(1-a)) = asin(sqrt(a)) = acos(sqrt(1-a)),但对于一个。
2021-03-19 17:07:56
为什么你建议使用 Math.atan2(Math.sqrt(a),Math.sqrt(1-a)) 而不是最简单的 Math.asin(Math.sqrt(a)) ?
2021-03-20 17:07:56
伙计们。问题。为什么您如此喜欢使用 1 个字母的变量名来解决需要一些想象力的问题,而好的变量名可能会有所帮助?只是问问 :)
2021-03-20 17:07:56
不应该是 var R = 6371; 公里?
2021-03-21 17:07:56
p1.lat()p1.lng()功能假定您的输入数据google.maps.LatLng对象。例如,如果您只有这样的原始数据,{lat: __, lon: __}那么您将改为使用p1.lat
2021-03-23 17:07:56

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);
那么为什么谷歌的球形computeDistanceBetween和Haversine距离公式给出的答案有1%的差异呢?
2021-03-11 17:07:56
@RamenRecon 我不确定,但问题是他们对地球半径使用不同的值。
2021-03-20 17:07:56
@ABCD.ca 这不是我的号码。这个问题是关于 Google Maps Library 的第 3 版。你问为什么你的计算与他们的不同。这是因为他们使用的地球半径值与您使用的值不同。编号的参考?developer.google.com/maps/documentation/javascript/...就在标题下方。
2021-03-20 17:07:56
上面的链接现在已断开,但该方法的解释使这不是什么大问题。
2021-03-29 17:07:56
@RamenRecon 是的,埃米尔对此是正确的。文档说:默认半径是地球的半径6378137 米。 但是上面Haversine中的Mike使用6371km代替。
2021-04-08 17:07:56

使用 GPS 纬度/经度 2 点的示例。

var latitude1 = 39.46;
var longitude1 = -0.36;
var latitude2 = 40.40;
var longitude2 = -3.68;

var distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(latitude1, longitude1), new google.maps.LatLng(latitude2, longitude2));       
@joan16v 如何在 node.js 中要求 google.maps.geometry。我想在 node.js 中使用上面的代码。我应该安装哪个module以及我应该需要哪些文件。
2021-03-13 17:07:56
距离结果以米表示。
2021-04-02 17:07:56

只需将其添加到 JavaScript 代码的开头即可:

google.maps.LatLng.prototype.distanceFrom = function(latlng) {
  var lat = [this.lat(), latlng.lat()]
  var lng = [this.lng(), latlng.lng()]
  var R = 6378137;
  var dLat = (lat[1]-lat[0]) * Math.PI / 180;
  var dLng = (lng[1]-lng[0]) * Math.PI / 180;
  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
  Math.cos(lat[0] * Math.PI / 180 ) * Math.cos(lat[1] * Math.PI / 180 ) *
  Math.sin(dLng/2) * Math.sin(dLng/2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  var d = R * c;
  return Math.round(d);
}

然后像这样使用这个函数:

var loc1 = new GLatLng(52.5773139, 1.3712427);
var loc2 = new GLatLng(52.4788314, 1.7577444);
var dist = loc2.distanceFrom(loc1);
alert(dist/1000);
Excellect 解决方案,但我想知道它以什么单位返回结果。我得到了 3.013 .. 是英里还是公里??
2021-03-20 17:07:56
返回值以米为单位。因此 dist/1000 为您提供以公里为单位的值。
2021-03-25 17:07:56
//p1 and p2 are google.maps.LatLng(x,y) objects

function calcDistance(p1, p2) {
          var d = (google.maps.geometry.spherical.computeDistanceBetween(p1, p2) / 1000).toFixed(2);
          console.log(d);              
}
@felixfbecker,因为您可能在无法将 google maps API 插入script标签并调用这些方法的环境中工作。就像本机反应一样。
2021-03-21 17:07:56
这是最好的答案。Google API 已有功能,为什么还要添加功能
2021-03-30 17:07:56
是否有适用于此 API 的 Java 变体?经过大量搜索,我找不到它。
2021-04-06 17:07:56