实体框架核心 + 空间数据正在引发 SRID 无效错误

Raú*_*año 5 sql-server spatial geospatial asp-net-core-spa-services ef-core-2.2

我收到以下错误:

错误:SqlException:例程执行或用户定义的聚合“地理”期间的 .NET Framework 错误:System.ArgumentException:24204:空间参考标识符 (SRID) 无效。指定的 SRID 必须与 sys.spatial_reference_systems 目录视图中显示的受支持 SRID 之一匹配。

当我尝试将这样创建的点保存到 SQL DB 时,会引发此错误

new Point(it.Lat, it.Lng)
Run Code Online (Sandbox Code Playgroud)

在那之后,我尝试使用GeometryFactory这样的:

    public static class GeometryHelper
    {
        public static IGeometryFactory GeometryFactory { get; set; }
            = NtsGeometryServices.Instance.CreateGeometryFactory();
    }
...
    geometryFactory.CreatePoint(new Coordinate(it.Lat, it.Lng))
Run Code Online (Sandbox Code Playgroud)

没事了。

还尝试设置特定的 SRID:

    public static class GeometryHelper
    {
        public static IGeometryFactory GeometryFactory { get; set; }
            = NtsGeometryServices.Instance.CreateGeometryFactory(4326);
    }
Run Code Online (Sandbox Code Playgroud)

但是然后得到这个错误:

SqlException:例程执行或用户定义的聚合“地理”期间的 .NET Framework 错误:System.FormatException:标识的元素之一的格式无效。System.FormatException:

Raú*_*año 7

发布问题后几分钟就解决了。关于第一个错误,解决它的正确方法是执行问题中的操作:创建几何工厂并使用 4326 作为 SRID。您必须检查您使用的 SRID 是否在数据库表 ( sys.spatial_reference_systems catalog view) 中。显然4326是一个标准的,就像 Microsft 文档中一样。

    public static class GeometryHelper
    {
        public static IGeometryFactory GeometryFactory { get; set; }
            = NtsGeometryServices.Instance.CreateGeometryFactory(4326);
    }
Run Code Online (Sandbox Code Playgroud)

第二个错误与点和经纬度对象之间的映射有关。

NTS 中的经度和纬度坐标以 X 和 Y 值表示。要表示经度和纬度,请使用 X 表示经度,使用 Y 表示纬度。请注意,这与您通常看到这些值的纬度、经度格式相反。

参考:Ef Core 中的 Spatial


Bra*_*ley 5

我也遇到了这个问题。这就是我最终解决它的方法。

new Point(geoLocation.Longitude, geoLocation.Latitude) { SRID = 4326 }
Run Code Online (Sandbox Code Playgroud)

我只是在创建新的 Point 实例时分配了 SRID,而不是创建和工厂并创建一个点。