【问题标题】:SQL Server 2008 R2 Spatial QueriesSQL Server 2008 R2 空间查询
【发布时间】:2012-09-07 19:43:33
【问题描述】:

我对 SQL Server 的空间领域非常陌生,需要一些帮助。我有一个航点组织应用程序,我正在尝试生成一些查询,这些查询遵循查找属于地理多边形(如湖泊、河流等)的航点的前提。我已经用我下载的数据预加载了我的表。我使用 shape2sql.exe 将 shapefile 加载到适当的数据库表中。

表格如下:
地下水位 - id、名称、geog(地理数据类型)
状态表 - id、state_name、state_abbr、geog(地理数据类型)
县表 - id、名称、state_name、geog(地理数据类型)
航点表 - id, name, lat, lon, waterid

如何针对这些表编写查询以返回以下内容:
- 'michigan' 中的所有航点
- 'michigan' 'montcalm' 县的 'bass Lake' 上的所有航路点(密歇根州和该国有多个 Bass 湖,因此是县/州部分)
- 通过“处理”一组航路点并找到它们实际属于哪个湖,自动分配航路点表的水 id 列
- 等等。

谢谢!

到目前为止学到的:
选择 geog.ToString() 作为 Points, geog.STArea() 作为 Area, geog.STLength() 作为 Length 从水 其中名称如 '%bass lake%' 和 STATE = 'mi'

将返回 Bass Lake 的记录和带有湖泊实际坐标的多边形。
POLYGON ((-87.670498549804691 46.304831340698243, -87.670543549804691 46.307117340698241, -87.676573549804687 46.313480340698241, -87.68120854980468 46.314821340698245, -87.685168549804686 46.315703340698242, -87.6877605498047 46.313390340698241, -87.685051549804683 46.308827340698244, -87.682360549804685 46.305650340698243, -87.677734549804683 46.304768340698246, -87.674440549804686 46.304336340698242, -87.670498549804691 46.304831340698243)) 1022083.96662664 4027.52433709888

【问题讨论】:

    标签: sql-server-2008-r2 spatial


    【解决方案1】:

    在这里,从臀部射击,但可能是这样的:

    UPDATE  waypoints
    SET waypoints.WaterId = water.Id
    FROM    dbo.Waypoints AS waypoints LEFT JOIN
        dbo.Water AS water ON geography::Point(waypoints.Lat, waypoints.Lon, 4326).STIntersects(water.geog)
    

    应将 wapoints 表上的 waterId 设置为水表中匹配的水 id 之一。

    这应该可以为您提供 BASS LAKE 上的所有航路点

    SELECT  waypoints.*
    FROM    dbo.Waypoints as waypoints INNER JOIN
        dbo.Water AS water ON geography::Point(waypoints.Lat, waypoints.Lon, 4326).STIntersects(water.geog) = 1
    WHERE   water.Name = 'BASS_LAKE' -- OR WHATEVER
    

    【讨论】:

    • geography::point 是否需要经度、纬度和 srid?得到某种关于经度需要在 -90 到 90 之间的错误......
    【解决方案2】:

    好的 - 边走边学,所以这里有一些我自己的问题的答案,供任何想知道的人参考。

    这是一个查询,用于在 where 子句中查找具有条件的各种航路点:
    SELECT * FROM WaypointTable wp
    加入水表w
    ON wp.geogcolumn.STIntersects(w.geogcolumn) = 1
    WHERE w.name LIKE '%bass lake%'
    和 w.state = 'mi';

    这是一个查询,用于根据航路点的“适合”位置将水标识分配给航路点:
    更新 WaypointTable wp
    SET WaterID = (
    选择 ID
    FROM 水表
    WHERE geogcolumns.STIntersects(wp.geogcolumn) = 1
    );

    这两个查询都运行得非常好和快!喜欢它!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 2013-03-19
      相关资源
      最近更新 更多