Transformation d'objets polygonaux et multi-polygonaux

26

Existe-t-il un moyen facile de transformer des objets Shapely (à savoir, des polygones et des multi-polygones) d'une projection à une autre sans avoir à creuser et extraire les coordonnées à la main?

En fait, peu m'importe si ce sont des objets Shapely à ce stade, je veux juste passer des fonctionnalités et une projection, et récupérer un ensemble de fonctionnalités reprojeté.

Ce type de fonctionnalité existe-t-il ou doit-il être codé à la main?

Chris Fonnesbeck
la source
2
Je crois que cela sort du cadre de Shapely, vous voudrez peut-être examiner Fiona. fiona.transformcherche à avoir ce dont vous avez besoin.
Jason Scheirer

Réponses:

50

Bien que galbe ne comprenne pas nativement les systèmes de coordonnées, shapely.ops.transform()peut le faire avec pyproj. Si vous pyproj.Projpouvez comprendre vos deux systèmes de coordonnées, alors il peut être transformé en une fonction qui peut se transformer avec galbe.

Des documents galbés :

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
la source
4
Si vous ne souhaitez pas utiliser le itertoolsmodule, vous pouvez le faire project = lambda x, y: pyproj.transform(pyproj.Proj(init='epsg:4326'), pyproj.Proj(init='epsg:26913'), x, y)et ensuite g2 = transform(project, g1).
Elmex80s
1
Cette réponse suggérée est pour pyproj1 alors qu'il existe maintenant une transformation préférée pour pyproj2 utilisant Transformer. Voir ici: pyproj4.github.io/pyproj/stable/gotchas.html
Thirst for Knowledge
11

Bien qu'il ne s'agisse pas d'une solution Shapely, l'utilisation de GeoPandas permet une projection relativement simple. Par exemple, si nous voulons convertir un fichier de formes en 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'})
Chris Fonnesbeck
la source
6
Geopandas utilise Shapely (regardez geodataframe.py par exemple)
gène
0

Si vous utilisez pyproj2, il est beaucoup plus facile d'utiliser un Transformer. Voici un exemple:

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

C'est aussi beaucoup plus rapide, car pyproj n'a pas besoin de recréer la projection pour chaque point.

Nick ODell
la source