在 C# 客户端中使用 SqlGeography 类型

using SqlGeography types in C# client-side

在 C# 客户端中,我正在尝试使用 SQLServerTypes (SqlServerSpatial140.dll) 程序集(编辑:直接这样做,SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory))来测量地球上各点之间的距离,一个街道地址和另一个街道地址通常相距不到 50 英里(但有时更远)。每个位置都表示为 latitude/longitude 对。

这是一个框架应用程序并使用 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) 不会使距离数字变大。

P.S。在 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);
        }

这实际上更像是一个 GIS 问题,而不是一个编程问题。

SRID 是空间参考 ID; table 中记录数据的空间参考,或者您在处理或显示数据时要使用的空间参考。参见:

https://desktop.arcgis.com/en/arcmap/10.3/manage-data/using-sql-with-gdbs/what-is-an-srid.htm

https://docs.microsoft.com/en-us/sql/relational-databases/spatial/spatial-reference-identifiers-srids

您可以查询 table 中的数据以查看它记录在哪个空间参考中。请参阅:

https://docs.microsoft.com/en-us/sql/t-sql/spatial-geometry/stsrid-geometry-data-type?view=sql-server-ver15

至于那个SRID对不对,就看你的了。输入数据时使用的是什么 SRID?如果您希望它具有相同的空间参考,请使用相同的 SRID。如果您希望在不同的空间参考中输出结果,请使用不同的 SRID。 4326 是 WGS84:

https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84

你应该使用 Sqlgeography class 4326 的 Srid 会给你以米为单位的结果。

SqlGeometry 用于笛卡尔坐标 (x, y),SqlGeography 用于地理空间坐标 Long、Lat 的顺序。

用 SqlGeography 替换 SqlGeometry。