实体框架 DbGeography 给了我一个纬度 FormatException 错误

Posted

技术标签:

【中文标题】实体框架 DbGeography 给了我一个纬度 FormatException 错误【英文标题】:Entity Framework DbGeography is giving me a latitude FormatException error 【发布时间】:2016-06-21 15:39:06 【问题描述】:

我正在编写一个 API,它使用 Entity Framework 6 来做一些 GeoSpatial 的东西。

我已将zip data 加载到数据库表中,在该表中我通过邮政编码进行查找并获取其相应的纬度和经度信息。

由于我正在测试不同的邮政编码,当我查找并使用90210 的纬度/经度时出现此错误


  "Message": "An error has occurred.",
  "ExceptionMessage": "24201: Latitude values must be between -90 and 90 degrees.",
  "ExceptionType": "System.FormatException",
  "StackTrace": "   at Microsoft.SqlServer.Types.GeographyValidator.ValidatePoint(Double x, Double y, Nullable`1 z, Nullable`1 m)\r\n   at Microsoft.SqlServer.Types.Validator.BeginFigure(Double x, Double y, Nullable`1 z, Nullable`1 m)\r\n   at Microsoft.SqlServer.Types.ForwardingGeoDataSink.BeginFigure(Double x, Double y, Nullable`1 z, Nullable`1 m)\r\n   at Microsoft.SqlServer.Types.CoordinateReversingGeoDataSink.BeginFigure(Double x, Double y, Nullable`1 z, Nullable`1 m)\r\n   at Microsoft.SqlServer.Types.WellKnownTextReader.ParsePointText(Boolean parseParentheses)\r\n   at Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType type)\r\n   at Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType type, Int32 srid)\r\n   at Microsoft.SqlServer.Types.SqlGeography.ParseText(OpenGisType type, SqlChars taggedText, Int32 srid)\r\n   at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)\r\n   at Microsoft.SqlServer.Types.SqlGeography.Parse(SqlString s)"

从 zip 查找返回的纬度/经度数据是:

latitude: "34.0901"
longitude: "-118.4065"

两者都作为字符串返回

当我在 Google 地图中查找这些坐标时,它确实显示了正确的位置(加利福尼亚州比佛利山庄)

我得到的错误也没有任何意义,因为34.0901-90 to 90 范围内。

这是发生问题的相关代码。当我创建 zip 数据库时,我删除了重复的 zip,并将邮政编码作为该表的键。

USZip zipData = context.USZip.Find(zip);
string point = string.Format("POINT(0 1)", zipData.latitude, zipData.longitude);
var myLocation = DbGeography.FromText(point);

【问题讨论】:

当然,在我发布此内容后,我能够找到一个与我的完全相同的旧问题:***.com/questions/16546598/… 【参考方案1】:

您将纬度和经度颠倒了,因此值 118.4065 被视为纬度,并且超出了 -90 到 90 的范围。

修正后的行应该是这样的:

string point = string.Format("POINT(0 1)", zipData.longitude, zipData.latitude);

【讨论】:

很好奇为什么 DBGeography 点违背了将纬度放在首位的规范。但这行得通,谢谢!

以上是关于实体框架 DbGeography 给了我一个纬度 FormatException 错误的主要内容,如果未能解决你的问题,请参考以下文章

PrimeFaces Mobile 反向幻灯片过渡给了我“对实体“反向”的引用必须以“;”结尾定界符。´ [重复]

将数据插入数据库时​​实体框架中的验证错误

Elevation API 给了我不合逻辑的结果

linq中的算术运算使用实体框架mvc C#

将 SQL Server tinyint 映射到 Int16 的实体框架

不支持关键字:“数据源”初始化实体框架上下文