Массовая загрузка нескольких шейп-файлов в PostGIS


33

У меня есть более ста слоев данных в формате шейп-файлов, которые я хочу загрузить в базу данных PostGIS. Все они находятся в одной проекции, но представляют разные слои данных, поэтому они не имеют одинаковую схему.

Каков наиболее эффективный способ массового преобразования всех этих файлов в мою базу данных PostGIS (в ОС Windows 7)?

ОБНОВЛЕНИЕ: Массовый импорт в pgAdmin3 «Загрузчик шейп-файлов PostGIS» (как отмечено ниже) теперь доступен по умолчанию в PostGIS 2.0 .


Я ищу простой ответ на это. Однако я хочу сделать это пакетной работой, которая выполняется каждую ночь. По сути, я хочу сделать свой PostGIS рабом ArcSDE (на данный момент). Будучи новичком в PostGIS и SQL, я понимаю, что будет делать скрипт cmd.exe, но почему-то его не застревает в моей голове. Я хочу получить серию shp-файлов, которые были экспортированы из ArcSDE в виде пакетного задания, а затем загрузить их в мою PostGIS, которая перезапишет уже существующие ГИС / таблицы.
geosmiles

Я бы задал этот вопрос как новый, в духе «как пакетно синхронизировать данные из ArcSDE в PostGIS». Там может быть несколько интересных идей.
Майк Т

Ответы:


22

Если вы хотите придерживаться GUI, то в более новой версии pgAdmin есть Shapefile Loader, который можно использовать в качестве массовой загрузки.

введите описание изображения здесь


32

Если у вас есть компьютер с Windows, вы можете использовать good 'ol CMD.EXEс несколькими эзотерическими циклами for. Убедитесь, что вы делаете это в «вложенном» каталоге только с теми файлами shp / sql, которые вам нужно загрузить.

Первый шаг, создайте файлы загрузчика SQL (я также предположил, что у вас есть данные Lat / Long WGS84 с 4326 .. обновите это до вашего SRS):

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

Затем проверьте файлы SQL, чтобы убедиться, что они хорошо выглядят, затем выполните аналогичный цикл:

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

bashЭквивалент для POSIX народной (Linux, Mac OS X, и т.д.) что - то вроде:

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

тогда

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

или обе части по конвейеру, если вам не нужно хранить промежуточные .sqlфайлы:

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

будет ли это работать лучше в один цикл,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

да, это может быть сделано одной командой (но без части >перенаправления, так как это разрывает |часть канала), если вы уверены, что SQL, переданный в psql, верен. Я бы сказал, что это не лучше, так как нет записи данных в формате SQL.
Майк Т

4

Вы также можете использовать эту единственную команду, которая помогает в зацикливании намного проще, а также не нужно создавать .sql отдельно,

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.