興味深い質問です。私はPostGISの第一人者とは見なしていませんが、問題をいじって、複数のフィールドに共通の値がある(データセットでは、フィールドとで一致した)高速道路LINESTRING
レコードをMULTILINESTRING
レコードに分解する次のクエリを思いつきました。私はOGRを使用して高速道路シェープファイル(名前はushwysに変更)をPostGREsqlにプッシュしました。したがって、私のジオメトリフィールドはと呼ばれます。このクエリをハッキングして、データとフィールドの条件に対応してください。name
state
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を使用してこのクエリを実行し、シェープファイル、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を表していますか?」次の質問でその質問に答えました。元のデータセットはミズーリ州のハイウェイ65を表すために38の特徴を使用しているようです:
SELECT count(*) FROM ushwys WHERE state = 'MO' AND name LIKE '%US%65%';
-- returned 38
最終的な分析では、クエリにより、38のフィーチャが、名前と状態のフィールドの値を共有する8つのフィーチャに削減されました。この時点で、ディゾルブタスクが複数のフィールドを考慮する必要がある場合に、このクエリがシングルパートジオメトリをマルチパートジオメトリにディゾルブするのに役立ち、適切であると私は比較的確信しています。
乾杯。:)