ใช้ ogr2ogr เพื่อแปลง shapefiles ทั้งหมดในไดเรกทอรีหรือไม่


25

ฉันมีไดเรกทอรีที่มีรูปร่างหลายไฟล์

จะแปลงไฟล์รูปร่างเหล่านี้เป็น MapInfo ด้วย ogr2ogr ได้อย่างไร

ฉันรู้ว่าฉันสามารถแปลงไฟล์หนึ่งไฟล์ได้อย่างไร และฉันสามารถสร้างสคริปต์ชุดเขียนบรรทัดสำหรับแต่ละไฟล์ แต่ไม่มีวิธีที่ง่ายกว่าในการแปลงไฟล์ทั้งหมดในไดเรกทอรี (และไดเรกทอรีย่อย)


มันขึ้นอยู่กับระบบปฏิบัติการอะไร โดยทั่วไปทำการวน "สำหรับ" ดูgis.stackexchange.com/questions/7803/ …
Mike T

ระบบปฏิบัติการคือ Windows 7 ฉันลองทำสิ่งนี้ในพร้อมท์คำสั่ง: สำหรับ% f ใน * .shp; ทำ ogr2ogr -f ไฟล์ MapInfo $ f.tab แต่นั่นไม่ได้ผล ฉันได้รับข้อผิดพลาด: 'ไม่สามารถเปิด datasour '$ f.tab' กับคนขับรถดังต่อไปนี้ .....
สเตฟาน

นี่คือวิธีการ SHP กับ TAB: ogr2ogr -f "ไฟล์ MapInfo"% 1.tab% 1.shp แต่ถ้า OGR ไม่สามารถรับรู้ไฟล์ PRJ ได้อย่างถูกต้องคุณสามารถลงเอยด้วยไฟล์ TAB ที่มี coordsys อยู่ภายในไม่ถูกต้อง ฉันขอแนะนำให้ใช้ Universal Translator ในตัว (ย่อขนาด FME) ซึ่งสามารถประมวลผลไฟล์ทั้งหมดที่คุณเลือก จะช่วยให้คุณเลือก coordsys ที่ถูกต้อง
Uffe Kousgaard

ฉันมีปัญหากับการฉายภาพที่ถูกต้องในไฟล์ MapInfo ฉันพยายามรวมการฉายภาพที่ถูกต้อง แต่ไม่ได้ผล การฉายภาพในไฟล์ de mapinfo ถูกตั้งเป็น non-earth (เมตร) เป็นไปได้หรือไม่ที่จะรวมการฉายภาพที่ถูกต้องกับเครื่องมือ ogr2ogr ฉันต้องการวางบรรทัดคำสั่งในสคริปต์อื่น ดังนั้นฉันจึงไม่ควรใช้ตัวแปลสากล
สเตฟาน

คุณได้ลองใช้ไลบรารีOGRแล้วและเป็นเครื่องมือบรรทัดคำสั่งหรือไม่
Alex Markov

คำตอบ:


34

บน Windows สำหรับไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยภายใต้ปัจจุบันลองคำสั่งนี้:

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

สั้น ๆ อธิบายกลอุบายของสิ่งที่จะเกิดขึ้นที่นี่ , %~dpnf.tabใช้ตัวแปรฉ%ด้วยซึ่งจะเพิ่มdตัวอักษรแม่น้ำPชื่อ ATH (เช่นโฟลเดอร์หรือไดเรกทอรี) และสารสกัดจากไฟล์n AME (โดยไม่มี.shpนามสกุลไฟล์) . สุดท้าย.tabจะถูกเพิ่มทันทีหลังจากตัวดัดแปลงตัวแปรผสมสำหรับส่วนขยายใหม่

ดังนั้นหากคุณอยู่ในไดเรกทอรีC:\MyDataและคุณมีข้อมูลในไดเรกทอรีนี้และไดเรกทอรีย่อยC:\MyData\Region1และC:\MyData\Region1\City1Shapefile ใด ๆ (ที่มี.shpส่วนขยาย) จะถูกประมวลผลและไฟล์ที่มีชื่อคล้ายกับที่.tabจะสร้างในไดเรกทอรีเดียวกัน


เย็น! มันใช้งานได้! ขอบคุณมากสำหรับคำตอบ :) คำถามอีกข้อหนึ่ง: นอกจากนี้ยังมีวิธีการอ้างถึงไดเรกทอรีย่อยและแปลงไฟล์ในไดเรกทอรีย่อยอื่น ฉันมีไดเร็กตอรี่ที่มีรูปร่างต่างๆ เช่น: เนเธอร์แลนด์ \ รูปร่าง \ ProvinceX เนเธอร์แลนด์ \ รูปร่าง \ จังหวัด Y เนเธอร์แลนด์ \ รูปร่าง \ provinceZ และต้องการแปลงเป็นโฟลเดอร์เหล่านี้: เนเธอร์แลนด์ \ mapinfo \ provinceX เนเธอร์แลนด์ \ mapinfo \ ProvinceY เนเธอร์แลนด์ \ mapinfo \ provinceZ ขอบคุณ :)
Stefan

ฉันได้อัปเดตข้างต้นสำหรับการค้นหาแบบเรียกซ้ำ แต่ฉันไม่ทราบวิธีการทำตรรกะเพิ่มเติมเพื่อเปลี่ยน "รูปร่าง" เป็น "mapinfo"; อาจจะค้นหา / ถามบนsuperuser.com
Mike T

1
ขอขอบคุณอีกครั้งสำหรับการตอบสนองที่รวดเร็วของคุณ สิ่งนี้มีประโยชน์มาก ฉันต้องการคัดลอกไฟล์ไปยังไดเรกทอรีที่ถูกต้องเท่านั้น
สเตฟาน

โปรดทราบว่า Windows บรรทัดคำสั่งและคำสั่งแฟ้มชุดที่แตกต่างกัน: คุณจะต้องเป็นสองเท่าร้อยละไป%f %%fดูss64.com/nt/for.htmlสำหรับรายละเอียด
AndreJ

วิธีการที่ยอดเยี่ยมนี้เป็นวิธีการที่คล้ายกันใน MAC
Ryan Garnett

11

สำหรับ 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

หากคุณทำงานในระบบปฏิบัติการที่ใช้ * nix (เช่น Linux หรือ OS X) มีสคริปต์เชลล์แบบแบทช์ที่clhenrikพัฒนาขึ้นที่นี่ (ซึ่งเป็นไปตามข้างต้น)

ฉันกำลังทำงานกับทางแยกที่ทำให้สคริปต์บางอย่างเป็นแบบทั่วไปมากกว่าเล็กน้อยและให้คำอธิบายเพิ่มเติมเกี่ยวกับการใช้งาน



สิ่งนี้จะทำให้เกิดข้อผิดพลาดหากชื่อไฟล์มีช่องว่าง
JasonRDalton

8

ขณะที่อเล็กซ์มาร์คอฟกล่าวว่าวิธีที่ดีที่สุดที่จะให้คุณใช้OGR

คุณจะต้องทำสคริปต์ แต่สคริปต์ง่าย ๆ โดยพื้นฐานถ้าคุณใช้ windows สิ่งที่คุณต้องทำก็คือรันโค้ดต่อไปนี้ในบรรทัดคำสั่ง (ภายในโฟลเดอร์ที่ต้องการ):

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

ตรวจสอบเว็บไซต์นี้ทุกอย่างอธิบายไว้ที่นี่:

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


2
ฉันคิดว่าคุณสามารถทำได้: ogr2ogr -f "KML" {outfolder} {infolder} เคล็ดลับที่นำมาจากunderdark.wordpress.com/2012/05/09/batch-shapefile-clipping
Nathan W

NBคำตอบนี้มาจากคำถามที่เกี่ยวข้องอย่างใกล้ชิดที่อ้างถึงรูปแบบไฟล์ที่แตกต่างกัน
whuber

สวัสดีเมื่อฉันลองใช้วิธีนี้ใน Ubuntu เช่น ogr2ogr -f "KML" {outfolder} {infolder} ฉันได้รับข้อผิดพลาด: 'ข้อผิดพลาด 4: การสร้างไฟล์ KML ล้มเหลว' มีความคิดอะไรที่อาจจะผิดพลาดที่นี่? ฉันสร้าง GDAL โดยใช้การสนับสนุน KML แล้ว
marty_c

7

กับหลาม:

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'))

คุณสามารถเปลี่ยนos.getcwd()เส้นทางที่ไฟล์ของคุณตั้งอยู่ ...

ฉันหวังว่ามันจะช่วยคุณ


for a in *.shp:เป็นข้อผิดพลาดทางไวยากรณ์ คุณกำลังคิดfrom glob import glob; for a in glob('*.shp'):
Mike T

โอ้ขอโทษฉันเขียนมันผิดไป ฉันได้รับการปรับปรุง @ Mike Toews ขอบคุณ
Aragon

4

คุณไม่จำเป็นต้องวนซ้ำคุณสามารถตั้งชื่อไดเรกทอรีเป็นต้นทางและปลายทางได้และ ogr2ogr จะแปลงไฟล์ใด ๆ ในไดเรกทอรีต้นทาง ดูที่นี่: การ แปลง TAB เป็น MIF / MIF เป็น TAB


ขอบคุณ! ฉันสามารถอ้างอิงจากไดเรคทอรี่หลักหนึ่งไปยังไดรฟ์ย่อยทั้งหมดและแปลงไฟล์ทั้งหมดไปยังไดรฟ์ย่อยอื่น ฉันมี: เนเธอร์แลนด์ \ รูปร่าง \ provinceX เนเธอร์แลนด์ \ รูปร่าง \ จังหวัด Y เนเธอร์แลนด์ \ รูปร่าง \ provinceZ และอื่น ๆ ... และต้องการแปลงเป็นโฟลเดอร์เหล่านี้: เนเธอร์แลนด์ \ mapinfo \ provinceX เนเธอร์แลนด์ \ mapinfo \ provinceY เนเธอร์แลนด์ \ mapinfo \ provinceZ ฉันสามารถ เขียนบรรทัดสำหรับแต่ละจังหวัด แต่ฉันสามารถทำได้ด้วยคำสั่งเดียว
Stefan

ฉันไม่ได้ลองสิ่งนี้ แต่ฉันไม่คิดว่าจะเป็นไปได้ คุณจะต้องมีลูปซึ่งจะจัดการไดเรกทอรีอินพุตและเอาต์พุตที่เกี่ยวข้อง ในกรณีนี้อาจเป็นการง่ายกว่าที่จะทำตามวิธีการของ python
Torsten


0

Universal Translator ใน Mapinfo สามารถจัดการไฟล์ได้หลายไฟล์ ไปที่โฟลเดอร์ปลายทางเลือกรูปร่างทั้งหมดกำหนด CRS สำหรับอินพุตและเอาต์พุต มันควรจะทำ


0

นี่คือการปรับแต่งคำตอบของอารากอนข้างต้น มันจะรัน ogr2ogr กับไฟล์. TAB หรือ. tab เท่านั้นและจะไม่สนใจไฟล์ประเภทอื่น ๆ ในโฟลเดอร์

#!/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))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.