Comment ST_Split fonctionnalités dans une table par fonctionnalités dans un autre?

9

J'ai besoin de diviser les polygones (couche 'pol') en chaînes fermées et non fermées (couche 'lin').

entrez la description de l'image ici entrez la description de l'image ici

Malheureusement, je n'obtiens pas de résultats corrects en exécutant la requête suivante.

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;

Dans mon exemple, ST_Split devrait créer six polygones (couche 'splitted_pol').

entrez la description de l'image ici entrez la description de l'image ici Quelqu'un sait-il comment utiliser ST_Split avec QGIS / PostGIS?

Mer lunaire
la source
Vous devez alimenter les geoms récursivement ST_Split.
Jakub Kania
Pouvez-vous m'aider avec la requête SQL? Je suis nouveau sur PostGIS.
Mer lunaire
Que contiennent exactement vos couches d'entrée? Je vois la couche «pol» avec un carré rouge et un polygone triangulaire et la couche «lin» avec une seule ligne verticale bleu foncé. Et pourquoi attendez-vous 6 polygones? Je ne prendrais pas en compte la "frontière".
Stefan
J'ai ajouté une capture d'écran pour illustrer les calques.
Lunar Sea
Y a-t-il une chance que vous puissiez ajouter les géométries d'entrée?
John Powell

Réponses:

4

Vous pouvez créer une fonction comme ceci:

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;

Ensuite, utilisez-le comme:

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;

Cela donne les six enregistrements que vous attendez. Vous voudrez peut-être ajouter une vérification / gestion des erreurs et je ne suis pas sûr de l'évolutivité.

travis
la source
4

J'utilise sql postGIS pour diviser la fonctionnalité par ligne dans JAVA, et mon code a fonctionné. mon code est:

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

J'espère vous aider.

Samane
la source
Merci pour votre aide, mais j'essaie de trouver une solution PostGIS uniquement car je ne sais pas comment lier QGIS à JAVA.
Lunar Sea
QGIS est écrit en C ++ et il existe des liaisons Python. Vous pouvez donc développer vos propres applications en utilisant ces langages. Vous ne pouvez pas utiliser Java. Vous pouvez utiliser à la place de postGIS.
Samane
Existe-t-il un moyen de fractionner des entités surfaciques en utilisant des entités de chaîne de lignes à l'aide de PostGIS sans aucune application C ++ / Python? Je n'ai aucune expérience en programmation.
Lunar Sea
Vous utilisez PostGIS et Java, sans avoir besoin de C ++ et Python. Vous pouvez également utiliser les géotools en Java.
Samane