Масове завантаження декількох файлів у PostGIS


33

У мене більше сотні шарів даних у форматі shapefile, які я хочу завантажити в базу даних PostGIS. Всі вони знаходяться в одній проекції, але представляють різні шари даних, щоб не мати однакової схеми.

Який найефективніший за часом спосіб конвертувати всі ці файли в мою базу даних PostGIS (на ОС Windows 7)?

ОНОВЛЕННЯ: Масовий імпорт у файл pgAdmin3 "Завантажувач формфайлів PostGIS" (як зазначено нижче) тепер доступний за замовчуванням у PostGIS 2.0 .


Я шукаю просту відповідь на це. Однак я хочу зробити це пакетною роботою, яка працює щовечора. Насправді я хочу зробити свій PostGIS рабом ArcSDE (поки що). Будучи новим у PostGIS та SQL, я отримую те, що робив би скрипт cmd.exe, але якимось чином не впадає в мою голову. Що я хочу зробити, це отримати ряд файлів shp, які були експортовані з ArcSDE як пакетне завдання, а потім завантажувати їх у мій PostGIS, який би замінив уже існуючі gis / таблиці на місці.
geosmiles

Я б поставив це як нове запитання, відповідно до пунктів "як пакетна синхронізація даних з ArcSDE до PostGIS". Можуть бути цікаві ідеї.
Майк Т

Відповіді:


22

Якщо ви хочете дотримуватися GUI, то в новій версії pgAdmin є Shapefile Loader, який може бути використаний як об'ємне навантаження

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


32

Якщо у вас є комп'ютер з Windows, ви можете використовувати хороший '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.