【问题标题】:STContains on Geography columnSTContains on Geography 列
【发布时间】:2012-11-09 04:40:51
【问题描述】:

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

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

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

【问题讨论】:

  • 你的地区积分有编号吗?你的区域总是凸的吗?
  • 您好,我的地区是纬度/经度(区域的单点轮廓),我的巴士路线也是纬度/经度(每行 1 条经度/经度记录)。希望这会有所帮助。

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


【解决方案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?如果是这样,请将其存储起来,免去重建它的麻烦。

【讨论】:

  • 嗨,本.. 再次感谢您的回复。我将更详细地解释。我得到的 Shapefile 包含对应总线的每条记录 1 纬度/经度。因此,如果巴士从纽约到芝加哥,我的 shapefile 将有 100 万条记录(每秒记录一个纬度/经度)。所以现在我在我的 SQL Server 上加载了 100 万个文件(记住 1 有单个纬度/经度作为公交路线)。现在我有一个区域的几何列,我使用 STNumPoints() 从中提取每个点。通过这个我得到了点格式的区域轮廓。
  • 如果我正确阅读了您上面的问题,您应该执行类似 select r.STContains(p) from region cross join points 的操作。如果您将区域存储为多边形并将点存储为点,这应该为每个点提供一个真/假指示器,说明它是否在该区域中。
猜你喜欢
  • 2015-11-20
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
相关资源
最近更新 更多