Carregar em massa vários shapefiles no PostGIS

33

Eu tenho mais de cem camadas de dados no formato shapefile que quero carregar em um banco de dados PostGIS. Eles estão todos na mesma projeção, mas representam diferentes camadas de dados para que não tenham o mesmo esquema.

Qual é a maneira mais econômica de converter todos esses arquivos em massa no meu banco de dados PostGIS (no sistema operacional Windows 7)?

ATUALIZAÇÃO: A importação em massa no pgAdmin3 "PostGIS shapefile uploader" (conforme observado abaixo) agora está disponível por padrão no PostGIS 2.0 .

RyanDalton
fonte
Estou procurando uma resposta similar para isso. No entanto, eu quero torná-lo um trabalho em lotes que é executado todas as noites. Na verdade, eu quero fazer do meu PostGIS um escravo do ArcSDE (por enquanto). Sendo novo no PostGIS e no SQL, entendo o que o script cmd.exe faria, mas de alguma forma não está na minha cabeça. O que eu quero fazer é obter uma série de arquivos shp que foram exportados do ArcSDE como um trabalho em lotes e depois enviá-los para o meu PostGIS, que substituiria as tabelas / gis existentes.
Geosmiles
Eu faria isso como uma nova pergunta, na linha de "como sincronizar em lote dados do ArcSDE para o PostGIS". Pode haver algumas idéias interessantes.
Mike T

Respostas:

22

Se você deseja manter uma GUI, a versão mais recente do pgAdmin possui o Shapefile Loader que pode ser usado como carregamento em massa

insira a descrição da imagem aqui

Mapperz
fonte
32

Se você possui um computador Windows, pode usar um bom visual CMD.EXEcom alguns loops esotéricos. Certifique-se de fazer isso em um diretório "contido" apenas com os arquivos shp / sql que você precisa carregar.

Primeira etapa, crie os arquivos do carregador SQL (eu também presumi que você tenha dados WGS84 Lat / Long com 4326 .. atualize isso para o seu SRS):

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

Em seguida, verifique seus arquivos SQL para garantir que eles tenham uma boa aparência e faça um loop semelhante:

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

O bashequivalente para o pessoal do POSIX (Linux, Mac OS X, etc) é algo como:

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

então

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

ou ambas as partes conectadas em um único loop, se você não precisar manter os .sqlarquivos provisórios :

for f in *.shp
do
    shp2pgsql -s 4326 %f public.`basename $f .shp` | psql -d mydb > /dev/null
done
Mike T
fonte
isso funcionaria melhor em um único loop,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
Sim, isso pode ser feito em um comando (mas sem a >parte de redirecionamento, pois isso quebra a |parte do pipe), desde que você tenha certeza de que o SQL passado para o psql está correto. Eu diria que isso não é melhor, já que não há registro dos dados no formato SQL.
Mike T
4

Você também pode usar este comando único, que ajuda o loop muito mais fácil e também não precisa criar .sql separadamente,

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