Câu trả lời:
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.
Để đơ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:
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ả:
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ả
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}})
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:
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)