阅读:2590回复:4
请教arcims做周边查询问题(with code)
请教arcims做周边查询问题(with code)
周边查询技术路线 选择某图元或定位查询poi图层,然后基于查询点做周边查询, 目前异类查询可以,但同类查询不行, 即查找某宾馆饭店周围一定距离内的非宾馆饭店(如医疗卫生),可实现 但查找某宾馆饭店周围一定距离内的宾馆饭店,不能实现 具体代码如下: ///////设置BUFFER参数 Buffer buffer = new Buffer(); SimplePolygonSymbol bufferSymbol = new SimplePolygonSymbol(); buffer.setPerformBuffer(true); buffer.setBufferUnits("METERS"); buffer.setBufferDistance(bufferDistance); //缓冲距离 buffer.setBufferRegionSymbol(bufferSymbol); bufferSymbol.setFillColor("0,255, 0"); bufferSymbol.setFillType(SimplePolygonSymbol.CROSS); bufferSymbol.setFillTransparency(0.3); ////判断缓冲图层和缓冲目标图层是否同层 ///bufferLayerItem 缓冲图层编号 ///bufferTargetLayerItem 缓冲目标图层编号 if(bufferLayerItem!=bufferTargetLayerItem)//异层做周边查询,设置缓冲目标图层的显示样式 { if(bufTargetLayer!=null) { if(bufTargetLayer.getFeatureClass().equals("point")) { SimpleMarkerSymbol symbol = new SimpleMarkerSymbol(); symbol.setColor("255,255,0"); symbol.setWidth(12); buffer.setBufferSelectionSymbol(symbol); } else if(bufTargetLayer.getFeatureClass().equals("line")) { SimpleLineSymbol symbol = new SimpleLineSymbol(); symbol.setColor("255,255,0"); symbol.setWidth(3); buffer.setBufferSelectionSymbol(symbol); } else { SimplePolygonSymbol symbol = new SimplePolygonSymbol(); symbol.setFillColor("255,255,0"); symbol.setFillType(SimplePolygonSymbol.VERTICAL); buffer.setBufferSelectionSymbol(symbol); } //缓冲目标图层设置 com.esri.aims.mtier.model.map.layer.query.Filter bufferFilter = new com.esri.aims.mtier.model.map.layer.query.Filter(); bufTargetLayer.setFilterObject(bufferFilter); buffer.setBufferTargetLayer(bufTargetLayer); } } //设置filter条件 com.esri.aims.mtier.model.map.layer.query.Filter filter = new com.esri.aims.mtier.model.map.layer.query.Filter(); if(bufferLayerItem==bufferTargetLayerItem)//同层做周边查询, { if(doSelect) //选中图元作周边查询 { filter.setSpatialShape(spatialFilter); } else if(!positionSql.equals(""))//定位后作周边查询 { Envelope spatialFilter2=new Envelope();//根据定位中心(自动定位到地图中心)生成新的 envelope ///容限值 int pTol = Integer.parseInt(pixelTolerance); ///定位中心坐标 double idx=(map.getEnvelope().getMaxX()+map.getEnvelope().getMinX())/2.0; double idy=(map.getEnvelope().getMaxY()+map.getEnvelope().getMinY())/2.0; double xIncre = (Double.parseDouble(maxx) - Double.parseDouble(minx)) / Integer.parseInt(imageWidth); double yIncre = (Double.parseDouble(maxy) - Double.parseDouble(miny)) / Integer.parseInt(imageHeight); double idminx = idx - (pTol * xIncre); double idmaxx = idx + (pTol * xIncre); double idminy = idy - (pTol * yIncre); double idmaxy = idy + (pTol * yIncre); String selectMaxXtemp = String.valueOf(idmaxx); String selectMaxYtemp = String.valueOf(idmaxy); String selectMinXtemp = String.valueOf(idminx); String selectMinYtemp = String.valueOf(idminy); spatialFilter2.setMinX(Double.parseDouble(selectMinXtemp)); spatialFilter2.setMinY(Double.parseDouble(selectMinYtemp)); spatialFilter2.setMaxX(Double.parseDouble(selectMaxXtemp)); spatialFilter2.setMaxY(Double.parseDouble(selectMaxYtemp)); filter.setSpatialShape(spatialFilter2); //filter.setWhereExpression(positionSql); } filter.setEnvelopeBuffer(buffer); } else//异层做周边查询 { if(doSelect)//若是选择,则设置条件为空间范围 { filter.setSpatialShape(spatialFilter); } //若是查询,则设置条件为SQL语句 else if(!positionSql.equals("")) { filter.setWhereExpression(positionSql); } filter.setBufferObject(buffer); } filter.setGlobalEnvelope(true); filter.setBoundingEnvelope(true); filter.setRelation(com.esri.aims.mtier.model.map.layer.query.Filter.AREA_INTERSECTION); //filter.setRelation(com.esri.aims.mtier.model.map.layer.query.Filter.ENVELOPE_INTERSECTION); bufferLayer.setFilterObject(filter); map.createBufferImage(true, true); //若buffer图层在目标图层之上(item大的在上面),则调换图层顺序 if(bufferLayerItem > bufferTargetLayerItem) {map.getLayers().moveTo(bufferLayerItem,bufferTargetLayerItem);} 目前问题:异层查询,可画出buffer图,且目标缓冲图层内的选中图元也高亮显示,查询结果正确 同层查询,不能画出buffer图(map.createBufferImage(true, true)仿佛没执行),选中图元也不能高亮显示,查询结果为0,不正确 刚接触arcims没多久, 还诚请大侠指点一二! |
|
1楼#
发布于:2004-07-06 15:18
关注
|
|
2楼#
发布于:2004-07-29 18:36
留意啊
|
|
|
3楼#
发布于:2004-08-03 11:33
问题我已经解决了,arcims存在这样一个bug,对于同层不能进行buffer查询,可以通过新建一个图层,进行复制来实现buffer
|
|
4楼#
发布于:2004-08-31 15:57
<P>自己来做缓冲分析吧,不用arcims的createBuffer函数,呵呵。。。</P><P>无外乎是判断点是否在指定中心和半径的圆内。。。</P>
|
|