Як ST_Split функції в одній таблиці за особливостями в іншій?


9

Мені потрібно розділити багатокутники (шар 'pol') на закриті та не закриті рядки (шар 'lin').

введіть тут опис зображення введіть тут опис зображення

На жаль, я не отримую належних результатів за допомогою наступного запиту.

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;

У моєму прикладі ST_Split повинен створити шість полігонів (шар 'splitted_pol').

введіть тут опис зображення введіть тут опис зображення Хтось знає, як використовувати ST_Split з QGIS / PostGIS?


Годувати гемів потрібно рекурсивно ST_Split.
Якуб Каня

Чи можете ви мені допомогти з запитом SQL? Я новачок у PostGIS.
Місячне море

Що саме містять ваші вхідні шари? Я бачу шар 'pol' з червоним квадратом і трикутником багатокутник і шар 'lin' лише однією темно-синьою вертикальною лінією. І чому ви очікуєте 6 багатокутників? Я б не взяв до уваги "кордон".
Стефан

Я додав скріншот для ілюстрації шарів.
Місячне море

Будь-який шанс ви могли додати геометрії введення?
Джон Пауелл

Відповіді:


4

Ви можете створити функцію приблизно так:

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;

Потім використовуйте його так:

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;

Це дає шість записів, яких ви очікуєте. Ви можете додати перевірку / обробку помилок, і я не впевнений у масштабованості.


4

Я використовую postGIS sql, щоб розділити функцію по рядку в JAVA, і мій код працював. мій код:

загальнодоступний список 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 ;
}

Сподіваюся, допоможу вам.


Дякую за вашу допомогу, але я намагаюся знайти єдине рішення для PostGIS, оскільки я не знаю, як пов’язати QGIS з JAVA.
Місячне море

QGIS написаний на C ++ і є прив'язки Python. Таким чином, ви можете розробляти власні програми, використовуючи ці мови. Ви не можете використовувати Java.Ви можете використовувати замість postGIS.
Samane

Чи є спосіб розділити функції багатокутника за допомогою рядкових рядків за допомогою PostGIS без будь-яких додатків C ++ / Python? У мене немає досвіду програмування.
Місячне море

Ви використовуєте PostGIS та Java, без потреби в C ++ та Python. Ви також можете використовувати geotools на Java.
Samane
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.