Suite

Transformation d'objets Shapely Polygon et MultiPolygon

Transformation d'objets Shapely Polygon et MultiPolygon


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

En fait, je ne me soucie même pas de savoir s'il s'agit d'objets Shapely à ce stade, je veux juste transmettre des fonctionnalités et une projection, et récupérer un ensemble reprojeté de fonctionnalités.

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


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

Des docs galbés :

Pyproj >= 2.1.0

importer pyproj depuis shapely.geometry importer Point depuis shapely.ops importer transformer wgs84_pt = Point(-72.2495, 43.886) wgs84 = pyproj.CRS('EPSG:4326') utm = pyproj.CRS('EPSG:32618') projet = pyproj .Transformer.from_crs(wgs84, utm, always_xy=True).transform utm_point = transform(project, wgs84_pt)

Pyproj < 2.1

from functools import partial import pyproj from shapely.ops import transform project = partial( pyproj.transform, pyproj.Proj(init='epsg:4326'), # système de coordonnées source pyproj.Proj(init='epsg:26913')) # système de coordonnées de destination g2 = transform(project, g1) # appliquer la projection

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'), # système de coordonnées source pyproj.Proj(init='epsg:26913')) # système de coordonnées de destination # g1 est un polygone shapley g2 = transform(project.transform, g1) # applique la projection

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


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 shapefile en ESPG 4326 :

importer des géopandas en tant que gpd HabModelEnviro = gpd.GeoDataFrame.from_file('data/HabModelEnviro.shp').replace({-999: None}) HabModelEnviroWGS84 = HabModelEnviro.to_crs({'proj':'longlat', 'ellps':' WGS84', 'donnée':'WGS84'})

Voir la vidéo: How to create a Polygon, MultiPolygon and MultiSurface shapefile in QGIS? A brief GIS tutorial