Menggunakan ogr2ogr untuk mengonversi semua shapefile dalam direktori?

25

Saya memiliki direktori dengan beberapa shapefile.

Bagaimana cara mengonversi semua shapefile ini ke MapInfo dengan ogr2ogr?

Saya tahu bagaimana saya bisa mengonversi satu file. Dan saya bisa membuat skrip batch menulis baris untuk setiap file. Tetapi apakah tidak ada cara yang lebih mudah untuk mengonversi semua file dalam direktori (dan subdirektori).

Stefan
sumber
Itu tergantung sistem operasi apa. Pada dasarnya buat loop "for", lihat gis.stackexchange.com/questions/7803/…
Mike T
OS adalah Windows 7. Saya coba ini di command prompt: for% f di * .shp; lakukan ogr2ogr -f MapInfo File $ f.tab. Tapi itu tidak berhasil. Saya mendapatkan kesalahan: 'Tidak dapat membuka data kami' $ f.tab 'dengan driver berikut .....
Stefan
Ini adalah bagaimana melakukan SHP ke TAB: ogr2ogr -f "File MapInfo"% 1.tab% 1.shp. Tapi kecuali OGR mampu mengenali file PRJ dengan benar, Anda dengan mudah berakhir dengan file TAB dengan coordsys yang salah bawaan. Saya sarankan menggunakan Penerjemah Universal bawaan (diperkecil FME), yang juga dapat memproses semua file yang Anda pilih. Ini memungkinkan Anda untuk memilih coordsys yang benar.
Uffe Kousgaard
Saya memang memiliki masalah dengan proyeksi yang tepat dalam File MapInfo. Saya mencoba memasukkan proyeksi yang tepat, tetapi ini tidak berhasil. Proyeksi dalam file de mapinfo diatur ke non-earth (meter). Apakah mungkin untuk memasukkan proyeksi yang benar dengan alat ogr2ogr. Saya ingin meletakkan baris perintah di skrip lain. Jadi saya lebih suka tidak menggunakan Penerjemah Universal.
Stefan
Sudahkah Anda mencoba pustaka OGR dan itu adalah alat baris perintah?
Alex Markov

Jawaban:

34

Di Windows, untuk direktori saat ini dan di bawah direktori saat ini, coba perintah ini:

for /R %f in (*.shp) do ogr2ogr -f "MapInfo File" "%~dpnf.tab" "%f"

Untuk menjelaskan secara singkat tipu apa yang terjadi di sini , %~dpnf.tabmenggunakan variabel % f , dengan yang menambahkan d surat sungai, p nama ath (yaitu, folder atau direktori), dan ekstrak file n ame (tanpa .shpekstensi file) . Terakhir, .tabditambahkan segera setelah pengubah variabel majemuk untuk ekstensi baru.

Jadi jika Anda berada di direktori C:\MyData, dan Anda memiliki data di direktori ini, dan sub-direktori C:\MyData\Region1dan C:\MyData\Region1\City1, setiap Shapefile (dengan .shpekstensi) akan diproses, dan file bernama yang sama dengan .tabakan dibuat di direktori yang sama.

Mike T
sumber
Keren! Ini bekerja! Terima kasih banyak atas jawabannya :) Satu pertanyaan lagi: Apakah ada juga cara untuk merujuk ke subdirektori dan mengonversi file di subdirektori lain. Saya memiliki berbagai direktori yang berisi shapefile. Seperti: Belanda \ bentuk \ provinsiX Belanda \ bentuk \ provinsiY Belanda \ bentuk \ provinsiZ Dan ingin mengubah ini menjadi folder ini: Belanda \ mapinfo \ provinsiX Belanda \ mapinfo \ provinsiY Belanda \ mapinfo \ provinsiZ Terima kasih :)
Stefan
Saya telah memperbarui pencarian rekursif di atas, namun saya tidak tahu bagaimana melakukan logika tambahan untuk mengubah "bentuk" menjadi "mapinfo"; mungkin temukan / tanyakan di superuser.com
Mike T
1
Sekali lagi terima kasih atas tanggapan cepat Anda. Ini sangat membantu. Saya hanya perlu menyalin file ke direktori yang benar.
Stefan
Perhatikan bahwa baris perintah Windows dan perintah file batch berbeda: Anda harus menggandakan persen %fmenjadi %%f. Lihat ss64.com/nt/for.html untuk detailnya.
AndreJ
Ini hebat, adalah pendekatan yang serupa pada MAC
Ryan Garnett
11

Untuk unix bash:

#!/bin/bash

for FILE in *.mif # cycles through all files in directory (case-sensitive!)
do
    echo "converting file: $FILE..."
    FILENEW=`echo $FILE | sed "s/.mif/_new.shp/"` # replaces old filename
    ogr2ogr \
    -f "ESRI Shapefile" \
    "$FILENEW" "$FILE"
done
exit

Jika Anda bekerja di OS berbasis * nix (yaitu Linux atau OS X), ada beberapa skrip shell batch yang dikembangkan clhenrik di sini (yang menjadi dasar di atas).

Saya sedang mengerjakan garpu yang membuat beberapa skrip menjadi sedikit lebih umum dan memberikan sedikit deskripsi tentang penggunaan.


eltiar
sumber
Ini akan menyebabkan kesalahan jika nama file mengandung spasi.
JasonRDalton
8

Seperti kata Alex Markov , cara terbaik bagi Anda untuk menggunakan OGR .

Anda harus membuat skrip, tetapi skrip yang sangat sederhana. Pada dasarnya jika Anda menggunakan windows, yang harus Anda lakukan adalah menjalankan kode berikut di baris perintah (di dalam folder yang diinginkan):

for %f in (*.tab) do ogr2ogr -f "KML" %~nf.kml %f

Periksa situs ini, semua dijelaskan di sini:

http://www.processamentodigital.com.br/?p=2511

Alexandre Neto
sumber
2
Saya pikir Anda juga dapat melakukannya: ogr2ogr -f "KML" {outfolder} {infolder} Tip diambil dari underdark.wordpress.com/2012/05/09/batch-shapefile-clipping
Nathan W
NB Balasan ini berasal dari pertanyaan terkait erat yang merujuk pada format file yang berbeda.
Whuber
Hai, ketika saya mencoba pendekatan ini di Ubuntu misalnya ogr2ogr -f "KML" {outfolder} {infolder} Saya mendapatkan kesalahan: 'KESALAHAN 4: Gagal membuat file KML'. Adakah yang tahu apa yang salah di sini? Saya telah membangun GDAL dengan dukungan KML
marty_c
7

dengan python:

import os 

for a in os.listdir(os.getcwd()):
   fileName, fileExtension = os.path.splitext(a)
   os.system('ogr2ogr -f "ESRI Shapefile" %s %s' % (a, fileName + '.tab'))

Anda dapat mengubah os.getcwd()jalur Anda di mana file Anda berada ...

Saya harap ini membantu Anda

Aragon
sumber
for a in *.shp:adalah kesalahan sintaksis; Anda berpikirfrom glob import glob; for a in glob('*.shp'):
Mike T
oh maaf, saya telah menulisnya dengan gaya yang salah. saya telah memperbarui. @ Mike Toews terima kasih.
Aragon
4

Anda tidak perlu perulangan, Anda cukup memberi nama direktori sebagai sumber dan tujuan dan ogr2ogr akan mengonversi file apa pun di direktori sumber. Lihat di sini: Mengonversi TAB ke MIF / MIF ke TAB

Torsten
sumber
Terima kasih! Dapatkah saya merujuk dari satu direktori induk ke semua subdir dan mengonversi semua file ke subdir lain. Saya memiliki: Belanda \ bentuk \ provinsiX Belanda \ bentuk \ provinsiY Belanda \ bentuk \ provinsiZ dan seterusnya ... Dan ingin mengonversi ini ke dalam folder ini: Belanda \ mapinfo \ provinsiX Belanda \ mapinfo \ provinsiY Belanda \ mapinfo \ provinsiZ Saya dapat menulis baris untuk masing-masing provinsi, tetapi dapatkah saya juga melakukannya dengan satu perintah
Stefan
Saya belum mencoba ini, tetapi saya tidak berpikir ini mungkin. Anda akan memerlukan loop yang menangani direktori input dan output masing-masing. Dalam hal ini mungkin lebih mudah untuk mengikuti pendekatan python.
Torsten
0

Penerjemah Universal di Mapinfo dapat menangani banyak file. Buka folder tujuan, pilih semua shapefile, tentukan CRS untuk input dan output. Itu harus dilakukan.

Bharadwaj AK
sumber
0

Ini adalah penyempurnaan dari jawaban Aragon di atas. Ini hanya akan menjalankan ogr2ogr pada file .TAB atau .tab, dan mengabaikan jenis file lain dalam folder.

#!/usr/bin/env python3

import os 

for a in os.listdir(os.getcwd()):
  fileName, ext = os.path.splitext(a)
  if ext.lower() == '.tab':
    print('ogr2ogr -f "ESRI Shapefile" %s %s' % (a.replace(ext,
                           '.shp'), fileName + ext))
    os.system('ogr2ogr -f "ESRI Shapefile" %s %s' % (a.replace(ext,
                           '.shp'), fileName + ext))
Tybion
sumber