Monthly Archives: April 2009

ArcGIS Server的切图原理深入

GoogleMap,Virtual Earth,YahooMap等,目前所有的WebGIS都使用了缓存机制以提高地图访问速度。原理都是将地图设定为多个比例尺,对于每个比例尺提前将地图分成若干小图片,存在服务器上,客户端访问时直接获取需要的小图片拼接成地图,而不是由服务器动态创建出一幅图片来送到客户端,极大程度的提高了反问速度。好比外面卖菠萝,和自己买一整个回家吃不同,提前把一个菠萝等分成四份(js可能会分成6份),你只需买一份来吃,体积小,方便吃,而不是对着整个菠萝咬下去,弄一脸菠萝汁。 本文中来详细了解一下ArcGIS Server目前为地图服务建立缓存(切图)的原理。先来了解一个概念: Tiling Scheme:创建地图缓存时使用的一系列参数的总称。包括比例尺级别,图片格式,图片大小等等。 Tiling Scheme Origin:是tiling scheme grid的左上角。默认情况下就是由mxd文档使用的坐标系的原点。而切图的范围通常是mxd文档中full extent的范围,即从full extent的左上角(map origin)到右下角。注意区分map origin与tiling scheme origin。 对于不同的地图服务(mxd文档),如果使用相同的坐标系,那么就有相同的tiling scheme origin,即使他们的full extent不同(map origin不同),也能处于同一参考系中。如果full extent相同,则可以轻松地叠加在一起,这也是tiling scheme origin设计的初衷。默认情况下,切图的范围是mxd文档的full extent。如果手工设置了tiling scheme origin,那么切图的范围只能是地图范围中tiling scheme origin右下角的部分:如果tiling scheme origin在map origin的左上角,那么切图范围还是full extent;如果tiling scheme origin落在地图中,那么切图的范围就是从tiling scheme origin到full extent的右下角。这也就是为什么建议通过设置特定的矩形范围(92中)或直接使用featureclass(93中)来改变切图范围,而不是利用tiling scheme origin来限制切图范围的原因。 那么地图到底是怎么切出来的?切多少块呢?通过一个例子深入浅出吧。一个中国地图,采用了自定义的坐标系: 切图时设置如下: 看看切图完成后的文件夹结构: 在缓存目录中,首先是地图服务命名的文件夹china;之后是切图的DataFrame命名的文件夹Layers;由于采用的是fused方式,下来就是_alllayers,如果是multi-layer切图,那么就是每个图层的序号文件夹;下来就是切图设置的多个比例尺级别(Level of Detail,LOD),从小到大,对应前面设置的5个比例尺;一个比例尺文件夹下,是切图的“行”文件夹,命名规则是R加上8位行号(16进制),不足补0。比如图中的R0000000a,表示此比例尺中第10行(16进制中的a);每行文件夹下就是该行的所有tile文件了,命名规则是C加上8位列号(16进制),不足补0。为什么这个比例尺下(L01)中只有8,9,10,11行呢?前面说过切图的范围是full extent,说明在该比例尺下,从tiling scheme origin算起,中国地图的范围只占到了这几行,其余没有,不切。同理,对于上面的第九行文件夹中,只有7,8两列,其余的没有,不切。 再打开和_alllayers文件夹同级的conf.xml看看吧,里面保存了整个tiling scheme参数。 可以看出地图服务使用的坐标系信息,tile图片的DPI(96),每个tile的长度和宽度(512),以及tiling scheme origin。 现在来计算某个比例尺中,地图上一个点所在的tile图片的行列号了。比如计算L01中,乌鲁木齐市所在tile的行列号。需要收集三个信息: 1、获得乌市的地理坐标:在本地图中是x=-1341070,y=5343697; 2、获得tiling scheme:x=-35331700,y=46619300; 3、获得当前比例尺的resolution,即一个像素所占的地图单位长度:在L01比例尺上是8466.68360003387。 乌市所在的行号:(35331700-1341070)/(8466.6836*512)=7.84=8 乌市所在的列号:(46619300-5343697)/(8466.6836*512)=9.52=10 所以乌鲁木齐在切图的第二个比例尺中,处于第10行,第8列的tile。

Hallelujah: a song is not just a song

[youtube=http://www.youtube.com/watch?v=mmyQEdr_IVY]        最近在newnaw.com上把背景音乐换成了《Hallelujah》,是Rufus Wainwright唱的,不少同学反映都好听,其实在这首歌背后还有不少的东西。        最初听到这首歌是在《the L World》第一季里,于是乎就找到了Leonard Cohen。他是上世纪加拿大的一位诗人,小说家,词曲作者,歌手。30多岁才出版了第一张专辑,但在这之前他已经是小有名气的一位诗人了。豆瓣上有他的一本书,不过看起来读过的人不多。在google一下,结果上的第一张肖像让我想起了保罗莫里哀,不禁肃然起敬。尽管不及达芬奇,但我还是忍不住想说:哦,又是一位让人尊敬的多才多艺者。        看看歌词的前两段:I’ve heard there was a secret chordThat David played, and it pleased the LordBut you don’t really care for music, do you?It goes like this:The fourth, the fifth, he minor fall, the major liftThe baffled king composing Hallelujah Hallelujah, HallelujahHallelujah, Hallelujah Your faith was strong but you needed proofYou saw her bathing on the roofHer beauty and the moonlight overthrew youShe … Continue reading Hallelujah: a song is not just a song »

ArcGIS API for Silverlight开发入门(5):任务外包——Tasks

        通过上一节的学习,我们已经知道了如何与GraphicLayer交互,但毕竟GIS不是一个画板,所以这节来看一下如何通过Silverlight API完成GIS中的分析功能。        GIS之所以是一个通用的工具,就是因为它具有各种各样分析和处理数据的能力。Silverlight API中提供了Task,使我们能够轻松完成常见的分析任务。        先来考虑一下吃饺子的场景。要想吃饺子,我们需要先去买菜,买肉,回家后在厨房里洗菜,揉面, 拌馅,包饺子,煮饺子,吃饺子,之后别忘了洗碗;另一种情况就是去饭馆,告诉服务员我要吃3两茴香,3两韭菜的饺子,然后等着饺子端到你面前,开吃,走人。        在ArcGIS Server程序开发中,要完成GIS的分析功能其实和吃饺子是一样的。用ADF编程就像在家里吃饺子,除了架设服务器,所有的工作基本上也都得我们自己在服务器端来完成,要处理的地方比较多;而用客户端API编程相当于去外面吃饺子,我们只要把任务交给相应的Task,之后接受结果就行了,不用做饺子。唯一不同的就是在外面吃完饺子别忘了付钱,而用Task完成分析任务则是免费的。这点也体现在使用客户端API中的Task时,是由ArcGIS Online提供给你的,不需要自己购买AGS软件。        现在来看看Silverlight API目前给我们提供了那些Task功能:Query:能够在已经发布的服务数据中,通过属性条件(可以属性字段中进行关系判断,字符查找等),图形条件(与输入的图形相交、包含、相离等),或者是两者的组合,查询出满足条件的数据并返回。相当于Engine中的SpatialFilter,当然也是QueryFilter。Find:在地图数据的属性字段中查找包含有关键字参数的数据并返回。Identity:对鼠标当前点击位置上的数据进行辨识并返回结果,可以对多个图层的数据进行辨识。Address Locator:输入经纬度,返回地址结果(Geocoding);输入一个地方的地址,返回经纬度结果(Reverse Geocoding)。由于国内地图数据保密工作做的相当好,这个Task暂时用不到。Geometry Service:可以对输入的地理数据进行如缓冲区,动态投影,面积/周长量算等几何操作。Geoprocessing:能够完成复杂的GIS任务,类似ToolBox中的工具。        抽象一下,可以看出,Query完全可以完成Identity和Find的工作,但后两者在特定场合下使用起来比Query要方便的多;Geoprocessing完全可以替代Geometry Service,但是在利用REST API编写的程序中,要尽量使用Geometry Service。        再抽象一下,Silverlight API中的这几个Task和JavaScript/Flex API中的Task是大同小异的,因为其实它们都是AGS 9.3 REST API中暴露出来的操作资源(Operation Resource)见下图:         后面的代码中实际上也是把输入参数封装起来提交到了REST API的特定Endpoint上。要理解好客户端API中的Task,建议熟读AGS的REST SDK。        Task的用法基本上相同,都遵循这几个步骤:初始化Task,设置Task所需参数,提交任务,等待服务器完成任务后,处理返回的结果;进饭馆,想好你要吃什么饺子,告诉服务员,等饺子做好端上来,开始吃。好了,下面我们就通过一个实例(点击这里,查看实例),来学习一下Query和Geometry两个Task的用法。         首先选择工具条中的画线工具,在屏幕上画一条曲线,会根据曲线自动生成一个距离100公里的缓冲区显示在地图上,之后开始查询缓冲区图形经过的州(相交),将结果显示在地图上。可以单击每个州查看详细信息。这里假设你已学习了前几节的内容,只讨论Task用法的部分。1、利用所画的线生成缓冲区。画线利用的是Draw工具中的Freehand,在这个动作完成后会触发Draw的OnDrawCompleted事件,自然可以在这里开始进行缓冲区的工作,用的是Geometry Service里的Buffer。        初始化Geometry Service。假设已经在Map1中添加了ID为glayerResult的GraphicsLayer,linesymbolred是提前设置好的CartographicLineSymbol:private void Draw1_OnDrawComplete(object sender, DrawEventArgs args) { Draw1.Deactivate();//Freehand动作失效 //将Freehand画的曲线显示在地图上 GraphicsLayer glayer = Map1.Layers[“glayerResult”] as GraphicsLayer; Graphic g = new Graphic(); g.Symbol = linesymbolred; g.Geometry = args.Geometry; glayer.Graphics.Add(g); //初始化Geometry Service GeometryService geometrytask = new GeometryService(“http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer”); }        Geometry Service的初始化使用构造函数来完成的,里面接受一个URL,这个是Geometry Service的REST API Endpoint。顺便说一下,不同于其他服务比如MapService,一个GIS Server只能发布一个GeometryService,并且它的名称必须是Geometry。        当一个Task完成时会触发Completed事件,失败时也有Failed事件,对这两个事件进行监听:geometrytask.BufferCompleted += … Continue reading ArcGIS API for Silverlight开发入门(5):任务外包——Tasks »

ArcGIS API for Silverlight开发入门(4):用户与地理信息之间的桥梁–GraphicsLayer

        我们与地图交互的过程时刻在进行着:一个拉框放大操作,或者对地图内容的查询等。这些交互过程中的输入输出,通常都是反映在独立于地图数据一个“层”上。比如拉框放大,我们能看见鼠标所画的一个矩形;又比如对兴趣点的查询,结果通常是将符合条件的兴趣点的形状高亮显示在那个独立的“层”中,通过它既可以反映用户的输入,又可以展现地图的输出。这个“层”就是GraphicsLayer。        其实ADF开发中也有GraphicsLayer的概念,同样在其他两个客户端API(JavaScript/Flex)中也能找到GraphicsLayer的身影,它们都是一样一样的。        本节我们主要看如何在GraphicsLayer中展现内容。当然第一个工作就是添加ESRI.ArcGIS.dll的引用,引入esri的xml命名空间;接下来在Map中添加一个GraphicsLayer图层:         要使GraphicsLayer中的内容处于最顶端(不被其他图层内容覆盖),就要将它放在Map标签里的最下头,像上面那样。从命名我们不难看出,GraphicLayer里面放的就是Graphic的集合了。Graphic(ESRI.ArcGIS.Graphic)是GraphicsLayer中的基本元素,它包括了Geometry(在ESRI.ArcGIS.Geometry命名空间中),Symbol(在ESRI.ArcGIS.Symbol命名空间中),Attributes等属性。所有显示在地图中的矢量元素都有一个Geometry,里面包含了若干地理坐标,用于显示地图上地物的形状,它是Point,Polyline,Polygon等的总称,在这里代表了Graphic的形状。Symbol代表了Graphic的外观,它是一系列符号的总称,我们通常跟SimpleMarkerSymbol,SimpleLineSymbol和SimpleFillSymbol等打交道,它们分别对应了上面3种不同的Geometry(Point,Polyline,Polygon)。        要让一个Graphic显示出来,总共分3步:1、定义Graphic:在xaml中在code-behind中Graphic g= new Graphic()2、设置Graphic的Geometry和Symbol属性:在xaml中 在code-behind中Graphic g = new Graphic() { Geometry = new MapPoint(108, 30), Symbol = new SimpleMarkerSymbol() { Color = new SolidColorBrush(Colors.Blue), Size = 12, Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square } };3、把定义好的Graphic添加到GraphicsLayer里:在xaml中 在code-behind中Graphic g = new Graphic() { Geometry = new MapPoint(108, 30), Symbol = new SimpleMarkerSymbol() { Color = new SolidColorBrush(Colors.Blue), Size = 12, Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square } };GraphicsLayer glayer = Map1.Layers[“GLayer”] as … Continue reading ArcGIS API for Silverlight开发入门(4):用户与地理信息之间的桥梁–GraphicsLayer »

ArcGIS API for Silverlight开发入门(3):Widgets

        Widgets翻译过来是小玩具。如果使用过Dojo或者ExtJS等js框架肯定会了解到这个“小玩具”也有大用处,能够在很大程度上减少我们的工作量,快速完成功能需求。能减少多大工作量呢?让我们先来,点击这里,看一个例子。         前两节的地图中,总感觉少点什么……对,就是一个sliderbar,有了它感觉就像汽车有了方向盘一样,能够控制方向了。那么来看看实现上面这个例子中的滑块条需要做什么工作吧。在silverlight中创建一个UserControl,把上面sliderbar的外观和功能都封装在里面。来看具体工作。vs中,在silverlight工程上右键单击,add,new item,选择silverlight user control,起名叫mapslider,在mapslider.xaml中填如下代码: 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”>         上面这些就是滑块条的外观,接下来看功能部分。大致思路是在mapslider类中设置一个公共属性Map,就是需要操作的地图了,但这个属性不是ESRI.ArcGIS.Map,而是另一个自定义类。为什么要这么做?因为这个自定义类需要实现INotifyPropertyChanged接口,当我们把自己的Map控件作为mapslider的属性赋值的时候,这个Map需要做另外一些工作。看代码吧,不太明白的话就要加强对silverlight中data binding的学习。在mapslider.xaml.cs页面中填入一下代码:using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes; using System.ComponentModel; namespace customcontrol{ public partial class mapslider : UserControl { private mymap map = new mymap(); public ESRI.ArcGIS.Map Map { get { return map.Map; } set { map.Map=value; if (map.Map != null) { Map.ExtentChanged += new EventHandler(map_ExtentChanged); Map.SnapToLevels = true; ((ESRI.ArcGIS.ArcGISTiledMapServiceLayer)Map.Layers[0]).Initialized += new … Continue reading ArcGIS API for Silverlight开发入门(3):Widgets »

ArcGIS API for Silverlight开发入门(2):一个基础地图实例

        这节在一个地图实例的基础上,来对Silverlight API中的一些基本概念做一个总体了解,顺便熟悉一下Silverlight的开发知识。        点击这里,直接看效果。         根据上一节的知识,可以知道这个Silverlight程序里包含了一个Map控件,并且里面至少有一个WorldImagery的图层。那么Page.xaml里的关键代码开起来应该是这样的:<Grid x:Name=”LayoutRoot”> <esri:Map x:Name=”Map1″> <esri:Map.Layers> <esri:ArcGISTiledMapServiceLayer ID=”WorldImageLayer” x:Name=”WorldImageLayer” Initialized=”WorldImageLayer_Initialized” Url=”http://services.arcgisonline.com/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer” /> </esri:Map.Layers> </esri:Map></Grid>所有的布局工作都在一个Grid中进行,给它起个名字叫LayoutRoot。Grid里面放了一个esri:Map元素(Map控件),它继承自Silverlight的Control,所以拥有Width和Height属性,默认是Auto,自动填充整个Grid。Map.Layers是一个集合,可以往里面添加layer,这里的layer指的是ArcGIS Server或其他软件发布的地图服务,目前Silverlight API中支持的能够直接使用的有ArcGISDynamicMapServiceLayer,ArcGISTiledMapServiceLayer,ArcGISImageServiceLayer,分别对应ArcGIS Server发布的动态地图服务,缓存地图服务(两种Map Service)和Image Service,这三种图层是拿来即用的,如果你想加入别的地图服务,比如WMS服务,则需要自己继承相应类型的的Layer;此外还有GraphicsLayer,ElementLayer,Silverlight API特有的FeatureLayer等。这些都会在之后的小节中讲到。强调一下,与ADF开发里MapResourceManager一样,在Map中加入的内容实际上是地图服务,但当做一个layer处理。        下面就对这个例子中的每一部分来做说明(与上图中的序号相对应)。 1、当地图移动时获取地图范围。        当地图范围改变后,显示出当前地图范围的边界值。        这部分的页面布局是这样的:<Grid x:Name=”Gridright” Margin=”0,15,20,0″ HorizontalAlignment=”Right” VerticalAlignment=”Stretch”> <!–extent–> <Canvas Width=”215″ Height=”110″ VerticalAlignment=”Top”> <Rectangle Style=”{StaticResource rectBottom}” /> <Rectangle Style=”{StaticResource rectMiddle}” /> <Rectangle Style=”{StaticResource rectTop}” /> <TextBlock x:Name=”TBextent” Margin=”20,15,15,0″ Text=”范围:” TextWrapping=”Wrap” FontWeight=”Bold” /> </Canvas></Grid>        有关xaml中详细的布局知识请大家参照其他例子学习,这里稍作讲解。外面的Gridright这个Grid就是页面右边1、2、3、6的父容器,之所以不用StackPanel是因为6需要贴着页面底部,StackPanel中的元素都会flow贴到一起。三个矩形组合便构成了整体轮廓,由于它们都在一个Canvas中,所以会产生压盖效果。最先加入的rectBottom这个矩形便是最底下的阴影效果,中间的矩形是蓝色框,最上面的矩形是白色的文字显示区域。“{ }”里的内容在xaml中称作markup extention,StaticResource是使用在别处已经定义好的资源(resource)来对本元素的一些属性进行自动赋值,这里用来修饰Rectangle的外观。xaml中除了StaticResource这种markup extention之外还有Binding和TemplateBinding两种markup extention,分别用于数据绑定(data binding)和自定义control的外观。上面的StaticResource是在App.xaml中定义的,这样就可以在本工程的任何页面中使用,当然也可以定义为LayoutRoot这个Grid的Resource。贴出来大家一看就明白了:<Application.Resources> <Style x:Key=”rectBottom” TargetType=”Rectangle”> <Setter Property=”RadiusX” Value=”10″ /> <Setter Property=”RadiusY” … Continue reading ArcGIS API for Silverlight开发入门(2):一个基础地图实例 »

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 inGIS可以在浏览器中看到下面的画面:        看到效果之后,再来对它进行理解吧。        先说下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) … Continue reading ArcGIS API for Silverlight开发入门(1):Getting Started »

ArcGIS API for Silverlight开发入门(0):为什么要用Silverlight API?

       你用上3G手机了吗?你可能会说,我就是喜欢用nokia 1100,ABCDEFG跟我都没关系。但你不能否认3G是一种趋势,最终我们每个人都会被包裹在3G网络中。1100也不是一成不变,没准哪天为了打击犯罪,会在你的1100上强制装上GPS。GIS工作既然建立在计算机的基础上,当然也得随着IT行业与时俱进。       看看现在计算机应用的趋势吧。云(计算),这个东西可讲不清楚,因为云嘛,飘忽不定的。不过可以这样来看它,以后计算机网络上就有一坨(或者几坨)万能的云,有什么需求云都可以满足我们,包括各种资源或者计算工作,就不需要在自己的机器上安装任何软件了(甚至操作系统都可以由天边那朵云来提供给你)。更具体点,SaaS(Software as a Service),各种的网页邮件系统,google docs(一个在线的office)都是SaaS。收发邮件登陆一个网页就行,而不需要在自己机器上安装一个软件。这就是计算机应用的一个趋势,把所有东西都做到网上。再来看看网上的趋势:RIA(Rich Internet Application)。RIA简单来讲就是一个网页(网络应用),在完成基本功能的同时,会让你觉得很漂亮,操作起来很舒服,效果很炫,而不是打开后立刻就想关掉它。其实大受欢迎的开心网(各种插件)和twitter,甚至QQ空间等,都有RIA的身影。       好了,ArcGIS之所以在行业领先,特点之一就是它能紧跟计算机发展的趋势。ArcGIS Online就是那朵天边的浮云;JavaScript API,Flex API,Siverlight API就是ArcGIS自己RIA的三驾马车。       这里还得插一句,我觉得ArcGIS Server的主角本来是ADF,通过它我们可以完成一个无所不能的Server GIS。但在大多数情况下,GIS都是作为特定的业务嵌入在一些MIS中的,相比购买ADF这辆悍马来说,还是直接驾驭三套车跑的更轻快一些。       现在看看我们的主角。其实是ArcGIS API for Silverlight/WPF(以下专注Siverlight部分),那么Silverlight和WPF的关系如何呢?Silverlight原来叫WPF/E,E就是Everywhere,从命名可以看出它们的关系:Silverlight是WPF的一个子集。WPF是.NET Framework 3.0的组成部分之一,微软视其为下一代用户界面,总之很高档就是了(在Vista和Windows 7中看到的大量与XP不同的界面,就是WPF的身影);Silverlight可以看做是WPF在浏览器里的一个外挂,用于向网络用户展示自己的强大能力,由于受限于网络环境,所以是WPF的一部分核心功能。Siverlight的设计初衷是跨平台,跨浏览器的。       如果这些还是比较抽象,那么可以造一个排比句来进一步说明。之前先肯定一点,Flash现在在网络中的的主导地位。开始造句。Adobe有Flash,微软有Silverlight;Adobe有AIR,微软有WPF;Flex有mxml,Silverlight有xaml;Adobe有ActionScript,微软有Code-Behind(C#/VB.NET)或者JavaScript;Adobe有CS(包括Dreamweaver,Flash,Fireworks,Photoshop,Illustrator),微软有Expression Studio(包括Blend,Web,Design,Media,Encoder)。现在,能够看来Siverlight到底是何方神圣了吧?       最后再来说说ArcGIS这三驾马车(JavaScript API,Flex API,Siverlight API)。国外有人说,随着Siverlight API的推出,与Flex API一起,将会使JavaScript API慢慢退出历史舞台,因为前两者就是为RIA而生的。但其实也不然,随着Google和Mozilla工程师的推进,他们能够使JavaScript的执行速度提高非常多,Chrome就是例子。在这种背景下,一些非常cool的程序员会让古老的JavaScript获得重生。到底哪匹马跑得更快?别回答这种问题,赶紧挑一匹自己的马儿,快马扬鞭吧~~       在今年的ESRI开发用户大会上,一阵鼓声过后,ESRI隆重推出了ArcGIS API for Silverlight/WPF(beta)。接下来我将把自己在学习Silverlight API中的一些经历和大家分享,与大伙共同进步。