Transformieren von Shapely Polygon- und MultiPolygon-Objekten

26

Gibt es eine einfache Möglichkeit, Shapely-Objekte (dh Polygone und MultiPolygone) von einer Projektion in eine andere zu transformieren, ohne die Koordinaten von Hand verschieben und extrahieren zu müssen?

Eigentlich ist es mir egal, ob es sich an dieser Stelle um Shapely-Objekte handelt, ich möchte lediglich Features und eine Projektion übergeben und einen neu projizierten Satz von Features zurückerhalten.

Existiert diese Art von Funktionalität oder muss sie von Hand codiert werden?

Chris Fonnesbeck
quelle
2
Ich glaube, das liegt außerhalb des Rahmens von Shapely. Vielleicht möchten Sie sich mit Fiona befassen. fiona.transformscheint zu haben, was du brauchst.
Jason Scheirer

Antworten:

50

Während shapely Koordinatensysteme nicht von Haus aus versteht, shapely.ops.transform()kann es das auch pyproj. Wenn pyproj.ProjSie beide Koordinatensysteme verstehen können, können Sie daraus eine Funktion machen, mit der Sie sich formschön verwandeln können.

Aus den wohlgeformten Dokumenten :

from functools import partial
import pyproj
from shapely.ops import transform

project = partial(
    pyproj.transform,
    pyproj.Proj(init='epsg:4326'), # source coordinate system
    pyproj.Proj(init='epsg:26913')) # destination coordinate system

g2 = transform(project, g1)  # apply projection
Alex Kerney
quelle
4
Wenn Sie das itertoolsModul nicht verwenden möchten, können Sie project = lambda x, y: pyproj.transform(pyproj.Proj(init='epsg:4326'), pyproj.Proj(init='epsg:26913'), x, y)und dann tun g2 = transform(project, g1).
Elmex80s
1
Diese vorgeschlagene Antwort gilt für pyproj1, wohingegen es jetzt eine bevorzugte Transformation für pyproj2 gibt, die verwendet Transformer. Siehe hier: pyproj4.github.io/pyproj/stable/gotchas.html
Wissensdurst
11

Die Verwendung von GeoPandas ist zwar keine formschöne Lösung, ermöglicht jedoch eine relativ einfache Projektion. Wenn wir beispielsweise ein Shapefile in ESPG 4326 konvertieren möchten:

import geopandas as gpd

HabModelEnviro = gpd.GeoDataFrame.from_file('data/HabModelEnviro.shp').replace({-999: None})

HabModelEnviroWGS84 = HabModelEnviro.to_crs({'proj':'longlat', 'ellps':'WGS84', 'datum':'WGS84'})
Chris Fonnesbeck
quelle
6
Geopandas verwendet Shapely (siehe zum Beispiel geodataframe.py)
gene
0

Wenn Sie pyproj2 verwenden, ist es viel einfacher, einen Transformer zu verwenden. Hier ist ein Beispiel:

import pyproj
from shapely.ops import transform

project = pyproj.Transformer.from_proj(
    pyproj.Proj(init='epsg:4326'), # source coordinate system
    pyproj.Proj(init='epsg:26913')) # destination coordinate system

# g1 is a shapley Polygon

g2 = transform(project.transform, g1)  # apply projection

Dies ist auch viel schneller, da pyproj die Projektion nicht für jeden Punkt neu erstellen muss.

Nick ODell
quelle