SQL Server Geo-spacial Data & C# - 其中之一是错误的

本文关键字:其中之一 错误 Geo-spacial Server Data amp SQL | 更新日期: 2023-09-27 17:56:24

所以这个问题几乎没有部分,但希望有人有足够的知识来提供帮助。

在我的SQL Server数据库中,我有2个位置记录,按顺序具有以下属性latitude(nLatitude),longitude(nlongtitue)和geography(gGeoLocation)值。

记录 1: 39.283638, -76.568567, 0xE6100000010C91F3FE3F4EA443406EA5D766632453C0

记录 2: 39.285200, -76.554366, 0xE6100000010CDC68006F81A44340EB0088BB7A2353C0

我使用以下 SQL 查询创建了地理值:

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

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

从 [位置] 中选择 * WHERE gGeoLocation.STDistance(geography::P oint(@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查询,该查询将搜索特定半径内的位置表,并以英里和公里为单位返回位置与搜索点之间的距离,那就太棒了。

但我也想了解为什么我在应该返回相同的结果方面得到不同的结果。 我对地理空间数据很陌生。

SQL Server Geo-spacial Data & C# - 其中之一是错误的

您正在使用地理,它是在球体表面上的计算。您可能希望使用几何图形,它是在平面上进行的计算。这是有区别的。另外,请检查您的 SRID。