在PostGIS或GRASS中的公共属性上分解或取消分割线?


9

我有一个道路中心线shapefile,该道路的每个交叉点处都有道路被分割。但是,我想将具有共同属性集的LINESTRING加入单个LINESTRING中。只要名称,速度限制等不变,我就希望将它们合并在一起。这是为了最终合并到OpenStreetMap中。

Esri的ArcGIS for Desktop软件似乎通过Dissolve命令和UNSPLIT_LINES选项允许这样做。

我还在QGIS中找到了Dissolve命令,但它似乎仅适用于多边形和单个字段。

假设QGIS不存在,有谁知道如何在PostGIS或GRASS中做到这一点?



如果今天提出这个问题,我认为范围可能太广。与其立即尝试关闭它,不如对其进行编辑以翻新现有的答案并防止使用更广泛的答案。
PolyGeo

Answers:


4

有趣的问题。我不认为自己是PostGIS专家,但我对您的问题toy之以鼻,并提出了以下查询,当高速公路LINESTRING记录MULTILINESTRING在多个字段中具有公用值时,它们会将高速公路记录分解为记录(在我的数据集中,我在namestate字段上进行了匹配)。我使用OGR将Highways形状文件(重命名为ushwys)推送到PostGREsql中。因此我的几何字段称为wkb_geometry。尝试修改此查询以适应您的数据和现场条件:

SELECT 
u.name, 
u.state, 
ST_AsText( ST_Multi( ST_Collect( u.wkb_geometry ) ) ) as multilines 
FROM ushwys u
GROUP BY u.name, u.state 
ORDER BY u.state 
LIMIT 100; --########### DROP THE LIMIT WHEN YOU'RE DONE EXPERIMENTING

如果可行,您可以使用ogr2​​ogr执行此查询并以大多数您喜欢的任何矢量格式(例如shapefile,GML,CSV或其他格式)导出结果。有关从ogr2ogr调用SQL查询的信息,请查看OGR SQL文档。

作为参考,我回顾了PostGIS ST_Collect指令以及该站点该站点演示了在多个字段上的分组。

如果您发现此查询的修订不适合您,请告诉我,我会回答我,以免它徘徊并使人们感到困惑。


PS:如果您不熟悉使用ogr2​​ogr将地理数据推送到PostGIS中,我使用以下ogr2ogr脚本执行数据导入(请注意,从Web复制并直接粘贴到ogr2ogr命令窗口中,因为我发现页面格式已设置为打破ogr脚本的双引号引入了换行符和字体/字符替换

ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=postgres dbname=gisdb password=my_password" 
"E:\GISData\UnitedStates\highways.shp" -nln ushwys -nlt geometry

[更新]

我想查看运行查询后在QGIS中的外观,因此我对查询进行了修改以应用此WHERE子句(这使我在密苏里州拥有US Highway 65的所有变体):

where u.state = 'MO' and u.name LIKE '%US%65%'

接下来,我使用QGIS和QuickWKT插件可视化了所有八(8)个公路MULTILINESTRING记录。从屏幕快照中可以看到,最终结果确实使65号高速公路从密苏瓦州与爱荷华州的北部边界一直延伸到她与阿肯色州的南部边界:

在此处输入图片说明

对我而言,这种可视化表明我的查询没有产生任何意外的功能重复或消除。因此,接下来我想知道“确定,该溶解物返回了8个特征,但是原始表中实际上有多少个特征代表密苏里州的65号公路?” 我的下一个查询回答了这个问题。似乎原始数据集使用三十八(38)个特征来表示密苏里州的65号高速公路:

SELECT count(*) FROM ushwys WHERE state = 'MO' AND name LIKE '%US%65%';
-- returned 38

在最终分析中,查询将三十八(38)个特征减少为八(8)个在名称和状态字段中共享值的特征。在这一点上,我相对有信心,当溶解任务需要考虑多个字段时,此查询对于将单部分几何体分解为多部分几何体是有用且适当的。

干杯。:)



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.