Micaps3.2二次开发实例教程-12

第十二节        实例七-让Micaps直接连接数据库显示数据

    上一节我们已能让Micaps支持新数据类型,但目前大量数据在数据库中保存,是否能让Micaps直接读取数据库中的数据显示呢?这一节我们将做一个Micaps直连数据库显示数据的插件。

Micaps实际上已经预留了数据库、XML数据读取接口,但它并没有实现。其实完全没必要将数据库与文件接口分开,主程序只用让插件绘图,其它的都让插件自己处理,不管数据是来自文件、数据库还是网络。

要实现这个功能,需解决如下问题:

  • 数据库数据启动问题。普通文件我们可以直接打开文件显示,也可以做出成综合图,数据库没有文件,怎么启动呢?第一种方法,按HelloWorld例子的方法,给Micaps主菜单添加一个按钮,单击按钮后,创建数据库图层并显示;第二种方法,建一个特定文件名文件,如sxaws.udl,文件内容可以随意(但最好把它当作数据库配置文件,保存数据库连接串等,如sxaws.udl),然后按上节的例子,打开sxaws.udl的文件时,连接数据库显示数据,这样可以就可以把它加进数据检索菜单或者综合图。本节将使用第二种方法。
  • 连接数据库读取数据问题。当用户打开文件时(如sxaws.udl),在CreateLayerForFile(OpenedFile file)函数中编写处理代码,其中file参数仅仅作为一个标识或配置文件,代码中直接创建数据库图层就可以了。                                     

1、Addin文件

与上节一样,增加一个显示绑定段,类名为:SxAwsDataBindings。
<Path name="/Workspace/DisplayBindings">
    <DisplayBinding id="SxAwsdb"
         type="Layer"
         class="SxAwsDataBindings"/>
</Path>


2、代码

实现SxAwsDataBindings类,代码除了对文件名的判断不同,其它与上节都一样:
 public bool CanCreateForFile(string filename)
 {            
         //仅能打开名为"sxaws.udl"的文件
         string fn = Path.GetFileName(filename).ToLower();
         return fn == "sxaws.udl";
 }


       再实现数据读取,在CreateLayerForFile(OpenedFile file)中编写数据读取代码。与上节唯一不同的是,这里创建的是一个叫做SxAws的图层类。
public ILayer CreateLayerForFile(OpenedFile file)
{
            //取得当前视图,转换为Micaps地图视图
            var mainRenderView = WorkspaceSingleton.Workspace.ActiveViewContent as IMicapsMainView;
            //如果当前视图是地图,则加载图层
            if (mainRenderView != null)
            {
                //创建自动站数据库图层
                SxAws Chart = new SxAws();
                //用它创建Micaps图层绑定对象
                MicapsDataLayerWrapper layer = new MicapsDataLayerWrapper(Chart);
                //给图层的地图对象赋值
                Chart.Map = mainRenderView.Map;
                //加载数据
                layer.Load(file, file.OpenRead());
                file.CloseIfAllViewsClosed();
                layer.LayerName = Chart.Description();
                return layer;
            }
            return null;
}


   SxAws类继承了C_ChartBase类,重写了 ReadFile(string filename)和Draw(GLGraphics g)虚函数,分别实现数据读取和绘图工作。与上节不同的是,读取数据库时,我们不是从sxaws.udl文件中读取数据,而是从sxaws.udl中读取数据库连接串,然后连接数据库读取数据。实际开发中,可根据需要修改读数据库和绘图代码,这里我读的陕西省的数据库的,把代码的直接贴上去是运行不了的。
    
public class SxAws : C_ChartBase
    {
        public override void Draw(GLGraphics g)
        {
            float x, y;
            float ang;
            foreach (DataRow row in _AwsData.Tables[0].Rows)
            {
                string t = row["dewtemp"].ToString();
 
                float lat = float.Parse(row["latitude"].ToString());
                float lon = float.Parse(row["longitude"].ToString());
                Map.MemTY(lon, lat, out x, out y);
                g.ShowNumber(t, x, y, 1, 1, Color.Red);
                float dd = 9999;
                float ff = 9999;
                float.TryParse(row["WindDirect"].ToString(), out dd);
                float.TryParse(row["WindVelocity"].ToString(),out ff);
                if(dd!=9999&& ff !=9999)
                {
                    ang = dd;//= ang - 270;
                    ang = ang + 180;
                    if (ang >= 360)
                    ang = ang - 360.0f;
                    ang = ang * 0.0174532925F;//转化为弧度
                    g.ShowWind(ff/10.0f, x, y, 0.8f, 0.8f, Color.Black, 360f - ang * 180.0f / (float)Math.PI, true);                    
                }
            }
        }          
        private DataSet _AwsData = new DataSet();
        public override string ReadFile(string filename)
        {
            string conString = @"Data Source=172.23.64.146;Persist Security Info=True;User ID=aws;;Initial Catalog=elementinfo";
            SqlConnection connection = new SqlConnection(conString);
            string sql = @"SELECT * FROM dbo.tabTimeData INNER JOIN dbo.tabStation ON dbo.tabTimeData.StationNum = dbo.tabStation.StationNum WHERE (ObservTimes = '2013010101')";
            SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
            _AwsData.Clear();
            adapter.Fill(_AwsData);
            connection.Close();
            return "Success";
        }
     …………………
     …………………
     …………………
 }

可惜的是,直接读取数据库时,Micaps的翻页功能无法使用。Micaps的图层类虽然预留了前一时次、后一时次的抽象方法,但却在翻页代码中却没有调用它,而是直接搜索文件来实现。我们调用数据库没有文件,就造成在插件代码中无法控制翻页。解决办法是我们重新编写翻页插件替换Micaps自带的翻页功能,翻页时,先调用每个图层的翻页方法,如果发生异常,再执行文件方式翻页(此方法并不安全,其它插件的翻页代码如果未抛出异常,那它的文件方式翻页功能将实效)。
 
       下图即直接连接陕西省局自动站数据库绘图的效果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Micaps3Micaps4都是气象数据交换格式,区别在于Micaps3是文本格式,而Micaps4是二进制格式。Micaps4格式拥有更好的压缩效率和更高的数据安全性,因此在数据传输和存储时更加优秀。 ### 回答2: Micaps是中央气象台研制的气象数据交换格式,便于不同气象系统之间的数据共享和传输。Micaps3Micaps4是两种常见的Micaps数据格式。 首先,两种格式在数据存储方式上有所区别。Micaps3采用的是二进制数据存储方式,即将数据以二进制形式存储在文件中,减小了文件体积,并且读取速度较快。而Micaps4采用的是文本数据存储方式,将数据以可读的文本形式存储,方便人工查看和编辑。 其次,两种格式在数据结构上也有不同。Micaps3采用时次-层次-要素的三维数据结构,即通过指定时次、层次和要素来定位数据,例如地面观测数据、雷达回波数据等。而Micaps4采用时次-层次-区域的三维数据结构,即通过指定时次、层次和区域来定位数据,例如数值预报产品、格点数据等。Micaps4的数据结构更加灵活多样,适用范围更广。 此外,两种格式在数据支持程度上也存在差异。Micaps3作为较早的格式,支持的气象要素相对较少,主要包括温度、湿度、气压等基本要素。而Micaps4作为更新的格式,增加了更多的气象要素,涵盖了温度、湿度、风速、降水量、云量、能见度等更为细致的要素。 综上,Micaps3格式与Micaps4格式的区别主要包括数据存储方式、数据结构和数据支持程度。Micaps3采用二进制存储,数据结构为时次-层次-要素,支持的气象要素较少;Micaps4采用文本存储,数据结构为时次-层次-区域,支持的气象要素更多。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值