Carga masiva de múltiples archivos de forma en PostGIS


33

Tengo más de cien capas de datos en formato shapefile que quiero subir a una base de datos PostGIS. Todos están en la misma proyección, pero representan diferentes capas de datos, por lo que no tienen el mismo esquema.

¿Cuál es la forma más efectiva en el tiempo de convertir en masa todos estos archivos en mi base de datos PostGIS (en el sistema operativo Windows 7)?

ACTUALIZACIÓN: La importación masiva en pgAdmin3 "PostGIS shapefile uploader" (como se indica a continuación) ahora está disponible de forma predeterminada con PostGIS 2.0 .


Estoy buscando una respuesta similar a esto. Sin embargo, quiero que sea un trabajo por lotes que se ejecuta todas las noches. En efecto, quiero hacer que mi PostGIS sea esclavo de ArcSDE (por el momento). Al ser nuevo en PostGIS y SQL, obtengo lo que haría el script cmd.exe, pero de alguna manera no se me pega en la cabeza. Lo que quiero hacer es obtener una serie de archivos shp que se han exportado de ArcSDE como un trabajo por lotes, luego subirlos a mi PostGIS, que sobrescribirá los gis / tablas existentes en su lugar.
geosmiles

Preguntaría esto como una nueva pregunta, en la línea de "cómo sincronizar por lotes los datos de ArcSDE a PostGIS". Podría haber algunas ideas interesantes.
Mike T

Respuestas:


22

Si desea apegarse a una GUI, la versión más nueva de pgAdmin tiene Shapefile Loader que se puede usar como carga masiva

ingrese la descripción de la imagen aquí


32

Si tiene una computadora con Windows, puede usar good 'ol CMD.EXEcon unos pocos bucles for esotéricos. Asegúrese de hacer esto en un directorio "contenido" con solo los archivos shp / sql que necesita cargar.

Primer paso, cree los archivos del cargador SQL (también asumí que tiene datos WGS84 Lat / Long con 4326 .. actualice esto a su SRS):

for %f in (*shp) do shp2pgsql -s 4326 %f public.%~nf > %~nf.sql

Luego verifique sus archivos SQL para asegurarse de que se vean bien, luego haga un ciclo similar:

for %f in (*sql) do psql -h myserver -d mydb -U myuser -f %f > nul

El bashequivalente para la gente POSIX (Linux, Mac OS X, etc.) es algo como:

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` > `basename $f .shp`.sql
done

luego

for f in *.sql
do
    psql -h myserver -d mydb -U myuser -f $f > /dev/null
done

o ambas partes canalizadas en un solo bucle, si no necesita mantener los .sqlarchivos provisionales :

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` | psql -d mydb > /dev/null
done

¿funcionaría mejor en un solo ciclo?for f in *.shp do shp2pgsql -s 4326 %f public.'basename $f .shp' > 'basename $f .shp'.sql | psql -h myserver -d mydb -U myuser done
Sam007

sí, se puede hacer en un comando (pero sin la >parte de redireccionamiento, ya que esto rompe la |parte de la tubería), siempre que esté seguro de que el SQL pasado a psql es correcto. Yo diría que esto no es mejor, ya que no hay registro de los datos en formato SQL.
Mike T

4

También puede usar este comando único que ayuda a hacer un bucle mucho más fácil y no necesita crear .sql por separado,

for f in *.shp
    do shp2pgsql -c -D -s 4326 -I $f public.${f%.*} | psql -h hostname -d dbname -U usrname
done

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.