基于ArcGIS API for Silverlight的Web应用初步实现
2015-02-09龙际梦蔡中祥刘宏建
龙际梦,蔡中祥,刘宏建,李 钦,樊 江
(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)。