【问题标题】:'The label SRID=4326;POINT( in the input well-known text (WKT) is not valid.''输入知名文本 (WKT) 中的标签 SRID=4326;POINT( 无效。'
【发布时间】:2014-03-31 05:32:55
【问题描述】:

抽象编程、糟糕/不完整的文档和神秘错误的组合让我摸不着头脑,想弄清楚是什么导致了这个错误:

  • MySql 5.6
  • 实体框架 6.0.2
  • .NET 6.8.3 的 MySql 连接器

只需使用 EntityFramework 从具有几何列的表中加载模型。该列的值由以下人员设置:

var example = DbGeometry.FromText(string.Format("POINT({0} {1})", 51.5 /* Lat /*, -1.28 /* LON * /), 4326)

回读值会产生异常:

24114:输入知名文本中的标签 SRID=4326;POINT(51.5 (WKT) 无效。有效标签为 POINT、LINESTRING、POLYGON、 多点、多线串、多多边形、几何集合、 CIRCULARSTRING、COMPOUNDCURVE、CURVEPOLYGON 和 FULLGLOBE(地理 仅限数据类型)。

使用堆栈跟踪:

[FormatException: 24114: The label SRID=4326;POINT(51.5 in the input well-known text (WKT) is not valid. Valid labels are POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION, CIRCULARSTRING, COMPOUNDCURVE, CURVEPOLYGON and FULLGLOBE (geography Data Type only).]
   Microsoft.SqlServer.Types.OpenGisTypes.ParseLabel(String input) +326
   Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType type) +99
   Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType type, Int32 srid) +47
   Microsoft.SqlServer.Types.SqlGeometry.GeometryFromText(OpenGisType type, SqlChars text, Int32 srid) +485
   Microsoft.SqlServer.Types.SqlGeometry.Parse(SqlString s) +222

我的第一个观察是使用 Microsoft.SqlServer 命名空间,这似乎不一致,因为我使用的是 MySQL 提供程序。

MySQL .NET 连接器是否不支持 SRID?它没有正确注册吗? (基本上,我正在尝试找出 DbGeometry 对象上的 .Distance() 方法返回的单位是什么,到目前为止它似乎是一个随机小数。

【问题讨论】:

    标签: mysql entity-framework gis geospatial


    【解决方案1】:

    这不是您问题的完整答案,我不完全确定您为什么会收到错误,但我有一些建议,对于 cmets 来说太长了。

    创建点时需要在纬度之前指定经度。考虑到它们的值,无论哪种方式,您的坐标在技术上都是有效的,但您当然会在其他地区遇到问题,如果您曾经绘制过它,那么该坐标就不会在您期望的样本坐标所在的英国。

    此外,如果您知道这是一个点,请使用 DbGeometry.PointFromText(WKT, SRID) 方法 - 它更易于阅读。

    double lng = -1.28;
    double lat = 51.5;
    var wkt = String.Format("POINT({0} {1})", lng, lat);
    var geometry = DbGeometry.PointFromText(wkt, 4326);
    

    如果您使用纬度/经度系统,我还建议您使用 Geography 而不是 Geometry - 或者是否有使用 Geometry 的特定原因?上述方法在 DbGeography 中可用。

    编辑:STDistance() 的单位(或随机小数)以米为单位。

    祝你好运找到错误的根源。

    【讨论】:

    • 感谢乔恩的意见。我正在使用 DbGeometry,因为 DbGeography 不会映射到列类型(MySql)。我切换了 lng 和 lat,但仍然出现错误(找不到任何关于此的文档)。至于以米为单位的单位,当与 where 子句结合使用时,查询将不匹配。即(距离 x 100)= 5 公里,然后在哪里(距离
    • @simbolo 不客气。很遗憾,您需要处理 MySQL,因为 SQL-Server 在 Spatial 和 EF5+ 方面确实做得非常出色。我不确定我是否遵循您提到的距离条款,写WHERE geom.STDistance < (5/100) 会尝试在 5 厘米内找到任何东西。也许我只是没有看到这么晚的错字!祝你好运。
    • 我认为您只需剥离 SRID 并尝试一下。一些空间系统并不真正支持 wkt 形式。您使用的基准/投影会暗示您的单位(在这种情况下为米)。
    猜你喜欢
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2012-06-27
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多