Arcpy kullanımına alternatifler


69

Hemen hemen tüm python coğrafi işlemlerim için ESRI'nin Arcpy site paketini kullanıyor gibiyim. ESRI'nin kredisine göre, bunlar büyük bir başarı elde etmenize yardımcı olabilecek inanılmaz bir araç takımı. Bununla birlikte, ESRI Arcpy alanı dışında coğrafi işlem komut dosyaları oluşturmak da istiyorum. Örneğin, bir çokgen için bir raster kırpmak istersem, ESRI'dan aşağıdaki komut dosyasıyla başlardım :

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

Aynı görevi programlı olarak Arcpy olmadan nasıl başaracağımı bilmiyorum. Buradaki ciddi programcılar için sorularım: ESRI kullanıcılarının Arcpy site paketi ile yapabilecekleri görevleri yerine getirmek için hangi python araçları koleksiyonunu kullanıyorsunuz? Nereden başlayayım?


Yanıtlar:


45

GDAL kullanılacak araç. Aslında, tüm çağrı gdal_rasterize için bir hattır:

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

dem'in veri değerini bilmiyorsanız

Bazı python kontrolü için:

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)

değişkenlerinizin python ile ayarlanabileceği yer

Tam python için:

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

C API'nin sözdizimine hızlı bir şekilde baktım, bu yüzden python için sözdizim muhtemelen biraz kapalı. Bakınız gdal_alg.h: http://gdal.org/gdal__alg_8h.html


29


20

Akademik araştırmamın çoğunda, jeomorfoloji için yüzey analizi yapan LiDAR verileriyle çalışıyorum. Arcpy kullanarak birçok işlem yapmanın, özellikle büyük veri kümelerinde çok yavaş olduğunu hemen fark ettim. Sonuç olarak kullanmaya başladım:

  • shapefiles üzerinde değişiklik yapmak ve nitelik tablolarını güncellemek için pyshp
  • numpy ASCII rasterları yönetmek ve bu tür eğrilik hesaplamalar olarak çekirdek tabanlı analiz gerçekleştirmek için
  • scipy sonuçları üzerinde istatistiksel analiz ve yüzeyler için eğri uydurma gerçekleştirmek
  • matplotlib , hızlı görselleştirmeler için temel haritalar gibi grafikleri ve diğer grafiksel sonuçları çizmek için

Raster yüzeylerin analizi hakkında daha fazla bilgi edinmek isteyen herkese , Dünya Yüzey İşlemlerinin Kantitatif Modellemesi kitabını da tavsiye ederim. Kitap, C ++ 'ta ArcGIS araçlarından çok daha verimli olan harika kod örnekleri ile birlikte geliyor. Bu algoritmalar, C ++ 'da çok daha hızlı çalışsalar da, numpy'den daha karmaşık bir şeye ihtiyaç duymadan Python'a aktarılabilirler.


16

ESRI kullanan insanlar için GRASS'ın GUI python ortamıyla çok benzer bir ortam olacağını ve farklı görevler (raster, vektör, güneş araç takımları vb.) İçin ayrı 'araç takımlarında' düzenlendiğini düşünüyorum. Script'in Python dışında başka seçenekleri de var ama bu şekilde kullanıyorum.

Güncel olan bu harika bağlantıyı kesinlikle inceleyin (inanıyorum): http://grass.osgeo.org/wiki/GRASS_and_Python

EDIT: ESRI’da geçmişi olanlar için başka bir link: http://grass.osgeo.org/wiki/GRASS_migration_hints

Ben de GDAL hareketini ikinci olarak yapıyorum. Bu paha biçilmez bir şey ve ben onsuz kaybolurdum.


1
GRASS GIS 7’de yeni: pyGRASS, bkz. İng.unitn.it
~


16

Bence şu ana kadar verilen cevaplar temelde tüm paketlerin üzerinde durmaya değiniyor (özellikle GDAL, OGR, pyshp, NumPy).

Ancak birkaç ilginç modüle ev sahipliği yapan GIS ve Python Yazılım Laboratuvarı da var . Onlar:

  • Fiona : OGR'nin düzenli API'si
  • Rtree : Python GIS için konumsal dizin
  • Düzgün : Kartezyen düzleminde özelliklerin manipülasyonu ve analizi için Python paketi

Şahsen son zamanlarda GDAL / OGR ile oynamaya başladım ve analiz araçlarının hızı ve kapsamı açısından onları çok etkileyici buldum.

Yöntemlerin nasıl kullanılacağına ilişkin bazı örnekler ( çok iyi bir başlangıç ​​noktası olan bu mükemmel kaynaktan alınmıştır ):

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

Bu araçlarla ilgili güzel şey, onları nasıl uygulayacağınız konusunda çok esnek olmanızdır. Mesela CreateGeometry()sıfırdan kolayca vektör dosyaları oluşturmak için kendi sınıfımı yazdım . Eğer ilgileniyorsanız, soruyu kapsamının ötesinde olduğunu düşündüğüm halde, buraya da gönderebilirim.


10

Sorunuzun Python merkezli olduğunu biliyorum, ancak R , bazıları mekansal analiz için kullanılabilecek bir çok değer istatistiksel analiz yöntemine sahiptir. Burada bir rasterin iki satırda bir kutuya nasıl çekileceğini gösteren @Whuberiyi bir cevabı var


6
Python'a geri getirmek için, RPy kütüphanesini kullanabilirsiniz . RPy, R Programlama Dilinin çok basit fakat sağlam bir Python arayüzüdür. Her türlü R nesnesini yönetebilir ve isteğe bağlı R işlevlerini (grafik işlevleri de dahil olmak üzere) yürütebilir. R diline ait tüm hatalar Python istisnalarına dönüştürülür. R sistemi için kurulu herhangi bir modül Python içinden kullanılabilir.
RyanDalton

6

Benim çözümüm, hızlı çözüm, GDAL'ı Python ile kullanmak.

Gerek

alt işlemi al

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

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

(Burada cevap: GDAL kullanarak vektör katmanı ile raster kırpma )

Tabii ki, saf Python kullanarak bunu başarabilmelisin, ama yapmam gerekmedi. Ve neredeyse her zaman etrafımda GDAL var! GDAL'in esnekliği, özellikle linux ortamında harika. Büyük rasterleri yönetir, Python veya Shell scriptleri ile birbirine bağlanabilir ve birçok şeyin fonksiyonu vardır. Vektör tabanlı araçlar için ayrıca OGR'ye bakınız.


4

PostGIS'i çalıştırmanın sakıncası yoksa, sizin için en uzamsal veri işlemlerini yapabilir.

PDF kod sayfası:

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

Python ile bütünleşir:

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

Quantum GIS veya pgAdmin içindeki SPIT gibi destek araçlarıyla PostGIS'i kurmak için iyi bir donanıma sahipsiniz. Daha sonra konumsal verileriniz üzerinde PostGIS işlemlerini kontrol etmek için python komutunu kullanabilirsiniz.


3

ArcPy'nin yerine birçok uygulamada kullanılabilecek WhiteboxTools adlı açık kaynaklı bir coğrafi işlem kitaplığı üzerinde çalışıyorum . Şu anda , raster, vektör ve LiDAR (LAS) verilerinin işlenmesi için yaklaşık 300 araç bulunmaktadır , bununla birlikte, plan sonunda Whitebox GAT'ta mevcut olan 400+ aracın tümünü kapsayacaktır . Her ne kadar takımlar Pas programlama dili kullanılarak (verim için) geliştirilmiş olsa da, her araç aşağıdaki örnekte olduğu gibi Python'dan çağrılabilir:

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

Daha fazla bilgiyi WhiteboxTools kullanım kılavuzunda bulabilirsiniz . Kütüphane bağımsızdır ve başka bir bağımlılığı yoktur. Burada bulunan küçük (<5Mb) dosyayı indirmeniz yeterlidir . İndirme dosyası, WhiteboxTools exe, kütüphane için Python API'sini (yukarıdaki betiğin en üst satırında içe aktarılır) sağlayan whitebox_tools.py betiğini ve kullanım kılavuzunu içerir. Kütüphane ile etkileşime girmek için çok temel bir hazırlayıcı GUI (wb_runner.py) de vardır.

İzin verilen MIT lisansı, WhiteboxTools'un diğer açık kaynaklı GIS ile arka uç olarak entegre edilmesine izin vermek için tasarlanmıştır; Alexander Bruy, WhiteboxTools arka ucu için bir QGIS eklentisi geliştirdi . Ayrıca, WhiteboxTools ve ArcPy'den araçları tek bir komut dosyasında gerektiği gibi karıştırabilir ve eşleştirebilirsiniz. Kütüphane halen biraz deneyseldir, Guelph Üniversitesi Jeomorfometrisi ve Hidrojeomatik Araştırma Grubu'ndan geliştirilmiştir ve şu anda kullanımda göz önünde bulundurulması gereken 1.0 öncesi yayındır.


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.