あるテーブルのフィーチャを別のテーブルのフィーチャでST_Splitする方法は?


9

閉じたラインストリングと閉じていないラインストリング(レイヤー 'lin')の両方でポリゴン(レイヤー 'pol')を分割する必要があります。

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

残念ながら、次のクエリを実行しても適切な結果が得られません。

CREATE VIEW splitted_pol AS
SELECT 
    g.path[1] as gid, 
    g.geom::geometry(polygon, SRID) as geom 
FROM
    (SELECT 
    (ST_Dump(ST_Split(pol.geom, lin.geom))).* 
    FROM pol, lin
) as g;

私の例では、ST_Splitは6つのポリゴンを作成する必要があります(レイヤー 'splitted_pol')。

ここに画像の説明を入力してください ここに画像の説明を入力してください QGIS / PostGISでST_Splitを使用する方法を知っている人はいますか?


geomをに再帰的にフィードする必要がありST_Splitます。
Jakub Kania

SQLクエリについて教えてください。PostGISは初めてです。
月の海

入力レイヤーには正確に何が含まれていますか?赤い四角形と三角形のポリゴンのあるレイヤー 'pol'と、濃い青の垂直線が1つしかないレイヤー 'lin'が見えます。そして、なぜあなたは6つのポリゴンを期待するのですか?「ボーダー」を考慮に入れなかった。
ステファン

レイヤーを示すスクリーンショットを追加しました。
ルナ海の

入力ジオメトリを追加できる可能性はありますか?
John Powell

回答:


4

次のような関数を作成できます。

create or replace function ST_MultiSplit(geom Geometry, blades Geometry) RETURNS Geometry AS $$
BEGIN
  FOR i IN 1..ST_NumGeometries(blades)
     LOOP
        geom = ST_Split(geom, ST_GeometryN(blades, i));
     END LOOP;
  RETURN geom;
END;
$$ LANGUAGE plpgsql;

次に、次のように使用します。

Select ST_AsEWKT(a.geom) from (
   select (ST_Dump(ST_MultiSplit(pol.geom, (
      select ST_MemUnion(lin.geom) from lin where ST_Intersects(pol.geom, lin.geom) = 't')
 ))).geom geom from pol) a;

これにより、期待している6つのレコードが得られます。エラーチェック/処理を追加することもできますが、スケーラビリティについてはよくわかりません。


4

JAVAでpostGIS sqlを使用して機能を行ごとに分割していますが、コードは機能しました。私のコードは:

public List splitGeometry(String geom1、String geom2){

    List<String> result=new ArrayList<String>() ;
    try {

        Statement s = connection.createStatement();
        String sql_stat = null;
        sql_stat = "select st_astext (a.geom)from (select ( st_dump(p_geom)).geom as geom FROM (SELECT  st_split(ST_GeomFromEWKT('"+geom1+"') ,ST_GeomFromEWKT('"+geom2+"'))AS p_geom) AS b) AS a;";
        System.out.println(sql_stat);
        ResultSet rs=  s.executeQuery(sql_stat);
        while (rs.next()){
            result.add(rs.getString(1)) ;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result ;
}

お役に立てば幸いです。


ご協力ありがとうございます。QGISとJAVAをリンクする方法がわからないので、PostGISのみのソリューションを見つけようとしています。
月面海

QGISはC ++で書かれており、Pythonバインディングがあります。したがって、これらの言語を使用して独自のアプリケーションを開発できます。Javaは使用できません。postGISの代わりに使用できます。
Samane 2015

C ++ / PythonアプリケーションなしでPostGISを使用してラインフィーチャによってポリゴンフィーチャを分割する方法はありますか?プログラミングの経験はありません。
月面海

C ++とPythonを必要とせずに、PostGISとJavaを使用します。Javaでgeotoolsを使用することもできます。
Samane
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.