Как 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.
— Самане

Есть ли способ разделить полигональные объекты по линейным функциям, используя PostGIS без каких-либо приложений на C ++ / Python? У меня нет опыта программирования.
— Лунное море

Вы используете PostGIS и Java, без необходимости в C ++ и Python. Вы также можете использовать geotools в Java.
— Самане
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.