在现实应用中,用户经常会需要用地理数据形成专题图。
ArcIMS用户会发现在用
ArcIMS Author定制地图服务时,并不能象在
ArcMap中那样通过定制图层属性实现专题地图,而是需要通过
ArcIMS的客户端的开发接口来实现。下面就以在
ArcIMS的
HTML Viewer中实现专题图为例阐述这个问题。
1
、
HTML Viewer的文件组织结构
通常情况下,用
ArcIMS Designer生成地图服务站点以后,会形成上面的目录结构。在虚拟目录的根目录下会有
ArcIMSParam.js以及大量的
HTML页面。同时还会生成两个子目录:
JavaScript和
Images。如果要做专题图,还需要手工将
aimsClassRenderParam.js放在此根目录下,在
JavaScript目录下添加
aimsClassRender.js。
ArcIMSParam.js
文件包含大量的配置参数,可以通过调整里面的参数改变
Viewer的外观,例如
OverView窗口的位置,是否显示层信息,是否显示图例,是否显示指北针,指北针的形状等等。
HTML页面包含了页面元素在浏览器中显示的信息。
JavaScript目录下是
HTML Viewer的
JavaScript类库。类库中包含了大量的
JavaScript函数,
HTML Viewer就是通过这些函数和后台服务器进行交互的。
2
、 开发步骤
(
1)用一种网页开发工具在
Viewer.htm中加一个新框架
FieldlistFrame。如下图所示:
在
FieldlistFrame.htm中动态加入当前活跃图层的字段名以及几个功能按钮。字段名主要用来选择要做专题图的字段,功能按钮主要用来触发一些特定的功能,如生成饼图,生成直方图,显示图例等。
(
2)在
Viewer.htm中定义
FieldVisible数组,并初始化。
var FieldVisible=new Array(); //define a new array and initialize it.
for (var i=0;i<100;i++)
{
FieldVisible[i]=0;
}
FieldVisible保存了哪些字段用来做专题图,这样在刷新地图时字段信息不会被刷新。
(
3)设置当前活动层,并更新
FieldlistFrame中显示的字段信息。
在
toc.htm中,更改
setActiveLayer()函数,每次设置完当前活动层后,重新载入
FieldlistFrame中的内容
parent.FieldlistFrame.location.reload(); //refresh the content of FieldlistFrame.
这样,就保证了每次更改当前活动层时,当前字段值也会随着刷新。
(
4)在
MapFrame.htm中,在适当的位置加入如下两行:
<SCRIPT TYPE="text/javascript" LANGUAGE="JavaScript" SRC="javascript/aimsClassRender.js"></SCRIPT>
<SCRIPT TYPE="text/javascript" LANGUAGE="JavaScript" SRC="aimsClassRenderParam.js"></SCRIPT>
这样,当
MapFrame.htm被加入到浏览器中时,上面两个
JavaScript文件中的函数就被载入到当前页面中。
AimsClassRender.js中定义了一些做专题图时要用到的函数,
aimsClassRenderParam.js中定义了一些做专题图时要用到的参数,开发人员可以自己定义所需要的参数。
(
5)设置
aimsClassRenderParam.js文件。
AimsClassRenderParam.js文件需要用户根据实际情况手工编辑。
这里用的数据是
ArcIMS带的教学数据(
d:\Program Files\ESRI\ArcIMS3.1\Samples\Viewers\Data\SanFrancisco)。
在
aimsClassRenderParam.js中存放了一些做专题图时要用到的参数,如图层的名称。
(
6)在
aimsClassRender.js中加如两个函数:
function startChart_Bar()和
function startChart_Pie()
在这两个函数中设置
ClassRenderString[ActiveLayerIndex],使之等于一个
ArcXML字符串,这个字符串决定了地图的表现方法(分类,直方图,饼图等等)。然后调用系统提供的函数
sendMapXML()就可以向服务器发送
XML指令,并在客户端显示查询结果。
(
7)最终效果如下:
3.
总结:
HTML Viewer通过
sendMapXML()函数向空间服务器发出请求,在此过程中会触发
writeXML()和
sendToServer()函数。开发的关键就是以
writeXML()为线索,找出要客户化的地图元素,用程序生成相应的
ArcXML代码,然后调用
sendMapXML()函数向服务器发请求。返回的
ArcXML由
processXML()函数处理,用户不用更改此函数,就可以得到查询结果。
原文:http://www.cnblogs.com/gispeng/archive/2007/05/16/747988.html