En nuestra búsqueda de nuevas herramientas geoespaciales en Python y mejores formas de manejar datos geoespaciales, encontramos que procesos complejos o multifuncionales ya están incluidos en bibliotecas espaciales como Geopandas. Hemos desarrollado un ejemplo aplicado para cargar ESRI Shapefiles de punto / línea / polígono a una base de datos Postgres / Postgis con Python, Geopandas y SQL Alchemy en unas pocas líneas de código. Además, hemos simplificado el procedimiento para ejecutar una base de datos de Postgres dentro de la imagen de Docker Hakuchik completamente conectada a QGIS.
Este tutorial require tener Docker. Para los usuarios de Windows pueden instalar Docker con este tutorial.
Tutorial
Codigo
Este es código en Python:
#import required libraries
from sqlalchemy import create_engine
import geopandas as gpd
import matplotlib.pyplot as plt
Connect with Postgresql
engine = create_engine('postgresql://gis:gis@localhost:5432/geodatabase')
Open shapefiles
#create geodataframes from all shapefiles
pointDf = gpd.read_file('../Shps/wellPoints.shp')
lineDf = gpd.read_file('../Shps/contoursLines.shp')
polyDf = gpd.read_file('../Shps/lakesPolygons.shp')
#sample of import geodataframes
pointDf.head()
Bore | Elev | geometry | |
---|---|---|---|
0 | A. Isaac | 976.579 | POINT (575546.629 4820354.914) |
1 | A. Woodbridge | 904.403 | POINT (564600.367 4807827.447) |
2 | A.D. Watkins | 965.698 | POINT (558944.843 4789663.820) |
3 | A.L. Clark; 1 | 694.670 | POINT (519259.006 4810958.617) |
4 | A.L. Clark; 2 | 1173.053 | POINT (585351.150 4811459.503) |
#you might need descartes, uncomment and run this line just one
#!pip install descartes
#a preview of the spatial data
fig, ax = plt.subplots(figsize=(12,8))
pointDf.plot(ax=ax,c='gold')
lineDf.plot(ax=ax,cmap='Oranges',alpha=0.5)
polyDf.plot(ax=ax,ec='royalblue')
plt.show()
Upload shapefiles
#points
pointDf.to_postgis('wellpoints',engine, index=True, index_label='Index')
#lines
lineDf.to_postgis('contourlines',engine, index=True, index_label='Index')
#polygons
polyDf.to_postgis('lakepolygons',engine, index=True, index_label='Index')
Datos de ingreso
Este es el enlace del repositorio en Github con los datos para este tutorial:
https://github.com/SaulMontoya/howToUploadShapefilestoPostGISwithPython