0

我正在计算 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?

4

2 回答 2

1

这应该这样做:

CREATE PROCEDURE FindPolygons(
    @geoline geography
) as begin
SELECT
     Coordinates
    ,ZoneName 
    ,WKT
FROM (
    SELECT
         Coordinates
        ,ZoneName 
        ,@geoline.STIntersection(Coordinates).STAsText() AS WKT
    FROM SpatialZonePolygons        
) data
WHERE data.WKT is not null
end

于 2014-08-08T01:35:33.097 回答
0

我将您关于“从与给定线相交的表格中返回多边形”作为要求的评论。

create procedure findPolygons (
   @line geography
)
as
begin

    select ZoneId, Coordinates
    from SpatialZonePolygons 
    where Coordinates.STIntersects( @line ) = 1

end
于 2014-08-08T15:07:19.983 回答