Làm thế nào để tạo một kho lưu trữ GIS?


21

Văn phòng của tôi sẽ thấy một sự thay đổi lớn trong phần GIS của nó. Phần này đã hoạt động từ những năm 1980 và có một bộ sưu tập dữ liệu GIS khổng lồ (ví dụ: shapefiles, tệp raster, dữ liệu, v.v.) nhưng chưa từng qua bất kỳ kho lưu trữ nào. Bây giờ nó sẽ xảy ra.

Có cách nào tự động để trích xuất tất cả thông tin về dữ liệu GIS (ví dụ: shapefile, bảo hiểm thông tin hồ quang, tệp lớp, * .mxd, gdb, tệp raster, v.v.) từ PC sang tệp Excel không? Thông tin có thể bao gồm ngày tạo, ngày chỉnh sửa lần cuối, tên thư mục hoặc vùng chứa, v.v.


3
Bạn đang ở phiên bản nào của ArcGIS? Tại 10.1 SP1, việc này được thực hiện dễ dàng hơn nhiều arcpy.da.walk.
blah238

1
Sẽ không bao giờ đau đầu khi bắt đầu bằng cách lấy một bản kiểm kê trực quan và phác thảo một thiết kế trước khi bạn tấn công một máy chủ cũ bằng python.
Roy

Để trả lời @Roy - bạn có thể cân nhắc bắt đầu với bản tải xuống MIỄN PHÍ này: Voyagergis.com
Đã đóng cửa

Bạn cũng có thể xem xét một cổng tìm kiếm siêu dữ liệu, chẳng hạn như Máy chủ Geoportal
Stephen Lead

Câu trả lời:


18

Điều này hoạt động với tôi, sử dụng arcpy.da.Walkchức năng tại 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])

Các csvmô-đun cũng được sử dụng để đơn giản hóa bằng văn bản cho tập tin đầu ra. Excel có thể mở tệp CSV để bạn có thể xem chúng dưới dạng bảng tính.

Xem arcpy.Describechức năng cho các thuộc tính bổ sung mà bạn có thể bao gồm trong đầu ra.

Nếu bạn đặc biệt muốn phân tích thông tin từ siêu dữ liệu thực tế , hãy xem tập lệnh trong câu trả lời này: Tạo bảng chứa tất cả tên tệp (và có thể siêu dữ liệu) trong Cơ sở dữ liệu địa lý tệp


@ blah239, excel cũng có thể mở tệp văn bản, chỉ cần cung cấp dấu phân cách.
nghệ thuật21

4
Đúng, nhưng phương ngữ CSV Excel xử lý tất cả các vấn đề phức tạp như trích dẫn được nhúng, dòng mới và dấu phẩy. Nó cũng không yêu cầu phải thông qua một trình hướng dẫn để chỉ mở tệp.
blah238

thx để làm rõ.
nghệ thuật21

10

Khi bạn sử dụng Python, bạn phải sử dụng các mô-đun chính xác để làm những gì bạn muốn. Ví dụ, để tìm tất cả các tệp trong một thư mục có phần mở rộng shp, có nhiều giải pháp đơn giản hơn được trình bày mà không bị phá vỡ, điều này thật tệ ... (như giải pháp được đưa ra bởi Nathan W, nhưng có rất nhiều, rất nhiều giải pháp khác, chỉ tìm kiếm trên Internet)

Một số ví dụ với các mô-đun có liên quan:

1) với mô-đun toàn cầu:

shapefiles chỉ:

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

shapefiles và geodatabase:

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

nếu bạn muốn tìm kiếm trong thư mục con:

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

2) với os.listdir và hiểu danh sách (trong hai dòng) -> danh sách kết quả

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) với mô-đun fnmatch:

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

và nhiều giải pháp khác, đệ quy vv


Làm thế nào để bạn bỏ qua các tệp .shp.xml bằng phương thức '* .shp'?
nghệ thuật21

1
Bạn đã thử à? global.glob ("*. shp") không trả về các tệp .shp.xml ở cuối của tôi.
blah238

@ blah238, không thử, thx.
nghệ thuật21

5

Cảm ơn tác phẩm nghệ thuật21 và Nathan W đã phản hồi của bạn. Và vâng, mã của Nathen đã làm nên điều kỳ diệu.

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

Chỉ tên tệp và vị trí. Máy tính tôi sẽ làm việc với rất nhiều tệp bảo hiểm (tệp thông tin hồ quang), nó cũng sẽ hoạt động trên chúng chứ?


Đối với phiên bản phần mềm của tôi, tôi sử dụng AG 10.1 SP1, nhưng máy tính khác sử dụng nhiều phiên bản phần mềm ESRI khác nhau - Thông tin Arc là chủ yếu.
blu_sr

Tôi thực sự không chắc chắn liệu arcpy.da.walksẽ liệt kê các trang bìa hay không, nhưng tôi đoán là không vì nó không được liệt kê trong bộ lọc kiểu dữ liệu hoặc loại.
blah238

Đây là phiên bản ngắn hơn của mã: gist.github.com/4577289 . Như logic cho shp, lyr và img giống nhau, chúng ta chỉ thực hiện chúng trong một ifcâu lệnh.
Nathan W

2
Bạn cũng không cần txt.close()nếu bạn đang sử dụng withvì nó sẽ làm điều đó cho bạn khi khối thoát.
Nathan W

4

Nếu bạn có ArcGIS Desktop 10.0 (hoặc bất kỳ gói dịch vụ nào của nó), tôi nghĩ rằng cách tốt nhất của bạn là viết một tập lệnh python sử dụng os.walk để xem qua thư mục GIS đã xác định và tìm kiếm các phần mở rộng tệp GIS phổ biến như .shp ,. gdb, .mdb, v.v ... và ghi kết quả vào tệp văn bản được phân tách bằng dấu phẩy. Sau đó, bạn có thể đưa tệp văn bản vào excel, xem ví dụ mã bên dưới:

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

Nếu bạn đang sử dụng ArcGIS 10.1 (hoặc phiên bản mới hơn) cho Máy tính để bàn thì có một Câu trả lời khác ở đây sử dụng arcpy.da.Walk không có sẵn ở 10.0 hoặc trước đó.


Bạn có thể muốn kiểm tra mã của bạn. Nó sẽ chỉ tìm kiếm gdb nếu nó tìm thấy hình dạng đầu tiên. Có vẻ như tất cả các lỗi.
Nathan W

Tôi cũng không f.find là cách sử dụng chính xác ở đây. Điều này sẽ được viết tốt hơn như thế này: gist.github.com/4577289 Tất nhiên chưa được kiểm tra.
Nathan W

đừng nghĩ f.find **
Nathan W

Các đơn giản hóa khác có thể bao gồm sử dụng csvmô-đun để trừu tượng hóa việc ghi tệp một chút và sử dụng arcpy.da.walktại 10.1 SP1 để cho phép ArcGIS xử lý việc liệt kê các loại dữ liệu GIS.
blah238

Cảm ơn! Tôi đang làm việc để trích xuất càng nhiều thông tin càng tốt từ cơ sở dữ liệu cũ.
blu_sr

0

Nếu bạn muốn tránh lập trình, đây có thể là phương pháp dễ nhất và nhanh nhất.

Có một tiện ích bổ sung cho Excel có tên là ASAP Utility . Có bản dùng thử miễn phí 90 ngày nhưng sau đó, đó là $ 49 USD cho sử dụng kinh doanh. Nó miễn phí cho sinh viên hoặc sử dụng cá nhân. Phần bổ sung thêm rất nhiều chức năng hữu ích. Một trong số đó là tạo một danh sách các tập tin trong cấu trúc thư mục. Nó cũng cung cấp các thuộc tính tập tin. Bạn có thể giới hạn kết quả theo loại tệp nếu bạn muốn.

Đây là một video về cách làm điều này.

Tôi đã sử dụng tiện ích này trước đây và kết quả rất nhanh.

Lưu ý, tôi không liên kết với công ty phần mềm này.


1
Thnx Fezter, nhưng tôi không nghĩ rằng nó sẽ tìm nạp các loại tệp GIS như trước đây. .Shp không chỉ là .shp, có nhiều tệp khác với nó.
blu_sr

Nó có thể nhận bất kỳ và tất cả các loại tệp trong một thư mục.
Fezter

2
@Fetzer trừ khi nó biết cách đọc các bộ dữ liệu GIS từ Cơ sở dữ liệu địa lý tệp và cá nhân, tôi sẽ ngạc nhiên nếu nó hoạt động ở đây vì không có mối tương quan thực sự giữa mỗi tệp và mỗi bộ dữ liệu
nicksan

Ồ vâng, bạn đúng. Tôi nhớ rằng bạn đã có cơ sở dữ liệu địa lý. Điều này sẽ không làm việc cho bạn. Xin lỗi vì điều đó. Nhưng, dù sao nó cũng là một phích cắm tốt.
Fezter

0

Tôi không thể có được câu trả lời khác để làm việc đầy đủ.

Trong ví dụ đầu tiên, trong một thư mục có cả cơ sở dữ liệu địa lý và shapefiles, tôi chỉ nhận được một danh sách các lớp tính năng trong cơ sở dữ liệu địa lý, nhưng khi tôi nhận xét phần cơ sở dữ liệu địa lý của tập lệnh, tôi đã nhận được một danh sách các shapefile.

Trong ví dụ thứ hai, phần cơ sở dữ liệu địa lý hoàn toàn không hoạt động, vì vậy tôi đã sao chép trong phần cơ sở dữ liệu địa lý của ví dụ đầu tiên. Một lần nữa, tôi nhận được một danh sách chỉ các cơ sở dữ liệu địa lý.

Sau đó, nó đánh tôi: cơ sở dữ liệu địa lý được đọc trước khi shapefiles và tập lệnh dừng lại ở break phần cơ sở dữ liệu địa lý.

Trở thành một người mới chơi python Tôi không biết tại sao lại breakcần thiết, nhưng không có nó, kịch bản dường như đi vào một vòng lặp vô tận, nhưng vì điều đó breaklà cần thiết đối với tôi khi đặt phần cơ sở dữ liệu địa lý vào vòng lặp của chính nó, sau tập tin khác các loại được liệt kê, sẽ giải quyết vấn đề:

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

Khi tôi làm điều đó tôi đã nhận được danh sách đầy đủ của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.