Làm cách nào để ST_Split các tính năng trong một bảng bằng các tính năng trong một bảng khác?


9

Tôi cần phải phân chia đa giác (lớp 'pol') bằng cả hai linestrings đóng và không đóng (lớp 'lin').

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Thật không may, tôi không nhận được kết quả thích hợp khi chạy truy vấn sau.

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;

Trong ví dụ của tôi, ST_Split sẽ tạo ra sáu đa giác (lớp 'splited_pol').

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây Có ai biết cách sử dụng ST_Split với QGIS / PostGIS không?


Bạn cần phải nuôi các đệ quy đệ quy ST_Split.
Jakub Kania

Bạn có thể vui lòng giúp tôi với truy vấn SQL không? Tôi mới biết đến PostGIS.
Biển âm lịch

Chính xác thì lớp đầu vào của bạn chứa gì? Tôi thấy lớp 'pol' với hình vuông màu đỏ và đa giác tam giác và lớp 'lin' chỉ có một đường thẳng đứng màu xanh đậm. Và tại sao bạn mong đợi 6 đa giác? Tôi không nên đưa "biên giới" vào tài khoản.
Stefan

Tôi đã thêm một ảnh chụp màn hình để minh họa các lớp.
Biển âm lịch

Bất kỳ cơ hội bạn có thể thêm hình học đầu vào?
John Powell

Câu trả lời:


4

Bạn có thể tạo chức năng như thế này:

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;

Sau đó sử dụng nó như:

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;

Điều này cung cấp cho sáu hồ sơ bạn đang mong đợi. Bạn có thể muốn thêm một số kiểm tra / xử lý lỗi và tôi không chắc về khả năng mở rộng.


4

Tôi đang sử dụng postGIS sql để phân chia tính năng theo dòng trong JAVA và mã của tôi đã hoạt động. mã của tôi là:

Danh sách công khai splitGeometry (Chuỗi 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 ;
}

Tôi hy vọng giúp bạn.


Cảm ơn sự giúp đỡ của bạn nhưng tôi đang cố gắng tìm ra giải pháp duy nhất cho PostGIS vì tôi không biết cách liên kết QGIS với JAVA.
Âm lịch

QGIS được viết bằng C ++ và có các ràng buộc Python. Vì vậy, bạn có thể phát triển các ứng dụng của riêng mình bằng các ngôn ngữ đó. Bạn không thể sử dụng Java. Bạn có thể sử dụng thay vì postGIS.
Samane 12/07/2015

Có cách nào để phân chia các tính năng đa giác bằng các tính năng linestring bằng PostGIS mà không cần bất kỳ ứng dụng C ++ / Python nào không? Tôi chưa có kinh nghiệm lập trình.
Biển âm lịch

Bạn sử dụng PostGIS và Java, không cần C ++ và Python. Bạn cũng có thể sử dụng các geotool trong Java.
Samane
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.