如何从两个位置的经度和纬度找到距离?
我有一套纬度和经度的位置。
Haversine公式假设球形地球。 但是,耳朵的形状更复杂。 扁球模型会给出更好的结果。
如果需要这样的精确度,你最好使用Vincenty逆公式 。 详情请参阅http://en.wikipedia.org/wiki/Vincenty's_formulae。 使用它,您可以获得0.5毫米的球体模型精度。
没有完美的公式 ,因为地球的真实形状太复杂,无法用公式表达。 此外,由于气候事件,地球的形状也会发生变化(见http://www.nasa.gov/centers/goddard/earthandsun/earthshape.html),并且随着时间的推移会由于地球的旋转而发生变化。
你还应该注意,上面的方法并没有考虑到海拔高度,并且假定了一个海平面扁球体。
编辑2010年7月10日:我发现有一些罕见的情况下Vincenty逆公式不会收敛到声明的精度。 更好的主意是使用GeographicLib(参见http://sourceforge.net/projects/geographiclib/),它也更加准确。
这里有一个:http://www.movable-type.co.uk/scripts/latlong.html
使用Haversine公式:
R = earth’s radius (mean radius = 6,371km)
Δlat = lat2− lat1
Δlong = long2− long1
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c
应用Haversine公式来查找距离。 请参阅下面的C#代码来查找2个坐标之间的距离。 更好的是,如果您想要查找某个半径内的商店列表,则可以将SQL中的WHERE
子句或C#中的LINQ过滤器应用于它。
这里的公式是以公里为单位,您将不得不更改相关的数字,它将以英里为单位。
例如: 将6371.392896转换为英里。
DECLARE @radiusInKm AS FLOAT
DECLARE @lat2Compare AS FLOAT
DECLARE @long2Compare AS FLOAT
SET @radiusInKm = 5.000
SET @lat2Compare = insert_your_lat_to_compare_here
SET @long2Compare = insert_you_long_to_compare_here
SELECT * FROM insert_your_table_here WITH(NOLOCK)
WHERE (6371.392896*2*ATN2(SQRT((sin((radians(GeoLatitude - @lat2Compare)) / 2) * sin((radians(GeoLatitude - @lat2Compare)) / 2)) + (cos(radians(GeoLatitude)) * cos(radians(@lat2Compare)) * sin(radians(GeoLongitude - @long2Compare)/2) * sin(radians(GeoLongitude - @long2Compare)/2)))
, SQRT(1-((sin((radians(GeoLatitude - @lat2Compare)) / 2) * sin((radians(GeoLatitude - @lat2Compare)) / 2)) + (cos(radians(GeoLatitude)) * cos(radians(@lat2Compare)) * sin(radians(GeoLongitude - @long2Compare)/2) * sin(radians(GeoLongitude - @long2Compare)/2)))
))) <= @radiusInKm
如果你想在C#中执行Haversine公式,
double resultDistance = 0.0;
double avgRadiusOfEarth = 6371.392896; //Radius of the earth differ, I'm taking the average.
//Haversine formula
//distance = R * 2 * aTan2 ( square root of A, square root of 1 - A )
// where A = sinus squared (difference in latitude / 2) + (cosine of latitude 1 * cosine of latitude 2 * sinus squared (difference in longitude / 2))
// and R = the circumference of the earth
double differenceInLat = DegreeToRadian(currentLatitude - latitudeToCompare);
double differenceInLong = DegreeToRadian(currentLongitude - longtitudeToCompare);
double aInnerFormula = Math.Cos(DegreeToRadian(currentLatitude)) * Math.Cos(DegreeToRadian(latitudeToCompare)) * Math.Sin(differenceInLong / 2) * Math.Sin(differenceInLong / 2);
double aFormula = (Math.Sin((differenceInLat) / 2) * Math.Sin((differenceInLat) / 2)) + (aInnerFormula);
resultDistance = avgRadiusOfEarth * 2 * Math.Atan2(Math.Sqrt(aFormula), Math.Sqrt(1 - aFormula));
DegreesToRadian是我自定义创建的函数,它是"Math.PI * angle / 180.0
的简单1班轮
我的博客条目 - SQL Haversine
链接地址: http://www.djcxy.com/p/70961.html上一篇: How to find distance from the latitude and longitude of two locations?