Cerchi una libreria Python (diversa da ArcPy) per la geoprocessing come il buffer? [chiuso]


16

Escludendo ArcPy, esiste qualche libreria Python che può eseguire il geoprocessing, come buffer / intersect, con shapefile?

Risposte:


17

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.


14

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:

inserisci qui la descrizione dell'immagine

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:

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine


9

Shapely dà accesso a Python a GEOS che può fare buffer / intersechi / ecc. GEOS è la libreria utilizzata dalla maggior parte dei programmi OSGeo per eseguire tali operazioni.


9

Ecco la mia lista di software di geoprocessing Python.

  • Formoso, pitone
  • OGR, pitone
  • QGIS, pyqgis, python
  • SagaGIS, pitone
  • Erba, pitone
  • spatialite, pyspatialite, pitone
  • PostreSQL / PostGIS, Psycopg, Python
  • Progetto R, rpy2, python
  • Whitebox GAT, python -GeoScript, jython

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:

  • inputvector è una stringa contenente il nome del vettore di input
  • outputvector è una stringa contenente il nome del vettore di output
  • bufferDist è un float che specifica la distanza del buffer, in unità della mappa
  • force è un bool, che specifica se forzare la rimozione del vettore di output se esiste

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.