Tìm kiếm thư viện Python (trừ ArcPy) để xử lý địa lý như bộ đệm? [đóng cửa]


16

Ngoại trừ ArcPy, có thư viện python nào có thể thực hiện xử lý địa lý, chẳng hạn như bộ đệm / giao cắt, với shapefiles không?

Câu trả lời:


17

Các Python GDAL / OGR Cookbook có một số mẫu mã để đệm một Geometry .

from osgeo import ogr

wkt = "POINT (1198054.34 648493.09)"
pt = ogr.CreateGeometryFromWkt(wkt)
bufferDistance = 500
poly = pt.Buffer(bufferDistance)
print "%s buffered by %d is %s" % (pt.ExportToWkt(), bufferDistance, poly.ExportToWkt())

và để tính giao điểm giữa hai hình học

from osgeo import ogr

wkt1 = "POLYGON ((1208064.271243039 624154.6783778917, 1208064.271243039 601260.9785661874, 1231345.9998651114 601260.9785661874, 1231345.9998651114 624154.6783778917, 1208064.271243039 624154.6783778917))"
wkt2 = "POLYGON ((1199915.6662253144 633079.3410163528, 1199915.6662253144 614453.958118695, 1219317.1067437078 614453.958118695, 1219317.1067437078 633079.3410163528, 1199915.6662253144 633079.3410163528)))"

poly1 = ogr.CreateGeometryFromWkt(wkt1)
poly2 = ogr.CreateGeometryFromWkt(wkt2)

intersection = poly1.Intersection(poly2)

print intersection.ExportToWkt()

Hình học có thể được đọc và ghi vào shapefiles và một loạt các định dạng khác.


14

Để đơn giản hóa, Shapely: thủ công cho phép tất cả xử lý hình học của PostGIS bằng Python.

Tiền đề đầu tiên của Shapely là các lập trình viên Python có thể thực hiện các hoạt động hình học loại PostGIS bên ngoài RDBMS ...

Ví dụ đầu tiên về PolyGeo

from shapely.geometry import Point, LineString, Polygon, mapping
from shapely.wkt import loads  
pt = Point(1198054.34,648493.09)
# or
pt = loads("POINT (1198054.34 648493.09)")
bufferDistance = 500
poly = pt.buffer(bufferDistance)
print poly.wkt
'POLYGON ((1198554.3400000001000000 648493.0899999999700000, 1198551.9323633362000000 
# GeoJSON
print mapping(poly)
{'type': 'Polygon', 'coordinates': (((1198554.34, 648493.09), (1198551.9323633362, 648444.0814298352), (1198544.7326402017, 648395.544838992), ....}

Ví dụ về đa giác từ PolyGeo:

poly1 = Polygon([(1208064.271243039,624154.6783778917), (1208064.271243039,601260.9785661874), (1231345.9998651114,601260.9785661874),(1231345.9998651114,624154.6783778917),(1208064.271243039,624154.6783778917)])    
poly2 = loads("POLYGON ((1199915.6662253144 633079.3410163528, 1199915.6662253144 614453.958118695, 1219317.1067437078 614453.958118695, 1219317.1067437078 633079.3410163528, 1199915.6662253144 633079.3410163528)))"

intersection = poly1.intersection(poly2)
print intersection.wkt
print mapping(intersection) -> GeoJSON

Tiền đề thứ hai là sự tồn tại, tuần tự hóa và phép chiếu bản đồ của các tính năng là những vấn đề quan trọng, nhưng trực giao. Bạn có thể không cần hàng trăm độc giả và nhà văn định dạng GIS hoặc vô số các phép chiếu Máy bay Nhà nước và Shapely không gây gánh nặng cho bạn với họ.

Vì vậy, bạn kết hợp nó với các mô-đun Python khác để đọc hoặc viết shapefiles và thao tác các phép chiếu như osgeo.ogr, Fiona hoặc PyShp .
Tìm kiếm trong Gis StackExchange, bạn có thể tìm thấy nhiều ví dụ nhưng tôi đưa cho bạn một ví dụ khác để minh họa sự kết hợp của shapely và Fiona và việc sử dụng các hàm tạo hình giao nhau () và bộ đệm () (Điều này có thể đã được thực hiện với PyShp).

Cho hai shapefiles polyline:

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

Tính toán giao điểm (giao điểm hàm () của hình dạng)

from shapely.geometry import Point, Polygon, MultiPolygon, MumtiPoint, MultiLineString,shape, mapping
import fiona
# read the shapefiles and transform to MultilineString shapely geometry (shape())
layer1 = MultiLineString([shape(line['geometry']) for line in fiona.open('polyline1.shp')])  
layer2 = MultiLineString([shape(line['geometry']) for line in fiona.open('polyline2.shp')])
points_intersect = layer1.intersection(layer2)

Lưu kết quả dưới dạng shapefile mới

# schema of the new shapefile
schema = {'geometry': 'MultiPoint','properties': {'test': 'int'}}
# write the new shapefile (function mapping() of shapely)
with fiona.open('intersect.shp','w','ESRI Shapefile', schema) as e:
  e.write({'geometry':mapping(points_intersect), 'properties':{'test':1}})

Kết quả:

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

Bộ đệm điểm riêng lẻ (bộ đệm chức năng () của hình dạng)

 # new schema
 schema = {'geometry': 'Polygon','properties': {'test': 'int'}}
 with fiona.open('buffer.shp','w','ESRI Shapefile', schema) as e:
     for point in points:
          e.write({'geometry':mapping(point.buffer(300)), 'properties':{'test':1}})

Kết quả

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

Bộ đệm hình học MultiPoint

schema = {'geometry': 'MultiPolygon','properties': {'test': 'int'}}
points.buffer(300)
with fiona.open('buffer2.shp','w','ESRI Shapefile', schema) as e:
     e.write({'geometry':mapping(points.buffer(300)), 'properties':{'test':1}})

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


9

Shapely cung cấp quyền truy cập python vào GEOS có thể thực hiện bộ đệm / giao cắt / vv. GEOS là thư viện mà hầu hết các chương trình OSGeo sử dụng để thực hiện các hoạt động đó.


9

Dưới đây là danh sách các phần mềm xử lý địa lý Python.

  • Tạo dáng, trăn
  • OGR, trăn
  • QGIS, pyqgis, trăn
  • SagaGIS, trăn
  • Cỏ, trăn
  • spatialite, pyspatialite, trăn
  • PostreSQL / PostGIS, Psycopg, python
  • Dự án R, rpy2, python
  • Whitebox GAT, python -GeoScript, jython

1

Thư viện 'xử lý địa lý' của tôi là 'Thư viện viễn thám và GIS' (RSGISLib). Nó dễ dàng để cài đặt và sử dụng và các tài liệu thực sự tốt. Nó có chức năng xử lý vector và raster - tôi rất hiếm khi phải đến gần một gui. Nó có thể được tìm thấy ở đây: http://rsgislib.org .

Một ví dụ trong trường hợp này là:

rsgislib.vectorutils.buffervector(inputvector, outputvector, bufferDist, force)

Một lệnh để đệm một vectơ theo một khoảng cách xác định.

Ở đâu:

  • inputvector là một chuỗi chứa tên của vectơ đầu vào
  • outputvector là một chuỗi chứa tên của vectơ đầu ra
  • bufferDist là một float chỉ định khoảng cách của bộ đệm, tính theo đơn vị bản đồ
  • lực là một bool, xác định xem có nên loại bỏ vectơ đầu ra hay không nếu nó tồn tại

Thí dụ:

from rsgislib import vectorutils
inputVector = './Vectors/injune_p142_stem_locations.shp'
outputVector = './TestOutputs/injune_p142_stem_locations_1mbuffer.shp'
bufferDist = 1
vectorutils.buffervector(inputVector, outputVector, bufferDist, True)
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.