ST包含地理专栏

时间:2012-11-21 00:41:52

标签: sql sql-server-2008 tsql sql-server-2008-r2 spatial

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

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

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

1 个答案:

答案 0 :(得分:1)

我使用我为您编写的代码(Storing 'Point' column from 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?如果是这样的话,那就把它存起来,让自己省去重建它的麻烦。