ArcGIS API for Silverlight开发入门(1):Getting Started

        这一节来对Silverlight API(ArcGIS API for Silverlight,下同)的开发有个总体的认识。
        欲善其事先利其器。要做开发,第一步就得搭建环境。因为是在Siverlight基础上做开发,所以先得整理好Siverlight的开发环境。Silverlight并没有内建在VS2008中,而是作为add-on的形式附加的。在这里可以找到详细的安装步骤:

        说明一下,步骤1安装了Silverlight add-on(要求有IDE的SP1补丁包);步骤2安装的是Expression Studio中的Expression Blend,这个工具相当于可视化的xaml编辑器,可以用来轻松的创建Silverlight程序的用户界面;步骤3中安装的是Silverlight一种非常华丽的图片处理效果,可以参看这里的实例;步骤4包括一些可用的Silverlight控件和例子。接下来再去看看Silverlight API的要求。可以看出对于开发ArcGIS Silverlight程序来说,只有步骤1是必须的,其他都是可选的。之后需要从ESRI网站下载Silverlight API(需要免费注册一个ESRI Global账户),以备后用。
        总结一下最常见的安装步骤:1、安装VS2008;2、安装VS2008 SP1;3、安装Silverlight Tools for Visual Studio 2008 SP1。到此,就可进行Silverlight程序的开发了。关于开发环境的搭建,还可以参考yyilyzbc版主的帖子。(做Silverlight API的开发不需要在自己的机器上安装ArcGIS Server,可直接使用ArcGIS Online上的数据;但如果要添加自己的数据,当然还是需要ArcGIS Server了)
        下面就来一个Hello World吧,对于GIS来说,理所当然就是展示一张漂亮的世界地图了。具体步骤如下:
1、VS2008中,新建project,选择Silverlight Application;
2、在出现的提示框中选择Add a new ASP.NET Web project to the solution to host Silverlight;(Silverlight程序与flash一样,相当于网页中的一个插件。第一个选项是将Silverlight嵌入到一个ASP.NET网站中,第二个选项是将Silverlight嵌入到一个临时的html页面中)
3、添加Silverlight API的引用:与.NET程序开发一样,add reference(注意是在Silverlight工程上而不是ASP.NET工程上),找到从ESRI下载的API,选择添加ESRI.ArcGIS.dll;
4、打开Page.xaml,在UserControl标签中添加一句引用,在Grid标签之间添加一些代码,完成后看起来像这样:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:esri="clr-namespace:ESRI.ArcGIS;assembly=ESRI.ArcGIS"
Width="400" Height="300">




Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer" />




5、按F5,运行程序,就完成了我们的hello world in
GIS可以在浏览器中看到下面的画面:

        看到效果之后,再来对它进行理解吧。
        先说下Silverlight的程序的基本背景。page.xaml实际上是一个控件,相当于asp.net中的default.aspx,大部分的工作都在这里面完成(app.xaml相当于global.asax);上面的是xaml(读:[ig`zeml])代码,是微软针对wpf/silverlight的标记语言,与flex中的mxml类似。Silverlight程序中所有的布局工作都是由xaml来完成的;Silverlight 2中,VS2008可以实时对xaml的效果做预览,但是这个预览效果是只读的,对于预览中的控件也不可选;为了弥补这个缺陷,可以用前面提到的Expression Blend来可视化地设计程序界面,会自动生成对应的xaml代码,使用于复杂的布局和美化工作(可参考Silverlight中的clock例子);再看page.xaml。usercontrol标签(页面的根元素)证明了page.xaml实际上是一个控件类;下面的几句相当于引入了xml的特定命名空间,里面包括了我们的ESRI.ArcGIS;width和height指明了Silverlight控件本身的尺寸,一般我们将这里的width和height属性去掉,已达到全屏的效果(你也可以试试哦);Grid标签是布局控件,相当于html中的表格,可以进行灵活的页面布局,xaml中常用的布局控件还有Canvas和StackPanel;每一个xaml的Control都可以有一个x:Name属性,以便在code-behind页面中对其引用。
        之后是我们的主角了。Map标签(继承自xaml的Control)相当于一个Map控件,可以在其中加入图层;这里我们添加了一个ArcGISTiledMapServiceLayer图层(在后面的文章中会专门讲到Silverlight API中的图层类型),对应使用的是ArcGIS Server发布的经过cache的服务,作为客户端的API,同JavaScript与Flex API一样,都是通过REST方式对资源和操作进行引用的;对这个图层,赋予了一个ID属性,因为Silverlight API中的图层是从xaml中的Dependency Object继承而来,所以没有x:Name的属性,为了方便在code-behind(与asp.net类似的托管代码)的代码中找到这个图层,便使用了ID属性;URL的内容便是ArcGIS Online发布好的一个世界地图资源。
        到此,应该对这个例子理解的差不多了。如果还想再添加一个图层怎么办呢?没错,就是在Map标签中再添加一个layer,不过要注意的是,第一个加入的图层会显示在最下面,并且决定了整个Map控件的空间参考信息。
        大家自然会想到叠加一个自己的数据图层来看看效果,于是对Map标签内容做了修改(china是本机发布的一个中国地图):

Url="http://loca
lhost/ArcGIS/rest/services/china/MapServer" />

        运行后却还是只有世界地图一个图层(已经确保拼写、大小写正确),怎么回事呢?来用事件帮助查找错误吧。
        Silverlight能够利用.net的一些核心库内容,包括事件。来对刚才的那个图层添加一个事件:InitializationFailed,当图层添加失败的时候会出发这个事件。添加这个事件的处理也非常简单:在上面的图层中加入InitializationFailed属性,会提示你生成新的eventhandler,默认回车,看上去像这样:

Url="http://localhost/ArcGIS/rest/services/china/MapServer" />

        在事件上面右键单击,Navigate to Event Handler,就会进入前面所说的code-behind页面(本例为C#),添加以下代码:
private void ArcGISDynamicMapServiceLayer_InitializationFailed(object sender, EventArgs e)
{
ESRI.ArcGIS.Layer layer = sender as ESRI.ArcGIS.Layer;
MessageBox.Show(layer.InitializationFailure.Message);
}

        然后运行程序,会得到初始化图层失败的原因:

        原来,为了安全原因考虑,同flash一样,Silverlight对跨域访问也做了严格的限制。要解决这个问题,可以参考帮助中的说明,将两个xml文件保存在网站根目录,比如C:Inetpubwwwroot中即可(其实保存其中一个就可以了,ArcGIS Online已经将两个xml文件都放在了网站根目录中,所以我们可以引用上面的服务)。
        看下最后的效果吧。

        为了更好的理解xaml和Silverlight,建议首先独立完成Silverlight帮助中的两个workthrough:hello worldclock
        下一节将会在事件和Silverlight特性的基础上带给大家一个比较完整的地图实例。

8 thoughts on “ArcGIS API for Silverlight开发入门(1):Getting Started”

  1. fatfatrat

    去年年底投论文A中了某期刊增刊 本来2个增刊算毕业 老板说年底投都中增刊让退稿改进A后投其他的 近完稿另一篇B仍投这此刊尚无果 现正改A 哈项目做的全忘了 老板看来不打算把我向这方面培养 你最近在弄啥?一直钻研这个?

  2. 大愚若智

    楼主你好
    对于你在文章中提到的“Silverlight对跨域访问也做了严格的限制”的问题我始终没有能够解决,参考了一下http://msdn.microsoft.com/en-us/library/cc197955(VS.95).aspx的文章,但是依然不能显示我用catalog发布的一个地图总,希望楼主提点一下!不甚感激!!
    esri:ArcGISDynamicMapServiceLayer ID=”CaliforniaLayer” Url=”http://localhost/ArcGIS/rest/services/Gulf_of_St._Lawrence/MapServer”

  3. 菩提老王

    @大愚若智:
    先确定你这个rest服务能够正常运行(把你的url输入到浏览器里回车),如果没有问题的话,按照上面提到的绑定InitializationFailed事件,查找一下加载服务不成功的原因是什么。如果是跨域的问题,再按照msdn那篇文章中的做法,把两个xml文件放在自己服务器的根目录中。

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>