2016-09-14 10 views
1

У меня возникли проблемы с записью/чтением Shapefile в python. У меня есть массив точек, которые я бы хотел написать в многоугольник, используя pyshp. Соответствующие части кода являются:Запись в файл Shape

dividedRects = [(7598325.0, 731579.0, 7698325.0, 631579.0), (7598325.0, 631579.0, 7698325.0, 611641.0), (7698325.0, 731579.0, 7728636.0, 631579.0), (7698325.0, 631579.0, 7728636.0, 611641.0)] 

def createPolys(dividedRects): 
    w = shapefile.Writer(shapefile.POLYGON) 
    for i in range(0, len(dividedRects)): 
     print i 
     topLeft = [dividedRects[i][0],dividedRects[i][1]] 
     topRight = [dividedRects[i][2], dividedRects[i][1]] 
     bottomRight = [dividedRects[i][2], dividedRects[i][3]] 
     bottomLeft = [dividedRects[i][0], dividedRects[i][3]] 
     w.poly(parts=[[topLeft,topRight,bottomRight,bottomLeft]]) 
     w.field("ID", "C", "40") 
     w.field("Events", "C", "40") 
     w.record(str(i), str(0)) 
    w.save('cellFile') 

createPolys(dividedRects) 

Это приводит к ошибке:

IndexError        Traceback (most recent call last) 
<ipython-input-36-503affbe838b> in <module>() 
----> 1 createPolys(dividedRects) 

<ipython-input-35-4c552ae29bc7> in createPolys(dividedRects) 
    10   w.field("ID", "C", "40") 
    11   w.field("Events", "C", "40") 
---> 12   w.record(str(i), str(0)) 
    13  w.save('cellFile') 
    14 #  topLeft = [dividedRects[1][0],dividedRects[1][1]] 

C:\Users\Me\Anaconda2\lib\site-packages\shapefile.pyc in record(self, *recordList, **recordDict) 
    967   if self.fields[0][0].startswith("Deletion"): fieldCount -= 1 
    968   if recordList: 
--> 969    [record.append(recordList[i]) for i in range(fieldCount)] 
    970   elif recordDict: 
    971    for field in self.fields: 

IndexError: tuple index out of range 

Если удалить field и records линии от createPolys:

def createPolys(dividedRects): 
    w = shapefile.Writer(shapefile.POLYGON) 
    for i in range(0, len(dividedRects)): 
     print i 
     topLeft = [dividedRects[i][0],dividedRects[i][1]] 
     topRight = [dividedRects[i][2], dividedRects[i][1]] 
     bottomRight = [dividedRects[i][2], dividedRects[i][3]] 
     bottomLeft = [dividedRects[i][0], dividedRects[i][3]] 
     w.poly(parts=[[topLeft,topRight,bottomRight,bottomLeft]]) 
#   w.field("ID", "C", "40") 
#   w.field("Events", "C", "40") 
#   w.record(str(i), str(0)) 
    w.save('cellFile') 

Тогда я получаю AssertionError при чтении записей из файла:

createPolys(dividedRects) 

sf2 = shapefile.Reader("cellFile") 
print sf2.records() 
shapes = sf2.shapes() 
bbox = shapes[1].bbox 
#['%.3f' % coord for coord in bbox] 
print bbox 
points = shapes[1].points 
print points 

AssertionError       Traceback (most recent call last) 
<ipython-input-37-597af0b882ba> in <module>() 
     1 sf2 = shapefile.Reader("cellFile") 
----> 2 print sf2.records() 
     3 shapes = sf2.shapes() 
     4 bbox = shapes[1].bbox 
     5 #['%.3f' % coord for coord in bbox] 

C:\Users\Me\Anaconda2\lib\site-packages\shapefile.pyc in records(self) 
    528   """Returns all records in a dbf file.""" 
    529   if not self.numRecords: 
--> 530    self.__dbfHeader() 
    531   records = [] 
    532   f = self.__getFileObj(self.dbf) 

C:\Users\Me\Anaconda2\lib\site-packages\shapefile.pyc in __dbfHeader(self) 
    464    self.fields.append(fieldDesc) 
    465   terminator = dbf.read(1) 
--> 466   assert terminator == b("\r") 
    467   self.fields.insert(0, ('DeletionFlag', 'C', 1, 0)) 
    468 

AssertionError: 

Когда я удалил цикл и написал одну запись, казалось, что все работает нормально. Что происходит?

ответ

1

Я не знаю о библиотеке pyshp, но я попробую помочь в любом случае.

Команды w.field() происходят в цикле for. Это может привести к тому, что два столбца «ID» и «События» будут определены несколько раз. Когда вы пишете только одну запись (многоугольник), она работает нормально (т. Е. Команда содержит два значения). После первой итерации будут 4, 6 и т. Д. Столбцы. Это объясняет поведение, которое вы описываете.

Попробуйте переместить две линии w.field() до for loop.

Когда вы прокомментируете w.record(), вы получите shpshx) файл с количеством записей, отличных от соответствующего dbf файла. Это объясняет ошибку утверждения при чтении.

Не связанный с вашей проблемой, вы также можете упростить код с помощью enumerate (встроенная функция).

w = shapefile.Writer(shapefile.POLYGON) 
w.field("ID", "C", "40") 
w.field("Events", "C", "40")  
for i,rect1 in enumerate(dividedRects): 
    print i 
    topLeft = [rect1[0],rect1[1]] 
    topRight = [rect1[2], rect1[1]] 
    bottomRight = [rect1[2], rect1[3]] 
    bottomLeft = [rect1[0], rect1[3]] 
    .... 

(я не могу проверить, так как у меня нет pyshp) Удачи!

+0

Это сделало, спасибо! Я не могу поверить, что я этого не видел, хотя я смотрел, если часами ... – David

+0

Добро пожаловать! –

 Смежные вопросы

  • Нет связанных вопросов^_^