美文网首页
安卓百度地图(四)城市,周边,区域检索

安卓百度地图(四)城市,周边,区域检索

作者: Active_Loser | 来源:发表于2018-01-12 19:27 被阅读0次

其他文章:
安卓百度离线地图的下载以及使用
安卓百度地图(一)定位功能的实现、周边POI的检索
安卓百度地图(二)地图显示以及离线地图的下载使用
安卓百度地图(三)绘制点、线等图层信息
安卓百度地图(五)百度地图路线规划
安卓百度地图(六)鹰眼轨迹的上传,历史轨迹的显示
安卓百度地图(七)地理围栏的建立与使用

本文就百度地图的城市,周边,区域POI检索,进行整理

一 POI检索简介

POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。
百度地图SDK提供三种类型的POI检索:城市内检索、周边检索和区域检索(即矩形范围检索)。下面将以POI城市内检索、周边检索 和 区域检索为例,向大家介绍如何使用检索服务。

二 POI检索

2.1 创建POI检索实例

mPoiSearch = PoiSearch.newInstance();

2.2 设置POI检索监听者

mPoiSearch.setOnGetPoiSearchResultListener(poiListener);

2.3 创建POI检索监听

OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
   public void onGetPoiResult(PoiResult result) {
       if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
           Toast.makeText(PoiActivity.this, "未搜索到POI数据", Toast.LENGTH_SHORT).show();
       }
       if (result.error == SearchResult.ERRORNO.NO_ERROR) {
           //获取POI检索结果
           Toast.makeText(PoiActivity.this, "已搜索到POI数据", Toast.LENGTH_SHORT).show();
       }
      if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {
          // 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
          String strInfo = "在";
          for (CityInfo cityInfo : result.getSuggestCityList()) {
               strInfo += cityInfo.city;
               strInfo += ",";
           }
           strInfo += "找到结果";
          Toast.makeText(PoiActivity.this, strInfo, Toast.LENGTH_LONG).show();
        }
}

2.4发起检索请求

2.4.1 城市内检索

输入城市名(city),以及物品(name),和页码(num)发起检索。

mPoiSearch.searchInCity((new PoiCitySearchOption())  
    .city(city)  
    .keyword(name)  
    .pageNum(num));

2.4.2 周边检索

周边搜索是一个圆形范围,适用于以某个位置为中心点,输入圆心(center)、自定义检索半径值(radius)和页码(num)发起检索。

 mPoiSearch.searchNearby(new PoiNearbySearchOption()
        .keyword("餐厅")
        .sortType(PoiSortType.distance_from_near_to_far)
        .location(center)
        .radius(radius)
        .pageNum(num));

2.4.2 区域检索(即矩形范围检索)

POI区域检索以“用户指定的左下角和右上角坐标的长方形区域”为检索范围的poi检索。

LatLng southwest = new LatLng( 39.92235, 116.380338 );
LatLng northeast = new LatLng( 39.947246, 116.414977);

LatLngBounds searchbound = new LatLngBounds.Builder()
    .include(southwest)
    .include(northeast)
    .build();

mPoiSearch.searchInBound(new PoiBoundSearchOption()
        .bound(searchbound)
       .keyword("餐厅"));

2.5 热词建议检索

2.5.1 创建在线建议查询实例

mSuggestionSearch = SuggestionSearch.newInstance();

2.5.2 创建在线建议查询监听者

OnGetSuggestionResultListener listener = new OnGetSuggestionResultListener() {  
    public void onGetSuggestionResult(SuggestionResult res) {  
        if (res == null || res.getAllSuggestions() == null) {  
            return;  
            //未找到相关结果  
        }  
    //获取在线建议检索结果  
    }  
};

2.5.3 设置在线建议查询监听者

mSuggestionSearch.setOnGetSuggestionResultListener(listener);

2.5.4 发起在线建议查询

// 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新  
mSuggestionSearch.requestSuggestion((new SuggestionSearchOption())  
    .keyword(“百度”)  
    .city(“北京”));

2.5.5 释放在线建议查询实例;

mSuggestionSearch.destroy();

2.6 释放POI检索实例;

mPoiSearch.destroy();

2.7 注意事项

  • 在传入city检索无结果时,会扩大检索范围,在全国进行检索。如有检索结果,不会直接返回,但会提示哪些城市有结果。
  • 在传入city检索时,返回的结果太多,涉及多个城市,可以将扩大检索的城市list罗列,让用户点击选择,再针对选定城市进行二次检索(如果只有一个城市,后端直接进行二次检索)。可以调用的接口在PoiResult类中:
    public List<CityInfo> getSuggestCityList() //返回城市列表页的结果数

三 公交线路查询

3.1 线路名称查询

输入公交线路的名称,POI检索返回的POI结果中,epoitype字段表示POI类型,epoitype字段值为2表示公交路线,4表示地铁路线,把这两种类型的POI的uid传给公交信息检索接口,可以得到该POI所代表的路线的详细信息(如:该公交线有多少个站点,每个站点的名称,位置、参考票价和上下线行信息)。

3.1.1 发起POI检索,获取相应线路的UID;

//以城市内检索为例,详细方法请参考POI检索部分的相关介绍  
mSearch.searchInCity((new PoiCitySearchOption())  
    .city(“北京”)  
    .keyword(“302”);

3.1.2 在POI检索结果中判断该POI类型是否为公交信息

public void onGetPoiResult(PoiResult result) {  

    if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
        return;  
    }  

    //遍历所有POI,找到类型为公交线路的POI  

    for (PoiInfo poi : result.getAllPoi()) {  

        if (poi.type == PoiInfo.POITYPE.BUS_LINE ||poi.type == PoiInfo.POITYPE.SUBWAY_LINE) { 
 
            //说明该条POI为公交信息,获取该条POI的UID  
            busLineId = poi.uid;  
            break;  
        }  
    }  
}

3.1.3定义并设置公交信息结果监听者(与POI类似),并发起公交详情检索

//如下代码为发起检索代码,定义监听者和设置监听器的方法与POI中的类似  
mBusLineSearch.searchBusLine((new BusLineSearchOption()  
    .city(“北京”)  
    .uid(busLineId)));
    //线路 ID 查询

获取公交线路的详细信息,可使用线路 ID 查询。结果返回线路信息有线路 ID、公交类型、线路名称、线路坐标、城市编码、首发站、末站、首班车时间、末班车时间、全程里程、起步价、全程票价、线路沿途坐标。
<pre>

四 地理编码

地理编码分:正向地图编码、反向地图编码
正向地理编码:将地址信息转换为坐标点
反向地理编码:将坐标点转换为地址信息

GeoCoder mSearch = GeoCoder.newInstance();//初始化地理编码
mSearch.setOnGetGeoCodeResultListener(listener);//设置回调监听

ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
reverseGeoCodeOption.location(new LatLng(36.897,127.9897));//设置坐标点
mSearch.reverseGeoCode(reverseGeoCodeOption);//将坐标点转换为地址信息

GeoCodeOption geoCodeOption = new GeoCodeOption();
geoCodeOption.address(addressStr);//设置地址
geoCodeOption.city(cityStr);//设置城市
mSearch.geocode(geoCodeOption);//将地址信息转换为坐标点

OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {

    @Override
    public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
        //正向地理编码回调,注意geoCodeResult中错误码的处理
        geoCodeResult.getLocation();//坐标点
        geoCodeResult.getAddress();//地址信息
    }

    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
        //反向地理编码回调
        reverseGeoCodeResult.getAddress();//简要地址信息
        reverseGeoCodeResult.getAddressDetail();//层次化地址信息
        reverseGeoCodeResult.getBusinessCircle();//所属商圈名称
        reverseGeoCodeResult.getPoiList();//周边POI信息集合
        reverseGeoCodeResult.getSematicDescription();//描述信息
        reverseGeoCodeResult.getLocation();//坐标点
    }
});

五 行政区边界数据检索

根据省、市、县(区)级行政区划名称,查询行政区划的详细边界信息。

DistrictSearch mDistrictSearch = DistrictSearch.newInstance();//初始化行政区检索
mDistrictSearch.setOnDistrictSearchListener(listener );//设置回调监听

DistrictSearchOption districtSearchOption = new DistrictSearchOption();
districtSearchOption.cityName(cityStr);//检索城市名称
districtSearchOption.districtName(districtStr);//检索的区县名称
mDistrictSearch.searchDistrict(districtSearchOption);//请求行政区数据

OnGetDistricSearchResultListener listener = new OnGetDistricSearchResultListener() {

    @Override
    public void onGetDistrictResult(DistrictResult districtResult) {
        districtResult.getCenterPt();//获取行政区中心坐标点
        districtResult.getCityName();//获取行政区域名称
        List<List<LatLng>> polyLines = districtResult.getPolylines();//获取行政区域边界坐标点
        //边界就是坐标点的集合,在地图上画出来就是多边形图层。有的行政区可能有多个区域,所以会有多个点集合。
    }
};

本文主要做于收集整理笔记使用,关于文章的源码,请移步我的GitHub

相关文章

网友评论

      本文标题:安卓百度地图(四)城市,周边,区域检索

      本文链接:https://www.haomeiwen.com/subject/sybfoxtx.html