0

如果我运行以下cartopy代码:

import cartopy.crs as ccrs
globe = ccrs.LambertCylindrical()
print(globe.proj4_params)
globe.proj4_params['a'] = 5
print(globe.proj4_params)

我得到:

{'proj': 'cea', 'lon_0': 0.0, 'a': 57.29577951308232, 'ellps': 'WGS84'}
{'proj': 'cea', 'lon_0': 0.0, 'a': 57.29577951308232, 'ellps': 'WGS84'}

暗示该proj4_params属性是不可变的。

但这只是一个沼泽标准dict

print(type(globe.proj4_params))

<class 'dict'>

其中,由于它是在 C 中实现的,因此不能被覆盖以具有这种行为(至少不安全)。

好的,但是这个类的代码很简单,所以我的理解有问题。有人可以向我解释为什么我会出现这种行为吗?

编辑

以下:

projection.proj4_params = dict(projection.proj4_params)

结果是:

*** AttributeError: attribute 'proj4_params' of 'cartopy._crs.CRS' objects is not writable
4

2 回答 2

1

You could ensure your params are a dictionary by converting it to one first.

params = dict(globe.proj4_params)

Then if you print

print type(params)

<type 'dict'>

Notice the <type 'dict'> instead of the <class 'dict'> in your question. The dict you're using may be a custom class that's immutable but uses the same dict name.

于 2016-11-26T19:50:34.237 回答
1

proj4_params对象最终在Projection的超类中定义CRS,该超类由 cartopy 中的私有 cython 模块_crs.pyx提供。当定义 cartopy CRS 的 proj4_params 时,它只是定义为类中的变量而不是类变量(即,它没有定义为self.proj4_params)。这是您无法修改 proj4 参数的值的部分原因。

对于它的价值,我相信这是 cartopy CRS 的正确行为方式。每个 CRS的proj4_params元素是对 cartopy 在 Python 中提供的基础投影的规范定义的直接引用。这些规范定义由 proj.4 组织维护(例如,Lambert Cylindrical is here),因此修改proj4_params将意味着您的投影不再是 Lambert Cylindrical 投影

如果你特别需要一个几乎LambertCylindrical是兰伯特圆柱体的 cartopy CRS,你总是可以通过在 cartopy 自己的类中复制代码来创建自己的 crs 。只要您在自己的类中维护继承,您就应该能够像使用 cartopy 的内置 CRS 之一一样使用它。请注意,如果您确实proj4_params为自己的类修改了它,它可能不起作用,因为您指定的参数与 proj.4 本身中的任何内容都不匹配。在这种情况下,您可以考虑修改 CRS 的地球属性以进行所需的投影更改。

于 2016-11-28T17:01:20.730 回答