Альтернативи використанню Arcpy


69

Я, здається, використовую пакет веб-сайтів Arcpy ESRI для практично всієї моїй обробці пітона. На відміну від ESRI, це неймовірний набір інструментів, який може допомогти досягти великої кількості. Однак я також хотів би створити сценарії геообробки поза межами домену ESRI Arcpy. Наприклад, якщо я хочу зафіксувати растр на багатокутнику, я б почав із наступного сценарію з 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")  

Я не впевнений, як би я програмно виконав те саме завдання без Arcpy. Мої запитання до серйозних програмістів там: Яку колекцію інструментів python ви використовуєте для виконання завдань, які користувачі ESRI виконували б із пакетом сайту Arcpy? З чого я починаю?


Відповіді:


45

GDAL - це інструмент для використання. Фактично, весь виклик - це одна лінія для gdal_rasterize:

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

якби ви знали, що немає значення даних дем

Для деякого управління пітоном:

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)

де ваші змінні можуть бути встановлені в python

Для повного пітона:

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

Я просто заглянув у синтаксис API API, тому мій синтаксис для python, мабуть, трохи відключений. Див. Gdal_alg.h: http://gdal.org/gdal__alg_8h.html


29

20

Хорошою відправною точкою буде бібліотека абстрагування геопросторових даних . Він фактично складається з двох бібліотек - GDAL для маніпулювання геопросторовими растровими даними та OGR для маніпулювання геопросторовими векторними даними, але люди зазвичай просто називають це GDAL.

У Державному університеті штату Юта працює геопроцедура з Python, використовуючи відкритий код GIS- курсу. Ви також можете перевірити це.


20

У багатьох своїх наукових дослідженнях я працюю з даними LiDAR, роблячи поверхневий аналіз для геоморфології. Я швидко виявив, що виконання багатьох операцій з використанням arcpy було дуже повільним, особливо на великих наборах даних. В результаті я почав використовувати:

  • pyshp для маніпуляцій з filefiles та оновлення таблиць атрибутів
  • numpy для управління растрами ASCII та проведення аналізу на основі ядра, такого як обчислення кривизни
  • наука для статистичного аналізу результатів та виконання кривої підгонки для поверхонь
  • matplotlib для побудови графіків та інших графічних результатів, таких як основні карти для швидкого візуалізації

Я також рекомендую книгу « Кількісне моделювання процесів поверхневих поверхонь Землі» всім, хто хоче дізнатися більше про аналіз растрових поверхонь. У книзі представлені чудові зразки коду в C ++, які набагато ефективніші, ніж інструменти ArcGIS. Ці алгоритми можна також перенести на Python, не потребуючи нічого складнішого, ніж numpy, хоча вони працюють набагато швидше в C ++.


16

Для людей, які використовують ESRI, я думаю, що GRASS був би дуже схожим середовищем із середовищем GUI python та організованим в окремі «набори інструментів» для різних завдань (растрові, векторні, сонячні набори інструментів тощо). Сценарій має інші варіанти, крім Python, але саме так я його використовую.

Однозначно перевірте це чудове посилання, яке є сучасним (я вважаю): http://grass.osgeo.org/wiki/GRASS_and_Python

EDIT: ще одне посилання для тих, хто має досвід роботи в ESRI: http://grass.osgeo.org/wiki/GRASS_migration_hints

Я також другий рух GDAL. Це безцінне, і я б без нього втратив.


1
Нове у GRASS GIS 7: pyGRASS, див. Ing.unitn.it/~zambelli/projects/pygrass
markusN


16

Я думаю, що відповіді, надані до цього часу, охоплюють в основному весь пакет, який варто згадати (особливо GDAL, OGR, pyshp, NumPy)

Але є також Лабораторія програмного забезпечення GIS та Python , де розміщено пару цікавих модулів. Вони є:

  • Fiona : чистіший API API
  • Rtree : просторовий індекс для GIS Python
  • Shapely : Пакет Python для маніпулювання та аналізу особливостей декартової площини

Особисто я нещодавно почав грати з GDAL / OGR і вважав їх дуже вражаючими щодо швидкості та покриття інструментів аналізу.

Ось кілька прикладів використання методів (взяті з цього чудового джерела, що є дуже гарною відправною точкою):

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

Приємна річ у цих інструментах полягає в тому, що ви дуже гнучкі в тому, як їх реалізувати. Наприклад, я писав власний клас, CreateGeometry()щоб легко створювати векторні файли з нуля. Якщо ви зацікавлені, я також можу розмістити його тут, хоча я думаю, що це не виходить за рамки питання.


10

Я знаю, що ваше питання є орієнтованим на Python, але R має безліч значущих методів статистичного аналізу, деякі з яких можна використовувати для просторового аналізу. @Whuberтут є хороша відповідь, що ілюструє, як прикріпити растр до поля в два рядки.


6
Щоб повернути його на Python, ви можете використовувати бібліотеку RPy . RPy - це дуже простий, але надійний інтерфейс Python до мови програмування R. Він може керувати всіма видами R-об'єктів і може виконувати довільні R-функції (включаючи графічні функції). Всі помилки з мови R перетворюються на винятки Python. Будь-який модуль, встановлений для системи R, можна використовувати зсередини Python.
RyanDalton

6

Моє рішення, швидке рішення, - використовувати GDAL з Python.

Тобі потрібно

імпортувати підпроцес

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

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

(З відповіді тут: Відсікання растрового з векторним шаром за допомогою GDAL )

Звичайно, ви повинні досягти цього за допомогою чистого Python, але мені це не потрібно було робити. І в мене майже завжди є GDAL! Гнучкість GDAL є фантастичною, особливо в умовах Linux. Він обробляє величезні растри, його можна зв'язати разом із сценаріями Python або Shell і є функції для багатьох речей. Дивіться також OGR для векторних інструментів.


4

Якщо ви не проти запустити PostGIS, він може обробити більшість просторових даних для вас.

PDF-чіт-лист:

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

Він інтегрується з python:

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

З підтримкою таких інструментів, як SPIT у Quantum GIS або pgAdmin, ви добре обладнані для налаштування PostGIS. Потім ви можете використовувати python для керування операціями PostGIS на ваших просторових даних.


3

Я працюю над бібліотекою геопроцесорського забезпечення з відкритим кодом під назвою WhiteboxTools, яку можна використовувати замість ArcPy у багатьох програмах. В даний час існує майже 300 інструментів для обробки растрових, векторних та LiDAR (LAS) даних, хоча планується врешті-решт перенести всі 400+ інструментів, доступних у Whitebox GAT . Хоча інструменти розроблені за допомогою мови програмування Rust (для підвищення ефективності), кожен інструмент може викликатись із Python, як у наступному прикладі:

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

Більш детальну інформацію можна знайти в посібнику користувача WhiteboxTools . Бібліотека є автономною і не має інших залежностей. Вам просто потрібно завантажити невеликий (<5Mb) файл, розміщений тут . Файл завантаження містить exe WhiteboxTools, сценарій whitebox_tools.py , який забезпечує API Python для бібліотеки (імпортований у верхньому рядку вищевказаного сценарію) та посібник користувача. Існує також дуже базовий графічний інтерфейс tkinter (wb_runner.py) для взаємодії з бібліотекою.

Дозвільна ліцензія MIT призначена для того, щоб дозволити інтеграцію WhiteboxTools як бек-енд з іншими ГІС з відкритим кодом; Олександр Брей розробив плагін QGIS для бек-енду WhiteboxTools. Ви також можете змішувати та співставляти інструменти з WhiteboxTools та ArcPy в одному сценарії за потребою. Бібліотека все ще дещо експериментальна, розроблена в дослідницькій групі з геоморфометрії та гідрогеоматики Університету Гельфа , і наразі випускається до 1,0, що слід враховувати при використанні.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.