ใช้ 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.