如何获得两个地方之间的准确或(接近准确)距离? mysql/php

Posted

技术标签:

【中文标题】如何获得两个地方之间的准确或(接近准确)距离? mysql/php【英文标题】:how to get accurate or (near accurate) distance between two places? Mysql/PHP 【发布时间】:2010-11-02 10:36:00 【问题描述】:

选择邮政编码、纬度、经度、 截短( (度(acos (罪(弧度(lat)) * 罪(弧度('.$纬度。')) + cos(弧度(lat)) * cos(弧度('.$纬度。')) * cos( 弧度(lng - ('.$longitude.'))) ) ) * 69.172), 2) 作为距离 FROM myData 此查询计算距离(以英里为单位)。但是当我在谷歌地图上检查相同纬度和经度的距离时,我的结果不匹配。如果距离在 10 英里左右,那么我的结果有点准确,但超过了它就会出错(例如,我的结果显示 13 英里,而谷歌显示相同邮政编码值的 22 英里)

我从http://forums.mysql.com/read.php?23,3868,3868#msg-3868得到这个查询

我怎样才能让它准确。有任何想法吗? 感谢您的帮助。

更新

我在 PHP 中尝试了@Blixt 代码。挑选了 2 个示例邮政编码及其经纬度

//B28 9ET
$lat1 = 52.418819;
$long1 = -1.8481053;

//CV5 8BX
$lat2 = 52.4125573;
$long2 = -1.5407743;

$dtr = M_PI / 180;
$latA = $lat1 * $dtr;
$lonA = $long1 * $dtr;
$latB = $lat2 * $dtr;
$lonB = $long2 * $dtr;
$EarthRadius = 3958.76; //miles
echo $distance = $EarthRadius * acos(cos($latA) * cos($latB) * cos($lonB - $lonA) + sin($latA) * sin($latB));

结果:

我的应用 - 12.95 英里

谷歌 - 17.8 英里

任何想法如何正确?

【问题讨论】:

您确定 Google 在计算距离时没有考虑道路等因素吗? hmm .. 可能是因为这个。我在谷歌地图上使用获取路线进行了检查。有什么公式可以得到类似于 Google 的东西吗? 没有公式可以考虑道路,除了某种平均鸟类距离/行驶距离比率,99% 的时间都是错误的。在这种情况下,您需要使用一个 API 来获取道路距离。查看 Google Maps API:code.google.com/apis/maps 【参考方案1】:

看看this source code。当我针对其他各种测量服务对其进行测试时,它似乎得到了相同的结果。它是 C#,但数学应该很容易转换。

以下是相关部分:

public const double EarthRadius = 6371.0072; // Kilometers
//public const double EarthRadius = 3958.76; // Miles

/* ... */

const double dtr = Math.PI / 180;
double latA = this.Latitude * dtr;
double lonA = this.Longitude * dtr;
double latB = other.Latitude * dtr;
double lonB = other.Longitude * dtr;

return GpsLocation.EarthRadius * Math.Acos(Math.Cos(latA) * Math.Cos(latB) * Math.Cos(lonB - lonA) + Math.Sin(latA) * Math.Sin(latB));

注意:地球不是完美的球形,因此使用的常数可能会有所不同。没有简单的方法可以使测量结果真正准确。见Wikipedia。

【讨论】:

感谢您的回复,Blixt。 //B28 9ET $lat1 = 52.418819; $long1 = -1.8481053; //CV5 8BX $lat2 = 52.4125573; $long2 = -1.5407743; $dtr = M_PI / 180; $latA = $lat1 * $dtr; $lonA = $long1 * $dtr; $latB = $lat2 * $dtr; $lonB = $long2 * $dtr; $地球半径 = 3958.76; //英里回波 $distance = $EarthRadius * acos(cos($latA) * cos($latB) * cos($lonB - $lonA) + sin($latA) * sin($latB));结果:我的应用程序 = 12.95~ 英里 Google = 17.8 英里 -- :-( -- @Blixt - 您可以在应用程序中检查上述值吗?如果是,你能告诉我你得到了什么值吗? 我已经检查过,我得到了和你一样的值,我用互联网上的其他一些服务验证了它,它们也返回了相同的值。您如何使用 Google 地图查看距离? 现在我什至把这两个坐标放在谷歌地图上的地图上,并使用“我的地图”功能在两点之间拖动一条线,果然,它显示了大约 13 英里。因此,错误可能在于您使用 Google 测量距离的方式。 hmm .. 这是谷歌地图获取路线。

以上是关于如何获得两个地方之间的准确或(接近准确)距离? mysql/php的主要内容,如果未能解决你的问题,请参考以下文章

iOS 和 Android 上相对地理定位的准确性

计算iOS地图上2点之间的距离[关闭]

如何获得两个地理点坐标之间的最短行驶路径和距离?

如何计算两个坐标之间的距离(没有浮点数)?

在 std::map 中查找最接近或准确的键

如何计算一个位置与另一个位置之间的距离/接近度(c#)