【问题标题】:using SqlGeography types in C# client-side在 C# 客户端中使用 SqlGeography 类型
【发布时间】: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


【解决方案1】:

您应该使用 Sqlgeography 类,并且 4326 的 Srid 将为您提供以米为单位的结果。

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

将 SqlGeometry 替换为 SqlGeography。

【讨论】:

  • 在运行时加载 DLL 对我来说是新的。有没有办法在设计时使用程序集中的类型来声明对象?我无法在我的项目中添加对 SqlServerSpatial140.dll 的引用。
  • 对我有用的是转到下面的这个文件位置并将 SqlServerSpatial240.dll 复制到我的项目 bin 文件夹中。 C:\Users\\.nuget\packages\microsoft.sqlserver.types\14.0.1016.290\nativeBinaries\x64
  • 非常感谢您在这方面的帮助。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多