Trasformare oggetti Poligono e Poligono Shapely


26

Esiste un modo semplice per trasformare oggetti Shapely (ovvero poligoni e multipoloni) da una proiezione all'altra senza dover scavare ed estrarre le coordinate a mano?

In effetti, non mi interessa nemmeno se sono oggetti Formosi a questo punto, voglio solo passare funzioni e una proiezione e ottenere un set riproiettato di funzionalità.

Esiste questo tipo di funzionalità o deve essere codificato a mano?


2
Credo che sia fuori dallo scopo di Shapely, potresti voler esaminare Fiona. fiona.transformsembra avere ciò di cui hai bisogno.
Jason Scheirer,

Risposte:


50

Mentre shapely non comprende nativamente i sistemi di coordinate, shapely.ops.transform()può farlo insieme a pyproj. Se pyproj.Projriesci a capire entrambi i tuoi sistemi di coordinate, allora può essere trasformato in una funzione con cui si può trasformare ben fatto.

Dai documenti formosi :

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

4
Se non si desidera utilizzare il itertoolsmodulo, è possibile farlo project = lambda x, y: pyproj.transform(pyproj.Proj(init='epsg:4326'), pyproj.Proj(init='epsg:26913'), x, y)e quindi g2 = transform(project, g1).
Elmex80s

1
Questa risposta suggerita è per pyproj1 mentre ora esiste una trasformazione preferita per l'utilizzo di pyproj2 Transformer. Vedi qui: pyproj4.github.io/pyproj/stable/gotchas.html
Thirst for Knowledge

11

Sebbene non sia una soluzione Shapely, l'utilizzo di GeoPandas consente una proiezione relativamente semplice. Ad esempio, se vogliamo convertire un file di forma in ESPG 4326:

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

6
Geopandas usa Shapely (guarda geodataframe.py per esempio)
gene

0

Se stai usando pyproj2, è molto più facile usare un Transformer. Ecco un esempio:

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

Anche questo è molto più veloce, poiché pyproj non ha bisogno di ricreare la proiezione per ogni punto.

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.