¿Existe una biblioteca de Python (que no sea ArcPy) para geoprocesar como un búfer?

17

Excluyendo ArcPy, ¿hay alguna biblioteca de Python que pueda hacer geoprocesamiento, como búfer / intersección, con shapefiles?

    
pregunta Mingshu 09.01.2014 - 23:52

5 respuestas

16

El Python GDAL / OGR Cookbook tiene algún código de ejemplo para Buffer a 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())

y a Calcule la intersección entre dos Geometrías

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

Las geometrías se pueden leer y escribir en shapefiles y en una variedad de otros formatos.

    
respondido por el PolyGeo 10.01.2014 - 00:03
13

Para simplificar, Shapely: manual permite todo el procesamiento de geometría de PostGIS en Python.

  

La primera premisa de Shapely es que los programadores de Python deberían poder realizar operaciones de geometría de tipo PostGIS fuera de un RDBMS ...

El primer ejemplo de 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), ....}

El ejemplo del polígono de 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 segunda premisa es que la persistencia, la serialización y la proyección de mapas de las características son importantes, pero problemas ortogonales. Es posible que no necesite un centenar de lectores y escritores en formato GIS o la multitud de proyecciones de State Plane, y Shapely no los carga con ellos.

Así que lo combinas con otros módulos de Python para leer o escribir shapefiles y manipular proyecciones como osgeo.ogr, Fiona o PyShp .
Buscando en Gis StackExchange, puedes encontrar muchos ejemplos, pero te doy otro para ilustrar la combinación de shapely y Fiona y el uso de la intersección de funciones shapely () y buffer () (Esto podría haberse hecho con PyShp).

Dados dos archivos de forma polilínea:

Calcularlaintersección(funciónintersección()debienformado)

fromshapely.geometryimportPoint,Polygon,MultiPolygon,MumtiPoint,MultiLineString,shape,mappingimportfiona#readtheshapefilesandtransformtoMultilineStringshapelygeometry(shape())layer1=MultiLineString([shape(line['geometry'])forlineinfiona.open('polyline1.shp')])layer2=MultiLineString([shape(line['geometry'])forlineinfiona.open('polyline2.shp')])points_intersect=layer1.intersection(layer2)

Guardeelresultadocomounnuevoshapefile

#schemaofthenewshapefileschema={'geometry':'MultiPoint','properties':{'test':'int'}}#writethenewshapefile(functionmapping()ofshapely)withfiona.open('intersect.shp','w','ESRIShapefile',schema)ase:e.write({'geometry':mapping(points_intersect),'properties':{'test':1}})

Resultado:

Buffer de puntos individuales (función buffer () de forma)

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

Resultado

BuffertheMultiPointgeometry

schema={'geometry':'MultiPolygon','properties':{'test':'int'}}points.buffer(300)withfiona.open('buffer2.shp','w','ESRIShapefile',schema)ase:e.write({'geometry':mapping(points.buffer(300)),'properties':{'test':1}})

    
respondido por el gene 10.01.2014 - 10:22
11

Aquí está mi lista de software de geoprocesamiento de Python.

Bien formado, pitón
OGR, pitón
QGIS, pyqgis, python
SagaGIS, pitón
Hierba, pitón
spatialite, pyspatialite, python
PostreSQL / PostGIS, Psycopg, python
Proyecto R, rpy2, python
Whitebox GAT, pitón
GeoScript, jython

    
respondido por el klewis 10.01.2014 - 00:52
9

Shapely proporciona a Python acceso a GEOS que puede hacer buffers / intersects / etc. GEOS es la biblioteca que la mayoría de los programas OSGeo utilizan para realizar esas operaciones.

    
respondido por el HeyOverThere 10.01.2014 - 00:02
1

Mi 'ir a' la biblioteca de procesamiento geográfico es la 'Biblioteca de sensores remotos y SIG' (RSGISLib). Es fácil de instalar y usar, y la documentación es realmente buena. Tiene una funcionalidad para el procesamiento de vectores y ráster; rara vez tengo que acercarme a una interfaz gráfica de usuario. Se puede encontrar aquí: enlace .

Un ejemplo en este caso es:

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

Un comando para amortiguar un vector por una distancia especificada.

Donde:

  • inputvector es una cadena que contiene el nombre del vector de entrada
  • outputvector es una cadena que contiene el nombre del vector de salida
  • bufferDist es un flotador que especifica la distancia del búfer, en unidades de mapa
  • force es un bool, especificando si forzar la eliminación del vector de salida si existe

Ejemplo:

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)
    
respondido por el Nathan Thomas 14.10.2016 - 03:02

Lea otras preguntas en las etiquetas