python - 设置范围时忽略投影限制
问题描述
有没有办法将图形的范围设置为超出投影限制?
例如,当使用“Rijksdriehoek”投影 (EPSG 28992) 时,Cartopy (proj4?) 的限制是错误的,太窄了。
该预测旨在覆盖整个荷兰,但强加的限制甚至导致该国部分地区被切断。而我宁愿将范围设置得比官方边界稍微宽一些,以提供一些额外的背景信息。
不幸的是,该set_extent
方法给出了错误:
ValueError: Failed to determine the required bounds in projection
coordinates. Check that the values provided are within the valid range
(x_limits=[646.3608848793374, 284347.25011780026],
y_limits=[308289.55751689477, 637111.0245778429]).
/方法似乎没有做任何事情,这适用于普通的 matplotlib 轴set_xlim
。set_ylim
示例代码:
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
projection = ccrs.epsg(28992)
fig, ax = plt.subplots(figsize=(5,10), subplot_kw=dict(projection=projection))
ax.coastlines(resolution='10m')
ax.add_feature(cfeature.NaturalEarthFeature('cultural', 'admin_0_boundary_lines_land', '10m', facecolor='none', edgecolor='k'))
图形的范围自动设置为投影的范围:
print(projection.bounds)
print(ax.get_extent())
(646.3608848793374, 284347.25011780026, 308289.55751689477, 637111.0245778429)
(646.3608848793374, 284347.25011780026, 308289.55751689477, 637111.0245778429)
根据有关投影的文档,实际限制应为:(-700 300000 289000 629000)
. 但即使是那些看起来有点严格的可视化目的。
例如,参见“有效范围部分”:
解决方案
我发现 Cartopy 中的投影限制取自 Proj4 中的投影限制,因此没有立即修复。但是,您可以通过询问参数来定义等效投影......首先,
>>> import pyepsg
>>> proj4_epsg = pyepsg.get(28992)
>>> print(proj4_epsg.as_proj4())
'+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +units=m +no_defs'
>>>
然后,例如..
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeat
proj_equivalent = ccrs.Stereographic(central_longitude=5.3876388888, central_latitude=52.15616055555,
false_easting=155000, false_northing=463000, scale_factor=0.9999079)
ax = plt.axes(projection=proj_equivalent)
x0, x1 = -4.7e4, +3.7e5
y0, y1 = 2.6e5, 6.82e5
ax.set_extent((x0, x1, y0, y1), crs=proj_equivalent)
ax.coastlines('50m', color='blue'); ax.gridlines()
ax.add_feature(cfeat.BORDERS, edgecolor='red', linestyle='--')
plt.show()
显然,这里的内置县界非常粗略。另外,我还没有设置正确的椭圆,这需要更多的研究。但它展示了如何突破提供的投影边界的限制。
我不知道这里是否有机会反击 Proj4 ?
推荐阅读
- r - 我应该如何在 ggplot2 中使用我的数据创建线图,还是需要在 R 中重构我的数据?
- javascript - 使用 API 的自动完成功能在 Django 中不起作用
- aws-lambda - AWS SAM - 附加策略附加到 Lambda 的 SQS 事件执行角色
- android - 如何捕获 java.lang.IllegalArgumentException 'eglChooseConfig failed'
- rabbitmq - RabbitMQ 崩溃说端口被占用
- spring - org.springframework.beans.factory.BeanDefinitionStoreException:无法处理配置类的导入候选
- sql - 重复行累积
- python - 条件格式函数内的舍入
- typescript - 使用 useQuery 只显示一个条目
- ios - 无法转换“字符串”类型的值?到预期的参数类型“类?”