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

6
我遇到了以下错误:
引用块: 错误: SqlException: 在执行例程或用户定义聚合'geography'期间出现.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: 在执行程序或用户定义聚合函数“geography”时发生 .NET Framework 错误: System.FormatException: 已识别的元素之一具有无效格式。 System.FormatException:

2个回答

7
发布问题几分钟后便解决了。关于第一个错误,解决方法如问题描述所示:创建几何工厂并使用4326作为SRID。必须检查您使用的SRID是否在数据库表中(sys.spatial_reference_systems目录视图)。显然,4326是一个标准值,因为它在Microsoft文档中提到。
    public static class GeometryHelper
    {
        public static IGeometryFactory GeometryFactory { get; set; }
            = NtsGeometryServices.Instance.CreateGeometryFactory(4326);
    }

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

经度和纬度

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

参考文献:EF Core中的空间数据

1
4326(通常称为EPSG:4326)是WGS84,这是今天最常用的坐标系统。如果您不将空间对象与坐标系统(空间参考)关联起来,则软件(在本例中为DB)将不知道如何处理坐标。 - Oyvind

5

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接