SQL Server地理空间数据& C# - 其中一个是错的!

时间:2011-05-15 16:46:57

标签: c# sql-server geolocation geospatial

所以这个问题很少,但希望有人有足够的知识来帮助。

在我的SQL Server数据库中,我有2个位置记录,其中包含以下属性latitude(nLatitude),longitude(nlongtitue)&地理位置(gGeoLocation)按此顺序排列。

记录1:39.283638,-76.568567,0xE6100000010C91F3FE3F4EA443406EA5D766632453C0

记录2:39.285200,-76.554366,0xE6100000010CDC68006F81A44340EB0088BB7A2353C0

我使用下面的SQL查询创建了Geography值:

UPDATE [Location] SET gGeoLocation = geography :: STPointFromText('POINT('+ CAST(nlongtitue AS VARCHAR(20))+''+ CAST([nLatitude] AS VARCHAR(20))+')',4326 )

现在假设我想搜索我的位置表,以确定哪个位置在特定纬度/经度的某个半径内(39.290555,-76.609604)我使用了以下查询:

SELECT * FROM [位置]    在哪里gGeoLocation.STDistance(geography :: Point(@Latitude,@ Longitude,4326))< ((@Miles * 1000)* 0.621371192)

然后我根据C#函数检查我的结果,两个结果不一样,所以其中一个必须是错误的,否则我会遗漏一些东西。这是C#函数:

//calculate haversine distance for linear distance - Miles
public static double haversine_mi(double lat1, double long1, double lat2, double long2)
{
    double dlong = (long2 - long1) * d2r;
    double dlat = (lat2 - lat1) * d2r;
    double a = Math.Pow(Math.Sin(dlat / 2.0), 2) + Math.Cos(lat1 * d2r) * Math.Cos(lat2 * d2r) * Math.Pow(Math.Sin(dlong / 2.0), 2);
    double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
    double d = 3956 * c;

    return d;
}

最终,如果有人可以为我提供一个SQL查询,可以在一定范围内搜索位置表,并返回位置和搜索点之间的距离,以英里和公里为单位。

但我也想明白为什么我会得到不同的结果,应该返回相同的结果。我对地理空间数据很陌生。

1 个答案:

答案 0 :(得分:0)

您正在使用GEOGRAPHY,它是球体表面的计算。您可能想要使用GEOMETRY,它是在飞机上进行计算。它有所作为。另外,请检查您的SRID。