machelchxw
路人甲
路人甲
  • 注册日期2003-07-28
  • 发帖数14
  • QQ
  • 铜币178枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2380回复:4

请教arcims做周边查询问题(with code)

楼主#
更多 发布于:2004-06-29 14:36
请教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没多久, 还诚请大侠指点一二!
喜欢0 评分0
loveit2010
路人甲
路人甲
  • 注册日期2004-06-07
  • 发帖数3
  • QQ
  • 铜币112枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-07-06 15:18
关注
举报 回复(0) 喜欢(0)     评分
cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5913
  • QQ14265545
  • 铜币29655枚
  • 威望213点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
2楼#
发布于:2004-07-29 18:36
留意啊
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
举报 回复(0) 喜欢(0)     评分
machelchxw
路人甲
路人甲
  • 注册日期2003-07-28
  • 发帖数14
  • QQ
  • 铜币178枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2004-08-03 11:33
问题我已经解决了,arcims存在这样一个bug,对于同层不能进行buffer查询,可以通过新建一个图层,进行复制来实现buffer
举报 回复(0) 喜欢(0)     评分
hengyu
路人甲
路人甲
  • 注册日期2004-01-08
  • 发帖数65
  • QQ24637884
  • 铜币406枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2004-08-31 15:57
<P>自己来做缓冲分析吧,不用arcims的createBuffer函数,呵呵。。。</P><P>无外乎是判断点是否在指定中心和半径的圆内。。。</P>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部