变换形状多边形和MultiPolygon对象


26

是否有一种简单的方法可以将Shapely对象(即Polygons和MultiPolygons)从一个投影转换为另一个投影,而无需手动挖掘和提取坐标?

实际上,我现在甚至都不在乎它们是否是Shapely对象,我只想传递要素和投影,并获得重新投影的要素集。

这种功能是否存在,或者必须手动编码?


2
我认为这超出Shapely的范围,您可能需要研究Fiona。fiona.transform看起来有您需要的东西。
杰森·谢勒

Answers:


50

尽管shapely本身并不了解坐标系,但 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)
基因

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不需要为每个点都重新创建投影。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.