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?


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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.