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

时间:2019-07-25 19:53:09

标签: sql-server geospatial spatial ef-core-2.2 asp-net-core-spa-services

我遇到以下错误:

  

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

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

new Point(it.Lat, it.Lng)

之后,我尝试使用像这样的GeometryFactory

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

什么都没有。

还尝试设置特定的SRID:

    public static class GeometryHelper
    {
        public static IGeometryFactory GeometryFactory { get; set; }
            = NtsGeometryServices.Instance.CreateGeometryFactory(4326);
    }

但随后出现此错误:

  

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

2 个答案:

答案 0 :(得分:1)

发布问题后几分钟即可解决。关于第一个错误,解决问题的正确方法是执行问题中的工作:创建几何工厂并使用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);
    }

第二个错误与点和lat-lng对象之间的映射有关。

  

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

参考:Spatial in Ef Core

答案 1 :(得分:1)

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

new Point(geoLocation.Longitude, geoLocation.Latitude) { SRID = 4326 }

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