Come ST_Split funzionalità in una tabella con funzionalità in un'altra?


9

Ho bisogno di dividere i poligoni (strato 'pol') per linee chiuse e non chiuse (livello 'lin').

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Sfortunatamente non ottengo risultati corretti eseguendo la seguente query.

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;

Nel mio esempio ST_Split dovrebbe creare sei poligoni (layer 'splitted_pol').

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine Qualcuno sa come utilizzare ST_Split con QGIS / PostGIS?


Devi alimentare i geom in modo ricorsivo ST_Split.
— Jakub Kania,

Potete per favore aiutarmi con la query SQL? Sono nuovo di PostGIS.
— Mare lunare,

Cosa contengono esattamente i livelli di input? Vedo il livello "pol" con un quadrato rosso e un poligono triangolare e il livello "lin" con una sola linea verticale blu scuro. E perché ti aspetti 6 poligoni? Non avrei dovuto prendere in considerazione il "confine".
— Stefan,

Ho aggiunto uno screenshot per illustrare i livelli.
— Lunar Sea,

Qualche possibilità che tu possa aggiungere le geometrie di input?
— John Powell,

Risposte:


4

È possibile creare una funzione simile a questa:

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;

Quindi usalo come:

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;

Ciò fornisce i sei record che ti aspetti. Potresti voler aggiungere qualche controllo / gestione degli errori e non sono sicuro della scalabilità.


4

Sto usando PostGIS sql per dividere funzionalità per riga in JAVA e il mio codice ha funzionato. il mio codice è:

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

Spero di aiutarti.


Grazie per il vostro aiuto, ma sto cercando di trovare una soluzione PostGIS unica poiché non so come collegare QGIS a JAVA.
— Mare lunare,

QGIS è scritto in C ++ e ci sono collegamenti Python. Quindi puoi sviluppare le tue applicazioni usando quelle lingue. Non puoi usare Java. Puoi usare al posto di postGIS.
— Samane,

Esiste un modo per dividere le funzioni poligonali tramite il linestring delle funzioni utilizzando PostGIS senza applicazioni C ++ / Python? Non ho esperienza di programmazione.
— Mare lunare,

Utilizzate PostGIS e Java, senza la necessità di C ++ e Python. Puoi anche usare i geotools in Java.
— Samane,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.