วิธีการ ST_Split คุณสมบัติในตารางหนึ่งโดยคุณสมบัติในอื่น


9

ฉันต้องการแยกรูปหลายเหลี่ยม (เลเยอร์ 'pol') โดย linestrings ทั้งปิดและไม่ปิด (เลเยอร์ '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


คุณต้องป้อน geoms ซ้ำST_Split
Jakub Kania

คุณช่วยฉันด้วยแบบสอบถาม SQL ได้ไหม? ฉันใหม่กับ PostGIS
Sea Lunar

ชั้นข้อมูลเข้าของคุณมีอะไรบ้าง ฉันเห็นเลเยอร์ 'pol' ที่มีสี่เหลี่ยมสีแดงและรูปหลายเหลี่ยมสามเหลี่ยมและเลเยอร์ 'lin' ที่มีเส้นแนวตั้งสีน้ำเงินเข้มเพียงเส้นเดียว แล้วทำไมคุณถึงคาดหวัง 6 รูปหลายเหลี่ยม? ฉันไม่ควรคำนึงถึง "เส้นขอบ"
Stefan

ฉันได้เพิ่มภาพหน้าจอเพื่อแสดงเลเยอร์
Sea Lunar

โอกาสใดที่คุณสามารถเพิ่มรูปทรงเรขาคณิตของอินพุต
John Powell

คำตอบ:


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 (สตริง geom1, สตริง 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
Sea Lunar

QGIS เขียนใน C ++ และมีการผูก Python ดังนั้นคุณสามารถพัฒนาแอปพลิเคชันของคุณเองโดยใช้ภาษาเหล่านั้น คุณไม่สามารถใช้ Java คุณสามารถใช้แทน postGIS
Samane

มีวิธีการแยกคุณสมบัติรูปหลายเหลี่ยมด้วยการคืนคุณสมบัติโดยใช้ PostGIS โดยไม่มีแอปพลิเคชัน C ++ / Python หรือไม่ ฉันไม่มีประสบการณ์การเขียนโปรแกรม
Sea Lunar

คุณใช้ PostGIS และ Java โดยไม่จำเป็นต้องใช้ C ++ และ Python คุณยังสามารถใช้ geotools ใน Java
Samane
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.