Como ST_Split recursos em uma tabela por recursos em outra?

9

Preciso dividir polígonos (camada 'pol') por cadeias de linhas fechadas e não fechadas (camada 'lin').

insira a descrição da imagem aqui insira a descrição da imagem aqui

Infelizmente, não obtenho resultados adequados executando a seguinte 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;

No meu exemplo, o ST_Split deve criar seis polígonos (camada 'splitted_pol').

insira a descrição da imagem aqui insira a descrição da imagem aqui Alguém sabe como usar ST_Split com QGIS / PostGIS?

Mar Lunar
fonte
Você precisa alimentar os geoms recursivamente ST_Split.
Jakub Kania
Você pode me ajudar com a consulta SQL? Eu sou novo no PostGIS.
Mar Lunar
O que exatamente suas camadas de entrada contêm? Vejo a camada 'pol' com um quadrado vermelho e um polígono triângulo e a camada 'lin' com apenas uma linha vertical azul escura. E por que você espera 6 polígonos? Eu não levaria em conta a "fronteira".
Stefan
Eu adicionei uma captura de tela para ilustrar as camadas.
Mar Lunar
Alguma chance de você adicionar as geometrias de entrada?
John Powell

Respostas:

4

Você pode criar uma função parecida com 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;

Em seguida, use-o 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;

Isso fornece os seis registros que você espera. Você pode adicionar alguma verificação / tratamento de erros e não tenho certeza sobre escalabilidade.

travis
fonte
4

Estou usando o postGIS sql para dividir o recurso por linha em JAVA, e meu código funcionou. meu código é:

lista pública 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 te ajudar.

Samane
fonte
Obrigado por sua ajuda, mas estou tentando descobrir uma solução única para o PostGIS, pois não sei como vincular o QGIS ao JAVA.
Mar Lunar
O QGIS é escrito em C ++ e existem ligações Python. Assim, você pode desenvolver seus próprios aplicativos usando esses idiomas. Você não pode usar Java. Você pode usar em vez de postGIS.
Samane 12/07/2015
Existe uma maneira de dividir recursos de polígono usando recursos de cadeia de linhas usando PostGIS sem nenhum aplicativo C ++ / Python? Não tenho experiência em programação.
Mar Lunar
Você usa PostGIS e Java, sem a necessidade de C ++ e Python. Você também pode usar os geotools em Java.
Samane