随笔-18  评论-20  文章-0  trackbacks-0
航线查询问题-Server Java的实现方法

数据准备
        1、航线的相关数据,google了一部分南航的数据,只要有几十条线路做演示就足够用了。将它们保存在数据库表中,主要有出发城市和到达城市两个字段。
        2、用作地图显示的行政区划图以及城市的点要素图。为了简化,只选择了涉及上述航线的若干城市。城市数据是一个point的shapefile文件,其中有一个属性列为城市名称“name”,为了方便检索,name属性中保存的城市名称与数据库中航线信息所保存的城市名称是匹配的。

实现方法

ADF提供了很好用的task framework,因此这个例子以自定义task的形式实现。先来简单了解一下整个操作的流程:

用户选择了自定义工具栏提供的一个工具,与地图进行一个点查询的交互,选择一个起点城市。在服务器端根据用户的操作将得到一个点的坐标,根据这个坐标进行查询,得到这个坐标点所表示的点要素的相关信息,这里我们所关心的只是这个城市的名称。知道了城市名称以后,以它作为起点城市,到数据库中检索所有从该城市出发的航线的目的地城市。这是一个字符串类型的数组,接下来可以根据这些城市名到地图中查找它们对应的点要素,并获得这些点要素的坐标。这样,我们就有了一个起点和若干个终点的坐标,可以绘制航线了。好了,基本思路就是这样,来看看怎么实现
    先创建一个自定义task类,它有一个方法:

public class SearchAirlinesTask{

    public void getAirlines(MapEvent event){

    }
}

声明了这个类以后,task framework就会根据getAirlines(MapEvent event)方法的参数来判断这个工具的类型。由于MapEvent涉及的地图交互操作有很多种,而这里我们需要的是点查询操作,所以接下来我们需要再构造一个类来给自定义task加一些说明:

public class SearchAirlinesTaskInfo extends SimpleTaskInfo{
    private TaskToolDescriptor[] taskTool = new TaskToolDescriptor[1];
    public SearchAirlinesTaskInfo(){
         taskTool[0] =
            new TaskToolDescriptor(SearchAirlines.class,"getAirlines","选择起点",ClientActions.MAP_POINT);
         taskTool[0].setToolTip(“从地图上选择一个起点”);
    }

    public TaskToolDescriptorModel[] getToolDescriptors(){
         return taskTool;
    }
}

然后将这个taskInfo类添加到我们的自定义task中:

public class SearchAirlinesTask{
    private SearchAirlinesTaskInfo taskInfo = new SearchAirlinesTaskInfo();

    public void getAirlines(MapEvent event){
    }

    public SimpleTaskInfo getTaskInfo(){
        return taskInfo;
    }
}

完成了上面的准备步骤以后,我们深入到getAirlines(MapEvent event)方法的内部,看看它是怎么运行的:

public getAirlines(MapEvent event){
    WebContext ctx = event.getWebContext();
    WebGraphics graphics = ctx.getWebGraphics();
    WebQuery query = ctx.getWebQuery();
}

所有的查询操作都是通过WebQuery来进行的,查询的结果将通过WebGraphics绘制到地图上。查询的时候需要提供两个信息,点的坐标以及目标图层:

WebPoint point =
    (WebPoint)event.getWebGeometry().toMapGeometry(ctx.getWebMap());
IdentifyCriteria ic = new IdentifyCriteria(point);
ic.setMaxRecordCount(1);
//只需要查询city图层,该图层保存的是城市的相关信息
List layers = query.getQueryLayers();
List<WebLayerInfo> queryLayer = new ArrayList<WebLayerInfo>();

for(Iterator iter=layers.iterator(); iter.hasNext();){
    Object item = iter.next();
    if(item instanceof WebLayerInfo){
         WebLayerInfo layerinfo = (WebLayerInfo)item;
         if(layerinfo.getName().equals(“city”)){
             queryLayer.add(layerinfo);
         }
    }
}

List rs = query.query(ic, queryLayer);

ok,用户与地图交互操作的查询就完成了,接下来我们需要从查询结果中得到这个城市的城市名。

if(rs.size() > 0){
    Iterator iter = rs.iterator();
    QueryResult item = (QueryResult)iter.next();
    Object obj = item.getDetails().get(“name”);
    String startCity = obj.toString();
    WebPoint start = (WebPoint)item.getHighlightGeometry();
}

这里需要解释一下的是最后一句,也许有人会问,刚才我们不是已经获取了一个point坐标了吗,那个不就是起点城市么?事实上,我们在地图上点击查询的时候不会恰好就点在表示城市的那个点的中心,WebQuery查询的时候是有一个距离容错的。而绘制航线的时候要求更精确,所以我们以查询得到的点要素的坐标为准。

费了半天劲总算把城市名给找出来了,擦一把汗,接着查,我们还需要终点城市的坐标呢!刚才我们用的是WebGeometry来查询,接下来我们将使用文本进行查询

DbAirlineSearch dboper = new DbAirlineSearch();
String[] destinations = dboper.getDestinations(startCity);
//终点城市的坐标
WebPoint[] ends = new WebPoint[destinations.length];
//航线
WebPath[] airlines = new WebPath[destinations.length];
//在WebGraphics中绘制航线所需的要素
GraphicElement[] linesElements =
        new GraphicElement[destinations.length];

for(int i=0;i<destinations.length;i++){
    //设置文本查询的条件
    TextCriteria tc = new TextCriteria();
    List<String> searchFields = new ArrayList<String>();
    searchFields.add(“name”);
    tc.setSearchFields(searchFields);
    tc.setSearchText(destinations[i]);

    List rs2 = query.query(tc,queryLayer);

    //处理文本查询的结果
    if(rs2.size() > 0){
         QueryResult destination = (QueryResult)rs2.iterator.next();
         ends[i] = (WebPoint)destination.getHighlightGeometry();

         //得到一个终点坐标以后就可以绘制一条航线了
         List<WebPoint> pointList = new ArrayList<WebPoint>();
         pointList.add(start);
         pointList.add(ends[i]);

         airlines[i] = new WebPath(pointList);
         WebPolyline polyline = new WebPolyline();
         polyline.addPath(airlines[i]);

         linesElement[i] = new GraphicElement();
         linesElement[i].setGeometry(polyline);//这里需要说明一下,如果这里用的是WebPath,将不会绘制出航线,换成WebPolyline以后就可以了。
         linesElement[i].setSymbol(lineSymbol);
         graphics.addGraphics(linesElement[i]);
    }
}

到这里,航线的绘制功能就算完成了。后续的文章中将介绍如何将航线的其他信息添加到WebResults中,以及高亮显示某一条航线的功能
posted on 2007-08-16 16:59 JavaPoint 阅读(884) 评论(0)  编辑  收藏 所属分类: ArcGis

只有注册用户登录后才能发表评论。


网站导航: