Lựa chọn thay thế cho việc sử dụng Arcpy


69

Tôi dường như sử dụng gói trang web Arcpy của ESRI cho hầu hết tất cả các công cụ xử lý địa lý trăn của tôi. Đối với tín dụng của ESRI, đây là một bộ công cụ đáng kinh ngạc có thể giúp hoàn thành một công việc tuyệt vời. Tuy nhiên, tôi cũng muốn tạo các tập lệnh xử lý địa lý bên ngoài miền ESRI Arcpy. Ví dụ: nếu tôi muốn đưa một raster vào đa giác, tôi sẽ bắt đầu với đoạn script sau từ ESRI :

# Import system modules
import arcpy
from arcpy import env
from arcpy.sa import *

# Set environment settings
env.workspace = "C:/sapyexamples/data"

# Set local variables
inRaster = "elevation"
inMaskData = "mask.shp"

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Execute ExtractByMask
outExtractByMask = ExtractByMask(inRaster, inMaskData)

# Save the output 
outExtractByMask.save("C:/sapyexamples/output/extractmask")  

Tôi không chắc làm thế nào tôi có thể hoàn thành nhiệm vụ tương tự theo chương trình mà không có Arcpy. Câu hỏi của tôi dành cho các lập trình viên nghiêm túc ngoài kia: Bạn sử dụng bộ sưu tập công cụ python nào để hoàn thành các nhiệm vụ mà người dùng ESRI sẽ thực hiện với gói trang web Arcpy? Tôi bắt đầu từ đâu?


Câu trả lời:


45

GDAL là công cụ để sử dụng. Trong thực tế, toàn bộ cuộc gọi là một dòng cho gdal_rasterize:

gdal_rasterize -l mask -i -burn -9999 mask.shp elevation.tif

nếu bạn biết không có giá trị dữ liệu của dem

Đối với một số điều khiển python:

lyr = 'mask'
shp = 'mask.shp'
dem = 'elevation.tif'
ndv = -9999
p = os.Popen('gdal_rasterize -l %s -i -burn %d %s %s' % (lyr,ndv,shp,dem)

nơi các biến của bạn có thể được đặt trong python

Đối với trăn đầy đủ:

from osgeo import gdal, ogr
from osgeo.gdalconst import *
shp = ogr.Open('mask.shp')
lyr = shp.GetLayer('mask')
dem = gdal.Open('elevation.tif', GA_Update)
ndv = dem.GetRasterBand(1).GetNoDataValue()
gdal.RasterizeLayer(dem, 1, lyr, None, ndv) # other options, such as transformer func, creation options...
dem = None

Tôi vừa xem nhanh cú pháp cho API C, vì vậy cú pháp của tôi cho python có lẽ hơi lạc hậu. Xem gdal_ache.h: http://gdal.org/gdal__ache_8h.html


29

20

Một điểm khởi đầu tốt sẽ là Thư viện trừu tượng dữ liệu không gian địa lý . Nó thực sự được tạo thành từ các thư viện - GDAL để thao tác dữ liệu raster không gian địa lý và OGR để thao tác dữ liệu vectơ không gian địa lý nhưng mọi người thường chỉ gọi nó là GDAL.

Có một công cụ địa lý với Python bằng khóa học GIS nguồn mở tại Đại học Bang Utah. Bạn có thể muốn kiểm tra nó quá.


20

Trong rất nhiều nghiên cứu học thuật của tôi, tôi làm việc với dữ liệu LiDAR thực hiện phân tích bề mặt cho địa mạo. Tôi nhanh chóng nhận thấy rằng việc thực hiện nhiều thao tác sử dụng arcpy rất chậm, đặc biệt là trên các bộ dữ liệu lớn. Kết quả là tôi bắt đầu sử dụng:

  • pyshp để thao tác shapefiles và cập nhật bảng thuộc tính
  • gọn gàng để quản lý các trình quét ASCII và thực hiện phân tích dựa trên nhân như tính toán độ cong
  • scipy để thực hiện phân tích thống kê về kết quả và thực hiện khớp đường cong cho các bề mặt
  • matplotlib để vẽ đồ thị và các kết quả đồ họa khác, chẳng hạn như bản đồ cơ bản để trực quan hóa nhanh

Tôi cũng muốn giới thiệu cuốn sách, Mô hình hóa định lượng các quá trình bề mặt trái đất cho bất cứ ai muốn tìm hiểu thêm về việc phân tích các bề mặt raster. Cuốn sách đi kèm với các mẫu mã tuyệt vời trong C ++, hiệu quả hơn nhiều so với các công cụ ArcGIS. Các thuật toán này cũng có thể được chuyển sang Python mà không cần bất cứ điều gì phức tạp hơn numpy, mặc dù chúng chạy nhanh hơn nhiều trong C ++.


16

Đối với những người sử dụng ESRI, tôi nghĩ GRASS sẽ là một môi trường rất giống với môi trường python GUI và được tổ chức theo các 'bộ công cụ' riêng biệt cho các tác vụ khác nhau (raster, vector, bộ công cụ năng lượng mặt trời, v.v.). Kịch bản có các tùy chọn khác ngoài Python nhưng đó là cách tôi sử dụng nó.

Chắc chắn kiểm tra liên kết tuyệt vời này được cập nhật (tôi tin): http://grass.osgeo.org/wiki/GRASS_and_Python

EDIT: một liên kết khác cho những người có nền tảng trong ESRI: http://grass.osgeo.org/wiki/GRASS_migration_hints

Tôi cũng thứ hai chuyển động của GDAL. Nó là vô giá và tôi sẽ bị mất nếu không có nó.


1
Tính năng mới trong GRASS GIS 7: pyGRASS, xem ing.unitn.it/~zambelli/projects/pygrass
markusN


16

Tôi nghĩ rằng các câu trả lời được đưa ra cho đến nay về cơ bản tất cả các gói đáng được đề cập (đặc biệt là GDAL, OGR, pyshp, NumPy)

Nhưng cũng có Phòng thí nghiệm phần mềm GIS và Python , nơi lưu trữ một vài mô-đun thú vị. Họ đang:

  • Fiona : API gọn gàng hơn của OGR
  • Rtree : chỉ mục không gian cho Python GIS
  • Shapely : Gói Python để thao tác và phân tích các tính năng trong mặt phẳng Cartesian

Cá nhân tôi đã bắt đầu chơi xung quanh với GDAL / OGR gần đây và thấy chúng rất ấn tượng về tốc độ và độ bao phủ của các công cụ phân tích.

Dưới đây là một số ví dụ về cách sử dụng các phương thức (lấy từ nguồn tuyệt vời này là điểm khởi đầu rất tốt):

# To select by attribute:
.SetAttributeFilter("soil = 'clay'")

# To select by location, either:
.SetSpatialFilter(<geom>)   

# or
.SetSpatialFilterRect(<minx>, <miny>, <maxx>, <maxy>)

# DataSource objects have a method `ExecuteSQL(<SQL>)`
.ExecuteSQL("SELECT* FROM sites WHERE soil = 'clay' ORDER BY id DESC")


# Plus all the well known tools, like:

# intersect
poly2.Intersect(<geom_1>)

# disjoint?
<geom>.Disjoint(geom_1)

# touches (on the edge?)
<geom>.Touches(geom_1)

# cross each other?
<geom>.Crosses(geom_1)

# within?
<geom>.Within(geom_1)

#contains?
<geom>.Contains(ptB)

# overlaps?
<geom>.Overlaps(geom_1)

## geoprecessing
<geom>.Union(<geom_1>)
<geom>.Intersection(<geom_1>)
<geom>.Difference(<geom_1>)
<geom>.SymmetricDifference(<geom_1>)

# Buffer (returns a new geometry)
<geom>.Buffer(<distance>)

# Are the geometries equal?
<geom1>.Equal(<geom2>)

# Returns the shortest distance between the two geometries
<geom1>.Distance(<geom2>)

# Returns the geometry's extent as a list (minx, maxx, miny, maxy)
<geom>.GetEnvelope()

Điều hay ho về những công cụ này là bạn rất linh hoạt trong cách thực hiện chúng. Tôi đã viết ví dụ lớp của riêng tôi CreateGeometry()để dễ dàng tạo các tệp vectơ từ đầu. Nếu bạn quan tâm tôi cũng có thể đăng nó ở đây, mặc dù tôi nghĩ rằng nó vượt quá phạm vi của câu hỏi.


10

Tôi biết câu hỏi của bạn là Python-centric, nhưng R có rất nhiều phương pháp phân tích thống kê giá trị, một số trong đó có thể được sử dụng để phân tích không gian. @Whubercó một câu trả lời tốt ở đây minh họa làm thế nào để đưa một raster vào một hộp trong hai dòng.


6
Để đưa nó trở lại Python, bạn có thể sử dụng thư viện RPy . RPy là một giao diện Python rất đơn giản nhưng mạnh mẽ cho Ngôn ngữ lập trình R. Nó có thể quản lý tất cả các loại đối tượng R và có thể thực thi các hàm R tùy ý (bao gồm cả các chức năng đồ họa). Tất cả các lỗi từ ngôn ngữ R được chuyển đổi sang ngoại lệ Python. Bất kỳ mô-đun nào được cài đặt cho hệ thống R đều có thể được sử dụng từ bên trong Python.
RyanDalton

6

Giải pháp của tôi, giải pháp nhanh chóng, là sử dụng GDAL với Python.

Bạn cần phải

nhập quy trình con

lệnh = "gdalwarp -of GTiff -cutline clipArea.shp -cl area_of_interest -crop_to_cutline inData.asc outData.tiff"

sub process.call (['C: \ Temp \ abc \ Notepad.exe'])

(Từ câu trả lời ở đây: Cắt raster với lớp vectơ bằng GDAL )

Tất nhiên, bạn sẽ có thể đạt được điều này bằng Python thuần túy, nhưng tôi không cần phải làm điều đó. Và tôi hầu như luôn có GDAL bên cạnh! Tính linh hoạt của GDAL là tuyệt vời, đặc biệt là trong môi trường linux. Nó xử lý các trình quét lớn, nó có thể được liên kết với các tập lệnh Python hoặc Shell và có các hàm cho nhiều thứ. Xem thêm OGR cho các công cụ dựa trên vector.


4

Nếu bạn không nhớ chạy PostGIS, nó có thể xử lý hầu hết dữ liệu không gian cho bạn.

Áo choàng PDF:

http://www.postgis.us/doads/postgis20_chcoateet.pdf

Nó tích hợp với python:

https://publicwiki.deltares.nl/display/OET/Accessing+PostgreQuery+PostGIS+with+Python

Với các công cụ hỗ trợ như SPIT trong Quantum GIS hoặc pgAdmin, bạn được trang bị tốt để thiết lập PostGIS. Sau đó, bạn có thể sử dụng python kiểm soát các hoạt động PostGIS trên dữ liệu không gian của bạn.


3

Tôi đã làm việc trên một thư viện xử lý địa lý nguồn mở có tên WhiteboxTools có thể được sử dụng thay cho ArcPy trong nhiều ứng dụng. Hiện tại có gần 300 công cụ có sẵn để xử lý dữ liệu raster, vector và LiDAR (LAS), mặc dù kế hoạch cuối cùng là chuyển qua tất cả hơn 400 công cụ có sẵn trong Whitebox GAT . Mặc dù các công cụ được phát triển bằng ngôn ngữ lập trình Rust (cho hiệu quả), mỗi công cụ đều có thể gọi được từ Python, như trong ví dụ sau:

from whitebox_tools import WhiteboxTools

wbt = WhiteboxTools()

# Set the working directory. This is the path to the folder containing the data,
# i.e. files sent to tools as input/output parameters. You don't need to set
# the working directory if you specify full path names as tool parameters.
wbt.work_dir = "/path/to/data/"

# The most convenient way to run a tool is to use its associated method, e.g.:
wbt.elev_percentile("DEM.tif", "output.tif", 15, 15)

# You may also provide an optional custom callback for processing output from the
# tool. If you don't provide a callback, and verbose is set to True, tool output
# will simply be printed to the standard output.
def my_callback(value):
    if user_selected_cancel_btn: # Assumes a 'Cancel' button on a GUI
        print('Cancelling operation...')
        wbt.cancel_op = True
    else:
        print(value)

wbt.breach_depressions('DEM.flt', 'DEM_breached.flt', callback=my_callback)

# List all available tools in WhiteboxTools
print(wbt.list_tools())

# Lists tools with 'lidar' or 'LAS' in tool name or description.
print(wbt.list_tools(['lidar', 'LAS']))

# Print the help for a specific tool.
print(wbt.tool_help("ElevPercentile"))

# Want to read the source code for a tool?
# 'view_code' opens a browser and navigates to a tool's  
# source code in the WhiteboxTools GitHub repository
wbt.view_code('watershed')

Thông tin chi tiết hơn có thể được tìm thấy được cung cấp trong hướng dẫn sử dụng WhiteboxTools . Thư viện độc lập và không có bất kỳ sự phụ thuộc nào khác. Bạn chỉ cần tải xuống tệp nhỏ (<5Mb) ở đây . Tệp tải xuống chứa exe WhiteboxTools, tập lệnh whitebox_tools.py , cung cấp API Python cho thư viện (được nhập trên dòng trên cùng của tập lệnh trên) và hướng dẫn sử dụng. Ngoài ra còn có GUI tkinter rất cơ bản (wb_runner.py) để giao tiếp với thư viện.

Giấy phép MIT cho phép nhằm mục đích cho phép WhiteboxTools được tích hợp dưới dạng back-end với các GIS nguồn mở khác; Alexander Bruy đã phát triển một plugin QGIS cho back-end WhiteboxTools. Bạn cũng có thể trộn và kết hợp các công cụ từ WhiteboxTools và ArcPy trong một tập lệnh khi cần. Thư viện vẫn còn hơi thử nghiệm, được phát triển từ Nhóm nghiên cứu địa mạo và địa chất học của Đại học Guelph , và hiện đang được phát hành trước 1.0, cần được tính đến khi sử dụng.


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.