爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5970|回复: 6

试解等值线中心标注

[复制链接]

新浪微博达人勋

发表于 2012-6-27 18:14:08 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 zfvv 于 2012-6-27 18:19 编辑

前段时间发帖求助如何自动标注等值线中心值,后来思考了一下,查阅了相关啊文献,采用如下思路,可以初步解决标注问题,在此抛砖引玉,希望更好的解决这个问题。
存在问题:没能标注“高”“低'字符;
中心没能考虑风压定律,只是接近中心
代码如下:

  MeteoInfoC.PointD td = new MeteoInfoC.PointD();
            string fieldName = LName.Split(new char[] { '_' })[0];
            
            DataColumn aField = new DataColumn
            {
                ColumnName = fieldName,
                DataType = typeof(double)
            };
            layer.EditAddField(aField);
            for (int i = 0; i < GridData.YNum; i++)
            {
                for (int j = 0; j < GridData.XNum; j++)
                {
                    double T0 = GridData.Data[i, j];
                    List<int> Xar = new List<int>();
                    List<int> Yar = new List<int>();
                    List<double> Vary = new List<double>();
                    int fw = 6;
                    for (int idx = i-fw; idx <= i+fw; idx++)
                    {
                        for (int idy = j-fw; idy <=j+fw; idy++)
                        {
                            GetZhi(idx, idy, GridData, GridData.YNum - 1, GridData.XNum - 1, ref Xar, ref Yar, ref Vary);
                           
                        }
                        
                    }
                    
                  
                    //-----------------------------------------------------
                    if (T0<Vary.Min()|T0>Vary.Max())
                    {
                        td.X = GridData.X[j];
                        td.Y = GridData.Y;
                        PointShape aShape = new PointShape
                        {
                            Point = td,
                            Value = GridData.Data[i, j]
                        };
                        int shapeNum = layer.ShapeNum;
                        if (layer.EditInsertShape(aShape, shapeNum))
                        {
                            layer.EditCellValue(fieldName, shapeNum, GridData.Data[i, j]);
                        }
                        
                    }
                    else if (T0==Vary.Min())
                    {
                        int idx=Vary.IndexOf(Vary.Min());
                        double x1 = GridData.X[Xar[idx]];
                        double y1 = GridData.Y[Yar[idx]];
                        td.X = (GridData.X[j] + x1) / 2;
                        td.Y = (GridData.Y + y1) / 2;
                        PointShape aShape = new PointShape
                        {
                            Point = td,
                            Value = GridData.Data[i, j]
                        };
                        int shapeNum = layer.ShapeNum;
                        if (layer.EditInsertShape(aShape, shapeNum))
                        {
                            layer.EditCellValue(fieldName, shapeNum, GridData.Data[i, j]);
                        }
                        
                    }
                    if (T0 == Vary.Max())
                    {
                        int idx = Vary.IndexOf(Vary.Max());
                        double x1 = GridData.X[Xar[idx]];
                        double y1 = GridData.Y[Yar[idx]];
                        td.X = (GridData.X[j] + x1) / 2;
                        td.Y = (GridData.Y + y1) / 2;
                        PointShape aShape = new PointShape
                        {
                            Point = td,
                            Value = GridData.Data[i, j]
                        };
                        int shapeNum = layer.ShapeNum;
                        if (layer.EditInsertShape(aShape, shapeNum))
                        {
                            layer.EditCellValue(fieldName, shapeNum, GridData.Data[i, j]);
                        }
                    }
                    //-----------------------------------------------------
                    
                    
                 }
            }
private static void GetZhi(int i, int j, GridData GridData, int iMax, int Jmax,
            ref List<int> Xar, ref  List<int> Yar, ref List<double> Vary)
        {
            if (i >= 0 && j  >= 0&&i<=iMax&&j<=Jmax)
            {
                Xar.Add(j);
                Yar.Add(i);
                Vary.Add(GridData.Data[i, j]);
            }
        }

未命名.jpg

评分

参与人数 1金钱 +15 贡献 +5 收起 理由
mofangbao + 15 + 5

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-6-27 20:23:04 | 显示全部楼层
很有探索性,感谢楼主分享代码,我正在做的一个东西可能也会涉及到这个,到这块的时候会参考你的代码一起交流的!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-6-27 21:09:24 | 显示全部楼层
很好的工作,不过楼主最好讲讲算法和思路,代码看起来比较费劲。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-6-27 21:58:32 | 显示全部楼层
循环搜索每个格点周边8,24等个格点的值,如果该值为极值,则为中心,如果和周边最值相等,则取几何中心。在实际操作中,需要搜索更大范围,以减少小中心。主要在getzhi函数
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-12 03:35:19 | 显示全部楼层
本帖最后由 Mc.Fish 于 2012-12-12 11:53 编辑

good。很好。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-3-20 15:22:54 | 显示全部楼层
讲讲算法和思路
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-10-28 12:16:46 | 显示全部楼层
楼主你好,关于等值线中心的标注,有没有什么新的算法参考
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表