Mehr

Erstellen von Datensätzen im Ausgabe-Shapefile mit Python


Ich habe eine Liste (Ausgabe aus einer vorherigen Schleife) mit Attributen aus einem Eingabe-Shapefile. Woran ich feststecke, ist die Eingabe dieser Attribute in ein neues Shapefile.

Ich habe die Punktdaten mit gezeichnetw.Punkt(x, y)und auch die entsprechenden Felder angelegtw.field()aus den Eingabe-Shapefile-Feldern.

Wo ich feststecke, ist die Kopie der Aufzeichnungen, die mir einen Fehler im Zusammenhang mit dem Löschkennzeichen gibt.

AttributeError: 'tuple'-Objekt hat kein Attribut 'startswith'

Ich füge einen Abschnitt des Codes mit meinen Abfragen ein.

from datetime import datetime import osgeo.ogr, osgeo.ogr from osgeo import ogr from osgeo import gdal import shapefile import os sf = shapefile.Reader("-- Input File Location --") # Auslesen der Shapefile-Felder = sf.fields # Lesen der Attributfelder records = sf.records() # Lesen der Datensätze der Features shapRecs = sf.shapeRecords() # Lesen von Geometrie und Datensätzen gleichzeitig w = shapefile.Writer(shapefile.POINT) w.autoBalance = 1 result1 = [] Ergebnis2 = [] # ??? Liegt der Fehler daran, dass wir keine Liste in einer Liste abfragen können??? print '** Funktion pt(p) aufrufen, wobei p der Knotenindex ist… **' # Aufforderung an den Benutzer, # die Funktion mit # der erforderlichen Anzahl von Knoten aufzurufen def pt(p): for i in range(len(shapRecs) ): u = shapRecs[i].shape.points[p-1] # Liefert die XY-Koordinaten # der abgefragten Punkte v = shapRecs[i].record[0:] # Generieren der Attribute result1.append(u) result2 .append(v) w.point(u[0], u[1]) # Erzeuge bei jedem Schleifendurchlauf Punkte aus Koordinaten w.autoBalance = 1 # -- Hinzufügen der Felder w.field(fields[0]) # Hinzufügen des ersten Felds, WITH Deletion Flag (???) für i in range(1, len(fields)): # Schleife beginnt mit dem zweiten Feld (???) w.field(fields[i]) w.autoBalance = 1 # CODE ZEIGT DEN OBEN ANGEGEBENEN FEHLER DER Anweisung w.record() AN # -- Hinzufügen der Datensätze für i in range(len(result2)): w.record(*result2[i]) w.autoBalance = 1 w .save('-- Speicherort der Ausgabedatei --')

Ich verstehe dein Drehbuch nicht. Warum PyShp (Shapefile) verwenden, wenn Sie osgeo.ogr verwenden? Sie könnten dasselbe nur mit ogr tun (bessere Möglichkeit, eine Ebene mit ogr in Python zu duplizieren?).

Wenn Sie ogr und gdal aus osgeo importieren möchten, ist die Formulierung

osgeo.ogr importieren, osgeo.ogr von osgeo importieren ogr von osgeo importieren gdal . importieren

ist eine Redundanz (Sie importieren ogr und gdal zweimal)

Gleiches fürsf.records()undsf.shapeRecords():

sf = shapefile.Reader("strati") records = sf.records() # Auslesen der Datensätze der Features für rec in records: print rec [30, 130, 'incl'] [55, 145, 'incl'] [ 40, 155, 'inkl']

und

shapRecs = sf.shapeRecords() for rec in shapRecs: print rec.record [30, 130, 'incl'] [55, 145, 'incl'] [40, 155, 'incl']

Wenn Sie nur die Geometrie wollen:

for rec in sf.iterShapes(): x,y = rec.points[0] print x,y 272070.600041, 155389.3879200000 271066.03214800003, 154475.63137700001 273481.498868, 153923.49298800001

und

für rec in shapRecs: x,y = rec.shape.points[0]

Wenn Sie nur das Shapefile kopieren möchten:

w = shapefile.Writer(shapefile.POINT) sf = shapefile.Reader("strati") w.fields = list(sf.fields) für rec in sf.records(): w.records.append(rec) w._shapes .extend(sf.shapes()) w.save("duplizieren")

Wenn Sie ein Feld hinzufügen möchten, lesen Sie Hinzufügen eines Felds zu einem vorhandenen Shapefile

Wenn Sie Listen wünschen, ist der einfachste Weg:

sf = shapefile.Reader("yourfile.shp") shape = sf.shapes() # -> Liste aller Geometrien fields = sf.fields[1:] #-> Felddefinition in einer Liste (ohne Deletion Flag) field_names = = [field[0] für Feld in Feldern] #-> Liste der Feldnamen Attribute = sf.records() #-> Liste mit allen Attributen