如何在python上分离两个latlon数据区域

时间:2014-06-10 18:07:23

标签: python linux cluster-analysis

我目前正在处理带风数据的BUFR文件。当我在python上读取这个文件时,我得到4个大向量,纬度向量,经度向量,wind_direction向量和wind_speed向量。

两个风矢量都是屏蔽的python数组,因为存在无效数据。发生这种情况是因为数据来自非对地静止卫星。实际上,我已成功从此BUFR文件生成以下图像,以显示数据所采用的一般形状。

wind data

在此图像中,我绘制了一个颜色区域来表示风速,而箭头显然代表了风向。

请注意两条实际数据。不幸的是,我正在绘制数据的方式,在实际数据带之间生成第三个带(色域是平滑的)。这是函数pcolormesh的人工制品。如果我可以叠加两个'pcolormesh图,每个图代表一个波段,这个问题就会消失。

不幸的是,我不知道如何分离数据"地区"。我已经考虑了聚类技术,但不知道如何使用ANOTHER数组(风数据)作为聚类规则来聚集latlon数据。

这是我目前的代码:

#!/usr/bin/python
import bufr
import numpy as np
import sys
import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot as plt
from matplotlib import mlab

WIND_DIR_INDEX = 97
WIND_SPEED_INDEX = 96

bfrfile = sys.argv[1]
print bfrfile
bfr = bufr.BUFRFile(bfrfile)

lon = []
lat = []
wind_d = []
wind_s = []

for record in bfr:
    for entry in record:
        if entry.index == WIND_DIR_INDEX:
            wind_d.append(entry.data)
        if entry.index == WIND_SPEED_INDEX:
            wind_s.append(entry.data)
        if entry.name.find("LONGITUDE") == 0:
            lon.append(entry.data)
        if entry.name.find("LATITUDE") == 0:
            lat.append(entry.data)

lons = np.concatenate(lon)
lats = np.concatenate(lat)
winds_d = np.concatenate(wind_d)
winds_s = np.concatenate(wind_s)
winds_d = np.ma.masked_greater(winds_d,1.0e+6)
winds_s = np.ma.masked_greater(winds_s,1.0e+6)
windu = np.cos((winds_d-180)*(np.pi/180))
windv = np.sin((winds_d-180)*(np.pi/180))

# Data interpolation for pcolormesh (needs gridded data)
xi = np.linspace(lons.min(),lons.max(),lons.size/10)
yi = np.linspace(lats.min(),lats.max(),lats.size/10)
Z = mlab.griddata(lons,lats,winds_s,xi,yi)
X,Y = np.meshgrid(xi,yi)

mydpi = 96
fig = plt.figure(frameon=True)
fig.set_size_inches(1600/mydpi,1200/mydpi)
ax = plt.Axes(fig,[0,0,1,1])
#ax.set_axis_off()
fig.add_axes(ax)
plt.hold(True);


plt.quiver(lons[::5],lats[::5],windu[::5],windv[::5],linewidths=0)
for method in (ax.set_xticks,ax.set_xticklabels,ax.set_yticks,ax.set_yticklabels):
        method([])
        fig.savefig('/home/cendas/bin/python/bufr_ascat.png',bbox_inches=0,dpi=5*mydpi)

mydpi = 96
fig = plt.figure(frameon=True)
fig.set_size_inches(1600/mydpi,1200/mydpi)
ax = plt.Axes(fig,[0,0,1,1])
#ax.set_axis_off()
fig.add_axes(ax)
plt.hold(True);
try:
    plt.pcolormesh(X,Y,Z,alpha=None)
    plt.clim(0,10)
except ValueError:
    pass
    print "Warning: Empty data array."

for method in (ax.set_xticks,ax.set_xticklabels,ax.set_yticks,ax.set_yticklabels):
    method([])
    fig.savefig('/home/cendas/bin/python/bufr_ascat_color.png',bbox_inches=0,dpi=5*mydpi)

然后我通常使用以下终端命令来跟踪此python代码以组合图像:

convert bufr_ascat.png  -transparent white bufr_ascat.png
convert bufr_ascat_color.png  -transparent white bufr_ascat_color.png
composite bufr_ascat.png bufr_ascat_color.png bufrascat.png

1 个答案:

答案 0 :(得分:0)

不要滥用群集。

您需要的是简单的选择/过滤;不是结构发现过程。

选择蒙版数据的平均值。剩下的所有非掩码数据是左边的部分,右边的所有非掩盖数据都是另一个?

群集是执行此任务的错误工具。