[英]using SqlGeography types in C# client-side
在 C# 客户端,我正在尝试使用 SQLServerTypes (SqlServerSpatial140.dll) 程序集(编辑:直接这样做, SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory)
)来测量 pl.net 上各点之间的距离,在一个街道地址和另一个街道地址之间,通常相距在 50 英里以内(但有时更远)。 每个位置都表示为纬度/经度对。
这是一个框架应用程序,使用 NuGet package。
这段代码正确吗? 我认为不可能,因为我得到的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) 不会使距离数字变大。
PS 在 Brian 的帮助下,我能够让它工作。 这是我实例化点的方式:
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);
}
您应该使用 Sqlgeography class 和 4326 的 Srid 将为您提供以米为单位的结果。
SqlGeometry 用于笛卡尔坐标 (x, y),而 SqlGeography 用于地理空间坐标 Long、Lat 的顺序。
将 SqlGeometry 替换为 SqlGeography。
这实际上更像是一个 GIS 问题,而不是一个编程问题。
SRID是空间参考ID; 记录该表中数据的空间参考,或者您在处理或显示数据时要使用的空间参考。 看:
https://desktop.arcgis.com/en/arcmap/10.3/manage-data/using-sql-with-gdbs/what-is-an-srid.htm
和
您可以查询表中的数据以查看它记录在哪个空间参考中。请参阅:
至于那个 SRID 是否正确,那取决于你。 输入数据时使用的是什么 SRID? 如果您希望它具有相同的空间参考,请使用相同的 SRID。 如果您希望在不同的空间参考中输出结果,请使用不同的 SRID。 4326 是 WGS84:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.