10 votos

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

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

enter image description here enter image description here

Desafortunadamente no obtengo resultados adecuados al realizar 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').

enter image description here enter image description here ¿Alguien sabe cómo usar ST_Split con QGIS/PostGIS?

0 votos

Es necesario alimentar los geoms recursivamente a ST_Split .

0 votos

¿Pueden ayudarme con la consulta SQL? Soy nuevo en PostGIS.

0 votos

¿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 sólo una línea vertical azul oscura. ¿Y por qué espera 6 polígonos? Yo no tendría en cuenta el "borde".

5voto

cristi _b Puntos 123

Podrías crear una función como ésta:

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;

Entonces ú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;

Así se obtienen los seis registros que se esperan. Es posible que quieras añadir alguna comprobación/manejo de errores y no estoy seguro de la escalabilidad.

4voto

P3trus Puntos 101

Estoy usando postGIS sql para dividir característica 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 que te ayude.

0 votos

Gracias por tu ayuda pero estoy tratando de encontrar una solución sólo para PostGIS ya que no sé cómo enlazar QGIS con JAVA.

0 votos

QGIS está escrito en C++ y hay enlaces a Python. Así que puedes desarrollar tus propias aplicaciones usando esos lenguajes. No se puede utilizar Java. Se puede utilizar en lugar de postGIS.

0 votos

¿Existe una manera de dividir las características de los polígonos por las de las cadenas de líneas utilizando PostGIS sin ninguna aplicación C++/Python? No tengo experiencia en programación.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X