我正在计算 SQL Server 中的多边形交点,并根据此处的示例有一个如下所示的表:http: //msdn.microsoft.com/en-gb/library/cc280766.aspx其中计算了“Coordinates_OGC_WKT”。
+--------+----------------------+------------------------------------+------------+
| ZoneId | Coordinates | Coordinates_OGC_WKT | ZoneName |
+--------+----------------------+------------------------------------+------------+
| 1 | 0xE61000000 [etc...] | POLYGON ((-122.358 47.653 [etc...] | Polygon |
| 2 | 0xE61000000 [etc...] | LINESTRING (-122.36 47 [etc...] | Linestring |
+--------+----------------------+------------------------------------+------------+
我已经测试了以下建议的 SP,它可以工作,但是我不确定如何还返回“ZoneName”字段——这很重要。
DECLARE @geocoords geography;
DECLARE @geoline geography;
DECLARE @result geography;
SELECT @geocoords = Coordinates FROM SpatialZonePolygons WHERE ZonePolygonId = 1;
SELECT @geoline = Coordinates FROM SpatialZonePolygons WHERE ZonePolygonId = 2;
SELECT @result = @geoline.STIntersection(@geocoords);
SELECT @result.STAsText() AS WKT;
结果显示交点坐标,但不指示数据库中保存多边形坐标的行。我正在尝试检索发生交叉点的“ZoneName”(这是必需的):
+---------------------------------------------------------------+
| WKT |
+---------------------------------------------------------------+
| LINESTRING (-122.35800000000017 47.656000130337446, [etc...]) |
+---------------------------------------------------------------+
这一定很简单,但我很挣扎。
- - 编辑 - -
这看起来好像它应该工作并且有点......但我得到的区域不在折线附近:
SELECT *
FROM dbo.SpatialZonePolygons
WHERE Coordinates.STIntersects(geography::STGeomFromText('LINESTRING(51.46276 -0.106, 51.46275 -0.10604, 51.46248 -0.10672, 51.46262 -0.10687, etc...)', 4326))>0
我通过在谷歌地图上手动绘制它来检查折线是否正确。我还通过相同的操作检查了多边形坐标是否正确,那么为什么数据库会返回距离折线 50 多英里且绝对没有交叉点的区域?
作为测试,折线穿过伦敦,所以我想我会看看布鲁塞尔的一个区域是否也被归还......不是。因此,这可能是一个准确性问题吗?我对此表示怀疑,因为绘制的折线可以准确渲染并且不会靠近区域。
我现在有点绝望,所以我也想知道我是按正确的顺序存储坐标(lat lng)还是应该是 lng lat?