如何在不重新采样的情况下在自定义地图上绘制海岸线

时间:2011-01-08 10:37:25

标签: python matplotlib python-imaging-library

我想显示卫星图像(最好使用python,但欢迎使用其他解决方案)。它包含一个浮点参数P,其维数为NxM,每个像素由纬度和经度(每个大小为NxM)进行地理定位。所以我想:

(1)创建具有相关色标的参数P的图像。图像不应重新采样,因此它应具有尺寸NxM

(2)在此图像上显示海岸线

目前,我可以(1)使用PIL。我还可以使用底图库来显示图像和海岸线,但我不知道如何在没有重投影的情况下通过保留大小为NxM的图像原生投影来实现它。

编辑:参数P不包含有关海岸线的任何信息。只应使用像素的位置(lat,lon)来覆盖海岸线。例如,可以从gshhs获得海岸线的坐标。 gshhs实际上在底图库中使用。

2 个答案:

答案 0 :(得分:0)

如果您要做的只是增强陆地和水之间的界限,那么使用高通滤波器可能会更好。

例如,从Lena开始: alt text

并应用高通滤波器: alt text

然后将高通叠加在原始顶部: alt text

(可以找到更多细节和示例here)。

您可以在scipy here中找到过滤器。

答案 1 :(得分:0)

对于社区中仍在寻找这个问题答案的人来说,我目前正在实施的方法(对于类似的目的 - 我试图测试卫星数据的地理位置)需要一个landmask。

陆地上有各种各样的土地面具数据集,每个都有不同的规则和特征。我正在使用python中的netCDF4数据,我的landmask是一个网格化的.nc数据集,其中海洋元素的值为1,而陆地元素的值为0。

迭代我的卫星数据,我将每个纬度和经度值乘以landmask中每度数的元素数。就我而言,纬度/经度每度有120个元素,所以

len(lons)/360
len(lats)/180

更通用的写作方式包括用120代替

my_mask = np.zeros(data.shape, dtype=int)

分别。如果使用numpy数组(python netCDF4模块就是这种情况),这两个操作的例子几乎可以瞬间完成。

现在我创建了一个自己的掩码:它必须与数据阵列具有相同的尺寸(对于那些不熟悉卫星的人来说,数据,拉特和长子阵列都具有相同的尺寸):

landmask[lon_inds[i,j],lat_inds[i,j]]

现在我们需要做的就是替换有海岸线的面具中的值。这是通过迭代lat_inds和lon_inds数组来完成的,在

的landmask中查找值
mask[i,j]

并更改

的值
landmask[lon_inds[i,j]-1,lat_inds[i,j]]
landmask[lon_inds[i,j]+1,lat_inds[i,j]]
landmask[lon_inds[i,j],lat_inds[i,j]-1]
landmask[lon_inds[i,j],lat_inds[i,j]+1]
如果任何邻居

,则

为1

    >>> a=[1,2,3,4,5,6]
    >>> iter(a)
   <listiterator object at 0x7f96f3273950>
   >>> next(a)
   Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: list object is not an iterator
   >>> ia=iter(a)
   >>> next(a)
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     TypeError: list object is not an iterator
  >>> next(ia)
       1

不等于0(当然,通过添加对角线相邻单元格可以生成更平滑的海岸线,但这不是必需的,因为希望您应该使用比您的卫星数据更清晰的空间分辨率的Landmask数据集)