Risposte:
Il ricettario Python GDAL / OGR ha del codice di esempio per bufferizzare una geometria .
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())
e per calcolare l'intersezione tra due geometrie
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()
Le geometrie possono essere lette e scritte in shapefile e in molti altri formati.
Per semplificare, Shapely: il manuale consente l'elaborazione di tutte le geometrie di PostGIS in Python.
La prima premessa di Shapely è che i programmatori Python dovrebbero essere in grado di eseguire operazioni di geometria di tipo PostGIS al di fuori di un RDBMS ...
Il primo esempio di 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), ....}
L'esempio del poligono di 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
La seconda premessa è che la persistenza, la serializzazione e la proiezione cartografica delle funzioni sono problemi significativi, ma ortogonali. Potresti non aver bisogno di un centinaio di lettori e scrittori in formato GIS o della moltitudine di proiezioni di State Plane e Shapely non ti grava con loro.
Quindi lo combini con altri moduli Python per leggere o scrivere shapefile e manipolare le proiezioni come osgeo.ogr, Fiona o PyShp .
Cercando in Gis StackExchange, puoi trovare molti esempi, ma te ne do un altro per illustrare la combinazione di shapely e Fiona e l'uso delle funzioni shapely intersection () e buffer () (questo avrebbe potuto essere fatto con PyShp).
Dati due shapefile di polilinea:
Calcola l'intersezione (funzione intersezione () di formosa)
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)
Salva il risultato come nuovo shapefile
# 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}})
Risultato:
Buffer singoli punti (buffer funzione () di shapely)
# 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}})
Risultato
Buffer la geometria 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}})
La mia libreria "vai a" di geoelaborazione è la "Libreria di rilevamento remoto e GIS" (RSGISLib). È facile da installare e utilizzare e la documentazione è davvero buona. Ha funzionalità per l'elaborazione vettoriale e raster: molto raramente devo avvicinarmi a una GUI. Può essere trovato qui: http://rsgislib.org .
Un esempio in questo caso è:
rsgislib.vectorutils.buffervector(inputvector, outputvector, bufferDist, force)
Un comando per bufferizzare un vettore di una distanza specificata.
Dove:
Esempio:
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)