¿Cómo ST_Split características en una tabla por características en otra?

9

Necesito dividir los polígonos (capa 'pol') por cadenas de líneas cerradas y no cerradas (capa 'lin').

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Lamentablemente, no obtengo resultados adecuados al ejecutar la siguiente consulta.

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;

En mi ejemplo, ST_Split debería crear seis polígonos (capa 'splitted_pol').

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ¿Alguien sabe cómo usar ST_Split con QGIS / PostGIS?

Mar lunar
fuente
Necesitas alimentar a los geoms recursivamente ST_Split.
Jakub Kania
¿Me pueden ayudar con la consulta SQL? Soy nuevo en PostGIS.
Mar Lunar
¿Qué contienen exactamente sus capas de entrada? Veo la capa 'pol' con un cuadrado rojo y un polígono triangular y la capa 'lin' con solo una línea vertical azul oscuro. ¿Y por qué esperas 6 polígonos? No debería tener en cuenta la "frontera".
Stefan
He agregado una captura de pantalla para ilustrar las capas.
Mar Lunar
¿Hay alguna posibilidad de que pueda agregar las geometrías de entrada?
John Powell

Respuestas:

4

Podría crear una función como esta:

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;

Luego úsalo como:

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;

Esto le da los seis registros que espera. Es posible que desee agregar alguna comprobación / manejo de errores y no estoy seguro acerca de la escalabilidad.

travis
fuente
4

Estoy usando postGIS sql para dividir la función por línea en JAVA, y mi código funcionó. mi código es:

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

Espero ayudarte

Samane
fuente
Gracias por su ayuda, pero estoy tratando de encontrar una solución única para PostGIS ya que no sé cómo vincular QGIS con JAVA.
Mar Lunar
QGIS está escrito en C ++ y hay enlaces de Python. Para que pueda desarrollar sus propias aplicaciones utilizando esos idiomas. No puede usar Java. Puede usarlo en lugar de postGIS.
Samane
¿Hay alguna manera de dividir las características de polígono por características de cadena de línea usando PostGIS sin ninguna aplicación C ++ / Python? No tengo experiencia en programación.
Mar Lunar
Utiliza PostGIS y Java, sin la necesidad de C ++ y Python. También puedes usar los geotools en Java.
Samane