Відповіді:
У кулінарній книзі Python GDAL / OGR є деякий зразок коду для буфера геометрії .
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())
і обчислити перетин між двома Геометріями
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()
Геометрії можна читати та записувати у форміфайли та різноманітні інші формати.
Для спрощення, Shapely: керівництво дозволяє проводити всю геометрію обробки PostGIS на Python.
Перша передумова Shapely полягає в тому, що програмісти Python повинні мати можливість виконувати операції геометрії типу PostGIS поза RDBMS ...
Перший приклад 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), ....}
Приклад полігону від 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
Друга передумова полягає в тому, що постійність, серіалізація та проекція карт особливостей є суттєвими, але ортогональними проблемами. Можливо, вам не знадобиться сто читачів та авторів формату ГІС або безліч проекцій Державного Плану, і Shapely не обтяжує вас ними.
Таким чином, ви поєднуєте його з іншими модулями Python для читання або запису файлів форм та маніпулювання проекціями, як osgeo.ogr, Fiona або PyShp .
Шукаючи в Gis StackExchange, ви можете знайти безліч прикладів, але я даю вам ще один, щоб проілюструвати поєднання фігурних та Fiona та використання перетину функцій () та буфера () (це могло бути зроблено з PyShp).
Дано два полілінійні форми:
Обчисліть перетин (функція перетину () витонченого)
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)
Збережіть результат як новий файл форми
# 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}})
Результат:
Буферні окремі точки (функціональний буфер () витонченого)
# 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}})
Результат
Буферуйте геометрію 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}})
Моя бібліотека "обробка" для геообробки - "Бібліотека дистанційного зондування та ГІС" (RSGISLib). Його легко встановити та використовувати, а документація справді хороша. Він має функціонал для векторної та растрової обробки - мені дуже рідко доводиться ходити поруч із gui. Його можна знайти тут: http://rsgislib.org .
Прикладом у цьому випадку є:
rsgislib.vectorutils.buffervector(inputvector, outputvector, bufferDist, force)
Команда для буфера вектора на заданій відстані.
Де:
Приклад:
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)