发表用户:liuzheli
收集整理:James.Liu
相关讨论:http://www.mygis.com.cn/forum/dispbbs.asp?boardID=11&ID=5250
信息原始来源:原创

文章标题:MapXtreme for Java中利用SelectionTheme实现查找图元的高亮显示

利用SelectionTheme实现查找图元的高亮显示

  得到斑竹的提示后。我进行了专题图方面的测试。可以实现图元的高亮显示。

  再次谢谢斑竹。同时把我的部分代码贴出来,希望诸多与我一样的初学者能有所收获。

  服务器端servlet处理选择工具点击后的代码如下:
  (当然,可以将该段代码按照规范写成bean。目前只是在学习api以及摸索某些功能的实现,所以没做

具体的封装了。)


//todo:the selectFeature operation;利用mapj对象来获得特定图层,根据点来获取附近的图元,并进

行图元的高亮渲染后生成新地图,返回客户端
          private void selectF(HttpSession session,HttpServletRequest req,
                                      HttpServletResponse res)
              throws Exception
          {
            
            String reqParam; // to hold request parameter
            Double xStr = null; // to hold x request params
            Double yStr = null; // to hold y request params

            // Try to retrieve the user's previous MapJ object.
            MapJ myMap = (MapJ) session.getAttribute("mapinfo.mapj");
            if (myMap == null) {
              // This is probably the user's first time requesting a map.
              myMap = initMapJ();
            }

              // Get the previous center point locations
              DoublePoint newpoint = myMap.getCenter();
              //以下是定义一个对象来获得点的位置
              DoublePoint AtPoint=new DoublePoint();
              if ( (reqParam = req.getParameter("ptx")) != null) {
                xStr = new Double(reqParam);
              }
              if ( (reqParam = req.getParameter("pty")) != null) {
                yStr = new Double(reqParam);
              }
              if (xStr != null && yStr != null) {
                // 把GIF的象素位置转化为实际的地理坐标
                DoublePoint screenpoint = new DoublePoint(xStr.doublevalue(),
                                                          yStr.doublevalue());
                AtPoint = myMap.transformScreenToNumeric(screenpoint);
              }

              double newZoom = myMap.getZoom();
             
              // Reset the bounding rectangle, note - Pan handled by default
              myMap.setZoomAndCenter(newZoom, newpoint);


             // 以下是进行图元的查找和渲染
             Layer toDoLayer=myMap.getLayers().getLayer("jumindi");
 //删除以上操作已经添加的theme列表
             toDoLayer.getThemeList().removeAll(true);

             System.out.println(toDoLayer.getName());
             Vector columns = new Vector();
             TableInfo tabInfo = toDoLayer.getTableInfo();
             for (int i = 0; i < tabInfo.getColumnCount(); i++) {
               System.out.println(tabInfo.getColumnName(i) + "  --  ");
               columns.addElement(tabInfo.getColumnName(i));
             }
              
//以下是利用专题图来高亮显示图元
        
         FeatureSet fs = null;

          // 选择图元。其中ATPoint是前面获得的鼠标客户端点击的实际位置。
          fs = toDoLayer.searchAtPoint(columns, AtPoint, null);
          // 创建一个 SelectionTheme
          SelectionTheme selTheme = new SelectionTheme("PointSelection");

          // 创建一个Selection对象并且把选择的图元加入
          Selection sel = new Selection();
          sel.add(fs);

    // 把Selection对象加入到SelectionTheme
         selTheme.setSelection(sel);

    // 设置SelectionTheme的显示渲染的样式
    Rendition rend = RenditionImpl.getDefaultRendition();
    rend.setvalue(Rendition.FILL, Color.red);
    selTheme.setRendition(rend);

    // 添加SelectionTheme到指定layer的theme列表中
    toDoLayer.getThemeList().add(selTheme);

              //以下是渲染地图,以流方式返回客户端
              try {
                MapXtremeImageRenderer rr = new MapXtremeImageRenderer(m_mxtURL);
                rr.render(ImageRequestComposer.create(
                    myMap, 256, Color.white, "image/jpeg"));

                System.out.println(
                    "render:now render the image over and back to client.");

                //Output the map
                rr.toStream(res.getOutputStream());
              }
              catch (Exception e) {
                log(e.getMessage());
                throw e;
              }

              // Save state info for next time around.保存mapj对象,维持会话
              session.setAttribute("mapinfo.mapj", myMap);


          }