Arcpy 사용에 대한 대안


69

거의 모든 파이썬 지오 프로세싱에 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 사이트 패키지와 함께 수행 할 작업을 수행하기 위해 사용합니까 파이썬 도구의 어떤 모음? 어디서부터 시작합니까?


답변:


45

GDAL은 사용하는 도구입니다. 실제로 전체 호출은 gdal_rasterize의 한 줄입니다.

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

dem의 데이터 없음 값을 알고 있다면

파이썬 제어의 경우 :

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)

파이썬에서 변수를 설정할 수있는 곳

전체 파이썬의 경우 :

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 구문을 살짝 들여다 보았으므로 파이썬 구문이 약간 벗어났습니다. gdal_alg.h 참조 : http://gdal.org/gdal__alg_8h.html


29

20

좋은 시작점은 지리 공간 데이터 추상화 라이브러리 입니다. 실제로 지리 공간 래스터 데이터를 조작하기위한 GDAL과 지리 공간 벡터 데이터를 조작하기위한 OGR이라는 두 개의 라이브러리로 구성되어 있지만 사람들은 보통이를 단지 GDAL이라고 부릅니다.

Utah State University의 오픈 소스 GIS 코스를 사용하여 Python 으로 지오 프로세싱 이 있습니다 . 당신도 그것을 확인하고 싶을 수도 있습니다.


20

많은 학술 연구에서 지형에 대한 표면 분석을 수행하는 LiDAR 데이터로 작업합니다. 나는 특히 큰 데이터 세트에서 arcpy를 사용하여 많은 작업을 수행하는 것이 매우 느리다는 것을 빨리 발견했습니다. 결과적으로 나는 다음을 사용하기 시작했다.

  • pyshp 가 shapefile을 조작하고 속성 테이블을 업데이트
  • ASCII 래스터를 관리하고 곡률 계산과 같은 커널 기반 분석을 수행하는 numpy
  • 결과에 대한 통계 분석을 수행하고 표면에 대한 곡선 맞춤을 수행하는 scipy
  • 빠른 시각화를위한 기본 맵과 같은 그래프 및 기타 그래픽 결과를 플롯하는 matplotlib

래스터 표면 분석에 대해 더 배우고 싶은 사람에게도 지구 표면의 양적 모델링 책을 추천합니다 . 이 책은 C ++로 된 훌륭한 코드 샘플과 함께 제공되며 ArcGIS 도구보다 훨씬 효율적입니다. 이 알고리즘은 C ++에서 훨씬 빠르게 실행되지만 numpy보다 복잡한 것을 필요로하지 않고 Python으로 이식 될 수도 있습니다.


16

ESRI를 사용하는 사람들에게 GRASS는 GUI 파이썬 환경과 매우 유사한 환경이며 다른 작업 (래스터, 벡터, 태양 툴킷 등)에 대해 별도의 '툴킷'으로 구성되어 있다고 생각합니다. 스크립팅에는 Python 이외의 다른 옵션이 있지만 이것이 내가 사용하는 방식입니다.

http://grass.osgeo.org/wiki/GRASS_and_Python에서 최신 링크를 확인하십시오.

편집 : 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 Software Laboratory도 있습니다. 그들은:

  • 피오나 : 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 에는 풍부한 값의 통계 분석 방법이 있으며 그중 일부는 공간 분석에 사용될 수 있습니다. 래스터를 상자에 두 줄로 자르는 방법을 보여주는 @Whuber좋은 대답이 있습니다.


6
파이썬으로 다시 가져 오려면 RPy 라이브러리를 사용할 수 있습니다 . RPy는 R 프로그래밍 언어에 대한 매우 단순하지만 강력한 Python 인터페이스입니다. 모든 종류의 R 객체를 관리 할 수 ​​있으며 그래픽 기능을 포함한 임의의 R 기능을 실행할 수 있습니다. R 언어의 모든 오류는 Python 예외로 변환됩니다. R 시스템 용으로 설치된 모든 모듈은 Python 내에서 사용할 수 있습니다.
RyanDalton

6

내 솔루션, 빠른 솔루션은 Python과 함께 GDAL을 사용하는 것입니다.

당신은 필요

하위 프로세스 가져 오기

command = "GTdal -p 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의 유연성은 특히 리눅스 환경에서 환상적입니다. 거대한 래스터를 처리하고 Python 또는 Shell 스크립트와 함께 묶을 수 있으며 여러 가지 기능이 있습니다. 벡터 기반 도구에 대해서는 OGR을 참조하십시오.


4

PostGIS를 실행하는 것이 마음에 들지 않으면 대부분의 공간 데이터 처리가 가능합니다.

PDF 치트 시트 :

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

파이썬과 통합됩니다.

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

Quantum GIS 또는 pgAdmin 내의 SPIT와 같은 지원 도구를 사용하면 PostGIS를 설정할 수 있습니다. 그런 다음 파이썬을 사용하여 공간 데이터에 대한 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, whitebox_tools.py 스크립트 가 포함되어 있으며이 스크립트는 라이브러리에 대한 Python API (위 스크립트의 맨 위 행에서 가져옴) 및 사용자 매뉴얼을 제공합니다. 라이브러리와의 인터페이스를위한 매우 기본적인 tkinter GUI (wb_runner.py)도 있습니다.

허용되는 MIT 라이센스는 WhiteboxTools를 다른 오픈 소스 GIS와 백엔드로 통합 할 수 있도록하기위한 것입니다. Alexander Bruy는 WhiteboxTools 백엔드 용 QGIS 플러그인 을 개발했습니다 . 필요에 따라 WhiteboxTools 및 ArcPy의 도구를 단일 스크립트로 혼합하고 일치시킬 수도 있습니다. 이 라이브러리는 다소 실험적이며 Guelph 대학교의 Geomorphometry and Hydrogeomatics Research Group 에서 개발되었으며 현재 1.0 버전 이전이며 사용시 고려해야합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.