使用javascript计算两个邮政编码之间的距离

Posted

技术标签:

【中文标题】使用javascript计算两个邮政编码之间的距离【英文标题】:calculating the distance between two postcodes using javascript 【发布时间】:2016-04-05 14:27:20 【问题描述】:

我正在尝试计算两个邮政编码之间的距离。一个邮政编码坐标是通用的,但是另一个邮政编码存储在我需要获取的数据库中。下面的代码无法计算出通用邮政编码与我输入的邮政编码之间的距离。

var x = getDistanceFromLatLonInKm(52.482799000000000, -2.000643000000000, 52.48463500000000, -1.980759000000000);

function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2)
  console.log(lat1, lon1, lat2, lon2); 
var distanceFromSpecificPoint = getDistanceFromLatLonInKm.bind(null, 52.486637, -1.890952); 

  var R = 6371; // Radius of the earth in km 
  var dLat = deg2rad(lat2 - lat1); // deg2rad below 
  var dLon = deg2rad(lon2 - lon1);
  var a =
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
    Math.sin(dLon / 2) * Math.sin(dLon / 2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  var d = R * c; // Distance in km 
  return d;


function deg2rad(deg) 
  return deg * (Math.PI / 180)



document.getElementById('result').textContent = x;

console.log(x)
</script>

【问题讨论】:

zipcodeapi.com 这条线试图做什么?对我来说似乎很奇怪。错误的函数签名,它似乎没有增加任何价值:var distanceFromSpecificPoint = getDistanceFromLatLonInKm.bind(null, 52.486637, -1.890952); 另外,您可能希望在a 的计算中放置一些括号。到目前为止,还没有检查过这些计算的数学有效性,但这是立即想到的一个可能的错误区域。您还可以在该计算中使用对 Math.pow 的一些调用来避免两次执行两个 sin 操作。 基于以下算法(我假设这是您从中派生代码的地方?),您的代码看起来正确:movable-type.co.uk/scripts/latlong.html。唯一的区别是他以米为单位返回值,而您以公里为单位返回值。假设算法是正确的,那么您的代码似乎是正确的。你的错误是什么?您的 javascript 函数是正确的。如果您想获得一段距离,只需调用您的 javascript 函数,并使用您从数据库中获得的 lat/lon 传入通用 lat/lon。你上面的电话对我来说很好:1.3618590385878444 公里。 @ManoDestra 我知道它是这样工作的,但是我试图让代码具有一个通用邮政编码(始终设置一个邮政编码)和另一个邮政编码根据它的属性进行更改,然后工作与每个属性的距离 【参考方案1】:

如上所述,您可以简单地从服务器端的数据库中获取值,并使用您想要的任何服务器端 Web 框架。我在这里给出的示例是 Classic ASP,纯粹是为了向您展示输入值的位置。然后在服务器端,数据库值是常量,您只需输入一个点的纬度/经度并获取与数据库纬度/经度的距离(此处为常量 LAT1/LON1)。 dbModel 将是从数据库填充的服务器端的某个对象。然后,您可以从此对象中获取纬度/经度值,以便通过服务器端脚本插入到网页中。

function getDistanceFromLatLonInKm(lat, lon) 
    const EARTH_RADIUS = 6371; // Radius of the earth in km 
    // Here's where you would add the value dynamically from the DB.
    // I'm using classic ASP here just as an example. You'll have to
    // amend for your particular server side web framework, be it
    // JSP, MVC, etc.
    const LAT1 = <%=dbModel.getLatitude()%>;
    const LON1 = <%=dbModel.getLongitude()%>;
    console.log(LAT1, LON1, lat, lon);

    var dLat = deg2rad(lat - LAT1);
    var dLon = deg2rad(lon - LON1);
    var a = Math.pow(Math.sin(dLat / 2), 2) + Math.cos(deg2rad(LAT1)) * Math.cos(deg2rad(LON1)) * Math.pow(Math.sin(dLon / 2), 2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = EARTH_RADIUS * c; // Distance in km 

    return d;


function deg2rad(deg) 
    return deg * (Math.PI / 180);

或者,如果您不要求它像这样是动态的,只需从数据库中获取静态值并在此处输入它们作为 LAT1 和 LON1 的值。

例如

    const LAT1 = 52.482799;
    const LON1 = -2.000643;

然后像这样调用你的函数...

var distance = getDistanceFromLatLonInKm(52.48463500000000, -1.980759000000000);

要进行 PAF 查找:

FreeMapTools

Google Maps。只需搜索您的邮政编码,然后从 URL 中获取纬度/经度。

【讨论】:

对我来说很好。您遇到什么错误或为什么它不起作用?您需要告诉我出了什么问题,以便我可以帮助您。 我转移代码时有一个小错误。现在更新了:) 谢谢。我正在使用 php 从数据库中获取信息。我不确定如何获取邮政编码信息,因为属性邮政编码是在没有长纬度信息的情况下存储的。但是,我在另一个名为 postcodes 的表中拥有所有英国邮政编码以及相应的 long 和 lat 信息。那么我如何从属性表中获取属性邮政编码,然后将其链接到邮政编码表,然后将该信息输入到这个公式中? 如果您的数据库中没有纬度/经度,在通过 PHP 在此处输入纬度/经度值之前,您需要进行邮政编码查找。 ***.com/questions/2832942/…。一旦你有了纬度/经度值,只需在此处输入它们就可以正常工作。看来您的问题根本不是关于 javascript,而是关于如何进行邮政编码查找并转换为纬度/经度。 感谢您的示例,它现在似乎可以正常工作了。是的,您怀疑是对的,这是真正的问题,我不确定该怎么做?如果你不介意你能给我一个例子或起点吗?

以上是关于使用javascript计算两个邮政编码之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 doParallel 计算 R 中邮政编码之间的距离?

两个纬度/经度点之间的谷歌地图距离计算?

在JavaScript中计算两个geolocs之间的距离[重复]

谷歌地图 api 为有效的邮政编码返回 Notfound 结果以进行距离计算

在iphone中使用谷歌地图计算两个位置之间的距离

计算iphone中两点之间的距离