Shapely PolygonおよびMultiPolygonオブジェクトの変換


26

Shapelyオブジェクト(つまり、PolygonとMultiPolygon)をある投影から別の投影に変換する簡単な方法はありますか?

実際、この時点でそれらがShapelyオブジェクトであるかどうかは気にしません。フィーチャと投影を渡し、再投影されたフィーチャセットを取得するだけです。

この種の機能は存在しますか、それとも手作業でコーディングする必要がありますか?


2
Shapelyの範囲外であると思うので、Fionaを調べてください。fiona.transform必要なものがあるように見えます。
ジェイソンシャイラー14

回答:


50

shapelyは座標系をネイティブに理解しません shapely.ops.transform()が、とともにそれを行うことができますpyprojpyproj.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を使用すると、比較的簡単に投影できます。たとえば、シェープファイルを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を見てください)
遺伝子

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.