输入的well-known text (WKT)中标签SRID=4326;POINT(不是有效的。

3

抽象编程、不完整的文档和晦涩的错误信息让我不知所措,无法确定是什么导致了这个错误:

  • MySql 5.6
  • Entity Framework 6.0.2
  • MySql Connector for .NET 6.8.3

只是使用EntityFramework从具有几何列的表中加载模型。该列的值是通过以下方式设置的:

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

读取返回的值引发了异常:
24114:输入的WKT格式标签SRID = 4326; POINT(51.5)无效。有效的标签为POINT,LINESTRING,POLYGON,MULTIPOINT,MULTILINESTRING,MULTIPOLYGON,GEOMETRYCOLLECTION,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() 方法返回的单位是什么,到目前为止,它似乎是随机小数。)

1个回答

2
这不是你问题的完整答案,我不确定你为什么会出现错误,但我有一些建议,而且评论区无法容纳。创建点时需要先指定经度再指定纬度。虽然给定这些坐标值时两种方式都是技术上有效的,但在其他地区或者将其映射时可能会遇到问题。另外,如果你知道它是一个点,请使用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);

如果您使用纬度/经度系统,我建议您使用地理而不是几何 - 或者您使用几何的特定原因是什么?上面的方法可在DbGeography中使用。编辑:STDistance()的单位(或您所说的随机小数)以米为单位。祝您找到错误的源头。

感谢您的输入 Jon。 我正在使用 DbGeometry,因为 DbGeography 无法映射到列类型(MySql)。 我交换了 lng 和 lat,但仍然出现错误(找不到任何相关文档)。 至于以米为单位的距离,在与 where 子句组合时,查询无法匹配。 例如(distance x 100)= 5km,则执行 where(distance <=(5/100)),将无法找到记录 - 令人困惑。 我想我会放弃并使用“老派”的方法,手动编写 SQL,完全跳过 Entity Framework。 这样很辛苦,整天都浪费在这上面了。 我发现 .NET 连接器最好是不可靠的。 - simbolo
@simbolo 不用谢。真遗憾你要处理MySQL,因为SQL-Server在空间和EF5+方面表现得非常出色。不过我不太明白你提到的距离子句,写WHERE geom.STDistance < (5/100)将尝试查找任何在5厘米内的内容。也许我只是没看到一个这么晚的笔误!祝你好运。 - Jon Bellamy
1
我认为你只需要剥离SRID并尝试一下。有些空间系统在wkt格式中并不真正支持它。你使用的基准面/投影决定了你的单位(在这种情况下是米),因此不需要显式指定单位。 - sovemp

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