ArcGIS Server Java--自定义tool

tool执行的过程需要与地图交互,而后再执行命令,从下面调用语句可以看出。

    <a:tool id="countFeature" defaultImage="images/selection.gif"
        hoverImage="images/ selection.gif"
        selectedImage="images/ selectionD.gif"
        clientAction="EsriMapRectangle"
        serverAction="com.demo.MyCountFeatureTool"
        clientPostBack="true" />

    其中,clientAction可参考com.esri.adf.web.faces.event中ClientActions接口,客户端支持的操作类型包括MAP_CIRCLE,MAP_CONTINUOUS_PAN,MAP_LINE,MAP_OVAL,MAP_PAN,MAP_POINT,MAP_POLYGON,MAP_POLYLINE,MAP_RECTANGLE

   指定clientAction后,我们需要编写serverAction对应的操作类。此处实现获取选择区域选中元素个数功能。


 

 

MyCountFeatureTool
import java.rmi.RemoteException;

import com.esri.adf.web.ags.ADFAGSException;
import com.esri.adf.web.ags.data.AGSMapResource;
import com.esri.adf.web.data.WebContext;
import com.esri.adf.web.data.geometry.WebExtent;
import com.esri.adf.web.faces.event.MapEvent;
import com.esri.adf.web.faces.event.MapToolAction;
import com.esri.arcgisws.EnvelopeN;
import com.esri.arcgisws.EsriSearchOrder;
import com.esri.arcgisws.EsriSpatialRelEnum;
import com.esri.arcgisws.MapServerPort;
import com.esri.arcgisws.SpatialFilter;

/**
* 计算选择区内选中元素个数
* 通过axis调用远程webservice的方式去调用服务器端的方法实现
*/
public class MyCountFeatureTool implements MapToolAction {

WebContext context
= null;
int countedFeatures;

private void countFeatures(WebExtent extent) {

AGSMapResource agsMap
= ((AGSMapResource) context.getResources().get("agsws1"));
MapServerPort mapServer
= agsMap.getMapServer();
// Make a new envelope from the web extent
EnvelopeN env = new EnvelopeN(extent.getMinX(), extent.getMinY(),
extent.getMaxX(), extent.getMaxY(),
null, null, null, null,null);

// Setup a spatial filter for an Intersection relationship
SpatialFilter spatialFilter = new SpatialFilter();
spatialFilter.setSpatialRel(EsriSpatialRelEnum.esriSpatialRelIntersects);
spatialFilter.setWhereClause(
"");
spatialFilter.setSearchOrder(EsriSearchOrder.esriSearchOrderSpatial);
spatialFilter.setSpatialRelDescription(
"");
spatialFilter.setGeometryFieldName(
"");
// Set the envelope as the geometry
spatialFilter.setFilterGeometry(env);

// MapServer::queryFeatureCount() executes on the server and can throw a
// RemoteException
try {
// Count features in 4th layer which intersect with the envelope
int layerId = 1;
this.countedFeatures = mapServer.queryFeatureCount(mapServer
.getDefaultMapName(), layerId, spatialFilter);

System.out.println(
"你选择了 " + countedFeatures + " 要素");
}
catch (RemoteException rme) {
throw new ADFAGSException(
"Could not execute MapServer::queryFeatureCount()", rme);
}
}

public void execute(MapEvent arg0) throws Exception {
try {
this.context = arg0.getWebContext();
WebExtent ex
= (WebExtent) arg0.getWebGeometry();
ex
= (WebExtent) ex.toMapGeometry(arg0.getWebContext().getWebMap());
this.countFeatures(ex);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}

 


MyCountFeatureTool2
import java.util.List;

import com.esri.adf.web.data.WebContext;
import com.esri.adf.web.data.geometry.WebGeometry;
import com.esri.adf.web.data.query.IdentifyCriteria;
import com.esri.adf.web.data.query.QueryResult;
import com.esri.adf.web.data.query.WebQuery;
import com.esri.adf.web.faces.event.MapEvent;
import com.esri.adf.web.faces.event.MapToolAction;

/**
* 使用WebQuery进行查询
*/
public class MyCountFeatureTool2 implements MapToolAction{

private static final long serialVersionUID = 1L;

public void execute(MapEvent event) {

//得到客户端绘制图形
WebContext ctx = event.getWebContext();
WebGeometry screenGeo
= event.getWebGeometry();
WebGeometry mapGeo
= screenGeo.toMapGeometry(ctx.getWebMap());

IdentifyCriteria ic
= new IdentifyCriteria(mapGeo);
WebQuery query
= (WebQuery)ctx.getAttribute("query");
List
<QueryResult> results=query.query(ic,query.getQueryLayers());
System.out.println(results.size());
}
}

 


 

 

 

WebQuery is a WebContextAttribute class used in a WebContext for querying attribute data and displaying related geometry objects spatially.

It is generally defined in the faces-config.xml of web applications. The following shows how it can be added as an attribute of the WebContext.


 <managed-bean>
   <managed-bean-name>mapContext</managed-bean-name>
   <managed-bean-class>com.esri.adf.web.data.WebContext</managed-bean-class>
   <managed-bean-scope>request</managed-bean-scope>
   <managed-property>
     <property-name>attributes</property-name>
     <map-entries>
      <map-entry>
        <key>query</key>
        <value>#{webappQuery}</value>
      </map-entry>
      ...
 

Below is the declaration of a WebQuery managed bean. Note the LayerDefinition managed beans being referenced below.


 <managed-bean>
   <managed-bean-name>webappQuery</managed-bean-name>
   <managed-bean-class>com.esri.adf.web.data.query.WebQuery</managed-bean-class>
   <managed-bean-scope>none</managed-bean-scope>
   <managed-property>
     <property-name>layerDefinitions</property-name>
     <list-entries>
       <value>#{arcgis_localmapgrid2_usa_2d_v_layer1}</value>
       ....
     </list-entries>
   </managed-property>
 </managed-bean>

参考:Server Java讲座--自定义Tools开发

    ArcGIS Server Java讲座-空间查询和高亮显示的实现

posted @ 2010-01-06 17:37  因是因非  阅读(550)  评论(0编辑  收藏  举报