有趣的问题。我不认为自己是PostGIS专家,但我对您的问题toy之以鼻,并提出了以下查询,当高速公路LINESTRING
记录MULTILINESTRING
在多个字段中具有公用值时,它们会将高速公路记录分解为记录(在我的数据集中,我在name
和state
字段上进行了匹配)。我使用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
如果可行,您可以使用ogr2ogr执行此查询并以大多数您喜欢的任何矢量格式(例如shapefile,GML,CSV或其他格式)导出结果。有关从ogr2ogr调用SQL查询的信息,请查看OGR SQL文档。
作为参考,我回顾了PostGIS ST_Collect指令以及该站点,该站点演示了在多个字段上的分组。
如果您发现此查询的修订不适合您,请告诉我,我会回答我,以免它徘徊并使人们感到困惑。
PS:如果您不熟悉使用ogr2ogr将地理数据推送到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)个在名称和状态字段中共享值的特征。在这一点上,我相对有信心,当溶解任务需要考虑多个字段时,此查询对于将单部分几何体分解为多部分几何体是有用且适当的。
干杯。:)