ArcGIS API for Silverlight updated
Silverlight API升级了,但还在继续它的beta之旅(Build 209,之前是Build 160),看来要修正的地方真不少。 除了新出一个OverviewMap的widget,改进了Magnifier widget(减轻使用时的服务器负担),还允许在Map控件初始化的时候根据Extent来动态投影地图,这与Flex API是一样了……具体的变化请看这里。
世界上最好的SUV,就是自己的两条腿
Silverlight API升级了,但还在继续它的beta之旅(Build 209,之前是Build 160),看来要修正的地方真不少。 除了新出一个OverviewMap的widget,改进了Magnifier widget(减轻使用时的服务器负担),还允许在Map控件初始化的时候根据Extent来动态投影地图,这与Flex API是一样了……具体的变化请看这里。
通过上一节学习,可以看出在Silverlight API中不仅可以轻松使用ArcGIS Server 9.3发布的地图服务,也可以通过继承相应的图层,引入其他的数据源,比如ArcGIS Server 9.2发布的地图服务,WMS服务,或者其他免费的数据。本节就通过一个实例,来看看如何将Google Map作为底图数据。 Google Map是经过缓存的数据,所以需要继承的是TiledMapServiceLayer。那么在扩展这个图层的时候需要做哪些工作呢?首先就要明白地图缓存的原理。可以看出我们继承的这个图层,需要收集到以下几个信息:1、Tiling Scheme Origin;2、切图的范围,也就是FullExtent;3、SpatialReference;4、TileInfo,包括切图的大小,级数,以及每级的Resolution;5、最后就是重写GetTileUrl方法。 这是为什么呢?可以想象,当地图控件的范围改变时,能够获取到当前范围的信息,那么只要把左上角和右下角之间的Tile全部按顺序显示出来就行了。由前面的文章可以看出,当图层获取了1、2、3、4四个信息后,图层完全可以自动计算出所需的Tile,最后根据GetTileUrl方法取回这些Tile显示出来即可。 那么对于Google Map的前4个参数,如何取得呢?记得在Catalog中做缓存时,有一个Load Tiling Scheme from Google Map吗?按照这个Tiling Scheme将一个地图服务做缓存,然后查看它的conf.xml和Service Directory,便完全可以取得这几个参数了。另外关于如何获取Google Map的缓存,网上已经有非常多方法,这里就不再讨论了。 代码如下:public class GoogleMap:TiledMapServiceLayer { public override void Initialize() { this.FullExtent = new ESRI.ArcGIS.Geometry.Envelope(-20037508.342787,-20037508.342787,20037508.342787,20037508.342787);//(-180, -85.0511287798066,180, 85.0511287798066) { SpatialReference = new ESRI.ArcGIS.Geometry.SpatialReference(102113); }; this.SpatialReference = new ESRI.ArcGIS.Geometry.SpatialReference(102113); //this.InitialExtent = this.FullExtent; this.TileInfo = new TileInfo() { Height = 256, Width = 256, Origin = new ESRI.ArcGIS.Geometry.MapPoint(-20037508.342787, 20037508.342787)//Origin = new … Continue reading ArcGIS API for Silverlight开发入门(7):使用非AGS数据源的图层
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。
我们与地图交互的过程时刻在进行着:一个拉框放大操作,或者对地图内容的查询等。这些交互过程中的输入输出,通常都是反映在独立于地图数据一个“层”上。比如拉框放大,我们能看见鼠标所画的一个矩形;又比如对兴趣点的查询,结果通常是将符合条件的兴趣点的形状高亮显示在那个独立的“层”中,通过它既可以反映用户的输入,又可以展现地图的输出。这个“层”就是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
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
这一节来对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
你用上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中的一些经历和大家分享,与大伙共同进步。
http://resources.esri.com/arcgisserver/apis/silverlight/ ESRI已推出for silverlight api的beta版,这让我们的开发又多了一种选择:javascript apiflex apisilverlight api========java api.net api 引用James Fee blog上一句话:Looks simple enough to leverage and I’m guessing since Microsoftdevelopers are in love with Silverlight, it won’t be long before theJSAPI is pushed aside. 最直接的感受就是比javascript和flex api的地图要平滑许多。相信RIA在silverlight上会有更好的表现。和flex要一较高下了 enjoy~~~ vista系统之外要安装silverlight插件,和flash一样,装吧
为什么要在ArcGIS Server的程序中来连接GIS Server呢?通常有两个理由:1、连接后,创建ServerContext,之后创建更多的AO对象,从而在程序中调用AO来工作;2、连接后,可以用来管理GIS Server,比如重新启动某个服务。 先解释两个概念。这里所说的ArcGIS Server程序是指利用了GIS Server上资源的程序,包括了Desktop Application,Engine Application,但最常见的还是Web Application;要调用AO来服务自己的AGS程序,就必须通过局域网直接连接到SOM机器,因为ArcObjects实际上寄存在SOC机器上,而我们是不能与SOC直接打交道的,只能通过SOM来完成这项工作(通过Internet连接的方式只能连接到Web Server)。 好了,要通过程序来连接到GIS Server,主要有两个对象可以使用:ESRI.ArcGIS.Server.GISServerConnection(实现了IGISServerConnection2接口)和ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection。前者是com对象,后者是原生的.net对象。 先来看ESRI.ArcGIS.Server.GISServerConnection。使用方法如下:ESRI.ArcGIS.Server.IGISServerConnection2 pGISSC = new ESRI.ArcGIS.Server.GISServerConnectionClass();pGISSC.Connect(“yourservername”);ESRI.ArcGIS.Server.IServerObjectAdmin pAdm = pGISSC.ServerObjectAdmin;注意,要成功获得pGISSC.ServerObjectAdmin属性得有一个前提条件,就是运行当前AGS程序(注意看前面对AGS程序的解释)的用户必须是agsadmin组里的成员。那么接下来就可以通过IServerObjectAdmin来对GIS Server进行管理了;如果运行当前AGS程序的用户只是agsuser组里的成员,那么你只能获得ServerObjectManager,从而通过IServerObjectManager来创建AO对象,但是不能对GIS Server进行管理;如果运行当前AGS程序的用户既不是agsuser成员也不是agsadmin成员,那么在connect的时候就会报错了。可以看出ESRI.ArcGIS.Server.GISServerConnection对象不能显式指定连接GIS Server的用户。那么连接GIS Server的用户身份很重要吗?下面通过Web Application来说明一下。 新建一个website,在其中使用如上的代码,调试,通过;将网站发布,浏览,将会出现“拒绝访问”的错误。这正是因为连接GIS Server的用户身份发生了变化。在VS中调试的时候,调用的是VS自带的ASP.NET程序,而不是IIS中的ASP.NET。如下图:可以看出,调试的进程是以系统管理员身份运行的,而通常在安装完AGS后会将系统管理员添加到agsadmin组中;网站发布后,web app运行在IIS进程中,而IIS进程通常以ASPNET账户身份运行,正常情况下,这个账户当然既不属于agsadmin也不属于agsuser了。 同理,如果是Desktop或者Engine的程序,在调试阶段和上面的情况是一致的,如果程序部署到了其他机器上,那么就得考虑一些添加用户的工作了。 下面再来看ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection。这是ADF中的.net对象,通常推荐使用这个对象来进行连接工作,因为它可以指定使用特定的账户身份来连接GIS Server,就是下面的Identity:ESRI.ArcGIS.ADF.Identity identity = new ESRI.ArcGIS.ADF.Identity(“yourusername”, “yourpassword”, “yourdomain”); ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection agsconnection = new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection(“yourgisservername”, identity); agsconnection.Connect(); ESRI.ArcGIS.Server.IServerObjectAdmin pAdm = agsconnection.ServerObjectAdmin;同样的,要成功获得pAdm,Identity中指定的用户必须是agsadmin成员。如果你的网站,在调试时可以运行,而发布后“拒绝访问”,那么首先检查web.config的identity,如果使用了以上代码,请确保使用的user在正确的用户组中。 再来看看这个Identity与web.config中的identity属性的区别。1、此处的Identity优先级比web.config中的identity属性要高。举例说明,如果在VS中已经做过Add ArcGIS Identity,添加了一个agsuser成员,那么可以在此处用agsadmin成员来连接GIS Server,依然可以获得对SOM机器的管理权限。2、web.config中的identity是在process级别上的impersonation,而此处的Identity是thread级别上的impersonation。如果服务是pooled,low isolation,那么并发请求发生时,会有多个instance运行在同一进程中,而这些instance(thread)就可以通过上面的Identity来以不同用户身份对GIS Server进行连接了。例如:public partial class _Default : System.Web.UI.Page{ private UserThread m_thread; protected void Button1_Click(object sender, EventArgs e) { m_thread = … Continue reading 在ArcGIS Server程序中连接GIS Server的注意事项
在ArcGIS Engine中,如果要调用ESRI自带符号库中的一个符号,比如图中的ColorRamp: 可以利用以下代码来得到: IStyleGallery pSG=new ServerStyleGalleryClass(); pSG.ImportStyle(“ESRI.ServerStyle”); IEnumStyleGalleryItem pESGI = pSG.get_Items(“Color Ramps”, null, null); IStyleGalleryItem pSGI=pESGI.Next();while(pSGI!=null){if(“Pastels”==pSGI.Name)//pastels是该colorramp的名字break;pSGI=pESGI.Next();}IColorRamp pColorRamp=pSGI.Item as IColorRamp;… 但在AGS中发现,执行完IStyleGalleryItem pSGI=PESGI.Next();后,pSGI始终为null,但pSG.ClassCount却为22,表明已经导入了符号库文件,原因后面。但pSG.get_Items()方法执行时也不报错,且在engine下都没有问题……最后发现,在pSG.get_Items()之后,pESGI.Next();之前,插入一句pESGI.Reset()问题就解决了,比较无厘头。