【Asp.net精品源码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了Asp.net精品源码-【精品】ArcGIS Server开发Web GIS新手体验 收藏 - 其它资料的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
ArcGIS Server 开发 Web GIS 新手体验 收藏原创作者:lt不详gt一、前述(原创作品网址:http://www.vscodes.com/article/3/2379.html)(以下针对于 windows 操作系统.net 开发环境 ArcGIS Server 是 ESRI 公司最新推出的服务器端品,主要可以实现两大功能: 1、强大的 Web GIS 系统的开发; 2、分布式 GIS 系统的开发; ArcGIS Server 其内核与 ArcGIS Desktop 和 ArcGIS Engine 一样,都是 ArcObjects 库。
其所谓的 Web GIS,其实无非就是用 Web 技术来封装 ArcObjects 而已;而分布式的开发则是通过 DCOM 来实现的。
小 弟 前 几 个 月 搞 了 一 下 ArcIMS , 发 觉 开 发 起 来 确 实 痛 苦 啊 , 整 天 就 是 折 腾javascriptarcxml,郁闷死了,听闻有 ArcGIS Server 这种好东西,稍稍了解一下,便向老板建议转向 ArcGIS Server,老板居然同意了。
于是便开发学习了。
网上四下里找了一下,发现可用的资源非常少,只好自己琢磨。
从零开始真不容易啊,这不,刚上手就碰到了两个问题,好在都已经解决,现在写下来,希望对和我一样的新手有所帮助。
ArcGIS Server 的安装非常简单,先安装 ArcGIS Server,然后安装 DotNet ADF,最后用ArcCatelog 添加一个 Server,然后再添加一个 ServerObject,这样就可以进行开发了。
这里的 ServerObject 与 ArcIMS 中的 Service 很像,其实应该是一个概念上的东西吧。
添加一个ServerObject 需要一个 mxd 或 pmf 文件,用来保存和管理需要发布的数据。
好了,现在可以开始开发了。
打开 Visual Studio 2003,打开新建项目对话框,发现 ESRI 公司已经为我们准备好了一些 ArcGIS Server Projects 的模板,包括 Map Viewer Web Application,Page Layout WebApplicaiton 等等,我们就建一个 Map Viewer Web Application 吧,选中它,输入项目名称,然后点击“确定”按钮,我们发现一个已经包含了基本数据浏览和查询功能的 Web GIS 程序已经建好了。
好, 打开 Default.aspx 文件,发现网页包含一个 Map 组件, 一个 Toolbar 组件,一个 TOC组件,一个 OverviewMap 组件等等。
看来与 C/S 开发模式下很像嘛,爽啊。
其中 Map 组件和 OverviewMap 组件有两个必填属性: Host 和 ServerObject,就分别对应着我们在 ArcCatelog中添加的的 Server 和 ServerObject,输入它。
然后设置 TOC 组件和 Toolbar 组件的 Buddy 属性,OK,大功告成! 运行!咦,发生错误,定睛一看,原来是访问拒绝,这是怎么回事呢?记得以前看到一篇文章,说在
Asp.net 中使用 COM 组件, 经常由于权限原因, 而 产生访问拒绝, ArcGIS Server本身就是对 ArcObjects 这些 COM 组件的再封装,看来就是这么回事了。
找出这篇文章来,原来要在 Web.config 中加入一行就可以了: ltidentity impersonatequottruequot userNamequotAdministratorquot passwordquot123456quot/gt 再运行,哇塞,酷毙了,一个漂亮的 WebGIS 展现在眼前。
可以浏览,查询,图层管理,鹰眼导航,还有指北针... 后来发现页面上还一个组件叫 impersonation 没用上,看了一下它的属性,只有一个identity,点击它,你会发现...呵呵,原来这个组件就是用来干这个事的,晕,又浪费了我两个小时的宝贵时间... 一行代码都不用写,爽。
可是又很失落,心里没有底,这个 Web GIS 究竟是怎样实现的呢?二、开发讲解(一)(原创作品网址:http://www.vscodes.com/article/3/2380.html) 我们知道,.Net ADF 提供的 map 组件、toc 组件等都是标准的
asp.net 组件。
这些组件在运行时,会生成相应的 html 代码,将自己展现出来。
一般还会通过 ViewState 来保存状态,并生成_doPostBack(javascript函数,在必要的时候,通过 javascript 来调用该函数,将客户端数据返回来服务器端,从而激发服务器的响应。
总之,我们通过分析生成的 html 页面,应该可以大致窥见
asp.net 组件是怎么运行的。
好,我们现在按 F5 运行首页,然后在浏览器中查看网页的源代码,赶快看下一吧: 1、首先会看到 IDMapIdClickstart 等 javascript 函数,这些函数是模板为我们生成的,在 default.aspx 文件中定义的。
ID 函数中有两行: var iddiv document.getElementByIdquotMapDiv_Map1quot if iddivnull iddiv.onmousedown MapIdClick 可以看到,这几个函数的作用是对地图的 Identify点击查询作出处理。
为什么要放在这里呢,为什么单单只有点击查询的 javascript 要在这里定义呢,其它如放大、缩小、平移为什么不在这里处理?这是因为 Toolbar 组件对放大、缩小、平移等提供了默认的处理方式,而 identify 没有,这样可以更方便进行扩展。
在后面的代码中有一行ltesri:Tool ToolTipquotIdentifyquot DefaultImagequotImages/identify.gifquot ClientToolActionquotIDquotNamequotIdentifyquot...gt,可以看到,这个调用是模板为我们生成的(并且这个调用是可以修改的)。
待会我们在进一步分析中可以看到这一点。
2、再向下,是几个隐藏域,其中包含__VIEWSTATE 隐藏域,还有__doPostBack 函数,这些是
asp.net 组件生成的,作用是向服务器提交数据,从而与服务器进行交互。
3、往下我们看到了一些引入 js 脚本文件的代码: ltscript languagequotJavascriptquotsrcquot/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/common.jsquotgtlt/scriptgt ltscript languagequotJavascriptquotsrcquot/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/map_functions.jsquotgtlt/scriptgt ltscript languagequotJavascriptquotsrcquot/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/overview_functions.jsquotgtlt/scriptgt ltscript languagequotJavascriptquotsrcquot/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/toolbar_functions.jsquotgtlt/scriptgt 可以看到,共引入了四个 js 脚本文件,这些文件的地址也比较奇怪,不是与当前网站在 同 一 个 虚 拟 目 录 下 , 而 是 在http://localhost//aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript 目 录 下 。
在c:/inetpub/webroot/aspnet_client/esri_arcgis_server_webcontrols/9_1/JavaScript/文件夹下可以找到这些文件。
原来,为了重用的方便,在安装 Arcgis Server 时,安装程序就已经建立了一个虚拟目录,用于提供这些共享的资源。
在这个文件夹上一级目录中,还可以看到 images 和treeimages 两个子目录,以及 treeview.htc 文件。
知道了这些 javascript 文件的藏身之所,各位可以把这些 javascript 文件逐个看一遍,可以发现其作用主要是与浏览器进行交互。
4、再往下,是 TOC 组件的 Html 代码,代码片断如下: lttvns:treenode ExpandedquotFalsequot DefaultStylequotcolor:silverquotImageUrlquot/aspnet_client/esri_arcgis_server_webcontrols/9_1/images/outscale.gifquotCheckBoxquotFalsequotgt 道 路 注 记 lttvns:treenode ExpandedquotTruequotImageUrlquotESRI.Web.Controls.MIMEImage.aspxImgIDDefault.aspx_Toc1_0_1_0_0ampNoCachetruequotgtlt/tvns:treenodegt 这一段代码有一个特别之处就是 ImageUrlquotESRI.Web.Controls.MIMEImage.aspx...quot,这个 ESRI.Web.Controls.MIMEImage.aspx 是什么东东, 是一个网页吗?在机器里找一下, 发现根本就不存在这个网页, 那它又是何方神圣, 竟然可以作为一个图片的地址?我们先往下看看。
5、ltdiv idOverviewMap1backdrop style position: absolute left: 16px top: 400pxwidth:204px height:124pxZ-INDEX:104 border-color:LightSteelBlue border-width:3px border-style:Solidoverflow:hiddengtlttable cellspacing0 cellpadding0 style width:198px height:118pxoverflow:hiddengtlttrgtlttd idOVCell_OverviewMap1gtlt/tdgtlt/trgtlt/tablegtlt/divgt 是鹰眼导航图的代码。
怎么只有一个空的 Div 层和一个空的表格呢?唉,比较简单,我懒得分析了,同志们自己去找吧~ 6、再往下是 Toolbar 组件的代码,没什么特别的:lttd nowrap widthquot29quot height quot32quot alignCenter idquotToolbar1ZoomInquot onMouseDownquotToolbarMouseDown Toolbar1 ZoomIn Tool eventquot onMouseOverquotToolbarMouseOverToolbar1 ZoomInquot onMouseOutquotToolbarMouseOut Toolbar1 ZoomInquot stylequotbackground-color:LightSteelBluefont-family:Arialfont-size:Smallerfont-weight:boldquot gtltimg idquotToolbar1ZoomInImagequot altquotZoom Inquot srcquotImages/zoominD.gifquotalignquotabsMiddlequotgtlt/tdgt 7、再下面是生成地图组件的代码:ltscript languagequotJavaScriptquot idquotcs_dynamic_Map1quotgtMapsmapCounter newMapCreationMap10mapCounter00502378MapDiv_Map1Black2mapURLmapCounter quotESRI.Web.Controls.MIMEImage.aspxImgIDDefault.aspx-Map1ampct5quotMakeMapDivmapCounterMap1ESRI.Web.Controls.MIMEImage.aspxImgIDDefault.aspx-Map1ampct5MapCell_Map1mapCounterMapDragRectangleMap1ZoomIn truelt/scriptgt 又看到了 MIMEImage 这个东东!它究竟是什么东东呢? 如果对
asp.net 不是很熟悉的话,要破解这个秘密可能确实比较困难。
在
asp.net 中,所有的请求,都是通过 httpHandler 来进行处理的。
那 httphandler 又是什么东东呢?其实只要实现在 IHttpHandler 接口的类,都可以作为一个 HttpHandler。
在web.config 或 machine.config 文件中,可以定义哪些请求可以由哪个 httphandler 来处理。
查看一下 web.config 文件,没有这些声明。
那就看一下 mapchine.config 文件吧,这个文件在WINDOWSMicrosoft.NETFrameworkv1.1.4322 目 录 下 , 用 记 事 本 打 开 它 , 查 找ESRI.Web.Controls.MIMEImage.aspx,好家伙,果然在这里啊! lthttpHandlersgt ltadd verbquotquot pathquotESRI.Web.Controls.MIMEImage.aspxquottypequotESRI.ArcGIS.Server.WebControls.ImageHandler ESRI.ArcGIS.Server.WebControlsVersion9.1.0.722 Cultureneutral PublicKeyToken8fc3cc631e44ad86quot/gt 原 来 ESRI.Web.Controls.MIMEImage.aspx 请 求 是 能 过 在ESRI.ArcGIS.Server.WebControls.ImageHandler 来处理的。
Visual Studio 中, 使用对像浏览器查看一下 esri.arcgis.server.webcontrols.dll 文件,可以看到 ImageHandler 类,果然实现了IHttpHandler 接口。
呵呵,其实很简单嘛,我们也完全可以自己写一个类,来执行自定义的请求。
三、开发讲解(二)(原创作品网址:http://www.vscodes.com/article/3/2381.html) 在(二)中我们分析了 HTML 代码,也就基本弄清了.net adf 怎样封装客户端的交互,以及客户端怎样与服务器端进行交互。
下面我们再看一看服务器端的开发方式是怎样的, 实际是就是进入了比较简单的实战。
用其它工作开发 Web GIS 的朋友如果能够了解一下 AGS的实现,一定会有很的大启发,你会在其中学到一些封装客户端、服务器端以及两者交互的技巧,怎样做到既封装一些常用的功能,又不妨碍我们进行功能的扩充。
好了,废话少说,开始我们新的体验吧。
在(一)中我们已经说了,.net adf 提供了一系列的模板,这些模板又根据不同的需要,封装了一些常用的功能。
我们的开发一般是从这些模板开始的。
如果我们对这些模板生成的程序已经很熟了,当然也可以不需要这些模板,但如果你是新手,请从模板开始,这样可以避免走很多弯路。
首先,我们启动 Visual Studio 2003,新建一个项目,在新建对话框中,在“项目类型”中可以看到 ArcGIS Server Projects 这一项,选择语言 Visual C,在右边的模板列表中可以看到有七种模板可供选择,每种模板可用于新建不同用途的应用,如下图所示: 我们先新建一个 Map Viewer Web Application,也就是地图浏览程序。
我们待会通过分析可以看到这个地图浏览程序是怎样实现的,以及怎样扩充自己的功能。
新建了一个 Map Viewer Web Application 之后,界面如下图所示。
可以看到,.net 为我们新建了一个
asp.net web 工程。
工程包括三个页面,default.aspxerrorpage.aspx 和identify.aspx。
其中,default.aspx 是主界面,errorpage.aspx 用于出错信息的显示,identify 用于点击查询操作的结果的显示。
下面我们主要分析 default.aspx 这个网页。
这个网页的的上部分是一个 banner,不用管。
下部分由七个
asp.net 组件构成。
这七个组件分别是: 1、Map 组件:地图组件。
有两个关键属性:Host 和 ServerObject,不用我说,也知道这是什么意思。
2、Toc 组件:图层控件组件table of contents。
有一个关键属性 BuddyControl,即与哪个 Map 组件相关联。
3、Toolbar 组件:工具条组件。
有一个关键属性 BuddyControls,表示可以绑定多个 Map 组件或 PageLayout 组件。
4、OverviewMap 组件:导航图组件。
有三个关键属性 Host,ServerObject 和BuddyControl。
5、Impersonation 组件:身份验证组件。
有一个关键属性 identity,用于设计怎么登录到服务器,拥有操作的权限。
6、NorthArrow 组件:指北针 7、ScaleBar 组件:比例尺组件,有一个关键属性 BuddyControl。
BarFont 属性好像有Bug,怎么设置也不起效,字体总是很小,不知为什么,哪位朋友也帮俺一个忙,看看怎么回事? 这七个组件中,显然 Map 组件最为重要,因为它负责地图显示并与用户交互。
我们看一下 Map 组件有的事件,只有 MapChanged 的事件包含代码,仔细看一下,是与视图(地图范围)保存相关的代码。
那 Map 组件与用户交互以及服务器端的处理代码,如缩放地图,在哪里呢? 再看一看 Toolbar 组件,共包含七个按钮,分别是放大,缩小,平移,全图,上一视图,下一视图和点选。
点开它的 ToolbarItems 属性看一下,原来工具条按钮的定义都在这里面。
工具条按钮有两种类型:Tool 和 Command Tool:工具按钮。
表示点击后并不立即执行某项功能,而是需要用户与地图进行交互再执行。
所以需要保存它的状态。
并且同时需要有相应的客户端代码(javascript和服务器端代码。
放大、缩小、平移和点选属于这种类型。
Command:命令按钮。
立即执行某项操作,不需要有户交互,所以不需要何存状态。
全图、上一视图、下一视图属于这种类型。
我们在 ToolbarItems 的定制界面中,选中 identify,看一下它的属性,包括五部份: 1、Appearance Images 组:定义按钮显示的图片。
这些设置会转化成 HTML 代码。
2、Appearance Text 组:有两个子项。
Text 表示在按钮中显示的文字,也就是说按钮可以由图片和文字两部份组成。
ToolTip,即鼠标放在按钮上面时显示的提示信息。
3、Client-side Action 组:这组只有一个属性,就是 ClientToolAction,这里就是与客户端交互的 javascript 代码了。
内容是 ID。
我们打开 defaut.aspx,查看 HTML,可以看到 ID函数的内容。
这里交互比较简单的情况,交互比较复杂,如放大时需要拉框,怎么封装?原来,Cient-side Action 实际上只是 javascript 中 onmousedown 的执行函数,拉框所需的onmousemove 和 omnouseup 去哪里找?其实只是一个小技巧而已,在 onmousedown 中动态地给 onmousemove 和 onmouseup 赋值不就可以了吗?事实上,.net adf 封装 zoomin 等操作就是这要样做的。
Client-side Action 属 性 有 一 个 下 拉 选 项 , 包 含 的 是 DragImage ,DragRectanglePointLinePolyLinePolygonCircleOvalnoneCustom。
不用解释,相信大家也明白了,是 Toolbar 组件封装了各种不同类型的客户端操作。
这些与客户端交互的 javascript在哪里呢?(二)中已经介绍了,这里就省略啦。
4、General 组。
包括 DisabledNameShowLoading 三个属性。
5 、 Server-side Action 组 : 有 两 个 属 性 , ServerToolActionAssembly 和ServerToolActionClass,用于定义服务器端要执行的功能。
在.net adf 中,每个被封闭的服务端操作,都是由一个类来实现的,ServerToolActionAssembly 表示这个类在哪个程序集中,ServerToolActionClass 就 是 这 个 类 的 名 称 。
我 们 在 ServerToolActionAssembly 中 选 择ESRI.ArcGIS.Server.WebControls , 可 以 清 楚 的 看 到 该 程 序 集 中 定 义 了 四 个 这 种 类 :MapCenterAtMapPanMapZoominMapZoomout。
事件上,我们也可以定义自己的处理类,只要实现 ESRI.ArcGIS.Server.WebControls.Tools.IMapServerToolAction 接口就可以了。
关于扩展: 1 、 客 户 端 交 互 : 即 Client-side Action 组 , adf 封 装 了 DragImage ,DragRectanglePointLinePolyLinePolygonCircleOval 这几种操作,相信已经能够应付我们绝大部份的应用了。
如果还不行,别忘了最后还有一项 custom,选中它,自己写 javascript就可以了。
记得是 onmousedown 的 javascript 哦。
在交互完毕后的代码中,如果需要返回到服务器端的话,记得执行_doPostback 函数。
2、服务器端功能实现:即 Server-side Action 组。
Map 组件针对客户端封装的每种行为,都提供了一个事件,表示客户端交互完毕后,立即执行该事件中的代码。
这些事件有OvalLinePointPolygon 等。
如果客户端操作是自己写的 javascript,并最后提交了操作到服务器的话,可以在 Page_Load 中处理你自己的操作。
上面介始的是 Tool 类型的工具条按钮。
至于 Command 类型的就简单多了, 我们可以选中 FullExtent 看一下,它的属性少了 Client-side Action 组和 Server-side Action 组。
它的实现代码就直接到 Toolbar 组件的 CommandClick 事件中。
自己去看吧。
其它组件就不介绍了。
说了这么多, 也基本明白了.net 相信您对用.net adf 开发 Web GIS 已经有一个大致的了解,adf 的封装方式,您已经可以开始偿试修改已有的功能,或者进行一些简单的扩展了。
下一节我就再介绍一下怎样进行简单的功能扩展。
四、开发讲解(三)(原创作品网址:http://www.vscodes.com/article/3/2382.html) 这一节主要贴代码算了,通过代码看一下一些简单功能的实现。
偶快要放假了,静不下心来写了,写得也不好。
说不定贴代码效果更好。
1、获取所有图层 ESRI.ArcGIS.Server.WebControls.WebMap webmap Map1.CreateWebMap try ESRI.ArcGIS.Carto.IMapDescription descr webmap.MapDescription ddlLayers.Items.Clear int id for int i0ilt descr.LayerDescriptions.Count-1i id descr.LayerDescriptions.get_Elementi.ID ddlLayers.Items.Addid.ToString quotquot webmap.LayerNameFromIDid//ddlLayers 是一个 DropDownList 控件 if ddlLayers.Items.Countgt0 ddlLayers.SelectedIndex0 finally webmap.Dispose 2、通过图层的 ID 获取图层对象 private IFeatureLayer GetFeatureLayerint lyid WebMap webmap Map1.CreateWebMap try ILayer layer webmap.MapServer asIMapServerObjects.get_Layerwebmap.DataFramelyid if layernull return null else return layer as IFeatureLayer finally webmap.Dispose 3、新建一个多边形 private void Map1_Polygonobject .
上一篇:
[精品论文]试卷分析系统的实际与实现毕业论文
下一篇:
项目上钢结构工程的运营管理