Alternatif untuk menggunakan Arcpy

69

Saya tampaknya menggunakan paket situs Arcpy ESRI untuk hampir semua geoprosesing python saya. Bagi ESRI, ini adalah seperangkat alat luar biasa yang dapat membantu mencapai banyak hal. Namun, saya juga ingin membuat skrip geoproses di luar domain ESRI Arcpy. Misalnya, jika saya ingin klip raster ke poligon, saya akan mulai dengan skrip berikut dari 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")  

Saya tidak yakin bagaimana saya akan menyelesaikan tugas yang sama secara terprogram tanpa Arcpy. Pertanyaan saya untuk programmer serius di luar sana: Kumpulan alat python apa yang Anda gunakan untuk menyelesaikan tugas yang akan dilakukan pengguna ESRI dengan paket situs Arcpy? Di mana saya mulai?

Harun
sumber

Jawaban:

45

GDAL adalah alat untuk digunakan. Faktanya, seluruh panggilan adalah satu baris untuk gdal_rasterize:

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

jika Anda tahu tidak ada nilai data dari dem

Untuk beberapa kontrol 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)

di mana variabel Anda dapat diatur dalam python

Untuk python penuh:

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

Saya baru saja mengintip sintaks untuk API C, jadi sintaks saya untuk python mungkin sedikit tidak aktif. Lihat gdal_alg.h: http://gdal.org/gdal__alg_8h.html


sumber
29

Anda akan menemukan sejumlah pertanyaan serupa lainnya di situs ini yang menanyakan pertanyaan dasar yang sama dan memiliki referensi yang sangat bagus. Yang paling mirip (dan terperinci) adalah:

Lainnya termasuk:

Ryan Dalton
sumber
20

Dalam banyak penelitian akademis saya, saya bekerja dengan data LiDAR melakukan analisis permukaan untuk geomorfologi. Saya segera menemukan bahwa melakukan banyak operasi menggunakan arcpy sangat lambat, terutama pada dataset besar. Akibatnya saya mulai menggunakan:

  • pyshp untuk memanipulasi shapefile dan memperbarui tabel atribut
  • numpy untuk mengelola raster ASCII dan melakukan analisis berbasis kernel seperti perhitungan kelengkungan
  • Scipy untuk melakukan analisis statistik pada hasil dan melakukan pemasangan kurva untuk permukaan
  • matplotlib untuk memplot grafik dan hasil grafis lainnya, seperti peta dasar untuk visualisasi cepat

Saya juga akan merekomendasikan buku, Pemodelan Kuantitatif dari Proses Permukaan Bumi kepada siapa saja yang ingin mempelajari lebih lanjut tentang menganalisis permukaan raster. Buku ini dilengkapi dengan contoh kode yang bagus dalam C ++, yang jauh lebih efisien daripada alat ArcGIS. Algoritme ini juga dapat di-porting ke Python tanpa perlu sesuatu yang lebih kompleks daripada numpy, walaupun mereka berjalan lebih cepat di C ++.

sgrieve
sumber
16

Untuk orang yang menggunakan ESRI saya pikir GRASS akan menjadi lingkungan yang sangat mirip dengan lingkungan python GUI dan diorganisir dalam 'toolkit' terpisah untuk tugas yang berbeda (raster, vektor, toolkit surya dll.). Skrip memiliki opsi lain selain Python tetapi itulah cara saya menggunakannya.

Pasti melihat tautan bagus ini yang terbaru (saya percaya): http://grass.osgeo.org/wiki/GRASS_and_Python

EDIT: tautan lain untuk mereka yang berlatar belakang ESRI: http://grass.osgeo.org/wiki/GRASS_migration_hints

Saya juga mendukung gerakan GDAL. Ini sangat berharga dan saya akan hilang tanpanya.

s_a
sumber
1
Baru di GRASS GIS 7: pyGRASS, lihat ing.unitn.it/ ~ zambelli
projects
16

Saya pikir jawaban yang diberikan sejauh ini pada dasarnya mencakup semua paket di luar sana yang layak disebut (terutama GDAL, OGR, pyshp, NumPy)

Tetapi ada juga Laboratorium Perangkat Lunak SIG dan Python , yang menampung beberapa modul menarik. Mereka:

  • Fiona : API yang lebih rapi dari OGR
  • Rtree : indeks spasial untuk Python GIS
  • Shapely : Paket Python untuk manipulasi dan analisis fitur dalam bidang Cartesian

Secara pribadi saya mulai bermain-main dengan GDAL / OGR akhir-akhir ini dan menemukan mereka sangat mengesankan dalam hal kecepatan dan jangkauan alat analisis.

Berikut beberapa contoh cara menggunakan metode (diambil dari sumber yang sangat baik ini yang merupakan titik awal yang sangat baik):

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

Yang menyenangkan tentang alat-alat ini adalah Anda sangat fleksibel dalam menerapkannya. Saya menulis misalnya kelas saya sendiri CreateGeometry()untuk dengan mudah membuat file vektor dari awal. Jika Anda tertarik, saya juga dapat mempostingnya di sini, meskipun saya pikir itu di luar cakupan pertanyaan.

LarsVegas
sumber
10

Saya tahu pertanyaan Anda Python-sentris, tetapi R memiliki banyak metode analisis statistik nilai, beberapa di antaranya dapat digunakan untuk analisis spasial. @Whubermemiliki jawaban yang baik di sini yang menggambarkan cara klip raster ke kotak dalam dua baris.

djq
sumber
6
Untuk mengembalikannya ke Python, Anda bisa menggunakan pustaka RPy . RPy adalah antarmuka Python yang sangat sederhana, namun kuat, ke Bahasa Pemrograman R. Itu dapat mengelola semua jenis objek R dan dapat menjalankan fungsi R sewenang-wenang (termasuk fungsi grafik). Semua kesalahan dari bahasa R dikonversi ke pengecualian Python. Modul apa pun yang dipasang untuk sistem R dapat digunakan dari dalam Python.
RyanDalton
6

Solusi saya, solusi cepat, adalah menggunakan GDAL dengan Python.

Kamu butuh

impor subproses

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

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

(Dari jawaban di sini: Memotong raster dengan layer vektor menggunakan GDAL )

Tentu saja, Anda harus dapat mencapai ini menggunakan Python murni, tapi saya tidak perlu melakukannya. Dan saya hampir selalu memiliki GDAL! Fleksibilitas GDAL sangat fantastis, terutama di lingkungan linux. Ini menangani raster besar, dapat diikat bersama dengan skrip Python atau Shell dan ada fungsi untuk banyak hal. Lihat juga OGR untuk alat berbasis vektor.

Alex Leith
sumber
4

Jika Anda tidak keberatan menjalankan PostGIS, ia dapat melakukan sebagian besar pemrosesan data spasial untuk Anda.

Cheatsheet PDF:

http://www.postgis.us/downloads/postgis20_cheatsheet.pdf

Terintegrasi dengan python:

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

Dengan alat pendukung seperti SPIT di dalam Quantum GIS atau pgAdmin, Anda dilengkapi dengan baik untuk mengatur PostGIS. Anda kemudian dapat menggunakan python mengendalikan operasi PostGIS pada data spasial Anda.

ragnvald
sumber
3

Saya telah bekerja pada pustaka geoproses sumber terbuka yang disebut WhiteboxTools yang dapat digunakan sebagai pengganti ArcPy dalam banyak aplikasi. Saat ini ada hampir 300 alat yang tersedia untuk memproses data raster, vektor, dan LiDAR (LAS), meskipun rencananya adalah untuk mem- porting semua 400+ alat yang tersedia di Whitebox GAT . Meskipun alat dikembangkan menggunakan bahasa pemrograman Rust (untuk efisiensi), setiap alat dapat dipanggil dari Python, seperti dalam contoh berikut:

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

Informasi lebih rinci dapat ditemukan di manual pengguna WhiteboxTools . Perpustakaan itu berdiri sendiri dan tidak memiliki dependensi lain. Anda hanya perlu mengunduh file kecil (<5Mb) yang ada di sini . File unduhan berisi exe WhiteboxTools, skrip whitebox_tools.py , yang menyediakan API Python untuk pustaka (diimpor pada baris teratas skrip di atas), dan manual pengguna. Ada juga GUI tkinter yang sangat mendasar (wb_runner.py) untuk berinteraksi dengan perpustakaan.

Lisensi MIT yang permisif dimaksudkan untuk memungkinkan WhiteboxTools diintegrasikan sebagai back-end dengan GIS open-source lainnya; Alexander Bruy telah mengembangkan plugin QGIS untuk back-end WhiteboxTools. Anda juga dapat mencampur dan mencocokkan alat dari WhiteboxTools dan ArcPy dalam satu skrip yang diperlukan. Perpustakaan masih agak eksperimental, dikembangkan dari University of Guelph Geomorfometri dan Hydrogeomatics Research Group , dan saat ini rilis pra-1.0, yang harus diperhitungkan dalam penggunaan.

WhiteboxDev
sumber