Bagaimana cara membuat inventaris GIS?

21

Kantor saya akan melihat perubahan besar di bagian GIS. Bagian ini telah beroperasi sejak 1980-an dan memiliki banyak koleksi data GIS (yaitu, shapefile, file raster, data, dll) tetapi tidak pernah melalui inventaris apa pun. Sekarang ini akan terjadi.

Apakah ada cara otomatis untuk mengekstrak semua informasi tentang data GIS (yaitu, shapefile, cakupan info busur, file lapisan, * .mxd, gdb, file raster, dan banyak lagi) dari PC ke file Excel? Informasi dapat mencakup tanggal pembuatan, tanggal diedit terakhir, nama folder atau wadah, dll.

blu_sr
sumber
3
Anda berada di versi ArcGIS apa? Pada 10.1 SP1 ini dibuat lebih mudah oleh arcpy.da.walk.
blah238
1
Tidak ada salahnya untuk memulai dengan mengambil inventaris visual dan membuat sketsa desain sebelum Anda menyerang server lama dengan python.
Roy
Menanggapi @Roy - Anda dapat mempertimbangkan mulai dengan unduhan GRATIS ini: voyagergis.com
Czed
Anda juga dapat mempertimbangkan portal pencarian metadata, seperti Server Geoportal
Stephen Lead

Jawaban:

18

Ini berfungsi untuk saya, menggunakan arcpy.da.Walkfungsi di 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])

The csvModul ini juga digunakan untuk menyederhanakan penulisan file output. Excel dapat membuka file CSV sehingga Anda dapat melihatnya sebagai spreadsheet.

Lihat arcpy.Describefungsi untuk properti tambahan yang dapat Anda sertakan dalam output.

Jika Anda secara khusus mencari untuk mem-parsing informasi dari metadata yang sebenarnya , lihat skrip dalam jawaban ini: Membuat tabel yang berisi semua nama file (dan mungkin metadata) dalam File Geodatabase

blah238
sumber
@ blah239, excel dapat membuka file teks juga, hanya perlu menyediakan pembatas.
artwork21
4
Benar, tetapi dialek Excel CSV menangani semua masalah rumit seperti kutipan yang disematkan, baris baru, dan koma. Itu juga tidak perlu melalui wizard untuk hanya membuka file.
blah238
Terima kasih untuk klarifikasi.
artwork21
10

Ketika Anda menggunakan Python, Anda harus menggunakan modul yang benar untuk melakukan apa yang Anda inginkan. Untuk menemukan semua file dalam direktori dengan ekstensi shp, misalnya, ada banyak solusi sederhana yang disajikan tanpa jeda, yang mengerikan ... (seperti solusi yang disajikan oleh Nathan W, tetapi ada banyak, banyak yang lain, hanya cari di internet)

Beberapa contoh dengan modul yang relevan:

1) dengan modul glob:

hanya shapefile:

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

shapefile dan geodatabases:

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

jika Anda ingin mencari juga di subdirektori:

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

2) dengan os.listdir dan daftar pemahaman (dalam dua baris) -> daftar hasil

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) dengan modul fnmatch:

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

dan banyak solusi lainnya, rekursif dll

gen
sumber
bagaimana Anda mengabaikan file .shp.xml menggunakan metode '* .shp'?
artwork21
1
Apakah kamu sudah mencobanya? glob.glob ("*. shp") tidak mengembalikan file .shp.xml di pihak saya.
blah238
@ blah238, tidak tidak mencoba, thx.
artwork21
5

Terima kasih artwork21 dan Nathan W atas tanggapan Anda. Dan ya, kode Nathen membuat keajaiban.

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

Hanya nama file, dan lokasi. PC saya akan bekerja dengan memiliki banyak cakupan (file arc-info) file, apakah akan bekerja pada mereka juga

blu_sr
sumber
Sedangkan untuk versi perangkat lunak saya, saya menggunakan AG 10.1 SP1, tetapi pc lain menggunakan berbagai versi perangkat lunak ESRI - Info Arc kebanyakan.
blu_sr
Saya sebenarnya tidak yakin apakah arcpy.da.walkakan mencantumkan cakupan, tapi saya kira tidak karena tidak terdaftar dalam tipe data atau filter tipe.
blah238
Ini adalah versi kode yang lebih pendek: gist.github.com/4577289 . Karena logika untuk shp, lyr, dan img sama, kita lakukan saja dalam satu ifpernyataan.
Nathan W
2
Anda juga tidak perlu txt.close()jika menggunakan withkarena akan melakukannya untuk Anda ketika blok keluar.
Nathan W
4

Jika Anda memiliki ArcGIS Desktop 10.0 (atau salah satu paket layanannya), saya pikir taruhan terbaik Anda adalah menulis skrip python yang menggunakan os.walk untuk melihat melalui direktori GIS yang ditentukan dan mencari ekstensi file GIS yang umum seperti .shp,. gdb, .mdb, dll ... dan menulis hasilnya ke file teks yang dibatasi koma. Anda kemudian dapat membawa file teks ke excel, lihat contoh kode di bawah ini:

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

Jika Anda menggunakan ArcGIS 10.1 (atau lebih baru) untuk Desktop, maka ada Jawaban lain di sini yang menggunakan arcpy.da.Walk yang tidak tersedia pada 10.0 atau sebelumnya.

artwork21
sumber
Anda mungkin ingin memeriksa kode Anda. Ini hanya akan mencari gdb jika menemukan bentuk terlebih dahulu. Sepertinya indentasinya berantakan.
Nathan W
Saya juga tidak f.find adalah penggunaan yang benar di sini. Ini akan lebih baik ditulis seperti ini: gist.github.com/4577289 Tentu saja tidak diuji.
Nathan W
jangan berpikir f.find **
Nathan W
Penyederhanaan lain dapat mencakup menggunakan csvmodul untuk sedikit abstrak penulisan file, dan menggunakan arcpy.da.walkpada 10,1 SP1 untuk membiarkan ArcGIS menangani daftar tipe data GIS.
blah238
Terima kasih! Saya sedang berupaya mengekstraksi sebanyak mungkin info dari basis data lama itu.
blu_sr
0

Jika Anda ingin menghindari pemrograman, ini mungkin metode termudah dan tercepat.

Ada add-on untuk Excel yang disebut ASAP Utilities . Ada uji coba gratis 90 hari, tetapi setelah itu, $ 49 USD untuk penggunaan bisnis. Ini gratis untuk penggunaan siswa atau pribadi. Add-on menambahkan banyak fungsi yang bermanfaat. Salah satunya adalah membuat daftar file dalam struktur folder. Ini juga menyediakan properti file. Anda dapat membatasi hasil berdasarkan tipe file jika diinginkan.

Berikut video cara melakukan ini.

Saya telah menggunakan pengaya ini sebelumnya dan hasilnya sangat cepat.

Catatan, saya tidak berafiliasi dengan perusahaan perangkat lunak ini.

Fezter
sumber
1
Thnx Fezter, tetapi saya tidak berpikir itu akan mengambil jenis file GIS seperti sebelumnya. .Shp bukan hanya .shp, memiliki banyak file lainnya.
blu_sr
Itu bisa mendapatkan semua dan semua jenis file dalam folder.
Fezter
2
@Fetzer kecuali ia tahu cara membaca dataset GIS dari File dan Personal Geodatabases, saya akan terkejut jika itu akan bekerja di sini karena tidak ada korelasi yang benar antara setiap file dan setiap dataset
nicksan
Oh ya, kamu benar. Saya rindu bahwa Anda memiliki geodatabases. Ini tidak akan bekerja untuk Anda. Maaf soal itu. Tapi bagaimanapun, ini adalah plug yang bagus.
Fezter
0

Saya tidak bisa mendapatkan jawaban lain untuk bekerja sepenuhnya.

Dalam contoh pertama, dalam direktori dengan geodatabases dan shapefile, saya hanya mendapat daftar kelas fitur di geodatabase, tetapi ketika saya berkomentar bagian geodatabases dari skrip, saya mendapat daftar shapefile.

Pada contoh kedua, bagian geodatabases tidak berfungsi sama sekali, jadi saya menyalin bagian geodatabases dari contoh pertama. Sekali lagi, saya mendapat daftar hanya geodatabases.

Lalu saya tersadar: geodatabases dibaca sebelum shapefile, dan skrip berhenti di break di bagian geodatabases.

Menjadi pemula python saya tidak tahu mengapa breakitu diperlukan, tetapi tanpa itu skrip tampaknya pergi dalam loop tak berujung, tetapi karena breakdiperlukan terpikir oleh saya bahwa menempatkan bagian geodatabases di loop sendiri, setelah file lainnya jenis terdaftar, akan menyelesaikan masalah:

#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...]

Ketika saya melakukan itu, saya mendapatkan daftar lengkap saya.

bkepl
sumber