实际上,我现在甚至都不在乎它们是否是Shapely对象,我只想传递要素和投影,并获得重新投影的要素集。
是否存在这种功能,或者必须手动编码?
#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
评论
我认为这超出Shapely的范围,您可能需要研究Fiona。 fiona.transform看起来可以满足您的需求。