Transformando objetos de polígono bem torneado e multi-polígono

26

Existe uma maneira fácil de transformar objetos Shapely (polígonos e poligonais) de uma projeção para outra sem precisar cavar e extrair coordenadas manualmente?

Na verdade, eu nem me importo se eles são objetos Shapely neste momento, só quero passar recursos e uma projeção e recuperar um conjunto reprojetado de recursos.

Esse tipo de funcionalidade existe ou deve ser codificado manualmente?

Chris Fonnesbeck
fonte
2
Acredito que isso esteja fora do escopo de Shapely, talvez você queira investigar Fiona. fiona.transformparece ter o que você precisa.
Jason Scheirer

Respostas:

50

Embora bem tornado não entenda nativamente os sistemas de coordenadas, ele shapely.ops.transform()pode fazer isso junto pyproj. Se você pyproj.Projconsegue entender seus dois sistemas de coordenadas, pode ser transformado em uma função que pode ser transformada com facilidade.

Dos documentos bem torneados :

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
fonte
4
Se você não quiser usar o itertoolsmódulo, poderá fazê-lo project = lambda x, y: pyproj.transform(pyproj.Proj(init='epsg:4326'), pyproj.Proj(init='epsg:26913'), x, y)e depois g2 = transform(project, g1).
precisa saber é o seguinte
11
Esta resposta sugerida é para pyproj1, enquanto agora há uma transformação preferida para o uso de pyproj2 Transformer. Veja aqui: pyproj4.github.io/pyproj/stable/gotchas.html
Thirst for Knowledge
11

Embora não seja uma solução bem torneada, o uso do GeoPandas permite uma projeção relativamente direta. Por exemplo, se queremos converter um shapefile em 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
fonte
6
Geopandas usa Shapely (veja geodataframe.py por exemplo)
gene
0

Se você estiver usando pyproj2, é muito mais fácil usar um Transformer. Aqui está um exemplo:

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

Isso também é muito mais rápido, porque o pyproj não precisa recriar a projeção para cada ponto.

Nick ODell
fonte