Các ví dụ về Python Script để xử lý các shapefile mà không sử dụng arcpy


33

Tôi muốn sử dụng tập lệnh Python không dựa trên arcpy để thực hiện những việc như truy vấn shapefile theo thuộc tính, tạo lớp mới từ lựa chọn và tính diện tích của đa giác và chuyển đổi đa giác thành điểm.

Bất cứ ai cũng có bất kỳ ví dụ mã nào về việc sử dụng các mô-đun hoặc thư viện Python khác? Tôi có thể làm điều này một cách dễ dàng bằng cách sử dụng arcpy nhưng tôi muốn khám phá các tùy chọn khác.


geopandas là bạn của bạn cho các tập tin vector. Rasterio cho raster.
RutgerH

Câu trả lời:


54

Điều đó thật kỳ lạ, như thể mọi người đột nhiên phát hiện ra sức mạnh của Python (không có ArcPy, chỉ là một mô-đun Python trong số những người khác), xem ví dụ câu hỏi Visualize shapefile trong Python :

  • Xử lý không gian địa lý trong Python có một lịch sử rất dài, lâu đời hơn Arcpy (hoặc arcgisscripting) -> không "bắt chước" các khả năng của ArcPy ở đây, như Paul nói, hầu hết đã có trước ArcPy.
  • tham chiếu cho các mô-đun Python là Chỉ số gói Python ( Pypi ) và có một phần dành riêng: Topic :: Khoa học / Kỹ thuật :: GIS
  • bạn có thể làm bất cứ điều gì với các mô-đun này và nó thường dễ dàng và nhanh hơn ArcPy vì nó là Python thuần túy (không có con trỏ ...).
  • Shapely là một trong những mô-đun này để xử lý hình học không gian địa lý -> tính diện tích của đa giác và chuyển đổi đa giác thành điểm ..
  • nếu bạn muốn xử lý các lớp vectơ, có osgeo / ogr , Fiona hoặc Pyshp (và những thứ khác, ít được sử dụng) -> truy vấn một shapefile theo các thuộc tính, tạo lớp mới từ lựa chọn, tính diện tích của đa giác, chuyển đổi đa giác thành các điểm
  • để xử lý các trình quét , tiêu chuẩn là osgeo / gdal
  • để phân tích không gian, có Pysal
  • đối với 3D, bạn có thể sử dụng các mô-đun Khoa học khác như numpy hoặc scipy (thuật toán 3D, lưới, nhưng cũng có thể thống kê, thống kê địa lý, 2D hoặc 3D)
  • Và tôi không nói về mapnik , matplotlib / basemap , Geodjango và ...

Bạn có thể kết hợp tất cả (Pysal với hình dạng, ...) và trộn chúng với các mô-đun Khoa học khác.

Do đó, ví dụ về Python Script, tìm kiếm Pyshp Fiona, ogr, gdal hoặc shapely trong gis.stackexchange hoặc internet (nhiều ví dụ, không chỉ bằng tiếng Anh).)
Một trong số đó bằng tiếng Pháp (chữ viết và hình vẽ là phổ biến!):
- Python: Sử dụng các lớp vectơ và raster trong phối cảnh địa chất, không có phần mềm GIS
khác bằng tiếng Anh:
- GIS với Python, Shapely và Fiona
và tiếng Tây Ban Nha
- Xác định các khu vực của đa giác không đều bằng tọa độ của các đỉnh
trong gis.stackexchange
- Cấu hình độ cao 10 km mỗi bên của một dòng
- Cập nhật các thuộc tính bằng Pyshp
- Làm cách nào để tạo một hình dạng 3D từ một raster?
- Python Script để nhận chênh lệch độ cao giữa hai điểm
- v.v.

Kịch bản được trình bày bởi Aaron có thể được viết đơn giản hơn với Fiona chỉ sử dụng từ điển 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')

và nếu bạn sử dụng hình dạng bổ sung:

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

Ngoài ra còn có hai cuốn sách:

Phát triển không gian địa lý Python của Eric Westra.

nhập mô tả hình ảnh ở đây

Học phân tích không gian địa lý với Python của Joel Lawhead

nhập mô tả hình ảnh ở đây

Python cũng được sử dụng làm ngôn ngữ kịch bản trong các ứng dụng GIS khác như QGIS (Quantum GIS), GRASS GIS, gvSIG hoặc OpenJump hoặc các nhà tạo mô hình 3D như Paraview (và Blender nữa !). Và bạn có thể sử dụng phần lớn các mô-đun không gian địa lý trong tất cả các ứng dụng này (xem Trực quan hóa dữ liệu QGIS bằng Blender )


Những thứ Python này mà bạn nói là gì;)
Nathan W

Fiona dường như đang ném một lỗi DLL trên Windows.
đa cấp

Làm thế nào bạn cài đặt Fiona? không có vấn đề gì với tôi
gen

19

Tôi đặc biệt khuyên dùng trang web USU Geoprocessing với Python bằng cách sử dụng GIS nguồn mở để giúp bạn bắt đầu. Họ chủ yếu sử dụng thư viện GDAL / OGR trong suốt các bài tập. Cài đặt GDAL / OGR có thể là một chút thách thức, vì vậy mục blog này có thể hữu ích cho bạn: Cài đặt GDAL (và OGR) cho Python trên Windows . Ngoài ra, hãy kiểm tra các lựa chọn thay thế cho việc sử dụng Arcpy trên GIS.SE.

Ví dụ về kịch bản xử lý địa lý mã nguồn mở sau đây (từ trang USU) được sử dụng để trích xuất dữ liệu thuộc tính và ghi nó vào tệp văn bản:

# 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
.Destroylà một tên phương thức tuyệt vời: p
Jason

5

Bạn có thể quan tâm đến GDAL / OGR .

GDAL được sử dụng để xử lý các trình quét trong khi OGR được sử dụng cho các vectơ. Cả hai đều là các thư viện mã nguồn mở.

Nếu bạn đang tìm cách loại bỏ một số phụ thuộc vào ArcPy, bạn có thể bắt chước một số khả năng bằng cách đọc thông tin đến một mảng và chạy các tính toán của riêng bạn trong Python thuần túy.

Gần đây tôi đã làm điều này với việc chọn các điểm trong một đa giác, như được thấy ở đây . Nó sử dụng thuật toán đúc tia để xác định xem một điểm có nằm trong đa giác hay không, được cho tọa độ của các đỉnh của đa giác.


1
vui lòng bao gồm đủ bản chất của giải pháp có thể được nắm bắt và hiểu trước khi đến thăm và đọc trang. Trong thời gian đó, trang đó có thể sẽ không ở địa chỉ đó khiến câu trả lời này không hữu ích lắm. :)
matt wilkie

1

Tôi chưa bao giờ sử dụng cá nhân này, nhưng những người khác trong văn phòng thích sử dụng một cách dễ dàng: https://pypi.python.org/pypi/Shapely


Bất kỳ cơ hội nào bạn có thể đăng một số mã mẫu bằng cách sử dụng hình dạng?
sherpas


5
Liên kết chỉ trả lời không hữu ích trong thời gian dài, vì chắc chắn chúng sẽ bị hỏng. Vui lòng bao gồm đủ thông tin về điểm đến mà a) ngôi nhà mới của nó có thể được khám phá lại và b) bản chất của giải pháp có thể được nắm bắt và hiểu trước khi đến thăm và đọc trang.
matt wilkie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.