zoukankan      html  css  js  c++  java
  • 【“零起点”百度地图手机SDK】如何进行三种POI搜索?

    摘要:POI即关键兴趣点,比如人民大学、新世界华联、306医院、沙县小吃、百度大厦,这些都是POI点。百度地图SDK查询POI有三种接口,分别是城市内搜索poiSearchInCity、周边搜索poiSearchNearBy、范围搜索poiSearchInbounds。其中周边和范围搜索还分别有多关键搜索,支持1-10个多关键词。

    ----------------------------------------------------------------------

    系列阅读:
    1、【百度地图-安卓SDK】从头开始写android程序
    http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html  
    2、【“零起点”--百度地图手机SDK】如何创建一张地图
    http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html 
    3、【“零起点”--百度地图手机SDK】如何使用离线地图?
    http://www.cnblogs.com/milkmap/archive/2012/05/21/2511928.html

    4、【“零起点”--百度地图手机SDK】如何添加地图图层+按钮事件+水平垂直布局?

    http://www.cnblogs.com/milkmap/archive/2012/05/25/2518454.html
    -----------------------------------------------------------------------

    一、选择一个POI搜索接口

    官网的类参考上有全部接口的说明:http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E7%B1%BB%E5%8F%82%E8%80%83/MKSearch

    以范围检索为例,我们查询一个矩形范围内的味多美有多少。

    第一个参数是关键词,这里写的是味多美。

    第二个参数,是矩形的左下角坐标。第三个参数,是矩形右上角坐标。

    取坐标的可视化工具:http://dev.baidu.com/wiki/static/map/API/tool/getPoint/

    myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6)));

    二、初始化

    需要申明变量,然后初始化搜索接口。

    /** 写在activity里面顶部 **/
    MKSearch myMKSearch = null;    //POI搜索变量申明
    
    /** 写在oncreate里面 **/
    myMKSearch = new MKSearch();  //初始化。

    三、设置回调函数

    onGetPoiResult是POI搜索的回调函数。
    在里面设置了,如果查询到结果,就将结果添加到地图上。
    myMKSearch.init(mBMapMan, new MKSearchListener(){
                @Override
                public void onGetPoiResult(MKPoiResult result, int type, int iError) {
                    if (result == null) {
                        return;
                    }
                    PoiOverlay poioverlay = new PoiOverlay(SearchPOIActivity.this, mMapView);
                    poioverlay.setData(result.getAllPoi());
                    mMapView.getOverlays().add(poioverlay);
                }
           
               @Override
               ......
    }

    不过,觉得百度地图SDK在这里有个很奇怪的地方。我明明只使用POI搜索啊,可是在回调函数里,必须要写出公交、驾车等的回调函数,即使是空的,也必须写,不然就会报错。如下图:

    1、把驾车回调函数注释了,就报错

    2、必须要将其他回调函数代码补齐,才不报错。(总觉得,这个有点儿不合理……)

    四、效果图

    五、其他POI搜索接口

    以下三个接口,选一个写就可以了。

    //1、城市poi检索
    myMKSearch.poiSearchInCity("北京", "德庄火锅");
    
    
    //2、根据范围和检索词发起范围检索|多关键词poiMultiSearchInbounds
    myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6)));
    
    
    //3、中心点5000米内的KFC有多少|多关键词poiMultiSearchNearBy
    myMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.920 * 1E6), (int) (116.410 * 1E6)), 5000);
                    

    六、关于布局

    这个教程的布局和上一个教程保持不变,我就把按钮的layout注释了。

    布局的详细代码可以参见上一个教程~

    七、全部源代码

    package com.baidu.searchpoi;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    /** 引入类 **/
    import java.util.ArrayList;
    import java.util.List;
     
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Point;
    import android.graphics.drawable.Drawable;
    import android.location.Location;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
     
    import com.baidu.mapapi.BMapManager;
    import com.baidu.mapapi.GeoPoint;
    import com.baidu.mapapi.ItemizedOverlay;
    import com.baidu.mapapi.LocationListener;
    import com.baidu.mapapi.MKAddrInfo;
    import com.baidu.mapapi.MKBusLineResult;
    import com.baidu.mapapi.MKDrivingRouteResult;
    import com.baidu.mapapi.MKGeneralListener;
    import com.baidu.mapapi.MKLocationManager;
    import com.baidu.mapapi.MKOLUpdateElement;
    import com.baidu.mapapi.MKOfflineMap;
    import com.baidu.mapapi.MKOfflineMapListener;
    import com.baidu.mapapi.MKPlanNode;
    import com.baidu.mapapi.MKPoiResult;
    import com.baidu.mapapi.MKSearch;
    import com.baidu.mapapi.MKSearchListener;
    import com.baidu.mapapi.MKTransitRouteResult;
    import com.baidu.mapapi.MKWalkingRouteResult;
    import com.baidu.mapapi.MapActivity;
    import com.baidu.mapapi.MapController;
    import com.baidu.mapapi.MapView;
    import com.baidu.mapapi.MyLocationOverlay;
    import com.baidu.mapapi.Overlay;
    import com.baidu.mapapi.OverlayItem;
    import com.baidu.mapapi.PoiOverlay;
    import com.baidu.mapapi.RouteOverlay;
    import com.baidu.mapapi.TransitOverlay;
    
    /** activity **/
    public class SearchPOIActivity extends MapActivity {
        //申明变量
        BMapManager mBMapMan = null;  
        MapView mMapView = null; 
        MKOfflineMap mOffline = null;   //离线地图变量
        MapController mMapController = null; //缩放平移地图
        MKSearch myMKSearch = null;    //POI搜索
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            mBMapMan = new BMapManager(getApplication());
            mBMapMan.init("4AA2949E616E069C37CDC3152E8C401A05A0035D", null);
            super.initMapActivity(mBMapMan);
             
            mMapView = (MapView) findViewById(R.id.bmapsView);
            mMapView.setBuiltInZoomControls(true);  //设置启用内置的缩放控件
             
            mMapController = mMapView.getController();  // 得到mMapView的控制权,可以用它控制和驱动平移和缩放
            //GeoPoint point = new GeoPoint((int) (39.93 * 1E6),(int) (116.42 * 1E6));  //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
            GeoPoint point = new GeoPoint((int) (30.670007 * 1E6),(int) (104.092569 * 1E6)); 
            mMapController.setCenter(point);  //设置地图中心点
            mMapController.setZoom(13);    //设置地图zoom级别
            //mMapView.getOverlays().add(new MyOverlay());  //添加覆盖物
            
            /** 离线地图初始化  **/
            mOffline = new MKOfflineMap();
            mOffline.init(mBMapMan, new MKOfflineMapListener() {
                public void onGetOfflineMapState(int type, int state) {
                    switch (type) {
                    case MKOfflineMap.TYPE_DOWNLOAD_UPDATE:
                        {
                            MKOLUpdateElement update = mOffline.getUpdateInfo(state);
                            //mText.setText(String.format("%s : %d%%", update.cityName, update.ratio));
                        }
                        break;
                    case MKOfflineMap.TYPE_NEW_OFFLINE:
                        Log.d("OfflineDemo", String.format("add offlinemap num:%d", state));
                        break;
                    case MKOfflineMap.TYPE_VER_UPDATE:
                        Log.d("OfflineDemo", String.format("new offlinemap ver"));
                        break;
                    }    
                      }
            }
            );
            /** 离线地图导入离线包 **/
            int num = mOffline.scan();
            //if (num != 0)   mText.setText(String.format("已安装%d个离线包", num));
            
            /** POI搜索  **/
            myMKSearch = new MKSearch();
            
            /** 回调函数 **/        
            myMKSearch.init(mBMapMan, new MKSearchListener(){
                @Override
                public void onGetPoiResult(MKPoiResult result, int type, int iError) {
                    if (result == null) {
                        return;
                    }
                    PoiOverlay poioverlay = new PoiOverlay(SearchPOIActivity.this, mMapView);
                    poioverlay.setData(result.getAllPoi());                
                    mMapView.getOverlays().add(poioverlay);
                    
                    mMapView.getController().animateTo(result.getPoi(0).pt);   //手动设定地图的中心点
                    mMapView.invalidate();  //手动刷新地图                
                    
                    //疑问1,如果是外省,如何设置覆盖物的最佳显示区域?无viewport接口
                    //疑问2,为何不能直接显示搜索结果,要先点击一下地图?刷新地图
                }
    
                public void onGetDrivingRouteResult(MKDrivingRouteResult res,
                        int error) {
                }
                public void onGetTransitRouteResult(MKTransitRouteResult res,
                        int error) {
                }
                public void onGetWalkingRouteResult(MKWalkingRouteResult res,
                        int error) {
                }
                public void onGetAddrResult(MKAddrInfo res, int error) {
                }
                public void onGetBusDetailResult(MKBusLineResult result, int iError) {
                }
                
            });        
            
            //1、城市poi检索
            //myMKSearch.poiSearchInCity("成都", "红星路");
            //2、根据范围和检索词发起范围检索|多关键词poiMultiSearchInbounds
            myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6)));
            //3、中心点5000米内的KFC有多少|多关键词poiMultiSearchNearBy
            //myMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.920 * 1E6), (int) (116.410 * 1E6)), 5000);
            
        }
     
        @Override
        protected boolean isRouteDisplayed() {
            return false;
        }
        
        @Override
        protected void onDestroy() {
            if (mBMapMan != null) {
                mBMapMan.destroy();
                mBMapMan = null;
            }
            super.onDestroy();
        }
        
        @Override
        protected void onPause() {
            if (mBMapMan != null) {
                mBMapMan.stop();
            }
            super.onPause();
        }
        
        @Override
        protected void onResume() {
            if (mBMapMan != null) {
                mBMapMan.start();
            }
            super.onResume();
        }
  • 相关阅读:
    telnet和ssh
    sersync实现实时同步
    rsync服务端一键安装rsync脚本(源码)
    rsync客户端一键安装rsync脚本(源码)
    rsync客户端一键安装rsync脚本(非源码)
    centos 建立Clamav自动扫描脚本
    DELL T110II Server如何通过RAID 级别迁移的方式在OMSA下实现磁盘阵列扩容?
    Dell PowerEdgeServerT110II USB Boot更新
    Centos7最小安装下Install Clamav(2017-06-09最后更新)
    Centos7 samba 匿名共享 简单config
  • 原文地址:https://www.cnblogs.com/milkmap/p/2536764.html
Copyright © 2011-2022 走看看