Shapely Polygon 및 MultiPolygon 객체 변형


26

손으로 좌표를 발굴하고 추출하지 않고도 한 투영에서 다른 투영으로 Shapely 객체 (즉, 다각형 및 다중 다각형)를 변환하는 쉬운 방법이 있습니까?

사실, 나는이 시점에서 그들이 Shapely 객체인지 신경 쓰지 않고 단지 기능과 투영을 전달하고 다시 투영 된 기능 세트를 얻고 싶습니다.

이런 종류의 기능이 존재합니까, 아니면 직접 코딩해야합니까?


2
나는 그것이 Shapely의 범위를 벗어났다고 생각합니다. Fiona를 살펴볼 수도 있습니다. fiona.transform당신이 필요로하는 것으로 보인다.
Jason Scheirer

답변:


50

shapey는 기본적으로 좌표계를 이해하지 않지만와 shapely.ops.transform()함께 할 수 있습니다 pyproj. 경우 pyproj.Proj이해할 수있는 당신의 좌표계의 모두, 다음은 매끈한로 변환 할 수있는 기능으로 할 수있다.

매끈한 문서에서 :

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
당신이 사용하지 않을 경우 itertools모듈을 당신이 할 수있는 project = lambda x, y: pyproj.transform(pyproj.Proj(init='epsg:4326'), pyproj.Proj(init='epsg:26913'), x, y)다음과 g2 = transform(project, g1).
Elmex80s

1
이 제안 된 답변은 pyproj1에 대한 것이며 pyproj2에 대한 선호 변환은을 사용 Transformer합니다. 여기를 참조하십시오 : pyproj4.github.io/pyproj/stable/gotchas.html
지식 갈증

11

Shapely 솔루션은 아니지만 GeoPandas를 사용하면 비교적 간단한 투영이 가능합니다. 예를 들어, shapefile을 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는 Shapely를 사용합니다 (예를 들어 geodataframe.py 참조)
gene

0

pyproj2를 사용하는 경우 Transformer를 사용하는 것이 훨씬 쉽습니다. 예를 들면 다음과 같습니다.

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

pyproj가 모든 점에 대한 투영을 다시 만들 필요가 없기 때문에 이것은 훨씬 빠릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.