한 테이블의 기능을 다른 테이블의 기능으로 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은 6 개의 다각형 (레이어 'splitted_pol')을 만들어야합니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 QGIS / PostGIS에서 ST_Split을 사용하는 방법을 아는 사람이 있습니까?


지오메트리를 반복적으로 피드해야합니다 ST_Split.
Jakub Kania

SQL 쿼리를 도와 주시겠습니까? PostGIS를 처음 사용합니다.
Lunar Sea

입력 레이어에는 정확히 무엇이 들어 있습니까? 빨간색 사각형이있는 레이어 'pol'과 삼각형 다각형과 하나의 진한 파란색 세로선이있는 레이어 'lin'이 보입니다. 그리고 왜 6 개의 다각형을 기대합니까? 나는 "테두리"를 고려하지 않았다.
Stefan

레이어를 설명하기 위해 스크린 샷을 추가했습니다.
Lunar Sea

입력 지오메트리를 추가 할 수 있습니까?
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 (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 전용 솔루션을 찾으려고합니다.
Lunar Sea

QGIS는 C ++로 작성되었으며 Python 바인딩이 있습니다. 따라서 해당 언어를 사용하여 고유 한 응용 프로그램을 개발할 수 있습니다. Java를 사용할 수 없으며 postGIS 대신 사용할 수 있습니다.
Samane

C ++ / Python 응용 프로그램없이 PostGIS를 사용하여 폴리곤 피처를 선 스트링 피처로 나누는 방법이 있습니까? 프로그래밍 경험이 없습니다.
Lunar Sea

C ++과 Python이 없어도 PostGIS와 Java를 사용합니다. Java에서 geotools를 사용할 수도 있습니다.
Samane
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.