我在Lat / long(地理位置)有一个公共汽车点。我想检查我的公交点(纬度/经度)在哪个区域。我的区域是一组纬度/经度。我有地理形式的纬度/长度区域(纬度/长度的轮廓,它构成一个区域)。现在我有一个点纬度/长度,我想确定该点是否位于我的区域内。我怎样才能做到这一点? 4000点构成一个区域的轮廓,一点是检查该区域是否存在。我该如何检查?
我想我可以使用STContains
或STintersect
,但我不知道确切的语法。
SELECT
Region.BlockID, Bus_Route.geography
FROM
Bus_Route, Region
WHERE
Region.points.STContains(Bus_Route.geography) = 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?如果是这样的话,那就把它存起来,让自己省去重建它的麻烦。