Mehr

Importieren Sie Shapefiles in PostGIS mit Python mit psycopg2

Importieren Sie Shapefiles in PostGIS mit Python mit psycopg2


Ich möchte Shapefiles in PostGIS importieren, indem ich Python mit arcpy & psycopg2 verwende, um eine Verbindung zu PostGIS herzustellen. Ich möchte weder den vorhandenen Shapefile-Loader noch ogr verwenden, sondern einfach mein eigenes Importwerkzeug schreiben.

Meine Schritte und wo ich hängengeblieben bin:

  1. Shapefile definieren
  2. Spaltennamen aus Shapefile in eine Liste auswählen
  3. Erstellen Sie eine SQL CREATE TABLE-Abfrage mit Spaltennamen von Shapefile
  4. Werte aus Shapefile in PostGIS-Datenbank einfügen

Ich bin bei Punkt 4 hängengeblieben, da ich nicht wirklich weiß, wie ich die Werte aus dem Shapefile extrahiere und unter Berücksichtigung der richtigen Spalte in die Datenbank einfüge.

Irgendeine Idee?

Codebeispiel:

import arcpy import psycopg2 arcpy.env.workspace = r"path	odata" shp = "BRD.shp" shp2 = shp[:3] desc_shp = arcpy.Describe(shp) #set variable and create list with OID and shape Attribute if desc_shp.hasOID: print desc_shp.OIDFieldName shp_OID = desc_shp.OIDFieldName print desc_shp.shapeFieldName shp_geom = desc_shp.shapeFieldName fields = desc_shp.fields field_names = [] für hpfield. name == shp_geom): field_names.append(field.name) new_list = field_names print new_list sc_da_cursor = arcpy.da.SearchCursor(shp,shp_geom) für sc_da_row in sc_da_cursor: print sc_da_row[0] # PostGIS part after here user = "postgres " pw = "postgres" db = "pypg" host = "localhost" port = 5432 conn_obj = psycopg2.connect(database=db, user=user, password=pw, host=host, port=port) cur_obj = conn_obj.cursor () sql_createtable = "CREATE TABLE" + shp2 + "(" + shp_OID + " serial PRIMARY KEY," + shp_geom + "geometrie", + new_list[0] + "VARCHAR(100)," + new_list[1] + " VARCHAR(100))" sql_insert = "INSERT INTO" + shp2 + "(" + shp_geom + ") VALUES(" + str(sc_da_row[0]) + ")" cur_obj.execute(sql_insert) conn_obj.commit() conn_obj .close() cur_obj.close()

Ich habe gerade den folgenden Code verwendet, um ein Shapefile in PostGIS zu übertragen. Ich habe deinen Beitrag gesehen und dachte, er könnte helfen. Das [email protected] macht es wirklich einfach, die Geometrie zu übertragen. Alles ist hart codiert und funktioniert, womit ich zufrieden bin und ich wahrscheinlich zu einem späteren Zeitpunkt erneut darauf zugreifen werde, wenn sich meine Codierung verbessert. Wenn etwas nicht klar ist, lass es mich wissen.

import psycopg2, arcpy # shapefile, um Daten aus data = ("C:/shapefiles/georgia_counties.shp") zu erhalten # Felder, die ich aus Shapefile-Feldern möchte = ["AREANAME", "TotPop90", "PctRural", "PctBach", " PctEld", "PctFB", "PctPov", "PctBlack", "ID", "[email protected]"] # pscopg2 connection, ersetzen Sie *** und *** durch Ihre Werte connection = psycopg2.connect("dbname=* ** user=***") cursor = connection.cursor() cursor.execute("DROP TABLE IF EXISTS georgia") cursor.execute(""" CREATE TABLE georgia ( id SERIAL, name VARCHAR, totpop INTEGER, pctrural DOUBLE PRECISION, pctbach DOUBLE PRECISION, pcteld DOUBLE PRECISION, pctfb DOUBLE PRECISION, pctpov DOUBLE PRECISION, pctblack DOUBLE PRECISION, county_id VARCHAR, PRIMARY KEY (county_id)) """) cursor.execute(""" SELECT Add'GeorgiaColumn, geom', 32616, 'MULTIPOLYGON', 2) """) # Verwenden Sie arcpy, um Attributdaten zu erhalten, füllen Sie PostGIS mit psycopg2 mit arcpy.da.SearchCursor(data,fields) as da_cursor: for row in da_cursor: wkt = row[ 9] # die ID wurde übertragen als ein Float, also nur zum Entfernen von Dezimal-ID = int(row[8]) # das war schwierig - alles muss ein String sein und Text muss umschlossen eingefügt werden"einschließlich wkt cursor.execute("INSERT INTO georgia (name, totpop , pctrural, pctbach, pcteld, pctfb, pctpov, pctblack, county_id, geom) WERTE (" + '"+ row[0] + '"+", " + str(row[1]) +", " + Str(Zeile[2]) + ", " + Str(Zeile[3]) +", " + Str(Zeile[4]) +", " + Str(Zeile[5]) +", " + Str( row[6]) + ", " + str(row[7]) + ", " + str(id) + ", ST_GeometryFromText(" + "'" + wkt + "', 32616))") connection.commit ()

Ich bin ziemlich neu in der gesamten pyscopg2-Python-Verbindung, aber es ist sehr nützlich. Ich habe vor kurzem dieses Skript geschrieben. Ich habe es hart codiert (wäre nützlicher, wenn ich eine Funktion schreiben würde), aber trotzdem funktioniert es völlig gut.

*id würde empfehlen, Ihre Datenbankverbindung oben in Ihren Skripten neben Ihren Importanweisungen zu definieren, um eine organisiertere Codestruktur zu erzielen

* Beim Erstellen von Tabellen und Einfügen von Werten in Spalten vermeiden Sie die Verwendung von 'Spaltenname'+Wert+'Spaltenname2'+Wert2 usw. Es wird klobig und schwer zu lesen. versuche es mit.Format()Funktion oder%SWerte einfügen und Tabellen erstellen

import arcpy import psycopg2 import arcgisscripting gp = arcgisscripting.create() conn = psycopg2.connect("dbname='shapefile' user="postgres" host="localhost" password="mypass"") #connecting to DB cur = conn. Cursor() #Verbindungsaufbau Cursor cur.execute("drop table drugpoints") cur.execute("CREATE TABLE drugpoints (id serial Primary Key, Name text, Type text, x float, y float, geom geometry);") conn.commit() arcpy.env.workspace = "path" shp = "pathdrugfreezone.shp" für Zeile in gp.Searchcursor(shp): ty = str(row.type_) name = str(row.name) x = float(row.x) y = float(row.y) print ty, name, x, y cur.execute("insert into drugpoints(Name, Type, x, y, geom) values(%s,%s ,%s,%s,ST_SetSRID(ST_MakePoint(%s,%s), 4269))",(ty, name, x,y,x,y)) conn.commit()

Schau das Video: Basic QGIS Tutorial - Open some Shapefile layers and a Project