2014-02-17 9 views
0

저는 신중하게 (그러나 그것에 대해 열성적입니다) 새로운 것이 었습니다. 최근에는 약간의 도로 충돌을 발견했습니다.Shapely를 사용하여 내부 폴리곤 좌표를 추출하는 방법은 무엇입니까?

나는 피오나를 통해 읽고있는 다각형 모양 파일을 가지고 있습니다. 이 shapefile에는 다각형 및 다중 다각형 항목이 모두 포함되어 있으며 그 안에 모든 좌표 (즉, 외부 및/또는 내부 모두)의 각 피처에 대한 h 열을 작성해야합니다. 특히, 다각형 항목 중 두 개에는 내부 링이 있습니다 (유효합니다).

다각형 (polygon)/다중 다각형 (polygong)의 외부 좌표를 액세스하는 데 아무런 문제가없는 것 같지만 인테리어 좌표를 위해 아무 것도 당기지 않습니다.

새로운 접근 방식 (예 : 선형 정렬)을 취해야합니까?

def convert_polygons(inFile): 

    for polys in fiona.open(inFile): 
     myShape = shape(polys['geometry']) 
     exterior_poly = 0 
     interior_poly = 0 
     if isinstance(myShape, Polygon): 
      print "yes, I am a polygon" 
      # count how many points for each interior polygon 
      try: 
       interior_poly += len(myShape.interior.coords) 
      except: 
       pass 
      # count how many points for each exterior polygon 
      exterior_poly += len(myShape.exterior.coords) 
      geomArray = asarray(myShape.exterior) 
      print geomArray 
      print "number of interior points in polygon " + str(interior_poly) 
      print "number of exterior points in polygon " + str(exterior_poly) 
     elif isinstance(myShape, MultiPolygon): 
      print "yes, I am a MultiPolygon" 
      # count how many points for each interior polygon 
      try: 
       interior_poly += len(myShape.interior.coords) 
      except: 
       pass 
      try: 
       # count how many points for each exterior polygon 
       exterior_poly += len(myShape.exterior.coords) 
      except: 
       pass 
      try: 
       geomArray = asarray(myShape.interior) 
      except: 
       pass 
      try: 
       geomArray = asarray(myShape.exterior) 
      except: 
       pass 
      print geomArray 
      print "number of interior points in polygon " + str(interior_poly) 
      print "number of exterior points in polygon " + str(exterior_poly) 

답변

6

내부 및 외부 링은 다르게 구성됩니다. 모든 다각형의 경우 항상 0 이상의 내부 링이있는 외부 링이 1 개 있습니다.

그래서 기하학의 구조에서 찾고, exteriorLinearRing 객체이며, interiors 0 개 이상의 LinearRing 객체의 목록입니다. LinearRing 개체는 coords이되며이 개체를 슬라이스하여 coords[:]의 좌표 목록을 볼 수 있습니다.

def extract_poly_coords(geom): 
    if geom.type == 'Polygon': 
     exterior_coords = geom.exterior.coords[:] 
     interior_coords = [] 
     for interior in geom.interiors: 
      interior_coords += interior.coords[:] 
    elif geom.type == 'MultiPolygon': 
     exterior_coords = [] 
     interior_coords = [] 
     for part in geom: 
      epc = extract_poly_coords(part) # Recursive call 
      exterior_coords += epc['exterior_coords'] 
      interior_coords += epc['interior_coords'] 
    else: 
     raise ValueError('Unhandled geometry type: ' + repr(geom.type)) 
    return {'exterior_coords': exterior_coords, 
      'interior_coords': interior_coords} 

예 :

다음

은 외부와 내부 좌표 목록의 딕셔너리를 반환하는 함수입니다

extract_poly_coords(myShape) 
+0

좋아 ... 음, 나는 블록 있음을 통과있어 ... 그러나 .coord 목록에서 좌표 (즉, 항목)를 삭제할 수는 없습니까? 계속 >> >> TypeError : 'CoordinateSequence'객체가 정렬 된 (removeList, reverse = True)에 대해 항목 삭제를 지원하지 않습니다. del ring.coords [i] – user14696