在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提供参数的顺序(lat,lon)或(lon,lat)不会使距离数变大。
PS我可以在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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句