Bir CBS envanteri nasıl yapılır?


21

Ofisim CBS bölümünde büyük bir değişiklik görecek. Bu bölüm 1980'lerden bu yana işler hale geldi ve büyük bir GIS verisi koleksiyonuna (yani, şekil dosyaları, tarama dosyaları, veriler vb.) Sahip, ancak hiçbir zaman envanterden geçmedi. Şimdi olacak.

Bir PC'den bir Excel dosyasına GIS verisi hakkında tüm bilgileri (yani, shapefile, ark-bilgi kapsamı, katman dosyası, * .mxd, gdb, raster dosyası ve daha fazlası) çıkarmak için otomatik bir yöntem var mı? Bilgiler, oluşturma tarihini, en son düzenlendiği tarihi, klasör veya kapsayıcı adını vb. İçerebilir.


3
ArcGIS'in hangi versiyonundasınız? 10.1 SP1'de bu daha kolay hale gelir arcpy.da.walk.
blah238

1
Python ile eski bir sunucuya saldırmadan önce görsel bir envanter alarak ve bir tasarım taslağını çizerek başlamak asla zarar vermez.
Roy

@Roy adlı kişiye yanıt olarak - bu ÜCRETSİZ indirme ile başlamayı düşünebilirsiniz: voyagergis.com
Czed

Yanıtlar:


18

arcpy.da.WalkArcGIS 10.1 SP1'deki işlevi kullanarak bu benim için çalışıyor :

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

csvModül ayrıca çıkış dosyası yazma basitleştirmek için kullanılır. Excel, CSV dosyalarını açarak bunları elektronik tablo olarak görüntüleyebilir.

Çıktıya arcpy.Describeekleyebileceğiniz ek özellikler için işleve bakın .

Özellikle asıl meta verilerden bilgi ayrıştırmak istiyorsanız, bu cevaptaki betiğe bakın: Bir Dosya Coğrafyatabanındaki tüm dosya adlarını (ve muhtemelen meta verileri) içeren bir tablo oluşturma


@ blah239, excel de metin dosyalarını açabilir, sadece sınırlayıcıyı sağlamanız gerekir.
artwork21,

4
Doğru, ancak Excel CSV lehçesi, gömülü tırnak işaretleri, yeni satırlar ve virgüller gibi tüm zorlu sorunların üstesinden gelir. Ayrıca sadece dosyayı açmak için bir sihirbazdan geçmeyi gerektirmez.
blah238

açıklama için thx.
artwork21,

10

Python'u kullanırken, istediğiniz şeyi yapmak için doğru modülleri kullanmanız gerekir. Shp uzantılı bir dizindeki tüm dosyaları bulmak için, örneğin, ara vermeden sunulan çok daha basit çözümler var, ki bu çok kötü ... (Nathan W tarafından sunulan çözüm olarak, ama daha birçokları var, sadece İnternette ara)

İlgili modüller ile bazı örnekler:

1) glob modülü ile birlikte:

sadece şekil dosyaları:

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

şekil dosyaları ve coğrafi veri tabanları:

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

alt dizinlerde de arama yapmak istiyorsanız:

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

2) os.listdir ve liste anlama (iki satırda) -> sonuç listesi

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 modülüyle:

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

ve diğerleri, özyinelemeli vb çözümler


'* .shp' yöntemini kullanarak .shp.xml dosyalarını nasıl görmezden gelirsiniz?
artwork21,

1
Onu denedin mi? glob.glob ("*. shp") benim tarafımda .shp.xml dosyalarını döndürmüyor.
blah238

@ blah238, hayır denemedim, thx.
artwork21,

5

Cevabınız için sanat eseri21 ve Nathan W teşekkür ederiz. Ve evet, Nathen'in kodu sihri yaptı.

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

Yalnızca dosya adı ve konum. Çalıştığım bilgisayar çok fazla kapsama (ark-bilgi dosyası) dosyası içeriyor, onlar üzerinde de çalışacak mı?


Yazılımımın sürümüne gelince, AG 10.1 SP1 kullanıyorum, ancak diğer bilgisayarlarda ESRI yazılımının çeşitli sürümleri kullanılıyor - Arc info.
blu_sr

Aslında arcpy.da.walk, grupları listeleyip listelenmeyeceğinden emin değilim , ancak dataType veya type filtrelerinde listelenmediğinden emin değilim .
blah238

İşte kodun daha kısa bir sürümü: gist.github.com/4577289 . Shp, lyr ve img mantığı aynı olduğundan sadece onları tek bir ififadede yaparız .
Nathan W.

2
Ayrıca blok txt.close()kullanıyorsanız withbunu sizin için yapacağınız için kullanıyorsanız buna ihtiyacınız yok.
Nathan W.

4

ArcGIS Desktop 10.0'a (veya hizmet paketlerinden herhangi birine) sahipseniz, en iyi bahsinizin tanımlanmış bir GIS dizinine bakmak için os.walk komutunu kullanan ve .shp gibi yaygın GIS dosya uzantılarını arayan bir python betiği yazmak olduğunu düşünüyorum. gdb, .mdb, etc ... ve sonucu virgülle ayrılmış bir metin dosyasına yazar. Daha sonra metin dosyasını excel'e getirebilirsiniz, aşağıdaki kod örneğine bakın:

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 (veya daha yenisini) Desktop için kullanıyorsanız, burada arcpy.da.Walk kullanan ve 10.0 veya daha önceki sürümlerde bulunmayan başka bir Cevap var.


Kodunuzu kontrol etmek isteyebilirsiniz. İlk önce bir şekil bulursa sadece gdb'yi arayacaktır. Görünüşe göre karışıklık hepsi berbat.
Nathan W.

Ayrıca burada doğru kullanım olduğunu da sanmıyorum. Bu böyle yazılmış daha iyi olurdu: gist.github.com/4577289 Elbette denenmemiş .
Nathan W.

düşünmeyin sanırım **
Nathan W.

Diğer basitleştirmeler csv, dosyayı biraz yazmak için modülün kullanılması arcpy.da.walkve ArcGIS'in GIS veri tiplerini listelemesine izin vermek için 10.1 SP1'de kullanılmasını içerebilir .
blah238

Teşekkürler! Bu eski veritabanından olabildiğince fazla bilgi çıkarmaya çalışıyorum.
blu_sr

0

Programlamadan kaçınmak istiyorsanız, bu en kolay ve en hızlı yöntem olabilir.

Excel için ASAP Utilities adlı bir eklenti var . Orada bir olan 90 günlük ücretsiz deneme ama bundan sonra bu iş kullanımı için 49 $ dolar var. Öğrenci veya kişisel kullanım için ücretsiz. Eklenti birçok yararlı işlev ekler. Bunlardan biri bir klasör yapısında dosyaların bir listesini oluşturmaktır . Ayrıca dosya özellikleri sağlar. İsterseniz sonuçları dosya türüne göre sınırlayabilirsiniz.

İşte bunun nasıl yapılacağı bir video .

Bu eklentiyi daha önce kullandım ve sonuçlar çok hızlı.

Not, bu yazılım şirketine bağlı değilim.


1
Thnx Fezter, ancak GIS dosya türlerini eskisi gibi getireceğini sanmıyorum. .Shp sadece .shp değil, onunla başka birçok dosyaya sahip.
blu_sr

Bir klasördeki tüm dosya türlerini alabilir.
Fezter

2
@Fetzer, GIS veri dosyalarının Dosya ve Kişisel Coğrafi Veri Tabanları dışında nasıl okunacağını bilmediği sürece, her dosya ile her veri kümesi arasında doğru bir ilişki olmadığı için burada çalışacak olsaydı
şaşırırdım

Evet haklısın. Coğrafi veri tabanlarına sahip olduğunuzu özledim. Bu senin için işe yaramaz. Bunun için üzgünüm. Ancak, yine de iyi bir fiş.
Fezter

0

Diğer cevapları tam olarak işe alamadım.

İlk örnekte, hem coğrafi veri tabanlarına hem de şekil dosyalarına sahip bir dizinde, yalnızca coğrafi veritabanındaki özellik sınıflarının bir listesini aldım, ancak komut dosyasının coğrafi veri tabanlarını yorumladığımda, biçim dosyalarının bir listesini aldım.

İkinci örnekte, coğrafi veri tabanları kısmı hiç işe yaramadı, bu yüzden ilk örneğin coğrafi veri tabanlarına kopyaladım. Yine, sadece coğrafi veri tabanlarının bir listesini aldım.

Sonra bana vurdu: geodatabases shapefiles önce okunur ve komut dosyası durur break geodatabases bölümünde .

Bir python acemi olmak, neden breakgerekli olduğunu bilmiyorum ama onsuz senaryo sonsuz bir döngüye giriyor gibi gözüküyor, ancak breakihtiyaç duyulduğundan beri , diğer veritabanından sonra coğrafi veri tabanlarını kendi döngüsüne koyma başıma geldi. türleri listelenir, sorunu çözerdi:

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

Bunu yaptığımda tam listemi aldım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.