我对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
答案 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
);
这两个查询都非常有效且快速!喜欢它!