無料のGISソフトウェアで擬似ノードを見つけましたか?


16

ソフトウェアgvSIG OA Digital Edition 2010には、線形ジオメトリの擬似ノードを見つけるためのツールトポロジがあります。20000リンクカウント線形ジオメトリのクラスター許容値0.00002と最大エラー数-10000を設定します。しかし、失敗した結果。

無料のGISソフトウェアで擬似ノードを見つけるソリューションはありますか?

擬似ノードを階層化する必要があります(この問題の1つの解決策-ArcInfoのツールトポロジを使用しますが、私にとっての優先事項はフリーソフトウェアを使用することです)。線形ジオメトリにより、PostGIS(v。2.0.1)データベースのQGIS 1.8.0で複数のユーザーが作成されました。

新しいイメージの追加:A(ライン4/5)、B(ライン6/7)、C(ライン9/10)に3つの擬似ノードを持つ12の線形フィーチャ。代わりに、擬似ノードはポイントである必要があります。1つのポイント(ノード)に交差する2つの線形フィーチャは、1つの線形フィーチャ(ライン4/5-ライン4、...)でなければなりません。

PostGISでリクエストを行うことは可能ですか?これにより、擬似ノードのレイヤーが作成されますか?

サンプルの擬似ノードの新しい画像を追加します:線形レイヤーのポイントレイヤーの擬似ノード(青い四角形)を受け取った場合、線形レイヤーの次のエラーを修正しました:A-欠落したジオメトリを追加、B-交差するスナップ線、C-擬似ノードを削除

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください


2
GRASSにはrmdangleコマンドが存在しますが、結果として擬似ノードのないshpファイルが存在します。結果として、疑似ノードのshpファイル(または別の)(gvSIG OA Digital Edition 2010など)
HasT

PostGIS 2.0を使用していますか?はいの場合、Is_ValidおよびMakevalid関数を試してください。
ジョヴァンニマンギ

はい、PostGIS 2.0を使用しています。これらの関数を使用して擬似ノードを検索する方法 「PgQuery for QGIS」でそれらを見つけることは可能ですか?
HasT

はい。たとえば、DBマネージャー(構文の強調表示と自動補完をサポートする)など、PostGISクエリを実行できるツールのQGIS内で使用できます。
ジョヴァンニマンギ

2番目の図の赤い点は、2つの有効なジオメトリの交差点です。
ビナヤン

回答:


8

ここでは、PostGISまたは他のOGC準拠のソフトウェアで改善できる一般的なソリューションです。

注:に言ったよう、FOSSとGISの重要な概念は標準化です。最適なソリューションはOGCなどの標準を採用します。


あなたの問題は「擬似ノードを見つける」ことです...しかし、もう少し「非擬似ノードを見つけて擬似ノードの行を結合する」と思います。私のソリューションは両方に使用できます。

OGC標準は以下を提供します:

  • ST_Boundary(geom):ラインのノードを検出します

  • ST_Dump(geom):各単一ノードをSQLテーブルレコードに配置します。

  • ST_DWithin、ST_Equals、ST_SnapToGrid、ST_Snapは、許容値の変更に使用できます。ST_DWithinを使用しています。

これらのオブジェクトとプロパティを使用して主な問題を特定できると想定できますが、

  • LINESTRINGジオメトリで表される(テーブルlinesegmentの)ラインセグメントのみがあります。

  • 各ラインセグメントには(ジオメトリID)gidと(カラーID)idlineがあります。

したがって、最初のステップは、ラインを結合することから来るノードを取得することです。

CREATE TABLE cache_bounds AS
  SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
         gid as color 
         -- if you not have something for "color label" of lines, use gid.
  FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;

CREATE TABLE cache_joinnodes AS
  -- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
  SELECT *, array_length(colors,1) as ncolors FROM (
   SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
    SELECT 
      a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
      , st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
    FROM cache_bounds a, cache_bounds b 
    WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
    -- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
    GROUP BY a.gid, a.the_geom
   ) as t
  ) as t2;

注:ビューよりも高速であるため、キャッシュを使用します。「EXPLAIN SELECT ...」を使用してCPU時間を確認します。長時間かかる場合があります。

ここでは、サイクルと連続した(同じ色の)線がncolors=1ポイントとして検出され、擬似ノードはポイントごとに検出されるncolors=2ため、そのポイントを持つレイヤーができます。

「適切なノード」のテーブルには、元の「境界点」があり、「疑似ノード」はありません。

CREATE VIEW vw_joinnodes_full AS
  SELECT b.*, j.ncolors
  FROM cache_joinnodes j INNER JOIN cache_bounds b 
       ON j.gid=b.gid;

CREATE TABLE cache_good_nodes AS
  SELECT *  
  FROM vw_joinnodes_full 
  WHERE ncolors=1 OR ncolors>2;

-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ... 

解決策をありがとう!pgAdminでクエリを実行しようとしましたが、「function array_distinct(integer [])not exist」という例外が表示されます。何が間違っていますか?
HasT

申し訳ありませんが、引用されていないarray_distinct関数はpostgres.czライブラリのものです。その他のエラーについては、ご報告ください。ここで説明を追加できます。
ピータークラウス

array_distinct関数を追加しました。データベースのリニアレイヤーには、「the_geom」ジオメトリ列名があります(クエリの「geom」ではありません)。クエリを実行した後、「ST_Boundary(the_geom)」の「geom」を「the_geom」に置き換えます。「as color、geom FROM」の場所に「列「geom」が存在しません」というメッセージが表示されます。「色として、geom FROM」を「色として、the_geom FROM」に置き換えましたが、「列「the_geom」が存在しません」というメッセージが再び表示されます。
HasT

OK、(編集済みの回答を参照)geomに変更しましたthe_geom(ST_Dump(x)) geomのままで、データベース属性ではありません。
ピータークラウス

ありがとう!クエリは機能します。ST_equalsのST_DWithinを置き換え、ST_Bufferに0.00002 DDトレランスを与えました。結果として、正しいノードを受け取りました(1つのノードが3つ以上の線形フィーチャと交差する)。1つのノードで2つの線形フィーチャと交差する結果(FROM vw_joinnodes_full WHERE ncolors = 2;)を受け取りますが、1つのノードで2つ以上の線形フィーチャと交差するポイントレイヤーを受け取ります。1つのノードで2つの線形フィーチャのみと交差する結果をどのように受け取りますか?
HasT

7

Refractions Researchは、必要な処理を行うラインクリーナーツールを作成しました。

Line Cleanerは、複雑で周期的で非常に短く、長さゼロのジオメトリを単純化し、擬似ノードと重要でない頂点を削除することにより、ネットワークをクレンジングします。最も重要なことは、クレンジングフェーズで、機能の一致が自動的に考慮されるようにすることです。

ここに画像の説明を入力してください

ソースコードは GitHubので見つけることができます。


答えてくれてありがとう。しかし、エラーの結果として、擬似ノードにはポイントレイヤーが必要です。これらのエラーは、ユーザーが手動で修正する必要があります。1つのノードで3本の線と交差する場合がありますが、1本の線がスキップされるか、頂点にスナップされない場合があります。
-HasT

これは機能するはずです。ここで何を言おうとしているかを正確に理解するのが難しい。「エラーの結果として、擬似ノードにはポイントレイヤーが必要です」これが何を意味するのかわかりません。これを機能させるには、各ラインの端にポイントがスナップされたポイントレイヤーが必要ですか?
レイナー

@Rayner、例の擬似ノードの新しい画像を追加(3):線形レイヤーのポイントレイヤー擬似ノード(青い四角形)を受け取った場合、線形レイヤーの次のエラーを手動で修正します(自動ではありません):A-欠落したジオメトリを追加、B-スナップ交差する線、C-擬似ノードを削除します。擬似ノードを自動的に修正すると、A、Bの場所にエラーが残ります。
HasT

さて、私はBとCを理解しています。「A-不足しているジオメトリを追加する」と言うとき、それはどういう意味ですか?2行が交わる場所に追加する必要があるポイントはありますか?
レイナー

@Rayner、それは 'A'に線形特徴(画像による通り/道路)を追加すべきことを意味します。А-ノードは画像に基づいて新しいジオメトリを追加する準備ができていましたが、ジオメトリは追加されていません(ペイントされていないジオメトリのレイヤ擬似ノードを使用してください)
HasT

2

非フリーソリューション:FME + MRF + SmartCleanerトランス

無料のソリューションGRASS v.clean(GRASSツールを備えた最新のQGIS 1.8.0を使用するのが最も簡単な方法です)およびその他のトポロジークリーニングツール


QGIS 1.8.0。C:\ Program Files \ Quantum GIS Lisboa \ apps \ qgis \ python \ pluginsディレクトリ(1.0.7)にSEXTANTEプラグインをインストールします。線形shpファイルをQGISプロジェクトにロードします(CRSレイヤーおよびプロジェクトWGS1984、「オンザフライ」変換オン)。次に、「キャンバス上のGRASS領域の定義」(GRASSコマンド-ツール)を適用し、コマンドv.clean-rmdangle(Thershold = 0、出力ベクトル/エラーのdir / nameを入力)を実行します。実行プロセスの後、エラー「レイヤーをロードできませんでした:D:/error.shp SEXTANTEログでエラーを確認してください」を受信します。TOCに新しいレイヤーが追加され、エラーのあるレイヤーは読み込まれません。
HasT

1
GRASSのが存在コマンドv.build.polylinesに-私は1つの頂点(削除疑似ノード)に交差する二行から1を受けるが、このコマンドは、I SEXTANTEプラグインで見つけることができません
HAST

@simplexio v.cleanのどのオプションを使用して擬似ノードを識別することができるか提案していただけますか
-osmjit

2

OpenJump a free GISを使用して擬似ノードを見つける手順は次のとおりです。
QGISとgvSIGにはSextanteプラグインがあるため、これらの同じ手順でも機能するはず
です。空間結合はわずかに異なる場合があります。
テストにはバージョン1.2を使用しました。

-ラインエンドポイントの
Sextanteツールボックス、トポロジ、ラインのエンドポイントの抽出-> endpt_0-

ラインの
スプリット解除Sextanteツールボックス、ラインレイヤーのツール、隣接ラインの結合

-スプリットされていないラインエンドポイントの
Sextanteツールボックス、トポロジ、エンドポイントの抽出line-> endpt_1-

「隣接するラインの結合」によって削除されるエンドポイントは、擬似ノード

ツール、クエリ、空間クエリ、
ソースレイヤー「endpt_0」
リレーション「交差」
マスクレイヤー「endpt_1」を

有効にするか、[結果を補完]をクリックします


答えてくれてありがとう!私はQGIS Sextanteでこれらの手順を実行しようとしていますが、「行のエンドポイントを抽出する」コマンドと「隣接する行に結合する」コマンドが見つかりません。QGIS Sextante(gvSIG 1.12にはこれらのコマンドが存在する)またはコマンドv.build.polylinesを追加できますか?
HasT

QGIS sextanteプラグインをインストールしました。私は完全な機能も見ていません、多くが欠落しています。シェープファイルでgvSIGの手順を簡単にテストできるはずです。
klewis

上記のワークフローをgvSIG 2.4.0.2834で検証したところ、正常に動作します。最終ステップを他の2つのツールボックスジオプロセスに置き換えました。1つ目はgvSIG "Spatial Join"、2つ目はas式を使用する"フィルターベクターレイヤー"DIST > 0です。さらに、すべてのジオプロセスをSEXTANTEモデルでチェーン化して、「Find pseudonodes 」などの新しいツールを作成できます。
アントニオファルチャーノ


1

PostGISでは、クエリの修正バージョンを使用して、このトピックで説明したダングルを見つけることができます。擬似ノードは2本のラインストリングをインターセプトするノードであり、ダングルは1本のラインストリングをインターセプトするノードです。

WITH nodes AS 
(SELECT ST_StartPoint(geom) AS pt FROM
linestring_table UNION ALL 
SELECT ST_EndPoint(geom) AS pt FROM
linestring_table) 
SELECT pt FROM nodes
GROUP BY pt HAVING count(*) = 2;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.