¿Busca la biblioteca de Python (que no sea ArcPy) para el geoprocesamiento como el búfer? [cerrado]

16

Excluyendo ArcPy, ¿hay alguna biblioteca de Python que pueda hacer geoprocesamiento, como buffer / intersect, con shapefiles?

Mingshu
fuente

Respuestas:

17

El libro de cocina Python GDAL / OGR tiene un código de muestra para almacenar una geometría .

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 para calcular 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 archivos de forma y en una variedad de otros formatos.

PolyGeo
fuente
14

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 del mapa de características son problemas significativos, pero ortogonales. Es posible que no necesite cientos de lectores y escritores en formato GIS o la multitud de proyecciones de State Plane, y Shapely no lo agobia con ellos.

Entonces lo combina con otros módulos de Python para leer o escribir archivos de forma y manipular proyecciones como osgeo.ogr, Fiona o PyShp .
Al buscar en Gis StackExchange, puede encontrar muchos ejemplos, pero le doy otro para ilustrar la combinación de shapely y Fiona y el uso de las funciones shapely intersection () y buffer () (Esto podría haberse hecho con PyShp).

Dados dos archivos de forma de polilínea:

ingrese la descripción de la imagen aquí

Calcule la intersección (función intersección () de bien proporcionado)

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)

Guarde el resultado como un nuevo archivo de forma

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

Resultado:

ingrese la descripción de la imagen aquí

Almacenar puntos individuales (función buffer () de bien proporcionado)

 # 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

ingrese la descripción de la imagen aquí

Almacenar la geometría de 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}})

ingrese la descripción de la imagen aquí

gene
fuente
9

Shapely le da acceso a Python a GEOS que puede hacer búferes / intersecciones / etc. GEOS es la biblioteca que la mayoría de los programas OSGeo utilizan para realizar esas operaciones.

HeyOverThere
fuente
9

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

  • Bien proporcionado, pitón
  • OGR, pitón
  • QGIS, pyqgis, python
  • SagaGIS, python
  • Hierba, pitón
  • spaceialite, pyspatialite, python
  • PostreSQL / PostGIS, Psycopg, python
  • Proyecto R, rpy2, python
  • Whitebox GAT, python -GeoScript, jython
klewis
fuente
1

Mi biblioteca 'ir a' de geoprocesamiento es la 'Biblioteca de sensores remotos y SIG' (RSGISLib). Es fácil de instalar y usar y la documentación es realmente buena. Tiene 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í: http://rsgislib.org .

Un ejemplo en este caso es:

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

Un comando para almacenar un vector en una memoria intermedia a una distancia especificada.

Dónde:

  • 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 flotante que especifica la distancia del buffer, en unidades de mapa
  • force es un bool, que especifica si se debe 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)
Nathan Thomas
fuente