ทางเลือกอื่นในการใช้ 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 คำถามของฉันสำหรับโปรแกรมเมอร์ที่จริงจัง: คุณใช้เครื่องมือหลามชุดใดเพื่อทำงานที่ผู้ใช้ 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)

ที่ตัวแปรของคุณสามารถตั้งค่าในหลาม

สำหรับงูหลามเต็ม:

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

มีการประมวลผลทางภูมิศาสตร์ด้วย Python โดยใช้หลักสูตรGIS แบบโอเพ่นซอร์สที่ Utah State University คุณอาจต้องการลองดูด้วย


20

ในงานวิจัยทางวิชาการของฉันฉันทำงานกับข้อมูล LiDAR เพื่อทำการวิเคราะห์พื้นผิวสำหรับธรณีสัณฐานวิทยา ฉันพบอย่างรวดเร็วว่าการดำเนินการจำนวนมากโดยใช้ arcpy นั้นช้ามากโดยเฉพาะชุดข้อมูลขนาดใหญ่ เป็นผลให้ฉันเริ่มใช้:

  • pyshpเพื่อจัดการรูปร่างของไฟล์และอัปเดตตารางแอตทริบิวต์
  • numpyการจัดการเชิงภาพ ASCII และดำเนินการวิเคราะห์เคอร์เนลที่ใช้เช่นการคำนวณความโค้ง
  • scipyเพื่อทำการวิเคราะห์ทางสถิติเกี่ยวกับผลลัพธ์และดำเนินการปรับโค้งสำหรับพื้นผิว
  • matplotlibเพื่อพล็อตกราฟและผลกราฟิกอื่น ๆ เช่นแผนที่พื้นฐานสำหรับการสร้างภาพข้อมูลอย่างรวดเร็ว

ฉันอยากจะแนะนำหนังสือเล่มนี้การสร้างแบบจำลองเชิงปริมาณของกระบวนการพื้นผิวโลกให้กับทุกคนที่ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการวิเคราะห์พื้นผิวแรสเตอร์ หนังสือเล่มนี้มาพร้อมกับตัวอย่างโค้ดที่ยอดเยี่ยมใน C ++ ซึ่งมีประสิทธิภาพมากกว่าเครื่องมือ ArcGIS อัลกอริธึมเหล่านี้สามารถนำไปใช้กับ Python ได้โดยไม่ต้องการอะไรที่ซับซ้อนกว่า numpy แม้ว่ามันจะทำงานได้เร็วกว่าใน C ++


16

สำหรับคนที่ใช้ ESRI ฉันคิดว่า GRASS จะเป็นสภาพแวดล้อมที่คล้ายกันมากกับสภาพแวดล้อม GUI python และจัดระเบียบใน 'toolkits' แยกต่างหากสำหรับงานต่าง ๆ (แรสเตอร์เวกเตอร์ชุดเครื่องมือแสงอาทิตย์ ฯลฯ ) สคริปต์มีตัวเลือกอื่นนอกเหนือจาก 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ซึ่งมีโมดูลที่น่าสนใจสองสามรายการ พวกเขาคือ:

  • Fiona : API ของ nGR ของ 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()เพื่อสร้างไฟล์เวคเตอร์ตั้งแต่เริ่มต้น หากคุณสนใจฉันสามารถโพสต์ได้ที่นี่แม้ว่าฉันจะคิดว่ามันเกินขอบเขตของคำถาม


10

ฉันรู้ว่าคำถามของคุณคือ Python-centric แต่Rมีวิธีการวิเคราะห์ทางสถิติที่มีค่ามากมายบางวิธีสามารถใช้สำหรับการวิเคราะห์เชิงพื้นที่ @Whuberมีคำตอบที่ดีที่นี่แสดงวิธีการแรสเตอร์ไปยังกล่องในสองบรรทัด


6
ที่จะนำมันกลับไป Python, คุณสามารถใช้ห้องสมุด RPy RPy เป็นอินเทอร์เฟซ Python ที่เรียบง่าย แต่แข็งแกร่งของภาษาโปรแกรม R มันสามารถจัดการวัตถุ R ทุกชนิดและสามารถใช้งานฟังก์ชั่น R โดยพลการ (รวมถึงฟังก์ชั่นกราฟิก) ข้อผิดพลาดทั้งหมดจากภาษา R ถูกแปลงเป็นข้อยกเว้น Python โมดูลใด ๆ ที่ติดตั้งสำหรับระบบ R สามารถใช้งานได้จากภายใน Python
RyanDalton

6

ทางออกที่รวดเร็วของฉันคือการใช้ GDAL กับ Python

คุณจำเป็นต้อง

นำเข้ากระบวนการย่อย

คำสั่ง = "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 สามารถจัดการกับ rasters ขนาดใหญ่สามารถเชื่อมโยงกับสคริปต์ Python หรือ Shell และมีฟังก์ชั่นหลายอย่าง ดูเพิ่มเติม OGR สำหรับเครื่องมือที่ใช้เวกเตอร์


4

หากคุณไม่สนใจใช้ PostGIS ก็สามารถทำการประมวลผลข้อมูลเชิงพื้นที่ให้คุณได้

เอกสาร PDF PDF:

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

มันทำงานร่วมกับหลาม:

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

ด้วยเครื่องมือสนับสนุนเช่น SPIT ภายใน Quantum GIS หรือ pgAdmin คุณพร้อมที่จะติดตั้ง PostGIS จากนั้นคุณสามารถใช้ python ควบคุมการทำงานของ PostGIS ในข้อมูลอวกาศของคุณ


3

ฉันได้รับการทำงานในโอเพนซอร์ส Geoprocessing ห้องสมุดเรียก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 ไลบรารีเป็นแบบสแตนด์อะโลนและไม่มีการขึ้นต่อกันใด ๆ คุณก็ต้องดาวน์โหลดขนาดเล็ก (<5 เมกะไบต์) ไฟล์อยู่ที่นี่ ไฟล์ดาวน์โหลดประกอบด้วย WhiteboxTools exe, สคริปต์whitebox_tools.pyซึ่งมี Python API สำหรับไลบรารี (นำเข้าที่บรรทัดบนสุดของสคริปต์ด้านบน) และคู่มือผู้ใช้ นอกจากนี้ยังมี tkinter GUI พื้นฐาน (wb_runner.py) สำหรับการเชื่อมต่อกับไลบรารี

สิทธิ์การใช้งาน MIT ที่ได้รับอนุญาตมีวัตถุประสงค์เพื่ออนุญาตให้ WhiteboxTools รวมเป็นแบ็คเอนด์กับ GIS โอเพ่นซอร์สอื่น ๆ Alexander Bruy ได้พัฒนาปลั๊กอิน QGISสำหรับ WhiteboxTools นอกจากนี้คุณยังสามารถผสมผสานและจับคู่เครื่องมือจาก WhiteboxTools และ ArcPy ในสคริปต์เดียวได้ตามต้องการ ห้องสมุดยังค่อนข้างทดลองพัฒนามาจากกลุ่มวิจัยธรณีสัณฐานวิทยาและอุทกธรณีวิทยาของมหาวิทยาลัย Guelph และขณะนี้ได้เปิดตัว pre-1.0 ซึ่งควรนำมาพิจารณาในการใช้งาน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.