Python Scripts para ingerir un shapefile en una base de datos PostgreSQL / PostGIS utilizando shp2pgsql.exe en Windows

Tengo una base de datos PostgreSQL alojada en una Máquina Virtual de Windows 2008 Server RT (Sí, sé que debería estar alojada en una VM de Linux, pero esto es lo que mi organización me ha ordenado que esté activada. Suspiro …)

Nuestros chicos de GIS descargan muchos shapefiles en un repository. Nos gustaría tener un proceso automático que recorra la carpeta como una tarea progtwigda. Nos gustaría agregarlos a nuestra geodatabase de Postgres para algunos otros procesos que estamos desarrollando actualmente

Estoy buscando recorrer grandes cantidades de shapefiles y tener sus geometrías y nombres de archivos cargados en nuestra base de datos.

Aquí está la esencia de las partes centrales de la función de ingesta que he trabajado hasta ahora.

import os, subprocess base_dir = r"c:\shape_file_repository" full_dir = os.walk(base_dir) shapefile_list = [] for source, dirs, files in full_dir: for file_ in files: if file_[-3:] == 'shp': #print "Found Shapefile" shapefile_path = base_dir + '/' + file_ shapefile_list.append(shapefile_path) for paths in shapefile_list: #This is the part where I keep running into trouble. os.system also didnt work temp_bat = open(r"c:\temp\temp_shp.bat", "w") temp_bat.write(r'start /D c:\Program Files (x86)\PostgreSQL\8.4\bin\shp2pgsql.exe' + \ paths + "new_shp_table | psql -d geometry_database") temp_bat.close() subprocess.Popen(r"c:\temp\temp_shp.bat") 

Una vez que las geometrías se hayan cargado en la nueva tabla de la base de datos, ya tengo la configuración de código para extraer la geometría de la tabla temporal y cargar eso más el nombre del shapefile en nuestra tabla principal de la base de datos. Mi problema es que puedo hacerlo a través del símbolo del sistema, sin embargo, ejecutar los comandos de Windows a través de python o enviarlos a un archivo por lotes y luego ejecutarlos no parece funcionar en absoluto.

Aquí hay algunas modificaciones que deberían hacer que las cosas funcionen. Tenga en cuenta que necesitaría una modificación adicional si necesita que se le notifique si falla alguno de los comandos. Tenga en cuenta que fallará para más de un shapefile, ya que ya existirá una tabla new_shp_table hasta que tenga más lógica para mover o cambiar el nombre de esa tabla a otra parte, o para cargarla con un nombre único.

Además, tenga en cuenta que PostgreSQL 8.4 llegará a su fin de vida a finales de este año, por lo que es posible que desee planificar la actualización a una versión más reciente antes de que sea demasiado tarde.

 import os, subprocess # Choose your PostgreSQL version here os.environ['PATH'] += r';C:\Program Files (x86)\PostgreSQL\8.4\bin' # http://www.postgresql.org/docs/current/static/libpq-envars.html os.environ['PGHOST'] = 'localhost' os.environ['PGPORT'] = '5432' os.environ['PGUSER'] = 'someuser' os.environ['PGPASSWORD'] = 'clever password' os.environ['PGDATABASE'] = 'geometry_database' base_dir = r"c:\shape_file_repository" full_dir = os.walk(base_dir) shapefile_list = [] for source, dirs, files in full_dir: for file_ in files: if file_[-3:] == 'shp': shapefile_path = os.path.join(base_dir, file_) shapefile_list.append(shapefile_path) for shape_path in shapefile_list: cmds = 'shp2pgsql "' + shape_path + '" new_shp_table | psql ' subprocess.call(cmds, shell=True)