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

其他文章:
安卓百度离线地图的下载以及使用
安卓百度地图(一)定位功能的实现、周边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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容