2016-09-14 3 views
1

Ich habe Probleme beim Schreiben/Lesen eines Shapefile in Python. Ich habe eine Reihe von Punkten, die ich mit pyshp in ein Polygon schreiben möchte. Die relevanten Teile des Codes sind:Schreiben in ein Shapefile

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) 

Dies verursacht einen Fehler:

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 

Wenn ich entfernen Sie die field und records Linien von 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') 

Dann erhalte ich eine AssertionError beim Lesen der Datensätze aus der Datei:

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: 

Als ich die Schleife entfernte und einen Datensatz schrieb, schien es in Ordnung zu sein. Was ist los?

Antwort

1

Ich weiß nicht über pyshp Bibliothek, aber ich werde versuchen, trotzdem zu helfen.

Die beiden Befehle treten in der for Schleife auf. Dies kann dazu führen, dass die beiden Spalten "ID" und "Events" mehrfach definiert werden. Wenn Sie nur einen Datensatz (Polygon) schreiben, funktioniert es einwandfrei (d. H. Der Befehl w.record() enthält zwei Werte). Nach der ersten Iteration würde es 4, 6 usw. Spalten geben. Das würde das Verhalten erklären, das du beschreibst.

Versuchen Sie, die beiden Zeilen vor die for loop zu verschieben.

Wenn Sie den w.record() kommentieren, erhalten Sie eine shp (und shx) mit einer Anzahl von Datensätzen unterscheidet sich von der entsprechenden dbf Datei Datei. Das erklärt den Assertionsfehler beim Lesen.

Unabhängig von Ihrem Problem könnten Sie auch Ihren Code mit enumerate (integrierte Funktion) vereinfachen.

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]] 
    .... 

Viel Glück (ich, da ich pyshp nicht haben nicht testen können)!

+0

Das hat es geschafft, danke! Ich kann nicht glauben, dass ich das nicht gesehen habe, obwohl ich mich stundenlang angeschaut habe ... – David

+0

Gern geschehen! –

Verwandte Themen