SQL Server 2008中的地理函数转换为C#代码(判断经纬度点是否在多边形/地图范围内)

3

在SQL Server 2008中,我有:

Declare @pointIn geometry
Declare @pointOut geometry
Declare @polygon geometry

SET @polygon = geometry::STGeomFromText('POLYGON((40 -9,40 -6,35 -6,35 -9,40 -9))', 4326)
SET @pointIn =  geometry::STGeomFromText('POINT (39 -8)', 4326)
SET @pointOut =  geometry::STGeomFromText('POINT (41 -3)', 4326)

select @polygon.STIntersects(@pointIn)
select @polygon.STIntersects(@pointOut)

正如预期的那样,我得到了结果10

现在我正在尝试使用库Microsoft.SqlServer.Types.dll将相同的代码带到C#中。

使用以下代码:

var p1lat = 40;
var p1long = -9;
var p2lat = 40;
var p2ong = -6;
var p3lat = 35;
var p3ong = -6;
var p4lat = 35;
var p4ong = -9;

var pILat = 39;
var pILong = -8;
var pOLat = 41;
var pOLong = -3;

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
const string polygonFormat = "POLYGON(({0} {1},{2} {3},{4} {5},{6} {7},{0} {1}))";
var polygon = string.Format(polygonFormat, p1lat, p1long, p2lat, p2ong, p3lat, p3ong, p4lat, p4ong);
var geometryString = new SqlChars(new SqlString(polygon));
var area = SqlGeography.STPolyFromText(geometryString, 4326);
var pointIn = SqlGeography.Point(pILat, pILong, 4326);
var pointOut = SqlGeography.Point(pOLat, pOLong, 4326);

Console.WriteLine(area.STIntersects(pointIn));
Console.WriteLine(area.STIntersects(pointOut));

我总是得到 False, False...... 而应该是 True, False

有人能帮忙吗?

谢谢

1个回答

2

SqlGeography.PointSqlGeography.STPointFromText 使用不同的坐标顺序。尝试以下解决方案来修复此问题:

  • SqlGeography.Point 方法调用中交换坐标;
  • 使用 WKT 语法创建点(SqlGeography.STPointFromText)。

1
为什么有人要倒置坐标顺序?:P 我真的不明白为什么……但这样做解决了我的问题,但现在我想知道是否会有失败的情况…… - Dryadwoods
1
是的,这很令人困惑。在使用调试器逐步执行您的代码之前,我也不知道这一点。好发现! :) - Yuriy Guts
1
我找到了原因:http://social.msdn.microsoft.com/forums/en-US/sqlspatial/thread/41250c42-25e6-4de7-953e-a6c41ada383f/ - Dryadwoods

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