ArcGIS Server Java ADF 案例教程 41

第一章 扩展ArcGIS Server

这一章其实和ADF已经没有太大关系了,在ArcGIS的帮助里也是在ArcGIS Server开发章节里。考虑到使用ADF开发的一般对功能要求比较多一点,所以对于怎么扩展ArcGIS Server可能比较关心,反正ADF差不多也讲完了,这一章就算是一个结束吧。

从9.3.1开始,ArcGIS Server提供了Java开发者更多的可扩展性。通过扩展ArcGIS Server可以使某些自定义的功能更加完善和强大、使你的某些工作可以更加模块化并和ArcGIS Server很好地结合在一起。下面让我们来看看ArcGIS Server可以通过什么样的途径进行扩展。

一 Utility Objects

Utility Objects主要是为了提升ArcGIS Server在Local方式连接下某些操作的性能而准备的。在此之前,让我们首先去了解一些ADF调用服务器端AO对象的过程和特点。

image

图 29 ADF调用服务器端对象的过程

如图 29所示,当用户发生请求的时候,ADF首先会和SOM交互(图中1);SOM将根据服务器情况分配一个SO用以处理这个用户的请求,同时返回这个SO的代理(proxy)给ADF(图中2);然后,ADF就会通过这个代理和服务器的SO进行交互(图中3,注意,这是ADF应用和GIS服务器之间的交互,是跨进程的);当请求完成后,ADF释放相应的资源供其它用户使用(图中4)。

跨进程的调用会消耗比较多的系统资源,响应速度较慢;当ADF应用和GIS服务器分开部署的时候,还有相应的网络开销。因此,当你的ADF应用中有大量细粒度操作,频繁地对服务器端AO对象进行调用的时候,性能会非常低下。Utility Objects就是为了解决这个问题而诞生的。

Utility Objects的原理就是把上述分别属于ADF和GIS服务器两个进程中的操作合并到一起,都放到ArcGIS Server中执行,这样可以极大地减小进程间通讯的开销。在实现上Utility Objects也并不复杂,你只需要把原来直接在ADF中实现的功能,封装到一个实现了自定义接口的类中,然后在ADF中调用这个自定义的功能类就可以了。下面让我们看一下这个大体的流程,在ArcGIS Server帮助中有这样一个例子:把计算一个FeatureLayer中所有多边形面积总和的功能封装成一个Utility Object。

首先,我们需要定义一个接口ICalculateArea,并使用CalcAreaUtil类来实现这个接口,注意,Utility Object的接口和类都需要使用“@ArcGISExtension”注记来声明:

@ArcGISExtension

public interface ICalculateArea

{

public double calculateArea(IFeatureLayer featureLayer)

throws IOException, AutomationException;

}

@ArcGISExtension

public class CalcAreaUtil implements ICalculateArea

{

public double calculateArea(IFeatureLayer featureLayer)

{

double totalArea = 0;

IFeatureClass featureClass = featureLayer.getFeatureClass();

int numFeatures = featureClass.featureCount(null );

IFeatureCursor featureCursor = featureLayer.search(null , true );

IFeature feature = null ;

Polygon polygon = null ;

for (int i = 0; i < numFeatures; i++)

{

feature = featureCursor.nextFeature();

polygon = (Polygon)feature.getShape();

totalArea += polygon.getArea();

}

return totalArea;

}

}

有两种方法可以部署这个Utility Object,当然,作为一个懒人我比较倾向于选择相对简单、绿色的方法:将上面实现的这个类编译成jar包,再将这个jar包复制到服务器上的 %ARCGISHOME%/java/lib/ext 目录下。另外一种复杂一些,而且让我觉得有点脏兮兮的方法,有兴趣的可以到帮助文档中寻觅一下。

好,下面我们就可以使用这个Utility Object了:

IFeatureLayer featureLayer = mapServer.getLayer(" ", 2);

ICalculateArea calArea = (ICalculateArea)

com.esri.arcgis.server.ServerContext.createObject(CalcAreaUtil.class );

double totalArea = calArea.calculateArea(featureLayer);

在这段代码中我们看到,调用“计算一个FeatureLayer中多边形总面积”的功能全部由一个GIS服务器端的CalcAreaUtil类实现,ADF中只需要使用IServerContext来实例化这个类,再调用它相应的方法即可。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值