0

我在纬度/经度(地理)有一个公共汽车站。我想检查我的巴士点(纬度/经度)在某个地区的位置。我的区域是一组纬度/经度点。我有地理形式的一个地区的纬度/经度(构成一个地区的纬度/经度的轮廓)。现在我有一个纬度/经度点,我想确定该点是否位于我的区域内。我怎样才能做到这一点?4000个点构成一个区域的轮廓,一个点是检查该区域是否存在。我将如何检查?

我想我可以使用STContainsorSTintersect但我不知道确切的语法。

SELECT
    Region.BlockID, Bus_Route.geography
FROM
    Bus_Route, Region
WHERE
    Region.points.STContains(Bus_Route.geography) = 1
4

1 回答 1

1

我使用我为您编写的代码(从 ShapeFile 存储“点”列)作为获取点表的起点。从那里:

select geography::STPolyFromText(
'POLYGON((' + 
    stuff((
        select ',' + cast(g.STPointN(t.i).Long as varchar(10)) + ' ' + cast(g.STPointN(t.i).Lat as varchar(10))
        from [a]
        cross join tally as [t]
        where t.i <= g.STNumPoints()
        order by i
        for xml path('')

    ), 1, 1, '') + '))'
    , 4326)

这段代码假设了几件事。第一:你的点是按照你在区域边界周围的顺序排列的。这很重要。想想一个连接点的谜题。为了获得正确的图片,您必须以正确的顺序进行操作。其次,与第一个相关,它们必须处于正确的方向。多边形遵循左手规则。也就是说,如果您按顺序遍历这些点,则您正在定义左侧的区域。因此,如果您以相反的顺序指定点,您将获得除您所在地区之外的所有内容!您将立即知道这一点,因为在 SQL 2012 之前,您仅限于拥有完全包含在半球中的区域。

但现在我不得不问:鉴于您之前提出的问题(我在上面链接到),您是否收到带有多边形的 shapefile?如果是这样,请将其存储起来,免去重建它的麻烦。

于 2012-11-21T14:08:21.463 回答