Ich habe eine Shapefile mit 80.000 Polygonen, die sie nach einem bestimmten Feld namens "OTA" gruppiert sind.Shapefile zu MDB mit benutzerdefinierten Feldstruktur
Ich wollte jedes Shapefile (seine Attributtabelle) in MDB-Datenbank (nicht Personal Geodatabase) mit einer Tabelle mit dem gleichen Namen wie das Shapefile und mit einer gegebenen Feldstruktur konvertieren.
Im Code, den ich habe ich auf Python 2 neue Module zu laden hatte:
pypyodbc
und adodbapi
Das erste Modul die MDB-Datei für jede Shape-Datei zu erstellen verwendet wurde und die zweite die Tabelle in der mdb zu erstellen und Füllen Sie die Tabelle mit den Daten aus der Attributtabelle der Shapefile.
Der Code kam ich mit ist die folgende:
import pypyodbc
import adodbapi
Folder = ur'C:\TestPO' # Folder to save the mdbs
FD = Folder+ur'\27ALLPO.shp' # Shapefile
Map = u'PO' # Map type
N = u'27' # Prefecture
OTAList = sorted(set([row[0] for row in arcpy.da.SearchCursor(FD,('OTA'))]))
cnt = 0
for OTAvalue in OTAList:
cnt += 1
dbname = N+OTAvalue+Map
pypyodbc.win_create_mdb(Folder+'\\'+dbname+'.mdb')
conn_str = (r"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Folder+"\\"+dbname+ur".mdb;")
conn = adodbapi.connect(conn_str)
crsr = conn.cursor()
SQL = "CREATE TABLE ["+dbname+"] ([FID] INT,[AREA] FLOAT,[PERIMETER] FLOAT,[KA_PO] VARCHAR(10),[NOMOS] VARCHAR(2),[OTA] VARCHAR(3),[KATHGORPO] VARCHAR(2),[KATHGORAL1] VARCHAR(2),[KATHGORAL2] VARCHAR(2),[LABEL_PO] VARCHAR(8),[PHOTO_45] VARCHAR(14),[PHOTO_60] VARCHAR(10),[PHOTO_PO] VARCHAR(8),[POLY_X_CO] DECIMAL(10,3),[POLY_Y_CO] DECIMAL(10,3),[PINAKOKXE] VARCHAR(11),[LANDTYPE] DECIMAL(2,0));"
crsr.execute(SQL)
conn.commit()
with arcpy.da.SearchCursor(FD,['FID','AREA','PERIMETER','KA_PO','NOMOS','OTA','KATHGORPO','KATHGORAL1','KATHGORAL2','LABEL_PO','PHOTO_45','PHOTO_60','PHOTO_PO','POLY_X_CO','POLY_Y_CO','PINAKOKXE','LANDTYPE'],'"OTA" = \'{}\''.format(OTAvalue)) as cur:
for row in cur:
crsr.execute("INSERT INTO "+dbname+" VALUES ("+str(row[0])+","+str(row[1])+","+str(row[2])+",'"+row[3]+"','"+row[4]+"','"+row[5]+"','"+row[6]+"','"+row[7]+"','"+row[8]+"','"+row[9]+"','"+row[10]+"','"+row[11]+"','"+row[12]+"',"+str(row[13])+","+str(row[14])+",'"+row[15]+"',"+str(row[16])+");")
conn.commit()
crsr.close()
conn.close()
print (u'«'+OTAvalue+u'» ('+str(cnt)+u'/'+str(len(OTAList))+u')')
Ausführen dieses Code etwa 5 Minuten in Anspruch nahm die Aufgabe, für etwa 140 MEB abzuschließen.
Wie Sie sehen können, führe ich eine "INSERT INTO" -Anweisung für jeden Datensatz der Shapefile.
Ist dies der richtige Weg (und wahrscheinlich der schnellste) oder sollte ich alle Anweisungen für jeden "OTA" sammeln und sie alle zusammen ausführen?
Wenn es einmal Prozedur ist, würde ich alle Dateien auf einen oder wenige MDB importieren (je nach Datengröße , 2 GB Grenze) und dann separate MDBs basierend auf importierten Tabellen erstellt, wird es einfacher als Erstellen von Tabellenstruktur mit VBA. –