APP下载

基于ArcGIS API for Silverlight的Web应用初步实现

2015-02-09龙际梦蔡中祥刘宏建

地理空间信息 2015年4期
关键词:服务器端控件插件

龙际梦,蔡中祥,刘宏建,李 钦,樊 江

(1.信息工程大学 地理空间信息学院,河南 郑州 450000)

基于ArcGIS API for Silverlight的Web应用初步实现

龙际梦1,蔡中祥1,刘宏建1,李 钦1,樊 江1

(1.信息工程大学 地理空间信息学院,河南 郑州 450000)

介绍了ArcGIS API for Silverlight及相关概念,举例说明了Map、Navigation、Draw、MapTip等控件的使用,以及应用程序在IIS上的部署方法。

ArcGIS API for Silverlight;WebGIS;RIA;Silverlight;REST;Web应用

WebGIS是Internet技术与GIS相结合的产物,随着互联网的不断发展和GIS 技术的广泛应用,人们对基于网页技术的WebGIS的交互性、视觉效果、响应速度以及功能体验等有了更高的要求。RIA(rich internet applications,富因特网应用程序)技术[1]提供了全新的Web应用解决方案,给WebGIS带来了新的发展契机,实现了更加直观有效的应用服务。Flex与Silverlight是目前RIA技术的主要代表,Flex技术尽管在一定程度上可满足现有需求,但存在不支持多线程、学习曲线较高、对大数量传输等支持不足等局限。与Flex相比较,虽然Silverlight浏览器插件安装率不及Flash插件,但Silverlight平台支持更多开发语言,学习成本低,开发效率高,发展迅速。基于ArcGIS Server,使用 ArcGIS API for Silverlight可以建立令人赏心悦目的RIA[2,3]。

1 ArcGIS API for Silverlight概述

1.1 ArcGIS Server API

ArcGIS Server可以使用的API有如下6种: .Net Web ADF、Java Web ADF、ArcGIS API for JavaScript、ArcGIS API for Flex、ArcGIS API for Silverlight、ArcObject API。

这6种API都能完成一些常见的功能,但是它们之间存在较大的差别。这6个API可分为两大类,分别是“服务器端API”和“客户端API”。.Net Web ADF、Java Web ADF和ArcObjects API可以算做“服务器端API”,因为使用这3类API所开发的程序代码主要是在服务器端运行的,而使用ArcGIS API for JavaScript、ArcGIS API for Flex和ArcGIS API for Silverlight开发的程序代码主要运行在客户端的浏览器里[4]。

1.2 Silverlight

Microsoft Silverlight是一个跨浏览器、跨平台的插件,为Web生成和提供下一代媒体体验和丰富的RIA。Silverlight提供灵活的编程模型,并可以很方便地集成到现有的网络应用程序中。Silverlight可以对运行在Mac或Windows上的主流浏览器提供高质量视频信息快速、低成本的传递。若要运行 Silverlight Web 应用程序,用户只需要在浏览器中安装一个小插件。

1.3 ArcGIS API for Silverlight的构成

ArcGIS API for Silverlight主 要 由Maps、Graphics、Tasks、Toolkit、Access to Silverlight components几部分组成[5]。开发者能够在Silverlight应用程序中集成ArcGIS Server和Bing地图的服务和功能,利用ArcGIS Server和Bing地图的资源,如地图、定位器、地理处理模型和Silverlight组件等,创建交互性和表达性很强的应用程序。

1.4 ArcGIS API for Silverlight与REST

REST(representational state transfer,表述性状态转移)是一个直观的架构风格[6,7],通过网址提交到Web服务的请求来创建地图图像。REST允许程序在不同计算机上独立于操作系统或平台进行通信,通过发送一个http请求到网址,并获取某种格式的返回数据,支持的格式包括XML或嵌入网址的XML。

Silverlight API负责客户端的界面交互、地图和相关数据的展现,REST API在服务器端提供GIS服务。这些REST API是ArcGIS Server软件已经在服务器端封装完成的,开发人员要做的工作是在Silverlight API里面去访问REST API提供的GIS服务。

2 ArcGIS API for Silverlight应用程序的实现

ArcGIS API for Silverlight的开发环境包括配置Silverlight开发环境和安装ArcGIS Silverlight API两部分。

2.1 Map控件

Map控件是ArcGIS API for Silverlight的核心组件,主要用来展示各种各样的数据,Map控件可与用户进行交互。ArcGIS API for Silverlight提供了若干种图层类型来承载不同来源的数据,主要分为Map Service Layers、Feature Layers、Graphics Layers 、Element Layers等。其中,Map Service Layers包括如下4种图层:

1)ArcGIS Tiled Map Service Layer, 是 可 通 过REST接口来访问的缓存地图服务图层。

2)ArcGIS Dynamic Map Service Layer,是可通过REST接口访问的ArcGIS动态地图服务图层。该图层类型可根据客户端请求生成背景透明的实时图片。

3)ArcGIS Image Service Layer,是可通过REST访问的ArcGIS影像服务图层。

4)Tile Layer,是缓存的微软Bing地图服务图层。使用该图层数据需提供令牌。

以添加ArcGIS Tiled Map Service Layer为例,XAML关键代码如下:

〈esri:Map x:Name="MyMap" Extent="-120, 20, -100, 40" 〉

〈esri:Map.Layers〉

〈esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"

Url="http://server.arcgisonline.com/ArcGIS/rest/ services/ESRI_StreetMap_World_2D/MapServer" /〉

〈/esri:Map.Layers〉

〈/esri:Map〉

运行效果如图1所示。

图1 Map控件使用运行截图

2.2 Navigation控件

Navigation控件即导航条控件,该控件与单个Map控件相关联。提供了地图的漫游、缩放、重置正北方向以及全图显示等功能。

运行效果如图2所示,XAML关键代码如下:

〈esri:Navigation HorizontalAlignment="Left" Name="Navigation1" VerticalAlignment="Top" Map="{Binding ElementName=MyMap}"/〉

图2 Navigation控件使用运行截图

2.3 Map Tip控件

Map Tip控件可显示与该控件所关联的Graphics Layer图层中鼠标光标所停留位置的元素的属性。

1)在Feature Layer元素中添加图层的Map Tip属性。

〈esri:FeatureLayer ID="MyFeatureLayer"

Url="http://sampleserver1.arcgisonline.com/ArcGIS/rest/ services/Demographics/ESRI_Census_USA/MapServer/5"

Where="POP07_SQMI 〉 150" Renderer= "{StaticResource MySimpleRenderer}" 〉

〈esri:FeatureLayer.OutFields〉

〈sys:String〉STATE_NAME〈/sys:String〉

〈sys:String〉POP07_SQMI〈/sys:String〉

〈/esri:FeatureLayer.OutFields〉

〈/esri:FeatureLayer〉

2)在Map Tip元素中,定义一个容器,用来显示Map Tip的内容。

〈esri:FeatureLayer.MapTip〉

〈Grid Background="LightYellow"〉

〈StackPanel Margin="5"〉

〈/StackPanel〉

〈Border BorderBrush="Black" BorderThickness="1" /〉

〈/Grid〉

立足上述立法背景存在的现实需求,以《知识产权基本法》的指导思想为指导,《知识产权基本法》立法应当秉持如下原则。

〈/esri:FeatureLayer.MapTip〉

3)在Map Tip的Stack Panel控件中,添加Text Block用来显示州名以及人口密度。

〈TextBlock Text="{Binding [STATE_NAME]}" FontWeight="Bold" /〉

〈StackPanel Orientation="Horizontal"〉

〈TextBlock Text="Population Density (2007): " /〉

〈TextBlock Text="{Binding [POP07_SQMI]}" /〉

〈/StackPanel〉

运行效果如图3所示。

Draw工具提供了在客户端绘制各种几何对象的功能。

客户端XAML关键代码如下:

〈Grid x:Name="LayoutRoot" Background="White"〉

〈Grid.Resources〉

〈esri:SimpleFillSymbol x:Key="RedFillSymbol" Fill="#66FF0000" BorderBrush="Red" Border Thickness="2" /〉

图3 MapTip使用运行截图

〈esri:SimpleFillSymbol x:Key="BlueFillSymbol" Fill="#660000FF" BorderBrush="Blue" Border Thickness="2" /〉

〈/Grid.Resources〉

〈esri:Map x:Name="MyMap" Background="White" Extent="-120, 20, -100, 40" 〉

〈esri:Map.Layers〉

〈esri:ArcGISTiledMapServiceLayer ID= "StreetMapLayer"

Url="http://server.arcgisonline.com/ArcGIS/rest/ services/ESRI_StreetMap_World_2D/MapServer"/〉

〈esri:GraphicsLayer ID="MyGraphicsLayer" /〉

〈/esri:Map.Layers〉

〈/esri:Map〉

〈/Grid〉

后台C#关键代码如下:

1)创建一个新的Draw对象:

Draw MyDrawObject = new Draw(MyMap)

{

FillSymbol = LayoutRoot.Resources ["RedFillSymbol"] as FillSymbol

};

MyDrawObject.DrawComplete += MyDrawObject_ DrawComplete;

2)激活Draw工具:

MyDrawObject.DrawMode=DrawMode.Polygon;

MyDrawObject.IsEnabled=true;

3)定义一个Draw事件完成的处理程序:

private void MyDrawObject_DrawComplete(object sender, ESRI.ArcGIS.Client.DrawEventArgs args)

{

Graphic graphic = new Graphic()

{

Geometry = args.Geometry,

Symbol = LayoutRoot.Resources["BlueFillSymbol"] as FillSymbol

};

GraphicsLayer graphicsLayer = MyMap.Layers ["MyGraphicsLayer"] as GraphicsLayer;

graphicsLayer.Graphics.Add(graphic);

}

运行效果如图4所示。

图4 Draw工具使用运行截图

2.5 查询任务

查询任务允许用户从ArcGIS Server地图服务图层中通过某些条件过滤来获取相关要素,可使用空间范围或属性条件或两者组合方式来进行查询。

这里以查询美国2007年人口密度大于500人/km2的地区为例,客户端XAML关键代码如下:

〈Canvas HorizontalAlignment="Right" VerticalAlign ment="Top" Margin="0,15,7,0" Width="250"〉

〈Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10" Width="230" Height="55"/〉

〈TextBlock Text="输入查询条件并点击“查询”按钮" Foreground="White" FontSize="10" Margin="10,5,0,0"/〉

〈TextBlock x:Name="QueryTextBox" Width="150" Margin="15,22,0,0" Text="POP07_SQMI〉500"/〉

〈Button x:Name="QueryButton" Content="查询" Margin= "168,23,0,0" Click="QueryButton_Click"/〉

〈/Canvas〉

后台C#关键代码如下:

private void QueryButton_Click(object sender, RoutedEventArgs e)

{

//初始化查询任务

QueryTask queryTask = new QueryTask("http:// sampleserver1.arcgisonline.com/ArcGIS/rest/services/" + "Demographics/ESRI_Census_USA/MapServer/5");

queryTask.ExecuteCompleted += QueryTask_ ExecuteCompleted;

queryTask.Failed += QueryTask_Failed;

//查询任务的参数

Query query = new Query();

query.ReturnGeometry = true;

query.OutFields.AddRange(new string[] { "STATE_NAME", "POP07_SQMI" });

//使用文本框的文本作为查询条件

query.Where = QueryTextBox.Text;

queryTask.ExecuteAsync(query);

}

//查询完成后绘制结果

private void QueryTask_ExecuteCompleted(object sender, ESRI.ArcGIS.Client.Tasks.QueryEventArgs args)

{

//清除以前的结果

GraphicsLayer graphicsLayer = MyMap.Layers ["MyGraphicsLayer"] as GraphicsLayer;

graphicsLayer.ClearGraphics();

//检查新结果

FeatureSet featureSet = args.FeatureSet;

if (args.FeatureSet.Features.Count 〉 0)

{

//将结果添加到地图

foreach (Graphic resultFeature in featureSet.Features)

{

r e s u l t F e a t u r e.S y m b o l = L a y o u t R o o t. Resources["ResultsFillSymbol"] as ESRI.ArcGIS.Client. Symbols.Symbol;

graphicsLayer.Graphics.Add(resultFeature);

}

}

else

{

MessageBox.Show("No feature found");

}

}

//查询失败时,提示错误信息

private void QueryTask_Failed(object sender, TaskFailedEventArgs args)

{

MessageBox.Show("Query failed:" + args.Error);

}

运行效果如图5所示。

图5 查询任务运行截图

3 部署应用程序

ArcGIS API for Silverlight应用程序的部署步骤为:①安装。②配置IIS。右键点击“IIS信息服务—网站—默认网站”,弹出“属性”页,选择“http头”标签,点击“MIME映射”的“文件类型”按钮,弹出文件类型窗口,点击新类型,新加.xap和.xaml两个类型,点击确定完成设置。③编译网站程序并发布。编译好Silverlight地图应用程序,在IIS创建虚拟目录,指向网站应用程序(后缀为.web的应用程序),完成发布。④在网页中打开地图应用程序查看是否部署成功[8]。

4 结 语

ArcGIS API for Silverlight使用起来比ADF框架更加轻巧,而且功能强大,可以与多种当今主流技术交互。本文只是介绍了ArcGIS API for Silverlight的入门知识,读者可在此基础上开发出界面更加友好、功能更加全面的WebGIS应用程序。

[1] 王京.基于Flex的WebGIS的设计与实现[D].西安:西安科技大学,2011

[2] 王天宝,王尔琪,卢浩,等.基于Silverlight的WebGIS客户端技术与应用试验[J].地球信息科学学报,2010,2(1):69-75

[3] Preciado J C,Linaje M,Sanchez F,et al.Necessity of Methodologies to Model Rich Internet Applications[C].Web Site Evolution(WSE 2005),Seventh IEEE International Symposium,2005

[4] 贾庆雷,万庆,邢超.ArcGIS Server开发指南——基于Flex和.Net[M].北京:科学出版社,2011

[5] 何正国,杜娟,毛海亚.精通ArcGIS Server应用与开发[M].北京:人民邮电出版社,2013

[6] 刘光,唐大仕.ArcGIS Server JavaScript API开发GeoWeb2.0应用[M].北京:清华大学出版社,2010

[7] 贾静,耿衬.基于ArcGIS API for Flex的Web应用初探[J].地理空间信息,2012,10(3):114-118

[8] 孙超,钟珞.基于Silverlight的富界面应用研究[J].武汉理工大学学报,2008,12(12):95-97

P208

B

1672-4623(2015)04-0095-04

10.3969/j.issn.1672-4623.2015.04.034

龙际梦,硕士,主要从事军事地理信息系统研究。

2014-06-27。

项目来源:国家自然科学基金资助项目(41301125)。

猜你喜欢

服务器端控件插件
基于.net的用户定义验证控件的应用分析
Linux环境下基于Socket的数据传输软件设计
自编插件完善App Inventor与乐高机器人通信
关于.net控件数组的探讨
基于Qt的安全即时通讯软件服务器端设计
基于jQUerY的自定义插件开发
基于Qt的网络聊天软件服务器端设计
基于C/S架构的嵌入式监控组态外设扩展机制研究与应用
基于Revit MEP的插件制作探讨
基于嵌入式MINIGUI控件子类化技术的深入研究与应用