Alternatives à Arcpy

69

Il me semble utiliser le package de site Arcpy d'ESRI pour la quasi-totalité de mes processus de géotraitement python. Au mérite de ESRI, il s'agit d'une incroyable série d'outils qui peuvent aider à accomplir de grandes choses. Toutefois, je souhaite également créer des scripts de géotraitement en dehors du domaine ESRI Arcpy. Par exemple, si je veux couper un raster sur un polygone, je commencerais par le script suivant d' 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")  

Je ne suis pas certain de la manière dont j'accomplirais la même tâche par programmation sans Arcpy. Mes questions pour les programmeurs sérieux: Quelle collection d'outils Python utilisez-vous pour accomplir les tâches que les utilisateurs ESRI accompliraient avec le package de site Arcpy? Par où je commence?

Aaron
la source

Réponses:

45

GDAL est l'outil à utiliser. En fait, l’appel n’est qu’une ligne pour gdal_rasterize:

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

si vous connaissiez la valeur non donnée de la dem

Pour certains contrôles 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)

où vos variables pourraient être définies en python

Pour le python complet:

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

Je viens juste de jeter un coup d'œil sur la syntaxe de l'API C, ma syntaxe pour python est donc probablement un peu fausse. Voir gdal_alg.h: http://gdal.org/gdal__alg_8h.html


la source
29

Vous trouverez sur ce site un certain nombre d'autres questions similaires qui posent la même question de base et qui ont de très bonnes références. Le plus similaire (et détaillé) est:

Parmi les autres:

RyanDalton
la source
20

Dans beaucoup de mes recherches universitaires, je travaille avec des données LiDAR pour l'analyse de surface pour la géomorphologie. J'ai rapidement constaté que l'exécution de nombreuses opérations à l'aide d'arcpy était très lente, en particulier pour les grands ensembles de données. En conséquence, j'ai commencé à utiliser:

  • pyshp pour manipuler les fichiers de formes et mettre à jour les tables attributaires
  • numpy pour gérer les rasters ASCII et effectuer des analyses basées sur le noyau, telles que des calculs de courbure
  • scipy pour effectuer une analyse statistique des résultats et effectuer l'ajustement des courbes pour les surfaces
  • matplotlib pour tracer des graphiques et d'autres résultats graphiques, tels que des cartes de base pour des visualisations rapides

Je recommanderais également le livre Modélisation quantitative des processus de surface de la Terre à tous ceux qui souhaitent en savoir plus sur l'analyse des surfaces matricielles. Le livre contient d'excellents exemples de code en C ++, qui sont bien plus efficaces que les outils ArcGIS. Ces algorithmes peuvent également être portés en Python sans nécessiter quoi que ce soit de plus complexe que numpy, bien qu'ils fonctionnent beaucoup plus rapidement en C ++.

sgrieve
la source
16

Pour les personnes utilisant ESRI, je pense que GRASS serait un environnement très similaire avec un environnement d'interface graphique en python et organisé dans des "toolkits" distincts pour différentes tâches (trousses à outils vectorielles, vectorielles, solaires, etc.). Le script a d'autres options que Python, mais c'est comme ça que je l'utilise.

Jetez un coup d'œil à ce super lien qui est à jour (je crois): http://grass.osgeo.org/wiki/GRASS_and_Python

EDIT: un autre lien pour ceux qui ont de l'expérience dans ESRI: http://grass.osgeo.org/wiki/GRASS_migration_hints

J'appuie également la motion de GDAL. C'est inestimable et je serais perdu sans cela.

s_a
la source
1
Nouveauté de GRASS GIS 7: pyGRASS, voir ing.unitn.it/~zambelli/projects/pygrass
markusN le
16

Je pense que les réponses données jusqu'ici couvrent essentiellement tous les paquets qui méritent d'être mentionnés (notamment GDAL, OGR, pyshp, NumPy)

Mais il y a aussi le SIG et le logiciel Python , qui héberge quelques modules intéressants. Elles sont:

  • Fiona : l'API plus propre d'OGR
  • Rtree : index spatial pour Python GIS
  • Shapely : paquet Python pour la manipulation et l'analyse d'entités dans le plan cartésien

Personnellement, j'ai commencé à jouer avec GDAL / OGR récemment et je les ai trouvés très impressionnants en ce qui concerne la rapidité et la couverture des outils d'analyse.

Voici quelques exemples d'utilisation des méthodes (tirées de cette excellente source qui constitue un très bon point de départ):

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

La bonne chose à propos de ces outils est que vous êtes très flexible dans la façon de les implémenter. J'ai écrit par exemple ma propre classe CreateGeometry()pour créer facilement des fichiers vectoriels à partir de rien. Si cela vous intéresse, je peux aussi le poster ici, même si je pense que cela dépasse le cadre de la question.

LarsVegas
la source
10

Je sais que votre question est centrée sur Python, mais R possède une multitude de méthodes d’analyse statistique, dont certaines peuvent être utilisées pour l’analyse spatiale. @Whubera une bonne réponse ici illustrant comment attacher un raster à une boîte en deux lignes.

djq
la source
6
Pour le ramener à Python, vous pouvez utiliser la bibliothèque RPy . RPy est une interface Python très simple, mais robuste, avec le langage de programmation R. Il peut gérer toutes sortes d'objets R et peut exécuter des fonctions R arbitraires (y compris les fonctions graphiques). Toutes les erreurs du langage R sont converties en exceptions Python. Tout module installé pour le système R peut être utilisé à partir de Python.
RyanDalton
6

Ma solution, la solution rapide, consiste à utiliser GDAL avec Python.

Tu dois

sous-processus d'importation

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

(D'après la réponse ici: rognage du calque avec couche vectorielle à l'aide de GDAL )

Bien sûr, vous devriez pouvoir y parvenir en Python pur, mais je n’ai pas eu besoin de le faire. Et j'ai presque toujours GDAL! La flexibilité de GDAL est fantastique, en particulier dans un environnement Linux. Il gère des énormes rasters, il peut être associé à des scripts Python ou Shell et il existe des fonctions pour beaucoup de choses. Voir aussi OGR pour les outils vectoriels.

Alex Leith
la source
4

Si vous n’êtes pas dérangé par PostGIS, il peut traiter la plupart des données spatiales à votre place.

Cheatsheet PDF:

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

Il intègre avec python:

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

Avec des outils de support tels que SPIT dans Quantum GIS ou pgAdmin, vous êtes parfaitement équipé pour configurer PostGIS. Vous pouvez ensuite utiliser python pour contrôler les opérations PostGIS sur vos données spatiales.

Ragnvald
la source
3

J'ai travaillé sur une bibliothèque de géotraitement à code source ouvert appelée WhiteboxTools, qui peut être utilisée à la place d'ArcPy dans de nombreuses applications. À l'heure actuelle, près de 300 outils sont disponibles pour le traitement des données raster, vectorielles et LiDAR (LAS), mais il est prévu de porter à terme l'ensemble des 400 outils disponibles dans Whitebox GAT . Bien que les outils soient développés à l'aide du langage de programmation Rust (pour plus d'efficacité), chaque outil peut être appelé à partir de Python, comme dans l'exemple suivant:

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

Vous trouverez des informations plus détaillées dans le manuel de l'utilisateur WhiteboxTools . La bibliothèque est autonome et n'a pas d'autres dépendances. Vous devez simplement télécharger le petit fichier (<5 Mo) situé ici . Le fichier de téléchargement contient l'exe WhiteboxTools, le script whitebox_tools.py , qui fournit l'API Python de la bibliothèque (importée sur la première ligne du script ci-dessus), ainsi que le manuel d'utilisation. Il existe également une interface graphique tkinter très basique (wb_runner.py) pour l’interfaçage avec la bibliothèque.

La licence permise MIT est destinée à permettre à WhiteboxTools d’être intégré en tant que back-end à d’autres SIG open source; Alexander Bruy a développé un plugin QGIS pour le back-end WhiteboxTools. Vous pouvez également mélanger et faire correspondre les outils de WhiteboxTools et ArcPy dans un seul script, si nécessaire. La bibliothèque est encore quelque peu expérimentale, développée par le groupe de recherche en géomorphométrie et hydrogéomatique de l'Université de Guelph , et est actuellement publiée avant la version 1.0, ce qui devrait être pris en compte dans l'utilisation.

WhiteboxDev
la source