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.