Suite

Importez des fichiers de formes dans PostGIS à l'aide de Python avec psycopg2


Je souhaite importer des fichiers de formes dans PostGIS à l'aide de Python avec arcpy et psycopg2 pour me connecter à PostGIS. Je ne veux pas utiliser le chargeur de fichiers de formes existant ni ogr, il suffit d'écrire mon propre outil d'importation.

Mes étapes et où je suis coincé:

  1. Définir le fichier de formes
  2. Sélectionnez les noms de colonnes du shapefile dans une liste
  3. Créer une requête SQL CREATE TABLE avec les noms de colonne du fichier de formes
  4. Insérer les valeurs du fichier de formes dans la base de données PostGIS

Je suis resté bloqué au point 4 car je ne sais pas trop comment extraire les valeurs du shapefile et l'insérer dans la base de données en tenant compte de la bonne colonne.

Une idée?

Exemple de code :

import arcpy import psycopg2 arcpy.env.workspace = r"cheminversdonnées" shp = "BRD.shp" shp2 = shp[:3] desc_shp = arcpy.Describe(shp) #définir les variables et créer une liste avec OID et forme attributs si 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_ = [] pour le champ dans les champs. name == shp_geom): field_names.append(field.name) new_list = field_names print new_list sc_da_cursor = arcpy.da.SearchCursor(shp,shp_geom) pour sc_da_row dans sc_da_cursor: print sc_da_row[0] # Post GIS partie après ici user = "postgre " 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 + " géométrie," + 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()

Je viens d'utiliser le code ci-dessous pour transférer un fichier de formes dans PostGIS. J'ai vu votre message et j'ai pensé que cela pourrait aider. Le [email protected] facilite le transfert de la géométrie. Tout est codé en dur et fonctionne, ce dont je suis satisfait et que je reviendrai probablement à une date ultérieure lorsque mon codage s'améliorera. Si quelque chose n'est pas clair, veuillez me le faire savoir.

importer psycopg2, arcpy # shapefile pour obtenir des données à partir de données = ("C:/shapefiles/georgia_counties.shp") # champs que je veux à partir de shapefile fields = ["AREANAME", "TotPop90", "PctRural", "PctBach", " PctEld", "PctFB", "PctPov", "PctBlack", "ID", "[email protected]"] # connexion pscopg2, remplacez *** et *** par vos valeurs 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)) """) curseur.execute("'"" SELECT('Geometryorgia) geom', 32616, 'MULTIPOLYGON', 2) """) # utilisez arcpy pour obtenir des données d'attributs, remplissez PostGIS en utilisant psycopg2 avec arcpy.da.SearchCursor(data, fields) as da_cursor: for row in da_cursor: wkt = row[ 9] # l'identifiant était transféré en tant que un flottant donc c'est juste pour supprimer l'identifiant décimal = int(row[8]) # c'était difficile - tout doit être une chaîne et le texte inséré dans "y compris wkt cursor.execute("INSERT INTO georgia (name, totpop , pctrural, pctbach, pcteld, pctfb, pctpov, pctblack, county_id, geom) VALEURS (" + '"+ row[0] + '"+ ", " + str(row[1]) + ", " + str(ligne[2]) + ", " + str(ligne[3]) + ", " + str(ligne[4]) + ", " + str(ligne[5]) + ", " + str( row[6]) + ", " + str(row[7]) + ", " + str(id) + ", ST_GeometryFromText(" + "'" + wkt + "', 32616))") connection.commit ()

Je suis assez nouveau sur l'ensemble de la connexion python pyscopg2 mais c'est super utile. J'ai récemment écrit ce script. Je l'ai codé en dur (ce serait plus utile si j'écrivais une fonction) mais néanmoins cela fonctionne parfaitement.

*id recommanderait de définir votre connexion à la base de données en haut de vos scripts par vos instructions d'importation, pour une structure de code plus organisée

* lors de la création de tableaux et de l'insertion de valeurs dans des colonnes, évitez d'utiliser 'nom de colonne'+valeur+'nom de colonne2'+valeur2 etc… cela devient maladroit et difficile à lire. essayez d'utiliser le.format()fonction ou%spour insérer des valeurs et créer des tableaux

import arcpy import psycopg2 import arcgisscripting gp = arcgisscripting.create() conn = psycopg2.connect("dbname='shapefile' user="postgres" host="localhost" password="mypass"") #connexion à la base de données cur = conn. curseur() #configuration du curseur de connexion 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" pour la ligne dans 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()