¿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?


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.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.