Jak ST_Split funkcje w jednej tabeli według funkcji w innej?

9

Muszę podzielić wielokąty (warstwa „pol”) zarówno na zamknięte, jak i nie zamknięte linie (warstwa „lin”).

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Niestety nie otrzymuję poprawnych wyników po uruchomieniu następującego zapytania.

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;

W moim przykładzie ST_Split powinien utworzyć sześć wielokątów (warstwa „splitted_pol”).

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj Czy ktoś wie, jak używać ST_Split z QGIS / PostGIS?

Morze Księżycowe
źródło
Musisz rekurencyjnie karmić geomy ST_Split.
Jakub Kania
Czy możesz mi pomóc z zapytaniem SQL? Jestem nowy w PostGIS.
Morze Księżycowe
Co dokładnie zawierają twoje warstwy wejściowe? Widzę warstwę „pol” z czerwonym kwadratem i trójkątem w kształcie wielokąta oraz warstwę „lin” z tylko jedną ciemnoniebieską pionową linią. A dlaczego oczekujesz 6 wielokątów? Nie wziąłbym pod uwagę „granicy”.
Stefan
Dodałem zrzut ekranu ilustrujący warstwy.
Lunar Sea
Czy jest szansa na dodanie geometrii wejściowych?
John Powell,

Odpowiedzi:

4

Możesz stworzyć funkcję mniej więcej taką:

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;

Następnie użyj go w następujący sposób:

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;

To daje sześć rekordów, których oczekujesz. Możesz dodać trochę sprawdzania / obsługi błędów i nie jestem pewien co do skalowalności.

Travis
źródło
4

Używam postGIS sql do dzielenia funkcji według linii w JAVA, a mój kod działał. mój kod to:

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

Mam nadzieję, że ci pomogę.

Samane
źródło
Dziękuję za pomoc, ale staram się znaleźć rozwiązanie oparte wyłącznie na PostGIS, ponieważ nie wiem, jak połączyć QGIS z JAVA.
Morze
QGIS jest napisany w C ++ i istnieją powiązania Pythona. Możesz więc tworzyć własne aplikacje w tych językach. Nie możesz używać Java. Możesz używać zamiast postGIS.
Samane,
Czy istnieje sposób na podzielenie elementów wielokąta przez wstawianie elementów za pomocą PostGIS bez żadnych aplikacji C ++ / Python? Nie mam doświadczenia w programowaniu.
Morze
Korzystasz z PostGIS i Java, bez potrzeby używania C ++ i Pythona. Możesz także korzystać z narzędzi geotools w Javie.
Samane,