Answers:
尽管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
itertools
模块project = lambda x, y: pyproj.transform(pyproj.Proj(init='epsg:4326'), pyproj.Proj(init='epsg:26913'), x, y)
,则可以执行g2 = transform(project, g1)
。
Transformer
。参见此处:pyproj4.github.io/pyproj/stable/gotchas.html
虽然不是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'})
如果您使用的是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不需要为每个点都重新创建投影。
fiona.transform
看起来有您需要的东西。