2017-10-31 45 views
0

GDAL/OGR API 또는 명령 줄 도구를 사용하여 겹치는 다각형을 분해 (병합) 할 수있는 방법이 있습니까? ? 나는 많은 것을 수색했고, 나는 무엇이 필요한지 닮은 것을 찾을 수 없다. 그러나이 문제가 아직 해결되지 않았을 가능성은 거의 없다고 생각합니다.연결되지 않은 결과를 구별하면서 겹치는 다각형 (GDAL/OGR 사용)을 쪼개십시오.

는 여기에 내가 필요에 대한 자세한 설명입니다 :

  • 내 입력은 단일 층 단일 모양 파일 (ESRI Shape 파일)로 구성되어 있습니다.
  • 이 레이어는 속성으로 구별 할 수없는 다각형을 포함합니다. (모두 동일한 속성을 가짐).
  • 그 중 다수가 겹쳐서 겹치는 사람들의 합집합을 얻고 싶습니다.
  • 연결되지 않은 영역은 별도의 다각형이됩니다.

문제의 원인이되는 마지막 지점입니다. 나는 기본적으로 내가 필요한 것을 얻는다. 마지막 점은 제외한다. 모양 파일을 녹이기위한 일반적인 해결책을 실행한다면

$ ogr2ogr -f "ESRI Shapefile" dissolved.shp input.shp -dialect sqlite -sql "select ST_union(Geometry) from input" 

영역이 연결되지 않아도 모든 것을 포함하는 단일 다각형으로 끝납니다.

업데이트 : 전적으로 GDAL을 제거하여 문제를 해결했습니다. 많은 소스에서 지적했듯이 일반적으로 형상 파일을 사용하여 피오나 및 매끄러운 도구를 사용하는 것이 더 나은 방법입니다. 아래에 내 솔루션을 게시했습니다.

답변

0

그래서 많은 실패한 시도 후에 나는 gdal/ogr을 버리고 매끈하고 피오나로 계속했습니다. 이것은 내가 필요한 것입니다. 내 데이터 집합이 자체 교차 폴리곤을 포함하고 있으므로 cascaded_union을 호출하기 전에 필터링해야하기 때문에 필터링이 필요했습니다.

import fiona                          
from shapely.ops import cascaded_union                    
from shapely.geometry import shape, mapping 

with fiona.open(src, 'r') as ds_in:                                                     
    crs = ds_in.crs 
    drv = ds_in.driver 

    filtered = filter(lambda x: shape(x["geometry"]).is_valid, list(ds_in))                     

    geoms = [shape(x["geometry"]) for x in filtered]             
    dissolved = cascaded_union(geoms)          

schema = {                          
    "geometry": "Polygon",                      
    "properties": {"id": "int"}                     
} 

with fiona.open(dst, 'w', driver=drv, schema=schema, crs=crs) as ds_dst:          
    for i,g in enumerate(dissolved):                   
     ds_dst.write({"geometry": mapping(g), "properties": {"id": i}})