Bagaimana cara ST_Split fitur dalam satu tabel dengan fitur di yang lain?

9

Saya perlu membagi poligon (lapisan 'pol') dengan linestrings tertutup dan tidak tertutup (layer 'lin').

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Sayangnya saya tidak mendapatkan hasil yang tepat menjalankan kueri berikut.

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;

Dalam contoh saya ST_Split harus membuat enam poligon (layer 'splitted_pol').

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini Adakah yang tahu cara menggunakan ST_Split dengan QGIS / PostGIS?

Laut Bulan
sumber
Anda perlu memberi makan geoms secara rekursif ST_Split.
Jakub Kania
Bisakah Anda membantu saya dengan permintaan SQL? Saya baru mengenal PostGIS.
Laut Lunar
Apa sebenarnya yang dikandung lapisan input Anda? Saya melihat lapisan 'pol' dengan kotak merah dan segitiga poligon dan lapisan 'lin' dengan hanya satu garis vertikal biru gelap. Dan mengapa Anda mengharapkan 6 poligon? Saya tidak akan memperhitungkan "perbatasan".
Stefan
Saya telah menambahkan tangkapan layar untuk menggambarkan lapisan.
Laut Lunar
Apakah Anda bisa menambahkan geometri input?
John Powell

Jawaban:

4

Anda dapat membuat fungsi seperti ini:

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;

Kemudian gunakan seperti:

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;

Ini memberi enam catatan yang Anda harapkan. Anda mungkin ingin menambahkan beberapa pemeriksaan / penanganan kesalahan dan saya tidak yakin tentang skalabilitas.

travis
sumber
4

Saya menggunakan sql postGIS untuk membagi fitur demi baris di JAVA, dan kode saya berfungsi. kode saya adalah:

Daftar publik 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 ;
}

Saya harap membantu Anda.

Samane
sumber
Terima kasih atas bantuan Anda, tetapi saya mencoba mencari solusi PostGIS saja karena saya tidak tahu cara menautkan QGIS dengan JAVA.
Laut Bulan
QGIS ditulis dalam C ++ dan ada binding Python. Jadi, Anda dapat mengembangkan aplikasi Anda sendiri menggunakan bahasa-bahasa itu. Anda tidak dapat menggunakan Java. Anda dapat menggunakan sebagai ganti postGIS.
Samane
Apakah ada cara untuk membagi fitur poligon dengan cara linestring menggunakan PostGIS tanpa aplikasi C ++ / Python? Saya tidak punya pengalaman pemrograman.
Laut Lunar
Anda menggunakan PostGIS dan Java, Tanpa perlu C ++ dan Python. Anda juga dapat menggunakan geotool di Jawa.
Samane