SQL 服务器地理与 DbGeography
SQL Server Geography vs DbGeography
我有两个 GPS 坐标,我想计算它们之间的距离,但是 SQL 服务器上的结果与 c# 中的结果完全不同 我用谷歌搜索发现这两种方法都以米为单位接近 return 距离但这种差异让我发疯。
SQL 服务器查询
select geography::Point(25.3132666, 55.2994054 ,4326)
.STDistance(geography::Point(25.25434, 55.32820,4326)) as Distance;
网页API
String format = "POINT(25.25434 55.32820)";
DbGeography myLocation = DbGeography.PointFromText(format, 4326);
var users = context.Users.Select(u => new
{
fullName = u.name,
lat = u.location.Latitude,
lng = u.location.Longitude,
distance = myLocation.Distance(u.location)
}).ToList();
回应
,{"fullName":"jons smith","lat":25.3132666,"lng":55.2994054,"distance":4133581.8647264037}
提前致谢。
在API版本中切换Lat/Lng。在 API 中,应该是 Lng Lat
select geography::Point(25.3132666, 55.2994054 ,4326).STDistance(geography::Point(25.25434, 55.32820,4326)) as Distance
Returns
7142.94965953253
这是我用我的 UDF
翻转一个 Lat/Lng 的地方
Select [dbo].[udf-Geo-Meters](55.2994054,25.3132666 ,25.25434,55.32820)
Returns
4135883.9028193
定义点时检查SQL中点的WKT表示中的经纬度顺序,如下GEOGRAPHY::POINT(Latitude, Longitude, srid)
:
SELECT GEOGRAPHY::Point(25.3132666,55.2994054 ,4326)
.STDistance(GEOGRAPHY::Point(25.25434, 55.32820,4326)) as distance;
//distance: 7142.94965953253
但是在C#代码中定义DBGeography
时,顺序不一样:"POINT(Longitude Latitude)"
String format = "POINT(55.32820 25.25434)";
DbGeography myLocation = DbGeography.PointFromText(format, 4326);
var users = context.Users.Select(u => new
{
fullName = u.name,
lat = u.location.Latitude,
lng = u.location.Longitude,
distance = myLocation.Distance(u.location)
}).ToList();
//distance: 7142.949659532529
您还应该检查 Users
table 中插入的那些位置。插入时确保它们已正确插入。否则他们将在其他地方,而不是您的 Users
所在的位置
更多:
SELECT GEOGRAPHY::Point(25, 55 ,4326).Lat //25
DbGeography.PointFromText("POINT(25 55)", 4326).Latitude.Value //55
Microsoft.SqlServer.Types.SqlGeography.STPointFromText(
new System.Data.SqlTypes.SqlChars("POINT(25 55)"), 4326).Lat.Value;
//55
什么是 WKT,它从何而来?
这是 OGC 在Simple Feature Access规范,为了兼容性,建议所有软件厂商遵循。本规范向我们展示了如何将点、线(线串)、多边形和其他一些几何类型定义为文本(WKT)和二进制(WKB)。
SQL服务器不完全遵循这个规范,我们看到不遵循标准的结果,导致即使是同一家公司的不同组件也会出现此类问题。
问题很小但很棘手
SQL 服务器查询
geography::Point(25.3132666, 55.2994054 ,4326)
SQL 服务器定义一个点,第一个值为纬度,第二个值为经度。
网页API
String format = "POINT(25.25434 55.32820)";
DbGeography myLocation = DbGeography.FromText(format);
C# 以第一个值是经度第二个值是纬度的方式定义上述格式的点
我有两个 GPS 坐标,我想计算它们之间的距离,但是 SQL 服务器上的结果与 c# 中的结果完全不同 我用谷歌搜索发现这两种方法都以米为单位接近 return 距离但这种差异让我发疯。
SQL 服务器查询
select geography::Point(25.3132666, 55.2994054 ,4326)
.STDistance(geography::Point(25.25434, 55.32820,4326)) as Distance;
网页API
String format = "POINT(25.25434 55.32820)";
DbGeography myLocation = DbGeography.PointFromText(format, 4326);
var users = context.Users.Select(u => new
{
fullName = u.name,
lat = u.location.Latitude,
lng = u.location.Longitude,
distance = myLocation.Distance(u.location)
}).ToList();
回应
,{"fullName":"jons smith","lat":25.3132666,"lng":55.2994054,"distance":4133581.8647264037}
提前致谢。
在API版本中切换Lat/Lng。在 API 中,应该是 Lng Lat
select geography::Point(25.3132666, 55.2994054 ,4326).STDistance(geography::Point(25.25434, 55.32820,4326)) as Distance
Returns
7142.94965953253
这是我用我的 UDF
翻转一个 Lat/Lng 的地方Select [dbo].[udf-Geo-Meters](55.2994054,25.3132666 ,25.25434,55.32820)
Returns
4135883.9028193
定义点时检查SQL中点的WKT表示中的经纬度顺序,如下GEOGRAPHY::POINT(Latitude, Longitude, srid)
:
SELECT GEOGRAPHY::Point(25.3132666,55.2994054 ,4326)
.STDistance(GEOGRAPHY::Point(25.25434, 55.32820,4326)) as distance;
//distance: 7142.94965953253
但是在C#代码中定义DBGeography
时,顺序不一样:"POINT(Longitude Latitude)"
String format = "POINT(55.32820 25.25434)";
DbGeography myLocation = DbGeography.PointFromText(format, 4326);
var users = context.Users.Select(u => new
{
fullName = u.name,
lat = u.location.Latitude,
lng = u.location.Longitude,
distance = myLocation.Distance(u.location)
}).ToList();
//distance: 7142.949659532529
您还应该检查 Users
table 中插入的那些位置。插入时确保它们已正确插入。否则他们将在其他地方,而不是您的 Users
更多:
SELECT GEOGRAPHY::Point(25, 55 ,4326).Lat //25
DbGeography.PointFromText("POINT(25 55)", 4326).Latitude.Value //55
Microsoft.SqlServer.Types.SqlGeography.STPointFromText(
new System.Data.SqlTypes.SqlChars("POINT(25 55)"), 4326).Lat.Value;
//55
什么是 WKT,它从何而来? 这是 OGC 在Simple Feature Access规范,为了兼容性,建议所有软件厂商遵循。本规范向我们展示了如何将点、线(线串)、多边形和其他一些几何类型定义为文本(WKT)和二进制(WKB)。
SQL服务器不完全遵循这个规范,我们看到不遵循标准的结果,导致即使是同一家公司的不同组件也会出现此类问题。
问题很小但很棘手
SQL 服务器查询
geography::Point(25.3132666, 55.2994054 ,4326)
SQL 服务器定义一个点,第一个值为纬度,第二个值为经度。
网页API
String format = "POINT(25.25434 55.32820)";
DbGeography myLocation = DbGeography.FromText(format);
C# 以第一个值是经度第二个值是纬度的方式定义上述格式的点