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

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

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

评论

我认为这超出Shapely的范围,您可能需要研究Fiona。 fiona.transform看起来可以满足您的需求。

#1 楼

尽管shape本身并不了解坐标系,但
shapely.ops.transform()可以和pyproj一起做到这一点。如果pyproj.Proj可以理解您的两个坐标系,则可以将其制成一个可以进行形变的函数。 class =“ lang-py prettyprint-override”> import pyproj from shapely.geometry import Point from shapely.ops import transform wgs84_pt = Point(-72.2495, 43.886) wgs84 = pyproj.CRS('EPSG:4326') utm = pyproj.CRS('EPSG:32618') project = 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'), # source coordinate system
    pyproj.Proj(init='epsg:26913')) # destination coordinate system

g2 = transform(project, g1)  # apply projection


评论


如果您不想使用itertools模块,则可以执行project = lambda x,y:pyproj.transform(pyproj.Proj(init ='epsg:4326'),pyproj.Proj(init ='epsg:26913'), x,y),然后g2 = transform(project,g1)。

– Elmex80s
18年1月24日在13:15

这个建议的答案是针对pyproj1的,而现在使用Transformer对pyproj2进行了首选的转换。看到这里:pyproj4.github.io/pyproj/stable/gotchas.html

–渴求知识
19年7月9日在14:59

我发现下面的Nick O'Dell的答案(gis.stackexchange.com/a/328642)更快。

–凯尔·巴伦(Kyle Barron)
19/12/27在4:21

#2 楼

如果您使用的是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不需要为每个点都重新创建投影。

评论


比接受的答案快得多!

–凯尔·巴伦(Kyle Barron)
19/12/27在4:20

真的快多了!太棒了!

–简
20年1月9日,13:12

#3 楼

尽管不是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'})


评论


Geopandas使用Shapely(例如,查看geodataframe.py)

–基因
2014年12月23日下午16:34