Android百度地图(六):百度地图POI检索,行政区边界、公交、线路规划查询,地理编码介绍 您所在的位置:网站首页 百度地图poi数据获取 Android百度地图(六):百度地图POI检索,行政区边界、公交、线路规划查询,地理编码介绍

Android百度地图(六):百度地图POI检索,行政区边界、公交、线路规划查询,地理编码介绍

#Android百度地图(六):百度地图POI检索,行政区边界、公交、线路规划查询,地理编码介绍| 来源: 网络整理| 查看: 265

转载、引用请标明出处 http://www.jianshu.com/p/026fd4f96d4d 本文出自zhh_happig的简书博客,谢谢

Android百度地图(一):百度地图定位sdk 类方法参数、定位原理详细介绍 Android百度地图(二):百度地图sdk显示位置点、图层绘制 Android百度地图(三):百度地图画运动轨迹及图层点击事件处理 Android百度地图(四):百度地图运动轨迹纠偏、去噪、绑路之百度鹰眼sdk服务 Android百度地图(五):百度地图鹰眼sdk监控进出地理围栏(区域)

上一篇文章介绍了百度鹰眼sdk监控进出围栏的功能,本篇将详细介绍百度地图中POI检索、公交查询、行政区边界坐标获取、两点之间的路径规划和地理编码(坐标和地址之间的转换)。

一 POI检索

1.POI简介 POI是兴趣点的意思,地图上标注的商铺、饭店、学校、银行、医院、车站等等都是POI。

地图上的POI是可以点击的,通过设置mBaiduMap.setOnMapClickListener监听,在onMapPoiClick回调方法中就可以获取到POI信息,包括经纬度、POI的描述等。

如果你获取到一个位置点,那么也可以查询这个位置点附近的POI,接下来我们就来介绍一下如何查询POI,包括:位置点周边查询、指定区域查询、城市内查询。

2.POI检索api详解

/*应用场景:输入银行,点击搜索,地图上显示各个银行的红色泡泡图标,点击银行图标,显示银行具体信息*/ //以下都是伪代码 PoiSearch mPoiSearch = PoiSearch.newInstance();//初始化POI检索 mPoiSearch.setOnGetPoiSearchResultListener(listener);//注册搜索事件监听 /** * 搜索位置点周边POI */ PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); //POI附近检索参数设置类 nearbySearchOption.keyword(keyword);//搜索关键字,比如:银行、网吧、餐厅等 nearbySearchOption.location(center);//搜索的位置点 nearbySearchOption.radius(radius);//搜索覆盖半径 nearbySearchOption.sortType(PoiSortType.distance_from_near_to_far);//搜索类型,从近至远 nearbySearchOption.pageNum(pageIndex);//查询第几页:POI量可能会很多,会有分页查询; nearbySearchOption.pageCapacity(pageCapacity)//设置每页查询的个数,默认10个 mPoiSearch.searchNearby(nearbySearchOption);//查询 /** * 搜索指定区域POI */ PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption(); /** * LatLngBounds searchbound:地理范围数据结构,两个点就可以确定一个矩形 * southwest:西南点 * northeast:东北点 */ LatLngBounds searchbound = new LatLngBounds.Builder().include(southwest).include(northeast).build(); boundSearchOption.bound(searchbound);//设置边界 boundSearchOption.keyword(keyword); boundSearchOption.pageNum(pageIndex); mPoiSearch.searchInBound(boundSearchOption);//查询 /** * 搜索城市内POI */ PoiCitySearchOption citySearchOption = new PoiCitySearchOption(); citySearchOption.city(citystr);//城市名称,最小到区级单位 citySearchOption.keyword(keyword); citySearchOption.isReturnAddr(true);//是否返回门址类信息:xx区xx路xx号 citySearchOption.pageNum(pageIndex); mPoiSearch.searchInCity(citySearchOption);//查询 /** * 查询POI结果回调监听器,包括周边,区域,城市返回的搜索结果 */ OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) {//获取Poi检索列表 /** * PoiInfo中包含了经纬度、城市、地址信息、poi名称、uid、邮编、电话等等信息; 有了这些,你是不是可以可以在这里画一个自定义的图层了,然后添加点击事件,做一些操作了呢 */ List poiInfos = result.getAllPoi();//poi列表 /** * PoiAddrInfo:只包含地址、经纬度、名称 */ List PoiAddrInfos = result.getAllAddr(); } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {//获取某个Poi详细信息 /** * 当执行以下请求时,此方法回调 * PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption(); detailSearchOption.poiUid(poiInfo.uid);//设置要查询的poi的uid mPoiSearch.searchPoiDetail(detailSearchOption);//查询poi详细信息 */ //poiDetailResult里面包含poi的巨多信息,你想要的都有,这里不列举了 } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { //查询室内poi检索结果回调 /** * 当执行以下请求时,此方法回调 * PoiIndoorOption indoorOption = new PoiIndoorOption(); indoorOption.poiFloor(floor);//楼层 mPoiSearch.searchPoiDetail(indoorOption); */ } } //再介绍一个推荐查询,应用场景:百度地图搜索输入:银行,百度会给你推荐各大银行供你选择,点击后显示具体位置及POI信息 SuggestionSearch mSuggestionSearch = SuggestionSearch.newInstance();//初始化 mSuggestionSearch.setOnGetSuggestionResultListener(this);//设置监听 SuggestionSearchOption sSption = new SuggestionSearchOption(); sSption.city(cityStr);//指定城市 sSption.keyword(keyword);//关键字 sSption.location(loction);//指定位置,选填,设置位置之后,返回结果按距离该位置的远近进行排序 sSption.citylimit(true);//设置限制城市范围,仅返回指定城市检索结果,默认为false mSuggestionSearch.requestSuggestion(sSption); OnGetSuggestionResultListener suggestionlistener = new OnGetSuggestionResultListener() { @Override public void onGetSuggestionResult(SuggestionResult result) {//获取推荐POI列表 /* * SuggestionInfo中包含的信息有限,只包含:联想词,坐标点,POI的uid等 如果想要POI的详细信息,还得利用uid通过mPoiSearch.searchPoiDetail获取 */ List suggestionInfos = result.getAllSuggestions(); } };

效果图

银行poi 建议查询 二 地理编码

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

2.地理编码api详解

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 polyLines = districtResult.getPolylines();//获取行政区域边界坐标点 //边界就是坐标点的集合,在地图上画出来就是多边形图层。有的行政区可能有多个区域,所以会有多个点集合。 } };

效果图

西城区边界 四 公交线路查询 /** * 公交线路查询分两步 * 1.根据关键字查询出公交类型的poi * 2.根据公交poi的uid查询公交线路详情 */ PoiSearch mSearch = PoiSearch.newInstance();//初始化poi查询 mSearch.setOnGetPoiSearchResultListener(poiSearchResultListener ); BusLineSearch mBusLineSearch = = BusLineSearch.newInstance();//初始化公交线路查询 mBusLineSearch.setOnGetBusLineSearchResultListener(busLineSearchResultListener ); PoiCitySearchOption citySearchOption = new PoiCitySearchOption(); citySearchOption.city(cityStr);//城市,北京 citySearchOption.keyword(numStr);//公交路号,例:地铁2号线 mSearch.searchInCity(citySearchOption);//查询POI,过滤出公交类型poi //POI回调 OnGetPoiSearchResultListener poiSearchResultListener = new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult result) { //遍历所有poi,找到类型为公交线路的poi for (PoiInfo poi : result.getAllPoi()) { if (poi.type == PoiInfo.POITYPE.BUS_LINE || poi.type == PoiInfo.POITYPE.SUBWAY_LINE) { //注意:这里的查到公交poi都是起点 busLineIDList.add(poi.uid);//size=2,两个方向 } } } //...省略其他方法 }; BusLineSearchOption busLineSearchOption = new BusLineSearchOption(); busLineSearchOption.city(cityStr);//城市 busLineSearchOption.uid(uid);//公交poi的uid mBusLineSearch.searchBusLine(busLineSearchOption);//查询公交路线 //公交路线回调 OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() { @Override public void onGetBusLineResult(BusLineResult result) { //BusLineResult包含公交:起步价、末班车时间、公交名、上行下行称等信息 List busStations = result.getStations();//公交所有站点 for (BusLineResult.BusStation busStation : busStations){ busStation.getTitle();//站点名称 busStation.getLocation();//站点坐标点 } List busSteps = result.getSteps(); //注意:这里并不是公交路线分段信息,而是:公交从起点到终点为一个busStep for (BusLineResult.BusStep busStep : busSteps){//size=1 busStep.getDistance();//距离,公交线路的总距离 busStep.getDuration();//总时长 } } };

效果图

地铁2号线 五 两点线路规划

线路规划:公交换乘、驾车、骑行和步行四种类型

RoutePlanSearch mSearch = RoutePlanSearch.newInstance();//初始化搜索模块 mSearch.setOnGetRoutePlanResultListener(planResultListener);//注册事件监听 PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "北京西站");//起始点 PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "北京南站");//终点,PlanNode也支持输入坐标点 /**驾车路线规划**/ DrivingRoutePlanOption drivingRoutePlanOption = new DrivingRoutePlanOption();//参数设置类 drivingRoutePlanOption.from(stNode);//设置起点 drivingRoutePlanOption.to(enNode);//设置终点 drivingRoutePlanOption.currentCity("北京");//当前城市,注意:这里设置城市,那么PlanNode中的城市将会被覆盖 /** * 路线规划策略,枚举类型:躲避拥堵、最短距离、较少费用、时间优先 * ECAR_TIME_FIRST:时间优先 * ECAR_AVOID_JAM:躲避拥堵 * ECAR_DIS_FIRST:最短距离 * ECAR_FEE_FIRST:较少费用 */ drivingRoutePlanOption.policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_TIME_FIRST); mSearch.drivingSearch(drivingRoutePlanOption);//查询 /**公交线路规划**/ TransitRoutePlanOption transitRoutePlanOption = new TransitRoutePlanOption(); transitRoutePlanOption.from(stNode); transitRoutePlanOption.to(enNode); transitRoutePlanOption.city("北京"); /** * EBUS_NO_SUBWAY:不含地铁 * EBUS_TIME_FIRST:时间优先 * EBUS_TRANSFER_FIRST:最少换乘 * EBUS_WALK_FIRST:最少步行距离 */ transitRoutePlanOption.policy(TransitRoutePlanOption.TransitPolicy.EBUS_TIME_FIRST);//线路规划策略: mSearch.transitSearch(transitRoutePlanOption);//查询 /**步行线路规划**/ WalkingRoutePlanOption walkingRoutePlanOption = new WalkingRoutePlanOption(); walkingRoutePlanOption.from(stNode); walkingRoutePlanOption.to(enNode); mSearch.walkingSearch(walkingRoutePlanOption); /**骑行线路规划**/ BikingRoutePlanOption bikingRoutePlanOption = new BikingRoutePlanOption(); bikingRoutePlanOption.from(stNode); bikingRoutePlanOption.to(enNode); mSearch.bikingSearch(bikingRoutePlanOption); /**跨城市线路规划**/ MassTransitRoutePlanOption massTransitRoutePlanOption = new MassTransitRoutePlanOption(); massTransitRoutePlanOption.from(stNode); massTransitRoutePlanOption.to(enNode); massTransitRoutePlanOption.pageIndex(0);//设置返回第几页 从0开始 massTransitRoutePlanOption.pageSize(5);//设置每页返回几条路线,1~10条 //市内公交换乘策略:最短时间......等 massTransitRoutePlanOption.tacticsIncity(MassTransitRoutePlanOption.TacticsIncity.ETRANS_LEAST_TIME); //设置跨城交通方式策略:火车优先......等 massTransitRoutePlanOption.transtypeintercity(MassTransitRoutePlanOption.TransTypeIntercity.ETRANS_TRAIN_FIRST); //设置跨城换乘策略:出发最早......等 massTransitRoutePlanOption.tacticsIntercity(MassTransitRoutePlanOption.TacticsIntercity.ETRANS_START_EARLY); mSearch.masstransitSearch(massTransitRoutePlanOption);//查询 //规划路线回调监听器 OnGetRoutePlanResultListener planResultListener = new OnGetRoutePlanResultListener() { @Override public void onGetWalkingRouteResult(WalkingRouteResult result) {//步行规划路线回调 if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { return; } if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) { // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息 // result.getSuggestAddrInfo() return; } List walkingRouteLines = result.getRouteLines();//获取规划路线列表 for (WalkingRouteLine walkingRouteLine : walkingRouteLines) {//多条规划路线 walkingRouteLine.getDistance();//该路线距离 walkingRouteLine.getDuration();//时长 walkingRouteLine.getStarting();//获取起点 walkingRouteLine.getTerminal();//获取终点 List walkingSteps = walkingRouteLine.getAllStep();//每条规划路线含多个路段 for (WalkingRouteLine.WalkingStep walkingStep : walkingSteps) { walkingStep.getEntrance();//该步段起点 walkingStep.getExit();//终点 walkingStep.getWayPoints();//该步段起点与终点中间的点,步段有可能不是直线,折线的话有多个点 ... } } } @Override public void onGetTransitRouteResult(TransitRouteResult result) {//公交路线规划回调 ...省略,同上 List transitRouteLines = result.getRouteLines();//获取规划路线列表 for (TransitRouteLine transitRouteLine : transitRouteLines){ /** * 每条规划路线含多个TransitStep,这里要注意的是:比如从北京西站到南站,一共有3个路段 * 乘坐地铁7号线(焦化厂方向),经过4站,到达菜市口站:第一个步段,乘坐7号线 * 站内换乘地铁4号线大兴线(天宫院方向):第二个步段,步行到4号线 * 乘坐地铁4号线大兴线(天宫院方向),经过2站,到达北京南站:第三个步段,乘坐4号线 * 所以每换一个线路就是一个路段,步行不论距离长短也算一个路段 */ List transitSteps = transitRouteLine.getAllStep();(); transitStep.getInstructions();//每段路线的乘坐信息 transitStep.getVehicleInfo();//每段路线站点、票价等信息 transitStep.getWayPoints();//该路段起点与终点中间的点,路段有可能不是直线,折线的话有多个点 ...省略,同上 } } @Override public void onGetMassTransitRouteResult(MassTransitRouteResult result) {//跨城市路线规划回调 ... result.getOrigin();//起点,含:坐标,城市信息等 result.getDestination();//终点 List massTransitRouteLines = result.getRouteLines(); for (MassTransitRouteLine massTransitRouteLine : massTransitRouteLines){//多条规划路线 //massTransitRouteLine包含本线路的票价、到达时间等信息 List transitSteps = massTransitRouteLine.getAllStep();//多个路段 //TransitStep包含:本路段始终点、交通方式等信息 ... } } @Override public void onGetDrivingRouteResult(DrivingRouteResult result) {//驾车线规划回调 ... List drivingRouteLines = result.getRouteLines(); for (DrivingRouteLine drivingRouteLine : drivingRouteLines){ ... drivingRouteLine.getLightNum();//本线路红绿灯数 drivingRouteLine.getCongestionDistance();//本线路拥堵距离 List drivingStep = drivingRouteLine.getAllStep(); ... } } @Override public void onGetBikingRouteResult(BikingRouteResult result) {//骑行线规划回调 ... List bikingRouteLines = result.getRouteLines(); for (BikingRouteLine bikingRouteLine : bikingRouteLines){ ... List bikingStep = bikingRouteLine.getAllStep(); ... } } @Override public void onGetIndoorRouteResult(IndoorRouteResult result) { //室内路线规划回调 } };

效果图

公交路径规划 好啦,本篇到这里就讲完了。如果只是查询的话,就不用百度地图sdk了。如果需要将poi、线路、公交、边界画在地图上显示的话,也是很简单的,只要你拿到了坐标点,就可以在地图上增加图层了,包括:圆形、多边形、线性等等,不清楚的阅读文章片头相关文章。这里推荐com.baidu.mapapi.overlayutil里面的api,可以方便的绘制上述图层

//例1:画公交线路图层 BusLineOverlay overlay = new BusLineOverlay(mBaiduMap); mBaiduMap.setOnMarkerClickListener(overlay);//添加marker点击监听 overlay.setData(result);//设置数据,BusLineResult:result,公交回调监听返回的公交线路结果 overlay.addToMap();//将公交线路画在地图上 overlay.zoomToSpan();//缩放操作,显示整个线路 //例2:画规步行划路线图层 WalkingRouteOverlay overlay = new WalkingRouteOverlay(mBaidumap); overlay.setData(result.getRouteLines().get(0));//设置步行路线,result步行回调监听返回结果 overlay.addToMap(); overlay.zoomToSpan(); ......

com.baidu.mapapi.overlayutil里面的api把画图层的操作都封装好了,比较简单,poi、行政区边界、其他规划路径都有相应的化图层工具类。

如果各位看官觉得文章不错,别忘了点个喜欢。 源码下载地址

以上文章内容,是本人工作中的总结,供大家参考,有误的地方还请指正。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有