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

问题描述

在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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...