Suchen Sie nach einer Python-Bibliothek (außer ArcPy) für die Geoverarbeitung, z. B. Buffer? [geschlossen]

16

Gibt es mit Ausnahme von ArcPy eine Python-Bibliothek, die Geoverarbeitung mit Shapefiles durchführen kann, z. B. Buffer / Intersect?

Mingshu
quelle

Antworten:

17

Das Python GDAL / OGR-Kochbuch enthält einen Beispielcode zum Puffern einer Geometrie .

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

und zum Berechnen des Schnittpunkts zwischen zwei Geometrien

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

Die Geometrien können in Shapefiles und einer Vielzahl anderer Formate gelesen und geschrieben werden .

PolyGeo
quelle
14

Zur Vereinfachung erlaubt Shapely: manual die gesamte Geometrieverarbeitung von PostGIS in Python.

Die erste Prämisse von Shapely ist, dass Python-Programmierer in der Lage sein sollten, Geometrieoperationen vom Typ PostGIS außerhalb eines RDBMS auszuführen ...

Das erste Beispiel für 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), ....}

Das Beispiel des Polygons von 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

Die zweite Voraussetzung ist, dass die Persistenz, Serialisierung und Kartenprojektion von Merkmalen signifikante, aber orthogonale Probleme sind. Möglicherweise benötigen Sie keine hundert GIS-Format-Leser und -Schreiber oder die Vielzahl von State-Plane-Projektionen, und Shapely belastet Sie nicht damit.

Sie können es also mit anderen Python-Modulen kombinieren, um Shapefiles zu lesen oder zu schreiben und Projektionen wie osgeo.ogr, Fiona oder PyShp zu bearbeiten .
Wenn Sie in Gis StackExchange suchen, finden Sie viele Beispiele, aber ich gebe Ihnen ein anderes, um die Kombination von shapely und Fiona und die Verwendung der shapely-Funktionen intersection () und buffer () zu veranschaulichen (Dies hätte mit PyShp geschehen können).

Gegeben zwei Polylinien-Shapefiles:

Bildbeschreibung hier eingeben

Berechnen Sie die Schnittmenge (Funktion intersection () von shapely)

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)

Speichern Sie das Ergebnis als neues 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}})

Ergebnis:

Bildbeschreibung hier eingeben

Einzelne Punkte puffern (Funktionspuffer () von 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}})

Ergebnis

Bildbeschreibung hier eingeben

Puffern Sie die MultiPoint-Geometrie

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

Bildbeschreibung hier eingeben

Gen
quelle
9

Formschön ermöglicht Python den Zugriff auf GEOS, das Puffer / Überschneidungen / etc. Ausführen kann. GEOS ist die Bibliothek, mit der die meisten OSGeo-Programme diese Vorgänge ausführen.

HeyOverThere
quelle
9

Hier ist meine Liste der Python-Geoverarbeitungssoftware.

  • Formschön, Python
  • OGR, Python
  • QGIS, Pyqgis, Python
  • SagaGIS, Python
  • Gras, Python
  • Spatialit, Pyspatialit, Python
  • PostreSQL / PostGIS, Psycopg, Python
  • R Project, RPY2, Python
  • Whitebox GAT, Python-GeoScript, Jython
klewis
quelle
1

Meine Geoverarbeitungsbibliothek ist die Fernerkundungs- und GIS-Bibliothek (RSGISLib). Es ist einfach zu installieren und zu benutzen und die Dokumentation ist wirklich gut. Es bietet Funktionen für die Vektor- und Rasterverarbeitung - ich muss mich nur sehr selten einer GUI nähern. Es kann hier gefunden werden: http://rsgislib.org .

Ein Beispiel in diesem Fall ist:

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

Ein Befehl zum Puffern eines Vektors um einen bestimmten Abstand.

Wo:

  • inputvector ist eine Zeichenfolge, die den Namen des Eingabevektors enthält
  • outputvector ist eine Zeichenfolge, die den Namen des Ausgabevektors enthält
  • bufferDist ist ein Gleitkommawert, der die Entfernung des Puffers in Karteneinheiten angibt
  • force ist ein Bool, der angibt, ob das Entfernen des Ausgabevektors erzwungen werden soll, falls vorhanden

Beispiel:

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
quelle