【发布时间】:2020-09-21 19:55:15
【问题描述】:
在 C# 客户端中,我正在尝试使用 SQLServerTypes (SqlServerSpatial140.dll) 程序集(编辑:直接这样做,SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory))来测量地球上点之间的距离,一个街道地址和另一条街道之间的距离地址通常彼此相距 50 英里(但有时更远)。每个位置都表示为一个纬度/经度对。
这是一个框架应用程序,使用 NuGet 包。
这段代码正确吗?我认为不可能,因为我为distance 获得的值太小了,例如24.35946... 当两点相距数百英里时,例如两个城镇,其中一个在北卡罗来纳州,另一个在波多黎各。米不是标准单位吗?
foreach (Origin o in Origins)
{
o.loc = SqlGeometry.Point(o.lat, o.lon, 4326);
foreach (Destination d in Destinations)
{
SqlDouble distance = o.loc.STDistance(SqlGeometry.Point(d.lat, d.lon, 4326));
<snip>
}
}
4326 是正确的 SRID 吗?如果 SRID 为零,我会得到相同的结果。此外,向 Point 提供参数的顺序 (lat,lon) 或 (lon,lat) 不会使距离数字大得多。
附:在布赖恩的帮助下,我能够让它工作。这是我实例化 Point 的方式:
public Microsoft.SqlServer.Types.SqlGeography CreateGeographyPoint(double longitude, double latitude)
{
var text = string.Format("POINT({0} {1})", longitude, latitude);
var ch = new System.Data.SqlTypes.SqlChars(text);
return Microsoft.SqlServer.Types.SqlGeography.STPointFromText( ch, 4326);
}
【问题讨论】:
-
如果您使用的是 NuGet 包而不是直接使用该程序集,请更新您的问题以说明这一点。另外,这是 .NET Core 还是 Framework?
-
@Ian Kemp。我不明白“使用 NuGet 包”和“直接”使用程序集之间的区别。我从 NuGet 获得包,但程序集必须在运行时显式加载,所以我想我是直接使用它。此外,必须将 NuGet 安装创建的文件夹中的 DLL 复制到
bin文件夹。
标签: c# sqlgeography sql-types