C# 计算半径内的100英里

C# 计算半径内的100英里,c#,sql,sql-server,C#,Sql,Sql Server,如果我有一个包含机场列表及其相关lat和long坐标的表格,我将如何获得距离另一个坐标100英里以内的机场列表?我的最终目标是让用户按城市进行搜索,找到距离城市纬度和经度100英里以内的机场。我有所有的数据,只是不知道从哪里开始 我的数据在SQL Server中。如果您的机场位于0,0点, 半径30英里内的所有机场都应在一个圆圈内。 若要测试点是否位于圆内,需要测试每个平方方程: sqrtX*X+Y*Y

如果我有一个包含机场列表及其相关lat和long坐标的表格,我将如何获得距离另一个坐标100英里以内的机场列表?我的最终目标是让用户按城市进行搜索,找到距离城市纬度和经度100英里以内的机场。我有所有的数据,只是不知道从哪里开始


我的数据在SQL Server中。

如果您的机场位于0,0点, 半径30英里内的所有机场都应在一个圆圈内。 若要测试点是否位于圆内,需要测试每个平方方程: sqrtX*X+Y*Y您可以使用System.Device.location.GeoCoordination类


你可以这样做:

 --SELECT Points closer than @radius
select * from #Points p
WHERE power(p.x - @locX, 2) + POWER(p.y - @locY, 2) < POWER(@radius,2)

这被无耻地从谷歌搜索SQL+Pyhtagoras的网站上盗取

这是“当乌鸦飞到两点之间的距离时”的公式: 哈弗森

formula:     a = sin²(Δφ/2) + cos(φ1).cos(φ2).sin²(Δλ/2)
c = 2.atan2(√a, √(1−a))
d = R.c
其中φ为纬度,λ为经度,R为地球半径平均半径=6371km 请注意,角度需要以弧度为单位才能传递到trig函数

您可以将此代码转换为SQL

JavaScript: 
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();

var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;
以下是指向数学函数的T-SQL页面的链接:

纬度和经度之间有多少英里?这就是您需要了解您使用的SQL Server版本的原因?如果您有SQL Server 2008,则可以使用地理坐标。也包含一些很好的信息。我在上回答了一个非常类似的问题。需要SQL 2008或更高版本。我认为OP要求在T-SQL中使用解决方案。@Pheonixblade9可能是这样,但它被标记为C。不幸的是,两条经线之间的距离因纬度不同而不同,因此此解决方案在实践中根本不起作用。而且,不要忘记,地球表面的距离测量的是地球弯曲时的距离,而不是两点之间穿过地球的直线距离。直达中国要快得多,但挖那条隧道要费一番功夫。@Markus是以英里为单位的结果吗?@LoneWOLFs是的,如果你想以公里为单位,将半径改为6366.7。
 --SELECT Points closer than @radius
select * from #Points p
WHERE power(p.x - @locX, 2) + POWER(p.y - @locY, 2) < POWER(@radius,2)
formula:     a = sin²(Δφ/2) + cos(φ1).cos(φ2).sin²(Δλ/2)
c = 2.atan2(√a, √(1−a))
d = R.c
JavaScript: 
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();

var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;
create function dbo.F_GREAT_CIRCLE_DISTANCE
(
    @Latitude1  float,
    @Longitude1 float,
    @Latitude2  float,
    @Longitude2 float
)
returns float as
begin
    declare @radius float

    declare @lon1  float
    declare @lon2  float
    declare @lat1  float
    declare @lat2  float

    declare @a float
    declare @distance float

    -- Sets average radius of Earth in Miles
    set @radius = 3956

    -- Convert degrees to radians
    set @lon1 = radians( @Longitude1 )
    set @lon2 = radians( @Longitude2 )
    set @lat1 = radians( @Latitude1 )
    set @lat2 = radians( @Latitude2 )

    set @a = sqrt(square(sin((@lat2-@lat1)/2.0E)) + (cos(@lat1) * cos(@lat2) * square(sin((@lon2-@lon1)/2.0E))) )
    set @distance = @radius * ( 2.0E *asin(case when 1.0E < @a then 1.0E else @a end ))

    return @distance
end