c# - SQL Server 地理与 DbGeography

标签 c# .net sql-server entity-framework geospatial

我有两个 GPS 坐标,我想计算它们之间的距离,但 SQL 服务器上的结果与 c# 中的结果完全不同我用谷歌搜索发现这两种方法都以米为单位返回距离,但这种差异让我发疯。

SQL SERVER 查询

select geography::Point(25.3132666, 55.2994054 ,4326)
                         .STDistance(geography::Point(25.25434, 55.32820,4326)) as Distance;

Result of above sql query

网络 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}

提前致谢。

最佳答案

定义点时检查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 表中的那些位置。插入时确保它们已正确插入。否则它们将位于其他地方,而不是您的 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 中引入的不同几何类型的 Well-Known Text 表示。为了兼容性,建议所有软件供应商遵循它。该规范向我们展示了如何将点、线(线串)、多边形和其他一些几何类型定义为文本(WKT)和二进制(WKB)。

SQL Server 不完全遵循此规范,我们看到不遵循标准的结果,甚至在同一家公司的不同组件中导致此类问题。

关于c# - SQL Server 地理与 DbGeography,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44048314/

相关文章:

c# - 删除序列化程序创建的空 xmlns

c# - 多阶段状态的嵌套类

c# - 如何根据进程 ID 而不是进程名称获取 CPU 使用率

c# - 获取第二个不同类型列表中缺少的元素

c# - 屏蔽文本框中的自定义日期格式

php - Doctrine QueryBuilder 需要更改 leftJoin 的 ON 条件

c# - 我的 GroupBy 查询有什么问题

c# - 为 Azure Functions 设置 Serilog

sql - DATEDIFF 将分钟转换为十进制

c# - 在 C# 中检索 SQL Server 数据库信息