`
mywebcode
  • 浏览: 998147 次
文章分类
社区版块
存档分类
最新评论

如何在ArcGIS Viewer for Silverlight中使用WCF服务完成降雨量专题图显示(一)

 
阅读更多

在我的工作中遇到有的用户喜欢使用ArcGIS Viewer for Silverlight搭建一些简单的工程,用来作为即将建立的系统的原型系统,或者尝试一些功能,这是一种很方便快捷的方式。但是并不是所有的功能都能够使用Viewer配置完成,有时候扩展开发是必须的。

尤其是有的用户在别的系统中已经有了一系列的数据访问封装好的WCF,只是需要在Viewer中完成数据的调用和显示,那么就更需要对Viewer进行灵活的扩展了。这个系列的文章中,笔者将利用WCF调用数据完成降雨量图的显示。

原本笔者想直接写WCF调用的那一小段,但是发现要是不讲清楚Viewer的扩展开发,后面的很多问题无法引出来。因此本系列将用3个篇幅完成对这个专题的阐述:

第一篇讲述如何对Viewer进行工具的扩展开发;

第二篇讲述如何调用WCF服务进行数据查询;

第三篇讲述查询到的数据如何进行专题图的显示。

利用ArcGIS Viewer for Silverlight配置工程我就不讲述了,各位应该比我还拿手,直接从扩展开发开始:

1.建立一个Silveright工程。

注意选择ASP.Net网站作为Silverlight的宿主。为什么这么做呢?如果大家注意过利用Viewer配置生成的应用程序,那就清楚,它其实是一个站点,我们在工程中也将使用这个站点作为我们调试的宿主。


呵呵,正如上面所说,用站点,因此需要把不需要的文件清空。

我们看到两个工程,上面的工程是Silverlight的宿主站点,下面的是Silverlight的应用程序。宿主站点我们清空后就将利用Viewer生成的站点文件整个拷贝下来;而应用程序则可以将两个xaml都删除。做完这一步,将上面的站点设置成为启动项目,且将index.htm设置成为起始页面。F5运行一下,OK站点顺利显示出来了。

2.设置Silverlight程序的扩展。

在这里提醒大家注意,Viewer的版本要等于或者高于使用的ArcGIS API for Silverlight版本,否者建立的Silverlight扩展是无法添加到Viewer里面的。

首先,在宿主站点中添加Silverlight程序。注意不要勾选“添加引用该控件的测试页”,因为这样做的话,会多出两个没用的页面(勾选了也没关系,删掉多余的页面就是了)。

之后给Silverlight应用程序添加引用

最重要的是以下两个:

最好设置一下这两个动态库不复制到本地,否者在Viewer里面添加您做的扩展会提示警告,说这两个dll已经打包在Viewer里面了。这么做也是让扩展包更小的方法。

做完这些之后就能建立我们自己的扩展工具了!

3.建立类型(以QueryTool为例)

QueryTool继承于ICommand和ISupportsConfiguration,可以直接点击“实现接口”来生成必须的接口。

扩展工具一般有两个类,一个是.cs类,是上述的QueryTool,但是QueryTool并没有用户交互界面,所以还必须有一个类来显示,一般是个xaml,可以继承于任意的UIElement。

下面是我注释的接口作用:

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Input;
using System.Xml.Linq;
using ESRI.ArcGIS.Client.Extensibility;

namespace WCFSilverlight
{
    public class QueryTool:ICommand,ISupportsConfiguration
    {
        /// <summary>
        /// 用于用户交互的查询窗口界面
        /// </summary>
        QueryToolWindow TheQueryToolWindow = null;

        /// <summary>
        /// 存储配置的图层
        /// </summary>
        public Dictionary<string, string> LayersDic = new Dictionary<string, string>();

        /// <summary>
        /// 判断是否可以执行Command的方法
        /// </summary>
        /// <param name="parameter">用于判断的参数</param>
        /// <returns></returns>
        public bool CanExecute(object parameter)
        {
            //返回是否可以执行
            return true;
        }

        /// <summary>
        /// 是否可以执行的值更改了的事件
        /// </summary>
        public event EventHandler CanExecuteChanged;

        /// <summary>
        /// 执行命令
        /// </summary>
        /// <param name="parameter">执行命令传递的参数</param>
        public void Execute(object parameter)
        {
            this.TheQueryToolWindow = new QueryToolWindow(this);
            //将TheQueryToolWindow作为工具交互界面显示出来
            MapApplication.Current.ShowWindow("调用WCF", this.TheQueryToolWindow);
        }

        /// <summary>
        /// 配置
        /// </summary>
        public void Configure()
        {
            //在这根据配置信息对工具进行配置
        }

        /// <summary>
        /// 读取工具的配置信息,这个信息在Tools.xml文件中有
        /// </summary>
        /// <param name="configData">标签"Tool.ConfigData"内的值</param>
        public void LoadConfiguration(string configData)
        {
            //笔者是因为将配置信息写成xml格式的了,因此需要这么配置,要是使用普通字符串则可以免除这个操作,直接使用
            using (StringReader sr = new StringReader(configData))
            {
                XDocument ConfigDataXDocument = XDocument.Load(sr);
                foreach (XElement layer in ConfigDataXDocument.Root.Elements("layer"))
                {
                    string url = layer.Attribute("url").Value;
                    string id = layer.Attribute("id").Value;
                    LayersDic.Add(id, url);
                }
            }
        }

        /// <summary>
        /// 退出Tools的时候进行的配置文件保存
        /// </summary>
        /// <returns></returns>
        public string SaveConfiguration()
        {
            //将需要保存的配置文件以字符串形式传递出去,比如笔者比较喜欢使用xml配置,也必须转换成字符串
            return string.Empty;
        }
    }
}

在这一步完成后,我们先不看交互界面里面的类如何写(要是调试出错,可以随意建立一个类名为“QueryToolWindow”的xaml不用做任何操作),我们先到宿主站点中,将Tool配置到Viewer生成的站点中去。

4.配置Tool

首先打开Config/Application.xml,在节点中添加对xap的引用。

<Extensions>
    <Extension Url="ClientBin/WCFSilverlight.xap" />
</Extensions>

再在Config/Tools.xml中配置工具的引用

<Tools>
      <Tool Label="查询降水量" Icon="Images/toolbar/ToggleSearchCommand16.png" Description="调用WCF查询降水量,并生成专题图">
        <Tool.Class>
            <QueryTool xmlns="clr-namespace:WCFSilverlight;assembly=WCFSilverlight" />
        </Tool.Class>
          <Tool.ConfigData>
              <queryConfig>
                  <layer id="Point" url="http://localhost:6080/arcgis/rest/services/CenterValue/MapServer/0"></layer>
              </queryConfig>
          </Tool.ConfigData>
      </Tool>
    </Tools>

我们可以看到,Tools节点中添加了Tool;在Tool下面有Tool.Class节点和Tool.ConfigData节点,前者是配置工具使用的类,格式为:

<Tool.Class>
      <类名xmlns="clr-namespace:命名空间;assembly=程序集" />
</Tool.Class>

有朋友会问:需要把Silverlight的程序集添加到上面的宿主站点中吗?答案是不用!因为在Application.xml中配置了xap的引用,因此,Viewer的Viewer.xap其实会去解析这些引用的xap,而生成我们的扩展工具自己的xap的时候已经将自己的程序集打包传过去了。感兴趣的朋友可以将xap包的扩展名改为.zip再打开看看。

下面的Tool.ConfigData标签内是随意填什么都行的,我这里是用xml格式表示了一个图层和查询的配置。

配置完成后,运行看看,应该在主窗体右侧工具拦中出现我们自定义的工具了。点开试试,是否出现我们自己定义的QueryToolWindow了?
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics