Python Script ตัวอย่างสำหรับการประมวลผลไฟล์รูปร่างโดยไม่ต้องใช้ arcpy


33

ฉันต้องการใช้สคริปต์ Python ที่ไม่ได้อิงกับ arcpy เพื่อทำสิ่งต่าง ๆ เช่นสืบค้นรูปร่างไฟล์โดยคุณสมบัติสร้างเลเยอร์ใหม่จากการเลือกและคำนวณพื้นที่ของรูปหลายเหลี่ยมและแปลงรูปหลายเหลี่ยมเป็นจุด

ใครมีตัวอย่างรหัสใด ๆ ของการใช้โมดูลหรือไลบรารี Python อื่น ๆ ฉันสามารถทำได้อย่างง่ายดายโดยใช้ arcpy แต่ฉันต้องการสำรวจตัวเลือกอื่น ๆ


geopandas เป็นเพื่อนของคุณสำหรับไฟล์เวกเตอร์ Rasterio สำหรับแรสเตอร์
RutgerH

คำตอบ:


54

เป็นเรื่องที่แปลกราวกับว่าผู้คนค้นพบพลังของ Python (โดยไม่ต้องใช้ ArcPy ซึ่งเป็นเพียงโมดูล Python เพียงอันเดียว) ดูตัวอย่างของคำถามVisualize shapefile ใน Python :

  • การประมวลผลเชิงพื้นที่ใน Python มีประวัติยาวนานมากเก่ากว่า Arcpy (หรือ arcgisscripting) -> ไม่มี "เลียนแบบ" ขีดความสามารถของ ArcPy ที่นี่ตามที่ Paul กล่าวส่วนใหญ่เคยมีมาก่อน ArcPy แล้ว
  • การอ้างอิงสำหรับโมดูล Python คือPython Package Index ( Pypi ) และมีส่วนเฉพาะ: หัวข้อ :: วิทยาศาสตร์ / วิศวกรรม :: GIS
  • คุณสามารถทำอะไรกับโมดูลเหล่านี้และมันก็มักจะง่ายกว่าและเร็วกว่า ArcPy เพราะมันเป็น Python แท้ๆ (ไม่มีเคอร์เซอร์ ... )
  • หุ่นดีเป็นหนึ่งในโมดูลเหล่านี้สำหรับการประมวลผลรูปทรงเรขาคณิตเชิงพื้นที่ -> คำนวณพื้นที่ของรูปหลายเหลี่ยมและแปลงรูปหลายเหลี่ยมเป็นจุด ..
  • หากคุณต้องการประมวลผลเลเยอร์เวกเตอร์มีosgeo / ogr , FionaหรือPyshp (และอื่น ๆ ที่ใช้น้อยกว่า) -> สอบถาม shapefile โดยแอตทริบิวต์สร้างเลเยอร์ใหม่จากการเลือกคำนวณเลเยอร์ใหม่จากการเลือกคำนวณพื้นที่ของรูปหลายเหลี่ยม
  • สำหรับการประมวลผล rasters มาตรฐานคือosgeo / gdal
  • สำหรับการวิเคราะห์เชิงพื้นที่มีPysal
  • สำหรับ 3D คุณสามารถใช้โมดูลวิทยาศาสตร์อื่น ๆ เช่นnumpyหรือscipy (อัลกอริทึม 3D, กริด แต่ยังรวมถึงสถิติ, ภูมิศาสตร์, 2D หรือ 3D)
  • และฉันไม่ได้พูดถึงmapnik , matplotlib / basemap , Geodjangoและ ...

คุณสามารถรวมทั้งหมด (Pysal กับหุ่นดี, ... ) และผสมกับโมดูลวิทยาศาสตร์อื่น ๆ

ดังนั้นสำหรับตัวอย่างของ Python Script ให้ค้นหา Pyshp Fiona, ogr, gdal หรือ shapely ใน gis.stackexchange หรืออินเทอร์เน็ต (ตัวอย่างมากมายไม่เพียง แต่เป็นภาษาอังกฤษ)
หนึ่งในนั้นเป็นภาษาฝรั่งเศส (สคริปต์และตัวเลขเป็นสากล!):
- Python: การใช้เวกเตอร์และเลเยอร์แรสเตอร์ในมุมมองทางธรณีวิทยาโดยไม่มีซอฟต์แวร์ GIS
เป็นภาษาอังกฤษ:
- GIS ด้วย Python, Shapely, และ Fiona
และภาษาสเปน
- การกำหนดพื้นที่ของรูปหลายเหลี่ยมผิดปกติโดยใช้พิกัดของจุดยอด
ใน gis.stackexchange
- โปรไฟล์ระดับความสูง 10 กม. ในแต่ละด้านของบรรทัด
- อัปเดตคุณสมบัติโดยใช้ Pyshp
- วิธีสร้างรูปร่าง3D จากแรสเตอร์
- Python Script สำหรับรับความแตกต่างของระดับความสูงระหว่างสองจุด
- ฯลฯ

สคริปต์ที่นำเสนอโดย Aaron สามารถเขียนได้ง่ายขึ้นด้วย Fiona ซึ่งใช้พจนานุกรม Python เท่านั้น:

import fiona
with fiona.open('sites.shp', 'r') as input:
    with open('hw1a.txt', 'w') as output:
       for pt in input:
           id = pt['properties']['id']
           cover = pt['properties']['cover']
           x = str(point['geometry']['coordinates'][0])
           y = str(point['geometry']['coordinates'][21])
           output.write(id + ' ' + x + ' ' + y+ ' ' + cover + '\n')

และถ้าคุณใช้หุ่นดีนอกจากนี้:

from shapely.geometry import shape
with fiona.open('sites.shp', 'r') as input:
    with open('hw1a.txt', 'w') as output:
       for pt in input:
           id = pt['properties']['id']
           cover = pt['properties']['cover']
           x = str(shape(pt['geometry']).x)
           y = str(shape(pt['geometry']).y)
           output.write(id + ' ' + x + ' ' + y+ ' ' + cover + '\n')

นอกจากนี้ยังมีหนังสือสองเล่ม:

Python การพัฒนาเชิงพื้นที่ของ Eric Westra

ป้อนคำอธิบายรูปภาพที่นี่

การเรียนรู้การวิเคราะห์เชิงพื้นที่ด้วย Pythonของ Joel Lawhead

ป้อนคำอธิบายรูปภาพที่นี่

Python ยังใช้เป็นภาษาสคริปต์ในแอปพลิเคชั่น GIS อื่น ๆ เช่น QGIS (Quantum GIS), GRASS GIS, gvSIG หรือ OpenJump หรือผู้สร้างโมเดล 3D เช่นParaview (และBlenderด้วย!) และคุณสามารถใช้โมดูล geospatial ส่วนใหญ่ในแอปพลิเคชันเหล่านี้ทั้งหมด (ดูการแสดงข้อมูล QGIS ด้วย Blender )


งูเหลือมตัวนี้พูดถึงอะไร;)
นาธาน

ฟิโอน่าดูเหมือนจะโยนข้อผิดพลาด DLL บน Windows
หลากสี

คุณติดตั้ง Fiona ได้อย่างไร? ไม่มีปัญหาสำหรับฉัน
ยีน

19

ฉันขอแนะนำการประมวลผลเว็บไซต์ USU ด้วย Python โดยใช้ Open Source GISเพื่อให้คุณเริ่มต้นได้ พวกเขาใช้ไลบรารี GDAL / OGR เป็นหลักตลอดการฝึก การติดตั้ง GDAL / OGR สามารถเป็นบิตของความท้าทายเพื่อเข้าบล็อกนี้อาจจะเป็นประโยชน์สำหรับคุณ: การติดตั้ง GDAL (และ OGR) สำหรับหลามบน Windows ตรวจสอบทางเลือกอื่น ๆ ในการใช้ Arcpyบน GIS.SE

ตัวอย่างสคริปต์ geoprocessing opensource ต่อไปนี้ (จากไซต์ USU) ใช้เพื่อแยกข้อมูลแอ็ตทริบิวต์และเขียนลงในไฟล์ข้อความ:

# import modules
import ogr, os, sys

# set the working directory
os.chdir('f:/data/classes/python/data')

# open the output text file for writing
file = open('hw1a.txt', 'w')

# get the shapefile driver
driver = ogr.GetDriverByName('ESRI Shapefile')

# open the data source
datasource = driver.Open('sites.shp', 0)
if datasource is None:
  print 'Could not open file'
  sys.exit(1)

# get the data layer
layer = datasource.GetLayer()

# loop through the features in the layer
feature = layer.GetNextFeature()
while feature:

  # get the attributes
  id = feature.GetFieldAsString('id')
  cover = feature.GetFieldAsString('cover')

  # get the x,y coordinates for the point
  geom = feature.GetGeometryRef()
  x = str(geom.GetX())
  y = str(geom.GetY())

  # write info out to the text file
  file.write(id + ' ' + x + ' ' + y + ' ' + cover + '\n')

  # destroy the feature and get a new one
  feature.Destroy()
  feature = layer.GetNextFeature()

# close the data source and text file
datasource.Destroy()
file.close()

4
.Destroyเป็นชื่อวิธีที่ยอดเยี่ยม: p
Jason

5

คุณอาจจะสนใจในGDAL / OGR

GDAL ใช้สำหรับการประมวลผลภาพแรสเตอร์ในขณะที่ OGR ใช้สำหรับเวกเตอร์ ทั้งสองเป็นไลบรารีโอเพนซอร์ส

หากคุณต้องการลบการพึ่งพา ArcPy คุณสามารถเลียนแบบความสามารถบางอย่างโดยการอ่านข้อมูลไปยังอาร์เรย์และเรียกใช้การคำนวณของคุณเองใน Python บริสุทธิ์

ฉันเพิ่งทำอย่างนี้กับการเลือกจุดในรูปหลายเหลี่ยมเท่าที่เห็นนี่ มันใช้อัลกอริทึมการหล่อเรย์เพื่อตรวจสอบว่าจุดหนึ่งอยู่ภายในรูปหลายเหลี่ยมหรือไม่โดยกำหนดพิกัดของจุดยอดของรูปหลายเหลี่ยม


1
โปรดรวมสาระสำคัญของการแก้ปัญหาที่สามารถเข้าใจและเข้าใจก่อนที่จะไปเยี่ยมชมและอ่านหน้า ในเวลาที่หน้าอาจจะไม่อยู่ที่ที่แสดงผลคำตอบนี้ไม่ได้มีประโยชน์มาก :)
matt wilkie

1

ฉันไม่เคยใช้สิ่งนี้เป็นการส่วนตัว แต่คนอื่น ๆ ในสำนักงานชอบใช้หุ่นดี: https://pypi.python.org/pypi/Shapely


โอกาสใดที่คุณสามารถโพสต์โค้ดตัวอย่างโดยใช้หุ่นดีได้
Sherpas


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