2014-02-17 3 views
0

Я новичок в Shapely (но в восторге от этого), и недавно я обнаружил немного дорожного удара.Как извлечь внутренние координаты полигона с помощью Shapely?

У меня есть файл формы полигона, который я читаю через Fiona. Этот файл формы содержит BOTH многоугольные и многопольные элементы, и мне нужно построить массив для каждой функции всех координат внутри него (то есть как внешний, так и/или внутренний). Примечательно, что два элемента многоугольника имеют внутренние кольца (и они действительны).

У меня, кажется, нет проблем с доступом к внешним координатам многоугольника (многоугольников)/multipolygon (s) ... но я не тяну что-либо для внутренних координат.

Нужно ли здесь использовать новый подход (то есть LinearRings) ...?

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

Внутренние и наружные кольца структурированы по-разному. Для любого многоугольника всегда существует 1 внешнее кольцо с нулевым или большим количеством внутренних колец.

Так, глядя на структуру геометрии, exterior является объектом LinearRing и interiors является список из нуля или более LinearRing объектов. Любой объект LinearRing будет иметь coords, который вы можете нарезать, чтобы просмотреть список координат с помощью coords[:].

Следующая функция, которая возвращает Dict списков внешних и внутренних координат:

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

Хорошо ... хорошо, я был принят, что блок ... но я не могу удалить координату (т.е. элемент) из списка .coords? Я продолжаю получать: >> TypeError: объект «CoordinateSequence» не поддерживает удаление элемента в >> для i в отсортированном (removeList, reverse = True): del ring.coords [i] – user14696