'标签SRID = 4326; POINT(在输入的已知文本(WKT)中无效。)

时间:2014-02-27 16:26:03

标签: mysql entity-framework gis geospatial

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

  • 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:标签SRID = 4326; POINT(输入的已知文本中为51.5)   (WKT)无效。有效标签是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 Connector不支持SRID吗?它没有正确注册吗? (基本上我是想弄清楚Distance()对象上的。DbGeometry方法返回的单位,到目前为止它似乎是一个随机小数。

1 个答案:

答案 0 :(得分:1)

这不是你问题的完整答案,我不完全确定你为什么会收到错误,但我有一些建议,而且评论时间太长了。

创建点时,您需要在纬度之前指定经度。您的坐标在技术上有效,无论是给定它们的值,但当然您会遇到其他区域的问题,如果您曾经映射过它,那么该坐标将不会出现在您希望的样本坐标的英国。

此外,如果您知道这是一个重点,请使用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()的单位(或放置的随机小数)以米为单位。

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