Альтернативы использованию Arcpy

69

Кажется, я использую пакет сайта Arcpy от ESRI практически для всей моей геообработки на python. К чести 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

Я просто быстро взглянул на синтаксис C API, поэтому мой синтаксис для python, вероятно, немного не в порядке. См. Gdal_alg.h: http://gdal.org/gdal__alg_8h.html.


источник
29

На этом сайте вы найдете ряд других похожих вопросов, которые задают тот же самый базовый вопрос и имеют очень хорошие ссылки. Наиболее похожим (и подробным) является:

Другие включают в себя:

RyanDalton
источник
20

Хорошей отправной точкой была бы Библиотека абстракций геопространственных данных . На самом деле он состоит из двух библиотек - GDAL для манипулирования геопространственными растровыми данными и OGR для манипулирования геопространственными векторными данными, но люди обычно просто называют его GDAL.

Существует геообработка с Python с использованием курса ГИС с открытым исходным кодом в Университете штата Юта. Возможно, вы захотите проверить это тоже.

RK
источник
20

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

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

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

sgrieve
источник
16

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

Обязательно посмотрите эту замечательную ссылку, которая актуальна (я считаю): http://grass.osgeo.org/wiki/GRASS_and_Python

РЕДАКТИРОВАТЬ: еще одна ссылка для тех, кто имеет опыт работы в ESRI: http://grass.osgeo.org/wiki/GRASS_migration_hints

Я также поддерживаю движение GDAL. Это бесценно, и я был бы потерян без этого.

S_A
источник
1
Новое в GRASS GIS 7: pyGRASS, см. Ing.unitn.it/~zambelli/projects/pygrass
markusN
Обновленная ссылка: grasswiki.osgeo.org/wiki/GRASS_and_Python#pygrass_Library
markusN
16

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

Но есть также ГИС и Лаборатория программного обеспечения Python , в которой размещена пара интересных модулей. Они есть:

  • Фиона : аккуратный API OGR
  • Rtree : пространственный индекс для Python GIS
  • 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()чтобы легко создавать векторные файлы с нуля. Если вам интересно, я также могу опубликовать это здесь, хотя я думаю, что это выходит за рамки вопроса.

LarsVegas
источник
10

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

djq
источник
6
Чтобы вернуть его обратно в Python, вы можете использовать библиотеку RPy . RPy - это очень простой, но надежный интерфейс Python к языку программирования R. Он может управлять всеми видами объектов R и может выполнять произвольные функции R (включая графические функции). Все ошибки из языка R преобразуются в исключения Python. Любой модуль, установленный для системы R, может быть использован из Python.
RyanDalton
6

Мое решение, быстрое решение, это использовать GDAL с Python.

Тебе следует

подпроцесс импорта

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

subprocess.call ([ 'C: \ Temp \ а \ 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 на ваших пространственных данных.

Ragnvald
источник
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) файл, расположенный здесь . Файл загрузки содержит исполняемый файл WhiteboxTools, сценарий whitebox_tools.py , который предоставляет API-интерфейс Python для библиотеки (импортированный в верхней строке приведенного выше сценария), а также руководство пользователя. Существует также очень простой графический интерфейс tkinter (wb_runner.py) для взаимодействия с библиотекой.

Разрешительная лицензия MIT предназначена для интеграции WhiteboxTools в качестве бэк-энда с другими ГИС с открытым исходным кодом; Александр Бруй разработал плагин QGIS для серверной части WhiteboxTools. Вы также можете смешивать и сочетать инструменты из WhiteboxTools и ArcPy в одном скрипте по мере необходимости. Библиотека все еще несколько экспериментальная, разработанная исследовательской группой по геоморфометрии и гидрогеоматике Университета Гвельфа , и в настоящее время она выпущена до версии 1.0, что следует учитывать при использовании.

WhiteboxDev
источник