Wie werden ST_Split-Features in einer Tabelle nach Features in einer anderen Tabelle dargestellt?

9

Ich muss Polygone (Ebene 'pol') durch geschlossene und nicht geschlossene Linestrings (Ebene 'lin') teilen.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Leider erhalte ich bei der folgenden Abfrage keine korrekten Ergebnisse.

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;

In meinem Beispiel sollte ST_Split sechs Polygone erstellen (Ebene 'splitted_pol').

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Weiß jemand, wie man ST_Split mit QGIS / PostGIS verwendet?

Mondsee
quelle
Sie müssen die Geoms rekursiv füttern ST_Split.
Jakub Kania
Können Sie mir bitte bei der SQL-Abfrage helfen? Ich bin neu bei PostGIS.
Mondsee
Was genau enthalten Ihre Eingabeebenen? Ich sehe die Ebene 'pol' mit einem roten Quadrat und einem Dreieckspolygon und die Ebene 'lin' mit nur einer dunkelblauen vertikalen Linie. Und warum erwarten Sie 6 Polygone? Ich würde die "Grenze" nicht berücksichtigen.
Stefan
Ich habe einen Screenshot hinzugefügt, um die Ebenen zu veranschaulichen.
Lunar Sea
Gibt es eine Chance, die Eingabegeometrien hinzuzufügen?
John Powell

Antworten:

4

Sie könnten eine Funktion wie die folgende erstellen:

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;

Dann benutze es wie folgt:

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;

Dies ergibt die sechs Datensätze, die Sie erwarten. Möglicherweise möchten Sie eine Fehlerprüfung / -behandlung hinzufügen, und ich bin mir über die Skalierbarkeit nicht sicher.

Travis
quelle
4

Ich verwende postGIS sql, um Features in JAVA zeilenweise aufzuteilen, und mein Code hat funktioniert. Mein Code ist:

öffentliche Liste 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 ;
}

Ich hoffe dir zu helfen.

Samane
quelle
Vielen Dank für Ihre Hilfe, aber ich versuche, eine Lösung nur für PostGIS zu finden, da ich nicht weiß, wie ich QGIS mit JAVA verknüpfen kann.
Lunar Sea
QGIS ist in C ++ geschrieben und es gibt Python-Bindungen. So können Sie Ihre eigenen Anwendungen mit diesen Sprachen entwickeln. Sie können Java nicht verwenden. Sie können anstelle von postGIS verwenden.
Samane
Gibt es eine Möglichkeit, Polygon-Features durch Linestring-Features mit PostGIS ohne C ++ / Python-Anwendungen zu teilen? Ich habe keine Programmiererfahrung.
Lunar Sea
Sie verwenden PostGIS und Java, ohne dass C ++ und Python erforderlich sind. Sie können die Geotools auch in Java verwenden.
Samane