0

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

表格如下:
Water table - id, name, geog(geography data type)
State table - id, state_name, state_abbr, geog(geography data type)
County table - id, name, state_name, geog(geography data type)
Waypoint table - id、name、lat、lon、waterid

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

谢谢!

到目前为止学到的:
选择 geog.ToString() 作为 Points,geog.STArea() 作为 Area,geog.STLength() 作为 Length from water where name like '%bass lake%' and 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

4

2 回答 2

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 设置为水表中匹配的水 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
于 2012-09-05T19:41:27.793 回答
0

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

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

这是一个查询,用于根据它们“适合”的位置将水 id 分配给航点:
UPDATE WaypointTable wp
SET WaterID = (
SELECT ID
FROM WaterTable
WHERE geogcolumns.STIntersects(wp.geogcolumn) = 1
);

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

于 2012-09-07T11:43:33.777 回答