जीआईएस इन्वेंट्री कैसे बनाएं?


21

मेरा कार्यालय अपने जीआईएस अनुभाग में एक बड़ा बदलाव देख रहा होगा। यह खंड 1980 के बाद से चालू है और इसमें जीआईएस डेटा (यानी, आकार फाइल, रेखापुंज फ़ाइलें, डेटा, आदि) का एक विशाल संग्रह है, लेकिन कभी भी किसी सूची के माध्यम से नहीं किया गया है। अब यह होगा।

क्या पीसी से एक एक्सेल फाइल में जीआईएस डेटा (यानी, शेपफाइल, आर्क-इंफॉर्मेशन कवरेज, लेयर फाइल, * .mxd, gdb, raster फाइल, और अधिक) के बारे में सभी जानकारी निकालने का कोई स्वचालित तरीका है? जानकारी में निर्माण की तिथि, अंतिम अंतिम तिथि, फ़ोल्डर या कंटेनर का नाम आदि शामिल हो सकते हैं।


3
ArcGIS के किस संस्करण में आप हैं? 10.1 SP1 में यह बहुत आसान है arcpy.da.walk
blah238

1
यह एक दृश्य सूची लेने और एक डिज़ाइन को बाहर निकालने से पहले शुरू करने के लिए कभी भी दर्द नहीं करता है, इससे पहले कि आप अजगर के साथ एक पुराने सर्वर पर हमला करें।
रॉय

@Roy के जवाब में - आप इस मुफ्त डाउनलोड के साथ शुरुआत करने पर विचार कर सकते हैं: voyagergis.com
काकेड

आप मेटाडाटा सर्च पोर्टल पर भी विचार कर सकते हैं, जैसे कि एश्री
स्टीफन लीड

जवाबों:


18

यह मेरे लिए काम करता है, arcpy.da.WalkArcGIS 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मॉड्यूल भी आउटपुट फ़ाइल लेखन आसान बनाने के लिए प्रयोग किया जाता है। एक्सेल CSV फाइलें खोल सकता है ताकि आप उन्हें स्प्रेडशीट के रूप में देख सकें।

arcpy.Describeअतिरिक्त गुणों के लिए फ़ंक्शन देखें जो आप आउटपुट में शामिल कर सकते हैं।

यदि आप विशेष रूप से वास्तविक मेटाडेटा से जानकारी पार्स करने के लिए देख रहे हैं , तो इस उत्तर में स्क्रिप्ट देखें: फ़ाइल जियोडेटाबेस में सभी फ़ाइलनाम (और संभवतः मेटाडेटा) युक्त तालिका बनाना


@ blah239, एक्सेल टेक्स्ट फ़ाइलों को भी खोल सकता है, बस डेलिमिनेटर प्रदान करने की आवश्यकता है।
कलाकृति

4
यह सच है, लेकिन एक्सेल सीएसवी बोली सभी मुश्किल मुद्दों जैसे कि एम्बेडेड उद्धरण, newlines और अल्पविराम का ख्याल रखती है। यह भी केवल फ़ाइल खोलने के लिए एक जादूगर के माध्यम से जाने की आवश्यकता नहीं है।
ब्लाह 238

स्पष्टीकरण के लिए thx।
कलाकृति

10

जब आप पायथन का उपयोग करते हैं, तो आप जो चाहते हैं उसे करने के लिए सही मॉड्यूल का उपयोग करना चाहिए। उदाहरण के लिए, विस्तार shp के साथ एक निर्देशिका में सभी फ़ाइलों को खोजने के लिए, बहुत सरल समाधान हैं जो बिना ब्रेक के प्रस्तुत किए गए थे, जो भयानक है ... (नाथन डब्ल्यू द्वारा प्रस्तुत समाधान के रूप में, लेकिन कई, कई अन्य हैं, बस इंटरनेट पर खोज)

प्रासंगिक मॉड्यूल के साथ कुछ उदाहरण:

1) ग्लोब मॉड्यूल के साथ:

केवल आकार:

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

आकारफाइल्स और जियोडैट डेटाबेस:

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

और कई अन्य समाधान, पुनरावर्ती आदि।


आप '.shp' पद्धति का उपयोग करके .shp.xml फ़ाइलों को कैसे अनदेखा करते हैं?
कलाकृति

1
क्या तुमने कोशिश की? glob.glob ("*। shp") मेरे अंत पर .shp.xml फ़ाइलों को वापस नहीं करता है।
blah238

@ blah238, नो ने कोशिश नहीं की, thx।
कलाकृति

5

धन्यवाद कलाकृति 21 और नाथन डब्ल्यू आपकी प्रतिक्रिया के लिए। और हाँ नाथेन के कोड ने जादू कर दिया।

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

केवल फ़ाइल नाम, और स्थान। जिस पीसी के साथ मैं काम कर रहा हूँ, उसमें बहुत सारी कवरेज (आर्क-इन्फो फाइल) है, क्या यह उन पर भी काम करेगा?


अपने सॉफ़्टवेयर के संस्करण के लिए, मैं AG 10.1 SP1 का उपयोग करता हूं, लेकिन अन्य पीसी ESRI सॉफ़्टवेयर- आर्क जानकारी के विभिन्न संस्करणों का उपयोग करते हैं।
blu_sr

मुझे वास्तव में यकीन नहीं है कि क्या arcpy.da.walkसूची को कवर किया जाएगा, लेकिन मुझे लगता है कि यह डेटाटाइप या टाइप फिल्टर में सूचीबद्ध नहीं है।
blah238

यहाँ कोड का एक छोटा संस्करण है: gist.github.com/4577289 । जैसा कि shp, lyr, और img के लिए तर्क एक ही है, हम सिर्फ उन्हें एक ifबयान में करते हैं ।
नाथन डब्ल्यू

2
txt.close()यदि आप उपयोग कर रहे हैं तो आपको इसकी आवश्यकता भी नहीं है withक्योंकि ब्लॉक से बाहर निकलने पर यह आपके लिए ऐसा करेगा।
नाथन डब्ल्यू

4

यदि आपके पास आर्कगिस डेस्कटॉप 10.0 (या इसका कोई सर्विस पैक) है, तो मुझे लगता है कि आपका सबसे अच्छा दांव एक पायथन स्क्रिप्ट लिख रहा है जो परिभाषित जीआईएस निर्देशिका के माध्यम से देखने के लिए os.walk का उपयोग करता है और सामान्य जीआईएस फ़ाइल एक्सटेंशन जैसे .shp के लिए खोज करता है। gdb, .mdb, आदि ... और एक अल्पविराम सीमांकित पाठ फ़ाइल के लिए परिणाम लिखता है। फिर आप टेक्स्ट फ़ाइल को एक्सेल में ला सकते हैं, नीचे कोड उदाहरण देखें:

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

यदि आप डेस्कटॉप के लिए आर्कगिस 10.1 (या बाद में) का उपयोग कर रहे हैं तो यहां एक और उत्तर है जो आर्कपी.एडा.वॉक का उपयोग करता है जो 10.0 या उससे पहले उपलब्ध नहीं था।


आप कोड की जाँच करना चाहते हो सकता है। यह केवल जीडीबी के लिए खोज करेगा यदि यह पहले एक आकार पाता है। लगता है कि इंडिकेशन सभी गड़बड़ है।
नाथन डब्ल्यू

मैं भी f.find यहाँ सही उपयोग नहीं है। : यह बेहतर तरह इस लिखा जाएगा gist.github.com/4577289 निश्चित रूप से untested है।
नाथन डब्ल्यू

न सोचें f.find **
नाथन डब्ल्यू

अन्य सरलीकरण में csvमॉड्यूल का उपयोग करके फ़ाइल को थोड़ा लिखने के लिए सार कर सकते हैं , और arcpy.da.walk10.1 SP1 का उपयोग करके आर्कगिस को जीआईएस डेटा प्रकारों को सूचीबद्ध करने के लिए संभाल सकते हैं।
blah238

धन्यवाद! मैं उतने पुराने डेटाबेस से उतनी जानकारी निकालने पर काम कर रहा हूं जितना मैं कर सकता हूं।
blu_sr

0

यदि आप प्रोग्रामिंग से बचना चाहते हैं, तो यह सबसे आसान और तेज़ तरीका हो सकता है।

एक्सेल के लिए एक ऐड-ऑन है जिसे एएसएपी यूटिलिटीज कहा जाता है । एक 90-दिवसीय नि: शुल्क परीक्षण है लेकिन इसके बाद, यह व्यावसायिक उपयोग के लिए $ 49 USD है। यह छात्र या व्यक्तिगत उपयोग के लिए मुफ़्त है। ऐड-ऑन कई उपयोगी कार्यों को जोड़ता है। जिनमें से एक फाइलों की सूची बना रहा है एक फ़ोल्डर संरचना में । यह फ़ाइल गुण भी प्रदान करता है। यदि आप चाहें तो आप परिणाम को फ़ाइल प्रकार से सीमित कर सकते हैं।

यहाँ एक है वीडियो ऐसा करने के तरीके की।

मैंने पहले इस ऐड का उपयोग किया है और परिणाम बहुत जल्दी हैं।

ध्यान दें, मैं इस सॉफ़्टवेयर कंपनी से संबद्ध नहीं हूं।


1
Thnx Fezter, लेकिन मुझे नहीं लगता कि यह पहले की तरह GIS फ़ाइल प्रकार लाएगा। .Shp सिर्फ .shp नहीं है, इसके साथ कई अन्य फाइलें हैं।
blu_sr

यह किसी भी और सभी फ़ाइल प्रकारों को एक फ़ोल्डर में प्राप्त कर सकता है।
Fezter

2
@ फ़ाइज़र जब तक यह नहीं जानता कि फ़ाइल और पर्सनल जियोडैट डेटाबेस से जीआईएस डेटासेट कैसे पढ़ें, मुझे आश्चर्य होगा कि अगर यह यहाँ काम करेगा क्योंकि प्रत्येक फ़ाइल और प्रत्येक डेटासेट के बीच सही संबंध नहीं है
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...]

जब मैंने ऐसा किया तो मुझे अपनी पूरी लिस्टिंग मिली।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.