如何通过一个表中的特征通过另一表中的特征ST_Split?


9

我需要通过封闭线和非封闭线串(图层“ lin”)拆分多边形(图层“ pol”)。

在此处输入图片说明 在此处输入图片说明

不幸的是,运行以下查询没有得到正确的结果。

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”)。

在此处输入图片说明 在此处输入图片说明 有人知道如何在QGIS / PostGIS中使用ST_Split吗?


您需要递归地将geoms喂入ST_Split
雅各布·卡尼亚

您能帮我进行SQL查询吗?我是PostGIS的新手。
月球海

您的输入层到底包含什么?我看到带有红色正方形和三角形多边形的'pol'层和只有一条深蓝色垂直线的'lin'层。为何还要6个多边形?我谁也不会考虑“边界”。
Stefan

我添加了一个截图来说明各层。
月球海

您是否有可能添加输入几何?
约翰·鲍威尔

Answers:


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

希望对您有帮助。


感谢您的帮助,但由于我不知道如何将QGIS与JAVA链接,因此我正在尝试找出仅PostGIS的解决方案。
月球海

QGIS用C ++编写,并且有Python绑定。因此,您可以使用这些语言开发自己的应用程序。您不能使用Java。可以使用代替postGIS。
萨曼妮

有没有一种方法可以使用PostGIS在没有任何C ++ / Python应用程序的情况下通过线串要素拆分多边形要素?我没有编程经验。
月球海

您可以使用PostGIS和Java,而无需C ++和Python。您也可以在Java中使用geotools。
萨曼妮(Samane)2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.