如何获得两个地方之间的准确或(接近准确)距离? 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的主要内容,如果未能解决你的问题,请参考以下文章