使用纬度和经度的两个位置之间的距离与谷歌所说的相差甚远
Posted
技术标签:
【中文标题】使用纬度和经度的两个位置之间的距离与谷歌所说的相差甚远【英文标题】:Distance between two locations using Latitude and Longitude way off what Google says 【发布时间】:2009-10-21 23:55:34 【问题描述】:我花了几天时间试图解决这个问题,但似乎无法查明问题所在。我有一个 SQL 2005 数据库,将纬度和经度存储为 Decimal(18,8),所有这些都是我通过查询 Google 获得的。
对于这两个位置:From: 10715 Downsville Pike Ste 100 MD 21740 to: 444 East College Ave Ste 120 State College PA, 16801
考虑到距离将是“乌鸦飞”,我的结果还有很长的路要走。在此示例中,我的结果显示为 21.32 英里,但 Google 地图显示为 144 英里。
我认为更令人沮丧的是我发现了这个网站:http://jan.ucc.nau.edu/~cvm/latlongdist.html,并得出了与我几乎完全相同的结果。
这是我的函数和查询:
功能: 计算距离
DECLARE @Temp FLOAT
SET @Temp = SIN(@Latitude1/57.2957795130823) *
SIN(@Latitude2/57.2957795130823) +
COS(@Latitude1/57.2957795130823) * COS(@Latitude2/57.2957795130823) *
COS(@Longitude2/57.2957795130823 - @Longitude1/57.2957795130823)
IF @Temp > 1
SET @Temp = 1
ELSE IF @Temp < -1
SET @Temp = -1
RETURN (3958.75586574 * ACOS(@Temp) )
纬度加距离
RETURN (SELECT @StartLatitude + SQRT(@Distance * @Distance / 4766.8999155991))
经度加距离
RETURN (SELECT @StartLongitude + SQRT(@Distance * @Distance /
(4784.39411916406 *
COS(2 * @StartLatitude / 114.591559026165) *
COS(2 * @StartLatitude / 114.591559026165))))
查询:
DECLARE @Longitude DECIMAL(18,8),
@Latitude DECIMAL(18,8),
@MinLongitude DECIMAL(18,8),
@MaxLongitude DECIMAL(18,8),
@MinLatitude DECIMAL(18,8),
@MaxLatitude DECIMAL(18,8),
@WithinMiles DECIMAL(2)
Set @Latitude = -77.856052
Set @Longitude = 40.799159
Set @WithinMiles = 50
-- Calculate the Max Lat/Long
SELECT @MaxLongitude = dbo.LongitudePlusDistance(@Longitude, @Latitude,
@WithinMiles),
@MaxLatitude = dbo.LatitudePlusDistance(@Latitude, @WithinMiles)
-- Calculate the min lat/long
SELECT @MinLatitude = 2 * @Latitude - @MaxLatitude,
@MinLongitude = 2 * @Longitude - @MaxLongitude
SELECT Top 20 *, dbo.CalculateDistance(@Longitude, @Latitude,
LocationLongitude, LocationLatitude) as 'Distance'
FROM Location
WHERE LocationLongitude Between @MinLongitude And @MaxLongitude
And LocationLatitude Between @MinLatitude And @MaxLatitude
And dbo.CalculateDistance(@Longitude, @Latitude, LocationLongitude,
LocationLatitude) <= @WithinMiles
ORDER BY dbo.CalculateDistance(@Longitude, @Latitude, LocationLongitude,
LocationLatitude)
【问题讨论】:
您链接到的另一个站点是 1997 年的,当时地球比现在小得多(由于离心力)。我会和谷歌一起去这个。 :) 是的,谷歌之前的世界要小得多。但这并不能帮助我到达正确的距离。 我找到了另一个网站来计算结果,它与我得到的结果相同,21 英里和一些变化。 movable-type.co.uk/scripts/latlong.html 试试这些位置:long/lat 40.799159,-77.856052 40.22018,-78.140205 好吧,你的坐标肯定是错的。看看我下面的更新 【参考方案1】:为什么在CalculateDistance 函数中将@Temp 重置为1 或-1?
更新。好吧,不管上面的。你确定你的纬度/经度是正确的吗?我使用geocoder.us 计算了以下内容:
10715 Downsville Pike Ste 100, 21740 返回 (39.607483, -77.753747)
444 E College Ave Ste 120, 16801 返回 (39.607483, -77.753747)
使用您的公式(四舍五入到小数点后 6 位,因为这是上面返回的精度),您会得到以下结果:
sin(39.607483/57.295779) * sin(40.798594/57.295779)
+ cos(39.607483/57.295779) * cos(40.798594/57.295779)
* cos(77.753747/57.295779 - 77.856110/57.295779) = 0.99978299
3958.75586574 * arccos(0.99978299) = 82.4748331
这似乎是合理的。
【讨论】:
好问题!我不得不查找我从哪里得到它,这里是:blogs.lessthandot.com/index.php/DataMgmt/DataDesign/… 如果结果大于 1 或小于 -1,它被解释为容纳舍入错误。 我想知道准确执行此操作所需的精度。我相信我在某处读到你应该只使用 6 个小数点,但解释没有意义,现在我找不到我在哪里读到它。我一直在使用 Google 进行地理编码。结果似乎有点不一致。我只是不确定不一致有多重要。 好的,经过一番搜索后,我找到了这个网站:daftlogic.com/projects-google-maps-distance-calculator.htm - 它使用谷歌 API 计算距离,并提供 ....drum roll.... 82.530!所以,看来我需要弄清楚如何获得更准确的地理代码。 @Temp 用于 ACOS 函数。对于小于 -1 或大于 1 的任何值,ACOS 将返回域错误。轻微的舍入错误可能会导致这些值(以及错误)。以上是关于使用纬度和经度的两个位置之间的距离与谷歌所说的相差甚远的主要内容,如果未能解决你的问题,请参考以下文章
mysql 下 计算 两点 经纬度 之间的距离 计算结果排序