ArcGIS Server 9.3 开发小记

最近项目告一段落了。项目采用的是 ArcGIS Server 9.3 平台来作开发,AGS 9.3 版本比以前增加了很多有用方便的特性,但是网上的相关资料好像特别的少。所以我把我遇到的问题整理出来,以备参考。

 

1. 数据导入
ArcGIS Server 要用 Oracle 作数据库的话必须要用到 ArcSDE。如果将 shp 文件用 ArcCatalog 中的 Import -> Feature Class 的功能导入的话,上传到数据库中的数据不能在原有数据的范围外加入新图元。当试图用 ArcMap 在原来的范围外部新增图元的话,会出现下图中的错误提示(图001):The coordinates or measures are out of bounds。这给项目造成诸多的不便,比如要想先导入一个县的 shp 数据导入成数据库中的 xian 表,过后再将其它县的 shp 数据也导入到这个 xian 表中就不可能了(县与县的数据是不重叠的)。

001

 

主要原因是从 shp 导入的数据时,程序会计算它的范围(XY Domain),所以导入后的数据就定死是这个范围了(图002)。

002


如果先用 ArcCatalog 中的 New -> Feature Class 的功能新建一个 Domain 非常大的表,这样一个表就可以作任何的编辑,就可以先导入一个县的数据再导入其它县的数据了。只要在 New -> Feature Class 功能的选项中钩上 Accept default resolution and domain extent 就可以。同时还可以在建立属性表结构时,使用 Import 的功能将原有的 shp 文件中的属性表结构方便的导入进来。

 

 

2. ArcSDE 的数据版本化(Versioned)和历史归档(Achiving)
在 ArcSDE 中的数据只有 Versioned 的才能被编辑,可以用 ArcCatalog 中的 Registed As Versioned 功能来使某个表变成 Versioned 状态。如果对某个表使用 Achiving -> Enable Achiving 功能还可以将增加历史归档的功能,就是会在每次对图元编辑后都保存下这个过程的变化量,使得可以查看编辑前的任何状态。

 

做了历史归档之后,可以方便的查询到数据表在任何时间点的现状,代码如下:

 

 

 

3. 开发过程中新建远程 AO 对象
由于 ArcGIS Server 中的 ArcObjects 由 SOC 统一管理,所以在代码中不能直接用 new 来生成新对象,要使用 CreateObject() 函数。比如:

 

 

如果在需要使用 CreateObject() 创建对象时使用了 new 来创建,服务器就会返回 Exception from HRESULT: 0x800706BA 错误。

 

 

4. AO 对象与 ADF 对象的转换(.net 版本)
有时候需要将 AO 对象转换成 ADF 对象,或反过来。比如想要实现:

 

 

由于 Map 的 Zoom() 函数的参数是要求 ESRI.ArcGIS.ADF.Web.Geometry.Geometry 类型,而 feature.Shape.Envelope 的类型是 ESRI.ArcGIS.Geometry.IGeometry.IEnvelop,所以编译无法通过。前一个是 ADF 对象,后一个是 AO 对象,这种情况下就要转换。在 9.3 版本中使用 ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter 来进行这样的转换。Converter 中有大量实用的函数,可以把 AO 对象转换成 ADF 对象、把 ADF 对象转换成 AO 对象等。上述代码改成:

 

5. 在显示图层中加入 Where 语句
一般情况下会把全市的数据都导入到一个表中,但是在显示时得根据用户所有区域和权限限制用户可看到和可操作的内容。比如县长只能看到和操作本县的数据。因此需要像 SQL 语句中那样用 Where 条件来限定。在 ArcGIS Server 开发中的使用方法如下:

 

加入限制条件后效果如下(图003):

003


6. 添加、删除 EditorTask 中的主工具栏
主工具栏上面有一些工具是自己不想要的,比如“选择”工具、“加点”工具,可以用如下的方法删除它们。
见图 004。

004

 

7. 自定义 EditorTask 中的“保存”命令
“保存”也是 Editor 中的工具栏命令,所以只要在 EditorTask 的 PreCommandExecute 事件中处理。

 

 

8. 在 EditorTask 中添加自定义工具面板

 

9. 向 ToolBar 中的 Command 动作传递自定义内容
想要实现的功能是:页面上有一个 HTML 的 TextBox,点 Toolbar 上的某个 Command 后,读取 TextBox 的值传给后台处理。

 

esri:Command 里面有一个 ClientAction 的参数,如果这个参数设有值就执行这个自定义的函数,否则执行内定的函数。ADF 的 ESRI.ADF.UI.Toolbar.debug.js 中可以看到它的内定函数 function ToolbarMouseDown(toolbarName, toolbarItemName, buttonType, e){},我们可以仿照这个函数的内容,加入读取 TextBox 的值再一起传到后台的方法。如下:

 

然后给自定义的 Command 命令加上参数 ClientAction="fun('Toolbar1', 'Command1', 'Command', event)"

 

由于这些参数是和 ASP.net 自有的各种参数一起 Post 到处理页面的,所以直接 Request.From["myvalue"] 是取不到的。上面 arg 变量里面的参数是作为一个字符串存在于 Request.Form["__CALLBACKPARAM"] 里面,比如是:"eventArg=Command&ControlID=Toolbar1&ControlType=Toolbar&PageID=/WebSite2/Default2.aspx&myvalue=2009-1-1 9:55:00"。这时再把这个字符串按照 & 号拆解开就可以用了。在网上搜到一个非常实用的函数可以把这个字符串拆开。

 

用的时候就可以:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值