- package com.esri.adf.web;
- import java.rmi.RemoteException;
- import java.util.Collection;
- import java.util.List;
- import java.util.Map;
- import com.esri.adf.web.ags.data.AGSLocalMapResource;
- 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.data.query.IdentifyCriteria;
- import com.esri.adf.web.data.query.QueryResult;
- import com.esri.adf.web.data.query.TextCriteria;
- import com.esri.adf.web.data.query.WebQuery;
- import com.esri.adf.web.faces.event.MapEvent;
- import com.esri.adf.web.faces.event.MapToolAction;
- import com.esri.arcgis.carto.IFeatureLayer;
- import com.esri.arcgis.carto.IFeatureSelection;
- import com.esri.arcgis.carto.IMap;
- import com.esri.arcgis.carto.IMapServer;
- import com.esri.arcgis.carto.IMapServerObjects;
- import com.esri.arcgis.carto.esriSelectionResultEnum;
- import com.esri.arcgis.geodatabase.Field;
- import com.esri.arcgis.geodatabase.ICursor;
- import com.esri.arcgis.geodatabase.IField;
- import com.esri.arcgis.geodatabase.IFields;
- import com.esri.arcgis.geodatabase.IRecordSet;
- import com.esri.arcgis.geodatabase.IRow;
- import com.esri.arcgis.geodatabase.ISelectionSet;
- import com.esri.arcgis.geodatabase.SpatialFilter;
- import com.esri.arcgis.geodatabase.esriSpatialRelEnum;
- import com.esri.arcgis.geometry.Envelope;
- import com.esri.arcgis.server.IServerContext;
- import com.esri.arcgisws.EnvelopeN;
- import com.esri.arcgisws.EsriSearchOrder;
- import com.esri.arcgisws.EsriSpatialRelEnum;
- import com.esri.arcgisws.MapServerPort;
- import com.esri.arcgisws.Record;
- import com.esri.arcgisws.RecordSet;
- public class ADFQuery implements MapToolAction {
- private static final long serialVersionUID = 713600076584099585L;
- WebContext context = null ;
- int c = 0 ;
- /*
- * WebQuery
- */
- private void test1(WebExtent extent) {
- AGSMapResource res = (AGSMapResource) context.getResources().get( "ags0" );
- IdentifyCriteria ic = new IdentifyCriteria(extent);
- WebQuery query = (WebQuery) context.getAttribute( "query" );
- List layer = context.getWebQuery().getQueryLayers();
- List results = query.query(ic, layer);
- for ( int i = 0 ; i < results.size(); i++) {
- QueryResult result = (QueryResult) results.get(i);
- result.highlight();
- Map map = result.getDetails();
- map.size();
- Collection col = map.values();
- Object[] obj = col.toArray();
- for ( int j = 0 ; j < obj.length; j++) {
- System.out.println(obj[j]);
- }
- }
- }
- /*
- * arcgisws.SpatialFilter
- */
- private void test2(WebExtent extent) {
- AGSMapResource res = (AGSMapResource) context.getResources().get( "ags0" );
- MapServerPort mapServer = res.getMapServer();
- EnvelopeN env = new EnvelopeN(extent.getMinX(), extent.getMinY(),
- extent.getMaxX(), extent.getMaxY(), null , null , null , null ,
- null );
- com.esri.arcgisws.SpatialFilter filter = new com.esri.arcgisws.SpatialFilter();
- filter.setSpatialRel(EsriSpatialRelEnum.esriSpatialRelIntersects);
- filter.setWhereClause( "" );
- filter.setSearchOrder(EsriSearchOrder.esriSearchOrderSpatial);
- filter.setSpatialRelDescription( "" );
- filter.setGeometryFieldName( "" );
- filter.setFilterGeometry(env);
- int layerId = 1 ;
- try {
- RecordSet rs = mapServer.queryFeatureData(mapServer.getDefaultMapName(), layerId, filter);
- Record[] rd = rs.getRecords();
- for ( int i = 0 ; i < rd.length; i++) {
- Object[] obj = rd[i].getValues();
- for ( int j = 0 ; j < obj.length; j++) {
- String s = obj[j].toString();
- }
- }
- } catch (RemoteException e) {
- e.printStackTrace();
- }
- }
- /*
- * geodatabase.SpatialFilter
- */
- private void test3(WebExtent extent){
- try {
- AGSLocalMapResource res = (AGSLocalMapResource) context.getResources().get( "ags0" );
- IMapServer mapServer = res.getLocalMapServer();
- IServerContext sc = res.getServerContext();
- Envelope env = (Envelope) sc.createObject(Envelope.getClsid());
- env.putCoords(extent.getMinX(), extent.getMinY(), extent.getMaxX(),
- extent.getMaxY());
- com.esri.arcgis.geodatabase.SpatialFilter filter = (SpatialFilter) sc
- .createObject(com.esri.arcgis.geodatabase.SpatialFilter
- .getClsid());
- filter.setGeometryByRef(env);
- filter.setSpatialRel(esriSpatialRelEnum.esriSpatialRelIndexIntersects);
- System.out.println( "---1--- " );
- int layerId = 1 ;
- IRecordSet rs = mapServer.queryFeatureData(mapServer.getDefaultMapName(), layerId, filter);
- IFields fds = rs.getFields();
- System.out.println( "---cnt2--- " + fds.getFieldCount());
- for ( int i = 0 ; i < fds.getFieldCount(); i++) {
- IField fd = (Field) fds.getField(i);
- System.out.println(fd.getName());
- }
- ICursor cursor = rs.getCursor( true );
- IRow row = cursor.nextRow();
- while (row != null ) {
- System.out.println( "------ " + row.getValue( 4 ));
- row = cursor.nextRow();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /*
- * IFeatureSelection
- */
- private void test4(WebExtent extent){
- AGSLocalMapResource res = (AGSLocalMapResource) context.getResources().get( "ags0" );
- IServerContext sc = res.getServerContext();
- IMapServerObjects mso = (IMapServerObjects) res.getLocalMapServer();
- IMap map;
- try {
- map = mso.getMap(res.getLocalMapServer().getDefaultMapName());
- IFeatureLayer fl = (IFeatureLayer) map.getLayer( 1 );
- Envelope env = (Envelope) sc.createObject(Envelope.getClsid());
- env.putCoords(extent.getMinX(), extent.getMinY(), extent.getMaxX(),
- extent.getMaxY());
- com.esri.arcgis.geodatabase.SpatialFilter filter = (SpatialFilter) sc
- .createObject(com.esri.arcgis.geodatabase.SpatialFilter
- .getClsid());
- filter.setGeometryByRef(env);
- filter.setSpatialRel(esriSpatialRelEnum.esriSpatialRelIndexIntersects);
- IFeatureSelection fs = (IFeatureSelection) fl;
- fs.selectFeatures(filter,esriSelectionResultEnum.esriSelectionResultNew, false );
- ISelectionSet ss = fs.getSelectionSet();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /*
- * TextCriteria
- */
- private void test5() {
- AGSMapResource res = (AGSMapResource) context.getResources().get( "ags0" );
- TextCriteria tc = new TextCriteria();
- tc.setSearchText( "北京市" );
- WebQuery query = (WebQuery) context.getAttribute( "query" );
- List layer = context.getWebQuery().getQueryLayers();
- List results = query.query(tc, layer);
- for ( int i = 0 ; i < results.size(); i++) {
- QueryResult result = (QueryResult) results.get(i);
- result.highlight();
- Map map = result.getDetails();
- map.size();
- Collection col = map.values();
- Object[] obj = col.toArray();
- for ( int j = 0 ; j < obj.length; j++) {
- System.out.println(obj[j]);
- }
- }
- }
- public void execute(MapEvent arg0) throws Exception {
- context = arg0.getWebContext();
- WebExtent ex = (WebExtent) arg0.getWebGeometry();
- ex = (WebExtent) ex.toMapGeometry(arg0.getWebContext().getWebMap());
- test5();
- System.out.println( "---ok---" );
- }
- }
package com.esri.adf.web; import java.rmi.RemoteException; import java.util.Collection; import java.util.List; import java.util.Map; import com.esri.adf.web.ags.data.AGSLocalMapResource; 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.data.query.IdentifyCriteria; import com.esri.adf.web.data.query.QueryResult; import com.esri.adf.web.data.query.TextCriteria; import com.esri.adf.web.data.query.WebQuery; import com.esri.adf.web.faces.event.MapEvent; import com.esri.adf.web.faces.event.MapToolAction; import com.esri.arcgis.carto.IFeatureLayer; import com.esri.arcgis.carto.IFeatureSelection; import com.esri.arcgis.carto.IMap; import com.esri.arcgis.carto.IMapServer; import com.esri.arcgis.carto.IMapServerObjects; import com.esri.arcgis.carto.esriSelectionResultEnum; import com.esri.arcgis.geodatabase.Field; import com.esri.arcgis.geodatabase.ICursor; import com.esri.arcgis.geodatabase.IField; import com.esri.arcgis.geodatabase.IFields; import com.esri.arcgis.geodatabase.IRecordSet; import com.esri.arcgis.geodatabase.IRow; import com.esri.arcgis.geodatabase.ISelectionSet; import com.esri.arcgis.geodatabase.SpatialFilter; import com.esri.arcgis.geodatabase.esriSpatialRelEnum; import com.esri.arcgis.geometry.Envelope; import com.esri.arcgis.server.IServerContext; import com.esri.arcgisws.EnvelopeN; import com.esri.arcgisws.EsriSearchOrder; import com.esri.arcgisws.EsriSpatialRelEnum; import com.esri.arcgisws.MapServerPort; import com.esri.arcgisws.Record; import com.esri.arcgisws.RecordSet; public class ADFQuery implements MapToolAction { private static final long serialVersionUID = 713600076584099585L; WebContext context = null; int c = 0; /* * WebQuery */ private void test1(WebExtent extent) { AGSMapResource res = (AGSMapResource) context.getResources().get("ags0"); IdentifyCriteria ic = new IdentifyCriteria(extent); WebQuery query = (WebQuery) context.getAttribute("query"); List layer = context.getWebQuery().getQueryLayers(); List results = query.query(ic, layer); for (int i = 0; i < results.size(); i++) { QueryResult result = (QueryResult) results.get(i); result.highlight(); Map map = result.getDetails(); map.size(); Collection col = map.values(); Object[] obj = col.toArray(); for (int j = 0; j < obj.length; j++) { System.out.println(obj[j]); } } } /* * arcgisws.SpatialFilter */ private void test2(WebExtent extent) { AGSMapResource res = (AGSMapResource) context.getResources().get("ags0"); MapServerPort mapServer = res.getMapServer(); EnvelopeN env = new EnvelopeN(extent.getMinX(), extent.getMinY(), extent.getMaxX(), extent.getMaxY(), null, null, null, null, null); com.esri.arcgisws.SpatialFilter filter = new com.esri.arcgisws.SpatialFilter(); filter.setSpatialRel(EsriSpatialRelEnum.esriSpatialRelIntersects); filter.setWhereClause(""); filter.setSearchOrder(EsriSearchOrder.esriSearchOrderSpatial); filter.setSpatialRelDescription(""); filter.setGeometryFieldName(""); filter.setFilterGeometry(env); int layerId = 1; try { RecordSet rs = mapServer.queryFeatureData(mapServer.getDefaultMapName(), layerId, filter); Record[] rd = rs.getRecords(); for (int i = 0; i < rd.length; i++) { Object[] obj = rd[i].getValues(); for (int j = 0; j < obj.length; j++) { String s = obj[j].toString(); } } } catch (RemoteException e) { e.printStackTrace(); } } /* * geodatabase.SpatialFilter */ private void test3(WebExtent extent){ try { AGSLocalMapResource res = (AGSLocalMapResource) context.getResources().get("ags0"); IMapServer mapServer = res.getLocalMapServer(); IServerContext sc = res.getServerContext(); Envelope env = (Envelope) sc.createObject(Envelope.getClsid()); env.putCoords(extent.getMinX(), extent.getMinY(), extent.getMaxX(), extent.getMaxY()); com.esri.arcgis.geodatabase.SpatialFilter filter = (SpatialFilter) sc .createObject(com.esri.arcgis.geodatabase.SpatialFilter .getClsid()); filter.setGeometryByRef(env); filter.setSpatialRel(esriSpatialRelEnum.esriSpatialRelIndexIntersects); System.out.println("---1--- "); int layerId = 1; IRecordSet rs = mapServer.queryFeatureData(mapServer.getDefaultMapName(), layerId, filter); IFields fds = rs.getFields(); System.out.println("---cnt2--- " + fds.getFieldCount()); for (int i = 0; i < fds.getFieldCount(); i++) { IField fd = (Field) fds.getField(i); System.out.println(fd.getName()); } ICursor cursor = rs.getCursor(true); IRow row = cursor.nextRow(); while (row != null) { System.out.println("------ " + row.getValue(4)); row = cursor.nextRow(); } } catch (Exception e) { e.printStackTrace(); } } /* * IFeatureSelection */ private void test4(WebExtent extent){ AGSLocalMapResource res = (AGSLocalMapResource) context.getResources().get("ags0"); IServerContext sc = res.getServerContext(); IMapServerObjects mso = (IMapServerObjects) res.getLocalMapServer(); IMap map; try { map = mso.getMap(res.getLocalMapServer().getDefaultMapName()); IFeatureLayer fl = (IFeatureLayer) map.getLayer(1); Envelope env = (Envelope) sc.createObject(Envelope.getClsid()); env.putCoords(extent.getMinX(), extent.getMinY(), extent.getMaxX(), extent.getMaxY()); com.esri.arcgis.geodatabase.SpatialFilter filter = (SpatialFilter) sc .createObject(com.esri.arcgis.geodatabase.SpatialFilter .getClsid()); filter.setGeometryByRef(env); filter.setSpatialRel(esriSpatialRelEnum.esriSpatialRelIndexIntersects); IFeatureSelection fs = (IFeatureSelection) fl; fs.selectFeatures(filter,esriSelectionResultEnum.esriSelectionResultNew, false); ISelectionSet ss = fs.getSelectionSet(); } catch (Exception e) { e.printStackTrace(); } } /* * TextCriteria */ private void test5() { AGSMapResource res = (AGSMapResource) context.getResources().get("ags0"); TextCriteria tc = new TextCriteria(); tc.setSearchText("北京市"); WebQuery query = (WebQuery) context.getAttribute("query"); List layer = context.getWebQuery().getQueryLayers(); List results = query.query(tc, layer); for (int i = 0; i < results.size(); i++) { QueryResult result = (QueryResult) results.get(i); result.highlight(); Map map = result.getDetails(); map.size(); Collection col = map.values(); Object[] obj = col.toArray(); for (int j = 0; j < obj.length; j++) { System.out.println(obj[j]); } } } public void execute(MapEvent arg0) throws Exception { context = arg0.getWebContext(); WebExtent ex = (WebExtent) arg0.getWebGeometry(); ex = (WebExtent) ex.toMapGeometry(arg0.getWebContext().getWebMap()); test5(); System.out.println("---ok---"); } }
内容摘要
使用ArcGIS Server java ADF开发,如果需要空间关系查询,可以有两种办法,
一种是通过com.esri.arcgisws.SpatialFilter这个包来实现,是一种SOAP的方式,
另外一种是使用传统的AO的方式实现:com.esri.arcgis.geodatabase.SpatialFilter注意两个包的命名一样,很容易混淆。
过程描述
第一种方式的代码如下:
- SpatialFilter filter = new SpatialFilter();
- String mapName=functionality.getMapDescription().getName();
- this .getWebContext().getWebGraphics().clearGraphics();
- WebPoint wPoint=(WebPoint)event.getWebGeometry().toMapGeometry(event.getWebContext().getWebMap());
- Geometry geom = AGSUtil.toAGSGeometry(wPoint);
- com.esri.arcgisws.PointN pontN = (com.esri.arcgisws.PointN)geom;
- Point aoPont = (Point)AGSUtil.createArcObjectFromStub(pontN, serverContext);
- filter.setFilterGeometry(geom);
- filter.setSpatialRel(com.esri.arcgisws.EsriSpatialRelEnum.esriSpatialRelRelation);
- filter.setWhereClause( "" );
- filter.setSearchOrder(com.esri.arcgisws.EsriSearchOrder.esriSearchOrderSpatial);
- filter.setGeometryFieldName( "" );
- filter.setSpatialReferenceFieldName( "" );
- filter.setSpatialRelDescription(spatialType);
- MapLayerInfo layerInfos[] = functionality.getLayerInfos();
- for ( int layerIndex= 0 ;layerIndex<layerInfos.length;layerIndex++){
- MapLayerInfo mapLayerInfo = (MapLayerInfo) layerInfos[layerIndex];
- Field[] fields=mapLayerInfo.getFields().getFieldArray();
- RecordSet recordSet = mapServer.queryFeatureData(mapName, layerIndex, filter);
- ...
- }
SpatialFilter filter = new SpatialFilter(); String mapName=functionality.getMapDescription().getName(); this.getWebContext().getWebGraphics().clearGraphics(); WebPoint wPoint=(WebPoint)event.getWebGeometry().toMapGeometry(event.getWebContext().getWebMap()); Geometry geom = AGSUtil.toAGSGeometry(wPoint); com.esri.arcgisws.PointN pontN = (com.esri.arcgisws.PointN)geom; Point aoPont = (Point)AGSUtil.createArcObjectFromStub(pontN, serverContext); filter.setFilterGeometry(geom); filter.setSpatialRel(com.esri.arcgisws.EsriSpatialRelEnum.esriSpatialRelRelation); filter.setWhereClause(""); filter.setSearchOrder(com.esri.arcgisws.EsriSearchOrder.esriSearchOrderSpatial); filter.setGeometryFieldName(""); filter.setSpatialReferenceFieldName(""); filter.setSpatialRelDescription(spatialType); MapLayerInfo layerInfos[] = functionality.getLayerInfos(); for(int layerIndex=0;layerIndex<layerInfos.length;layerIndex++){ MapLayerInfo mapLayerInfo = (MapLayerInfo) layerInfos[layerIndex]; Field[] fields=mapLayerInfo.getFields().getFieldArray(); RecordSet recordSet = mapServer.queryFeatureData(mapName, layerIndex, filter); ... }
第二种方式代码如下:
- SpatialFilter spatialFilter= (SpatialFilter)serverContext.createObject(SpatialFilter.getClsid());
- WebPolygon wPgon=(WebPolygon)event.getWebGeometry().toMapGeometry(event.getWebContext().getWebMap());
- GraphicElement ge = new GraphicElement();
- ge.setGeometry(wPgon);
- ge.setSymbol( this .getWebContext().getWebQuery().getPolygonGraphicSymbol());
- this .getWebContext().getWebGraphics().addGraphics(ge);
- Geometry geom = AGSUtil.toAGSGeometry(wPgon);
- com.esri.arcgisws.PolygonN pgonN = (com.esri.arcgisws.PolygonN)geom;
- Polygon aoPgon = (Polygon)AGSUtil.createArcObjectFromStub(pgonN, serverContext);
- for ( int layerIndex= 0 ;layerIndex<pMap.getLayerCount();layerIndex++){
- ILayer layer=pMap.getLayer(layerIndex);
- FeatureLayer featureLayer=(FeatureLayer)layer;
- IFeatureClass featureClass=featureLayer.getFeatureClass();
- spatialFilter.setGeometryByRef(aoPgon);
- spatialFilter.setSpatialRel(esriSpatialRelEnum.esriSpatialRelWithin);
- spatialFilter.setGeometryField(featureClass.getShapeFieldName());
- IFeatureCursor featureCursor = featureClass.search(spatialFilter, true );
- IFeature feature = featureCursor.nextFeature();
- ...
- }
SpatialFilter spatialFilter= (SpatialFilter)serverContext.createObject(SpatialFilter.getClsid()); WebPolygon wPgon=(WebPolygon)event.getWebGeometry().toMapGeometry(event.getWebContext().getWebMap()); GraphicElement ge = new GraphicElement(); ge.setGeometry(wPgon); ge.setSymbol(this.getWebContext().getWebQuery().getPolygonGraphicSymbol()); this.getWebContext().getWebGraphics().addGraphics(ge); Geometry geom = AGSUtil.toAGSGeometry(wPgon); com.esri.arcgisws.PolygonN pgonN = (com.esri.arcgisws.PolygonN)geom; Polygon aoPgon = (Polygon)AGSUtil.createArcObjectFromStub(pgonN, serverContext); for(int layerIndex=0;layerIndex<pMap.getLayerCount();layerIndex++){ ILayer layer=pMap.getLayer(layerIndex); FeatureLayer featureLayer=(FeatureLayer)layer; IFeatureClass featureClass=featureLayer.getFeatureClass(); spatialFilter.setGeometryByRef(aoPgon); spatialFilter.setSpatialRel(esriSpatialRelEnum.esriSpatialRelWithin); spatialFilter.setGeometryField(featureClass.getShapeFieldName()); IFeatureCursor featureCursor = featureClass.search(spatialFilter, true); IFeature feature = featureCursor.nextFeature(); ... }
在一般的情况下,建议使用第一种方式空间查询

