Arcpyを使用する代わり


69

私はほとんどすべてのpythonジオプロセシングにESRIのArcpyサイトパッケージを使用しているようです。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を使用せずにプログラムで同じタスクをどのように達成できるかわかりません。そこにいる真剣なプログラマーに対する私の質問: ESRIユーザーがArcpyサイトパッケージで達成するタスクを達成するために使用するPythonツールのコレクションは何ですか?どこから始めますか?


回答:


45

GDALは使用するツールです。実際、呼び出し全体がgdal_rasterizeの1行です。

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

あなたがdemのデータなしの値を知っていた場合

一部の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)

Pythonで変数を設定できる場所

フル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

20

良い出発点は、地理空間データ抽象化ライブラリです。実際には、地理空間ラスターデータを操作するためのGDALと地理空間ベクトルデータを操作するためのOGRの2つのライブラリで構成されていますが、通常は単にGDALと呼びます。

ユタ州立大学のオープンソースGISコースを使用したPythonによるジオプロセシングがあります。あなたもそれをチェックアウトしたいかもしれません。


20

私の多くの学術研究では、地形の表面分析を行うLiDARデータを使用しています。私はすぐに、特に大規模なデータセットでは、arcpyを使用した多くの操作の実行が非常に遅いことを発見しました。その結果、私は使用し始めました:

  • シェイプファイルを操作し、属性テーブルを更新するpyshp
  • ASCIIラスタを管理し、曲率計算などのカーネルベースの分析を実行するnumpy
  • 結果の統計分析を実行し、表面の曲線近似を実行するscipy
  • matplotlibにより、グラフやその他のグラフィカルな結果(迅速な視覚化のための基本的なマップなど)をプロット

また、ラスターサーフェスの分析についてさらに詳しく知りたい人には、「地球表面プロセスの定量的モデリング」という本をお勧めします。この本には、ArcGISツールよりもはるかに効率的なC ++の優れたコードサンプルが付属しています。これらのアルゴリズムは、numpyよりも複雑なものを必要とせずにPythonに移植することもできますが、C ++でははるかに高速に実行されます。


16

ESRIを使用している人々にとって、GRASSはGUI python環境を備えた非常に類似した環境であり、さまざまなタスク(ラスター、ベクター、ソーラーツールキットなど)の個別の「ツールキット」に編成されると思います。スクリプトにはPython以外のオプションがありますが、それが私が使用する方法です。

間違いなく最新のこの素晴らしいリンクをチェックしてください(私は信じています):http : //grass.osgeo.org/wiki/GRASS_and_Python

編集:ESRIのバックグラウンドを持つ人々のための別のリンク:http//grass.osgeo.org/wiki/GRASS_migration_hints

GDALの動きも2番目です。それはかけがえのないものであり、それなしでは失われてしまうでしょう。


1
GRASS GIS 7の新機能:pyGRASS、ing.unitn.it
〜zambelli


16

これまでに出された答えは、言及する価値のある基本的にすべてのパッケージ(特にGDAL、OGR、pyshp、NumPy)をカバーしていると思います

しかし、いくつかの興味深いモジュールをホストするGISおよびPython Software Laboratoryもあります。彼らです:

  • Fiona:OGRのきちんとしたAPI
  • 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()、最初からベクトルファイルを簡単に作成するために独自のクラスを作成しました。興味があれば、質問の範囲を超えていると思いますが、ここに投稿することもできます。


10

あなたの質問はPython中心であることがわかっていますが、Rには価値のある統計分析方法が豊富にあり、そのいくつかは空間分析に使用できます。ここには、ラスターを2行でボックスにクリップする方法を示す@Whuber良い答えがあります。


6
Pythonに戻すには、RPyライブラリを使用できます。RPyは、Rプログラミング言語への非常にシンプルでありながら堅牢なPythonインターフェイスです。あらゆる種類のRオブジェクトを管理でき、任意のR機能(グラフィック機能を含む)を実行できます。R言語からのエラーはすべて、Python例外に変換されます。Rシステム用にインストールされたモジュールは、Python内から使用できます。
ライアンダルトン

6

私の解決策である迅速な解決策は、PythonでGDALを使用することです。

必要がある

サブプロセスのインポート

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

(ここからの回答から:GDALを使用してベクターレイヤーでラスターをクリッピングする

もちろん、純粋なPythonを使用してこれを達成できるはずですが、私はそれをする必要はありません。そして、私はほぼ常にGDALを使用しています!GDALの柔軟性は、特にLinux環境では素晴らしいです。巨大なラスターを処理し、Pythonまたはシェルスクリプトと結び付けることができ、多くの機能があります。ベクトルベースのツールについてはOGRも参照してください。


4

PostGISの実行を気にしないのであれば、ほとんどの空間データ処理を実行できます。

PDFチートシート:

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

Pythonと統合します:

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

Quantum GISまたはpgAdmin内のSPITなどのサポートツールを使用すると、PostGISをセットアップするための十分な準備が整います。その後、Pythonを使用して、空間データのPostGIS操作を制御できます。


3

私は、に取り組んできているオープンソースのジオプロセシングライブラリと呼ばれるWhiteboxTools多くのアプリケーションでArcPyの代わりに使用することができます。現在、ラスター、ベクター、およびLiDAR(LAS)データの処理に使用できるツールは約300ありますが、最終的にはWhitebox GATで使用可能な400以上のツールすべてを移植する計画です。ツールは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 exe、ライブラリ用のPython APIを提供するwhitebox_tools.pyスクリプト(上記のスクリプトの一番上の行にインポート)、およびユーザーマニュアルが含まれています。ライブラリとのインターフェース用の非常に基本的なtkinter GUI(wb_runner.py)もあります。

寛容なMITライセンスは、WhiteboxToolsをバックエンドとして他のオープンソースGISと統合できるようにすることを目的としています。Alexander Bruyは、WhiteboxToolsバックエンド用のQGISプラグインを開発しました。また、必要に応じて、単一のスクリプトでWhiteboxToolsとArcPyのツールを組み合わせて使用​​することもできます。このライブラリはまだ幾分実験的で、グエルフ大学の地形計測と水文地質学研究グループから開発されており、現在は使用前に考慮する必要がある1.0より前のリリースです。


1

Pythonを使用してArcPyなしでラスターをシェープファイルにクリップする:http ://geospatialpython.com/2011/02/clip-raster-using-shapefile.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.