Как 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 ;
}

Я надеюсь помочь вам.

Samane
источник
Спасибо за вашу помощь, но я пытаюсь найти решение только для PostGIS, так как я не знаю, как связать QGIS с JAVA.
Лунное море
QGIS написан на C ++ и есть привязки Python. Таким образом, вы можете разрабатывать свои собственные приложения, используя эти языки. Вы не можете использовать Java. Вы можете использовать вместо postGIS.
Самане
Есть ли способ разделить полигональные объекты по линейным функциям, используя PostGIS без каких-либо приложений на C ++ / Python? У меня нет опыта программирования.
Лунное море
Вы используете PostGIS и Java, без необходимости в C ++ и Python. Вы также можете использовать geotools в Java.
Самане