한 테이블의 기능을 다른 테이블의 기능으로 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.