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?


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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.