【发布时间】:2017-11-10 15:50:15
【问题描述】:
使用实体框架从谷歌地图的边界获取数据时出现以下异常:
FormatException: 24201:纬度值必须在 -90 到 90 度之间。
POLYGON((81.9882716924738 140.187434563007,21.5587046599696 140.187434563007,21.5587046599696 -40.1641279369925,81.9882716924738 -40.1641279369925,81.9882716924738 140.187434563007))
我可以看到其他人有同样的问题,但还没有找到任何解决这个问题的方法。我希望点的第一个坐标是纬度,第二个是经度?而且没有一个高于 90,那么为什么我会收到此错误?我尝试交换 lat 和 lng 但有同样的问题。
这是失败的路线:
var poly = FindByBoundingBox(northEastLat, northEastLng, southWestLat, southWestLng);
DbGeography polygon = DbGeography.FromText(poly, 4326);
var parksWithinPolygon = dbCtx.SiteList.Where(p =>
p.PolygonCenter.Intersects(polygon)).Select(p=>p.SiteName).ToList();
正如 Damien 所说的第一个问题是 Sql 服务器首先需要经度,然后是纬度。这会引发另一个错误,重定向到另一个问题:
“此操作无法完成,因为实例无效”。
我最好的选择是我构建多边形的方式/顺序。有没有人成功地将谷歌边界映射到 SQL 服务器中的多边形?简而言之,我试图在谷歌地图范围内获取任何数据(数据有一个点列)。
计算多边形的函数如下:
public string FindByBoundingBox(double northEastLat, double northEastLng, double southWestLat, double southWestLng)
{ //Create poylgon of bounding box
System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
customCulture.NumberFormat.NumberDecimalSeparator = ".";
System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;
var bboxWKT = string.Format("POLYGON(({1} {0},{1} {2},{3} {2},{3} {0},{1} {0}))", northEastLat, northEastLng, southWestLat, southWestLng);
return bboxWKT;
}
【问题讨论】:
-
“我尝试交换 lat 和 lng 但有同样的问题” - 但这应该已经解决了。 SQL
GEOGRAPHYWKT 表示使用long lat而不是lat long。 -
我尝试这样做,但后来我得到:此操作无法完成,因为实例无效。使用 MakeValid 将实例转换为有效实例。请注意,MakeValid 可能会导致几何实例的点稍微移动。
-
多边形((180 89.8489730732467,180 -80.2507546123243,-180 -80.2507546123243,-180 89.8489730732467,180 89.848973073247))
-
所以,学会区分当你收到一个完全不同的消息时,这不是相同的问题。请edit您的问题包含此类信息。
-
谢谢你的权利。我已经更新了问题。
标签: sql-server geography sqlgeography