จะสร้างคลัง GIS ได้อย่างไร


21

สำนักงานของฉันจะเห็นการเปลี่ยนแปลงครั้งใหญ่ในส่วนของ GIS ส่วนนี้เปิดใช้งานมาตั้งแต่ปี 1980 และมีการรวบรวมข้อมูล GIS จำนวนมาก (เช่นรูปร่างไฟล์ไฟล์แรสเตอร์ข้อมูล ฯลฯ ) แต่ไม่เคยผ่านคลังโฆษณาเลย ตอนนี้มันจะเกิดขึ้น

มีวิธีใดโดยอัตโนมัติในการดึงข้อมูลทั้งหมดเกี่ยวกับข้อมูล GIS (เช่น shapefile ความครอบคลุมข้อมูลส่วนโค้งไฟล์เลเยอร์ * .mxd, gdb, ไฟล์แรสเตอร์และอื่น ๆ ) จากพีซีไปยังไฟล์ Excel หรือไม่ ข้อมูลอาจรวมถึงวันที่สร้างวันที่แก้ไขล่าสุดชื่อโฟลเดอร์หรือคอนเทนเนอร์ ฯลฯ


3
คุณกำลังใช้ ArcGIS รุ่นใดอยู่ ที่ 10.1 SP1 สิ่งนี้ทำให้ง่ายขึ้นarcpy.da.walkมาก
blah238

1
ไม่เคยเจ็บปวดเลยที่จะเริ่มต้นด้วยการทำคลังภาพและร่างการออกแบบก่อนที่คุณจะโจมตีเซิร์ฟเวอร์เก่าด้วยหลาม
Roy

ในการตอบสนองต่อ @Roy - คุณอาจพิจารณาเริ่มต้นด้วยการดาวน์โหลดฟรีนี้: voyagergis.com
Czed

คุณอาจพิจารณาพอร์ทัลการค้นหาข้อมูลเมตาเช่นเซิร์ฟเวอร์ Geoportal
Stephen Lead

คำตอบ:


18

สิ่งนี้ใช้ได้สำหรับฉันโดยใช้arcpy.da.Walkฟังก์ชั่นที่ ArcGIS 10.1 SP1:

import arcpy, csv, os

workspace = r"c:\GISData"
output = r"C:\temp\test.csv"

with open(output, 'wb') as csvfile:
    csvwriter = csv.writer(csvfile)
    for dirpath, dirnames, filenames in arcpy.da.Walk(workspace):
        for filename in filenames:
            desc = arcpy.Describe(os.path.join(dirpath, filename))
            csvwriter.writerow([desc.catalogPath, desc.name, desc.dataType])

csvโมดูลจะใช้ในการลดความซับซ้อนของการเขียนไฟล์เพื่อส่งออก Excel สามารถเปิดไฟล์ CSV เพื่อให้คุณดูเป็นสเปรดชีต

ดูarcpy.Describeฟังก์ชันสำหรับคุณสมบัติเพิ่มเติมที่คุณสามารถรวมไว้ในเอาต์พุต

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


@ blah239, excel สามารถเปิดไฟล์ข้อความได้เช่นกันเพียงแค่ต้องระบุตัวตน
artwork21

4
จริง แต่ภาษา CSV ของ Excel ดูแลปัญหาที่ยุ่งยากทั้งหมดเช่นราคาที่ฝังตัวการขึ้นบรรทัดใหม่และจุลภาค นอกจากนี้ยังไม่ต้องใช้ตัวช่วยสร้างเพื่อเปิดไฟล์
blah238

ขอบคุณสำหรับการชี้แจง
Artwork21

10

เมื่อคุณใช้ Python คุณต้องใช้โมดูลที่ถูกต้องเพื่อทำสิ่งที่คุณต้องการ หากต้องการค้นหาไฟล์ทั้งหมดในไดเรกทอรีที่มีนามสกุล shp มีวิธีแก้ปัญหาที่ง่ายกว่าที่นำเสนอโดยไม่มีการหยุดพักซึ่งน่ากลัว ... (ตามวิธีการนำเสนอโดย Nathan W แต่มีวิธีอื่น ๆ อีกมากมายเช่น ค้นหาบนอินเทอร์เน็ต)

ตัวอย่างบางส่วนที่เกี่ยวข้องกับโมดูล:

1) ด้วยโมดูล glob:

รูปร่างเท่านั้น:

import glob
import os
os.chdir("mydir")
for files in glob.glob("*.shp"):
    print files

shapefiles และฐานข้อมูล geod:

import glob
types = ('*.shp', '*.gbd') # the tuple of file types
files_grabbed = []
for files in types:
     files_grabbed.extend(glob.glob(files)) #files_grabbed = the list of shp and gbd files

หากคุณต้องการค้นหาในไดเรกทอรีย่อยด้วย:

import glob
for f in glob.iglob("/mydir/*/*.shp"): #search immediate subdirectories 
    print f

2) ด้วย os.listdir และรายการความเข้าใจ (ในสองบรรทัด) -> รายการผลลัพธ์

path = 'mydir'
shape_files = [f for f in os.listdir(path) if f.endswith('.shp')]
gdb_files = [f for f in os.listdir(path) if f.endswith('.gdb')]

3) กับโมดูล fnmatch:

import fnmatch
for file in os.listdir('path'):
    if fnmatch.fnmatch(file, '*.shp'):
        print file

และโซลูชั่นอื่น ๆ มากมาย recursive ฯลฯ


คุณจะข้ามไฟล์. shp.xml ไปได้อย่างไรโดยใช้วิธีการ '* .shp'
artwork21

1
คุณลองหรือยัง glob.glob ("*. shp") ไม่ส่งคืนไฟล์. shp.xml ที่ส่วนท้ายของฉัน
blah238

@ blah238 ไม่ลองไม่ได้ขอบคุณ
artwork21

5

ขอบคุณ Artwork21 และ Nathan W สำหรับการตอบกลับของคุณ และใช่รหัสของ Nathen ทำให้เกิดเวทมนตร์

import os, arcpy

#create blank text file
with open("C:\\Temp\\GISlayers.txt", "w") as txt:
for root, dirs, files in os.walk("C:\\Temp\\temp"):
    for f in files:
        #look for shapefiles
        if f.endswith('.shp'):
            desc = arcpy.Describe(root + "\\" + f)
            #write info to text file
            txt.write(desc.name + "," + desc.catalogPath + "\n")

        #look for file geodatabases
        if f.endswith('.gdb'):
            desc = arcpy.Describe(root)
            for child in desc.children:
                #write info to text file
                txt.write(child.name + "," + child.path + "\n")

        #look for layer files
        if f.endswith('.lyr'):
            desc = arcpy.Describe(root + "\\" + f)
            #write info to text file
            txt.write(desc.name + "," + desc.catalogPath + "\n")

        #look for img file
        if f.endswith('.img'):
            desc = arcpy.Describe(root + "\\" + f)
            #write info to text file
            txt.write(desc.name + "," + desc.catalogPath + "\n")

ชื่อไฟล์และที่ตั้งเท่านั้น พีซีที่ฉันจะใช้งานมีไฟล์ครอบคลุม (ไฟล์ arc-info) มากมายมันจะใช้งานได้ไหม


สำหรับซอฟต์แวร์เวอร์ชันของฉันฉันใช้ AG 10.1 SP1 แต่พีซีเครื่องอื่นใช้ซอฟต์แวร์ ESRI รุ่นต่างๆ - ข้อมูล Arc ส่วนใหญ่
blu_sr

จริง ๆ แล้วฉันไม่แน่ใจว่าarcpy.da.walkจะแสดงรายการความคุ้มครองหรือไม่ แต่ฉันคาดเดาไม่ได้เนื่องจากไม่มีอยู่ในรายการประเภทข้อมูลหรือตัวกรองประเภท
blah238

นี่คือรุ่นสั้นของรหัส: gist.github.com/4577289 ในฐานะที่เป็นตรรกะสำหรับ shp, lyr และ img เหมือนกันเราแค่ทำมันในหนึ่งifประโยค
Nathan W

2
คุณไม่จำเป็นต้องใช้txt.close()ถ้าคุณใช้withเพราะมันจะทำเพื่อคุณเมื่อบล็อกออก
Nathan W

4

หากคุณมี ArcGIS Desktop 10.0 (หรือชุดบริการใด ๆ ) ฉันคิดว่าทางออกที่ดีที่สุดของคุณคือการเขียนสคริปต์ไพ ธ อนที่ใช้ os.walk เพื่อค้นหาไดเรกทอรี GIS ที่กำหนดไว้และค้นหานามสกุลไฟล์ GIS ทั่วไปเช่น. shp, gdb, .mdb ฯลฯ ... และเขียนผลลัพธ์ไปยังไฟล์ข้อความที่คั่นด้วยจุลภาค จากนั้นคุณสามารถนำไฟล์ข้อความไปสู่ ​​excel ดูตัวอย่างโค้ดด้านล่าง:

import os, arcpy

#create blank text file
txt = open("C:\\Temp\\GISlayers.txt", "w")

for root, dirs, files in os.walk("C:\\Temp\\temp"):
    for f in files:

        #look for shapefiles
        foundSHP = f.find(".shp")
        if foundSHP >0:
            checkEXT = f[-3:]
                if checkEXT <> "xml":
                    desc = arcpy.Describe(root + "\\" + f)
                    #write info to text file
                    txt.write(desc.name + "," + desc.catalogPath + "\n")

        #look for file geodatabases
        foundGDB = f.find(".gdb")
        if foundGDB >0:
            desc = arcpy.Describe(root)
            for child in desc.children:
            #write info to text file
            txt.write(child.name + "," + child.path + "\n")
        break
txt.close()

หากคุณใช้ ArcGIS 10.1 (หรือใหม่กว่า) สำหรับเดสก์ท็อปมีคำตอบอีกข้อหนึ่งที่นี่ซึ่งใช้ arcpy.da.Walk ซึ่งไม่สามารถใช้งานได้ตั้งแต่ 10.0 ขึ้นไป


คุณอาจต้องการตรวจสอบรหัสของคุณ มันจะค้นหา gdb เท่านั้นหากพบรูปร่างก่อน ดูเหมือนว่าการเยื้องจะเป็นสิ่งที่สับสน
Nathan W

ฉันยังไม่ f.find คือการใช้งานที่ถูกต้องที่นี่ สิ่งนี้น่าจะเขียนได้ดีกว่านี้: gist.github.com/4577289ยังไม่ได้ทดลอง
Nathan W

อย่าคิดว่า f.find **
นาธาน W

ความเรียบง่ายอื่น ๆ อาจรวมถึงการใช้csvโมดูลเพื่อสรุปไฟล์ที่เขียนเล็กน้อยและใช้arcpy.da.walkที่ 10.1 SP1 เพื่อให้ ArcGIS จัดการรายการประเภทข้อมูล GIS
blah238

ขอบคุณ! ฉันกำลังพยายามดึงข้อมูลให้ได้มากที่สุดจากฐานข้อมูลอายุเก่า
blu_sr

0

หากคุณต้องการหลีกเลี่ยงการเขียนโปรแกรมนี่อาจเป็นวิธีที่ง่ายที่สุดและเร็วที่สุด

มี add-on สำหรับ Excel เรียกว่าเร็วที่สุดยูทิลิตี้ มีการทดลองใช้ฟรี 90 วันแต่หลังจากนั้นมีค่าใช้จ่าย $ 49 USD สำหรับการใช้งานทางธุรกิจ ฟรีสำหรับนักเรียนหรือของใช้ส่วนตัว ส่วนเสริมเพิ่มฟังก์ชั่นที่มีประโยชน์มากมาย หนึ่งในนั้นคือการสร้างรายการของไฟล์ในโครงสร้างโฟลเดอร์ นอกจากนี้ยังมีคุณสมบัติของไฟล์ คุณสามารถ จำกัด ผลลัพธ์ตามประเภทไฟล์ได้หากต้องการ

นี่คือวิดีโอวิธีการทำสิ่งนี้

ฉันเคยใช้ Add-on นี้มาก่อนและผลลัพธ์ก็รวดเร็วมาก

หมายเหตุฉันไม่ได้มีส่วนเกี่ยวข้องกับ บริษัท ซอฟต์แวร์นี้


1
ขอบคุณ แต่ฉันไม่คิดว่ามันจะดึงไฟล์ประเภท GIS เหมือนก่อน . shp ไม่ได้เป็นเพียง. shp แต่มีไฟล์อื่น ๆ อีกมากมาย
blu_sr

มันสามารถรับไฟล์ทุกประเภทในโฟลเดอร์
เฟซเตอร์

2
@Fetzer เว้นแต่จะรู้วิธีการอ่านชุดข้อมูล GIS ออกจากแฟ้มและ Geodatabases ส่วนตัวผมต้องการจะประหลาดใจว่ามันจะทำงานที่นี่ตั้งแต่ยังไม่ได้เป็นความสัมพันธ์ที่แท้จริงระหว่างแต่ละไฟล์และแต่ละชุด
nicksan

ใช่แล้วคุณพูดถูก ฉันพลาดที่คุณมีฐานข้อมูลทางภูมิศาสตร์ สิ่งนี้ไม่ได้ผลสำหรับคุณ ขอโทษสำหรับเรื่องนั้น. แต่มันเป็นปลั๊กอินที่ดีอยู่แล้ว
Fezter

0

ฉันไม่สามารถรับคำตอบอื่น ๆ ให้ทำงานได้อย่างเต็มที่

ในตัวอย่างแรกในไดเรกทอรีที่มีทั้งฐานข้อมูลทางภูมิศาสตร์และรูปร่างไฟล์ฉันจะได้รับรายชื่อของคุณสมบัติชั้นเรียนในฐานข้อมูลทางภูมิศาสตร์เท่านั้น แต่เมื่อฉันแสดงความคิดเห็นในส่วนฐานข้อมูลทางภูมิศาสตร์ของสคริปต์ฉันได้รับรายการรูปร่างไฟล์

ในตัวอย่างที่สองส่วนฐานข้อมูลทางภูมิศาสตร์ไม่ทำงานดังนั้นฉันจึงคัดลอกในส่วนฐานข้อมูลทางภูมิศาสตร์ของตัวอย่างแรก อีกครั้งฉันได้รับรายการฐานข้อมูลทางภูมิศาสตร์เท่านั้น

จากนั้นมันก็กดฉัน: ฐานข้อมูลทางภูมิศาสตร์จะถูกอ่านก่อนที่จะสร้างไฟล์รูปร่างและสคริปต์จะหยุดที่ส่วนbreakในฐานข้อมูลทางภูมิศาสตร์

เป็นมือใหม่หลามฉันไม่รู้ว่าทำไมbreakมันถึงต้องการ แต่ถ้าไม่มีมันสคริปต์ดูเหมือนจะวนซ้ำไม่รู้จบ แต่เนื่องจากbreakมันเป็นสิ่งที่จำเป็นสำหรับฉันที่วางส่วนฐานข้อมูลภูมิศาสตร์ไว้ในลูปของตัวเองหลังจากไฟล์อื่น ประเภทมีการระบุไว้จะแก้ปัญหา:

#create blank text file with open("C:\\Temp\\GISlayers.txt", "w") as txt: for root, dirs, files in os.walk("C:\\Temp\\temp"): for f in files: #look for shapefiles, etc. [code...] for f in files: #look for geodatabases [code...]

เมื่อฉันทำฉันได้รับรายชื่อเต็ม

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