问题描述
在C#客户端中,我尝试使用sqlServerTypes(sqlServerSpatial140.dll)程序集(编辑:直接进行操作,sqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory)
)来测量地球上各点之间,一个街道地址与另一个街道地址,通常相距不超过50英里(但有时更远)。每个位置都表示为纬度/经度对。
这是一个Framework应用程序,并使用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提供参数的顺序(纬度,经度)或(纬度,经度)不会使距离数变大。
P.S。在Brian的帮助下,我能够使它工作。这是我实例化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);
}
解决方法
您应该使用Sqlgeography类,Srid 4326将以米为单位给出结果。
SqlGeometry用于笛卡尔坐标(x,y),而SqlGeography用于地理空间坐标Long,Lat。
用SqlGeography替换SqlGeometry。
,这实际上是一个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: