| 
本帖最后由 MeteoInfo 于 2023-3-26 09:12 编辑
x
登录后查看更多精彩内容~您需要 登录 才可以下载或查看,没有帐号?立即注册 
  
 江志红有一篇文章分析了2007年淮河流域强降水过程的水汽输送特征,利用了气团轨迹聚类分析技术。该文中轨迹起点不同,水平方向15个格点(2.5*2.5度),垂直方向3个高度。用了HYSPLIT自带的聚类分析工具进行聚类。其实不管HYSPLIT还是TrajStat中的聚类分析方法都要求所有参与聚类的轨迹都是同一起点(高度没有关系,目前的聚类算法中都没有考虑高度)。那么文中的聚类分析必然需要首先将不同起点的轨迹平移至同一起点(应该是研究区的中点),文章并没有相关的说明。不过从文章中图8b、10b来看5类平均轨迹应该是同一起点(图也不是很清楚)。
 
 这种平移必定对之后的聚类分析有所影响,但从解决问题的角度来说也是可行的,可以对一个相对较大的区域的气团轨迹特征进行分析。因此写了一个脚本来实现气团轨迹的平移(假定气团轨迹已经转为shape文件,并加载为MeteoInfo的一个图层):
 
 
  #-----------------------------------------------------
# Author: Yaqiang Wang
# Date: 2021-9-14
# Purpose: Move trajectory to a new start point
# Note: Sample
#-----------------------------------------------------
import os
from org.meteoinfo.geo.layer import VectorLayer
from org.meteoinfo.geometry.shape import ShapeTypes, PointZ, PolylineZShape
from org.meteoinfo.geometry.legend import LegendType
# Get trajectory layer
print 'Start...'
trajLayer = miapp.getMapView().getLayer('JiuquanSpr.shp')
#Create result trajectory layer
print 'Create result trajectry layer...'
layer = VectorLayer(trajLayer.getShapeType())
layer.setLayerName('Moved_trajectories')
for field in trajLayer.getFields():
    layer.editAddField(field.getColumnName(), field.getDataType())
#Move trajectories to new start position
print 'Move trajectories...'
newX = 105.0
newY = 40.5
i = 0
for shape in trajLayer.getShapes():
    point = shape.getPoints().get(0)
    xd = newX - point.X
    yd = newY - point.Y
    npoints = []
    for point in shape.getPoints():
        npoint = PointZ()
        npoint.X = point.X + xd
        npoint.Y = point.Y + yd
        npoint.M = point.M
        npoint.Z = point.Z
        npoints.append(npoint)
    polyline = PolylineZShape()
    polyline.setPoints(npoints)
    sn = layer.getShapeNum()
    layer.editInsertShape(polyline, sn)
    for j in range(0, layer.getFieldNumber()):
        layer.editCellValue(j, sn, trajLayer.getCellValue(j, i))
    i += 1
layer.updateLegendScheme(LegendType.SINGLE_SYMBOL, 'TrajID')
#Add the moved layer
print 'Add the layer...'
miapp.getMapDocument().getActiveMapFrame().addLayer(layer)
#Save the moved layer
print 'Save the moved layer...'
outDir = 'D:/Temp/test'
fn = os.path.join(outDir, 'traj_moved.shp')
#layer.saveFile(fn)
print 'Finish !'
 
   
 |