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.