SQL Server 2008 R2空间查询

时间:2012-09-05 12:31:25

标签: sql-server-2008-r2 spatial

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

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

如何针对这些表编写查询以返回以下内容:
- '密歇根'中的所有航路点 - '密歇根州''montcalm'县'低音湖'的所有航路点(密歇根州有多个低音湖,因此县/县有部分) - 通过“处理”一组航路点并查找它们实际属于哪个湖,自动分配航点表的水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

2 个答案:

答案 0 :(得分:0)

从臀部拍摄,在这里,但也许是这样:

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设置为来自地下水位的匹配水ids之一。

这应该可以让你获得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

答案 1 :(得分:0)

好的 - 在我这里学习的时候,对于任何想知道的人,我都会回答自己的问题。

以下是查询where子句中具有条件的各种航点的一个查询:
    SELECT * FROM WaypointTable wp
    加入WaterTable w
    ON wp.geogcolumn.STIntersects(w.geogcolumn)= 1
    在哪里w.name LIKE'%bass lake%'
    AND w.state ='mi';

这是一个根据它们“适合”的方式将水ID分配给航路点的查询:
    更新WaypointTable wp
    SET WaterID =(
      选择ID
      来自WaterTable
      在哪里geogcolumns.STIntersects(wp.geogcolumn)= 1
    );

这两个查询都非常有效且快速!喜欢它!