百度地图_百度地图api - CSDN
百度地图 订阅
百度地图(Baidu Map)是为用户提供包括智能路线规划、智能精准导航(驾车、步行、骑行)、实时路况、实时公交等出行相关服务的平台。百度地图作为新一代人工智能地图,秉持”科技让出行更简单“的品牌使命,以"科技"为手段不断探索创新。伴随AI时代的到来,百度地图不仅实现了语音交互覆盖用户产品使用全流程,还上线了AR步导、AR导游等实用功能,且地点信息丰富,更加方便用户的出行。2019年9月,百度地图全新发布“百雀灵计划”,上线全球首个地图语音定制功能,让用户出行更具个性化。 展开全文
百度地图(Baidu Map)是为用户提供包括智能路线规划、智能精准导航(驾车、步行、骑行)、实时路况、实时公交等出行相关服务的平台。百度地图作为新一代人工智能地图,秉持”科技让出行更简单“的品牌使命,以"科技"为手段不断探索创新。伴随AI时代的到来,百度地图不仅实现了语音交互覆盖用户产品使用全流程,还上线了AR步导、AR导游等实用功能,且地点信息丰富,更加方便用户的出行。2019年9月,百度地图全新发布“百雀灵计划”,上线全球首个地图语音定制功能,让用户出行更具个性化。
信息
最近更新时间
2020年03月05日
覆盖范围
全球209个国家和地区
运营公司
北京百度网讯科技有限公司
品牌愿景
科技让出行更简单
类    型
服务性软件
软件类型
出行类应用软件
推出时间
2005年
中文名
百度地图 [1]
外文名
Baidu Maps
软件大小
94.8M
运营平台
Web,PC,Android,iOS
最新版本
10.23.0.965
特色功能
智能语音,AR步导,智能驾车导航
百度地图AI化数据生产 加速产业升级
百度地图80%数据采集环节已实现AI化 [2]  ,拥有国内规模最大的采集团队和最领先的采集设备,是业内AI化水平最高、搭载AI技术最强最丰富,唯一拥有全景数据的地图服务商,道路里程覆盖已达1000万公里 [3]  。
收起全文
精华内容
参与话题
  • 百度地图api的基本使用

    万次阅读 2018-08-15 16:23:30
    百度地图坐标拾取系统链接: http://api.map.baidu.com/lbsapi/getpoint/index.html   最近业务需求,需要在网页上地图。关于地图的使用,主流的就是高德地图,百度地图。经比较以后,发现两种地图的使用的方式...

    百度地图坐标拾取系统链接:

    http://api.map.baidu.com/lbsapi/getpoint/index.html

     

    最近业务需求,需要在网页上地图。关于地图的使用,主流的就是高德地图,百度地图。经比较以后,发现两种地图的使用的方式几乎一模一样。

    于是,我使用了百度地图。

     

    1、注册百度账号,在http://lbsyun.baidu.com/apiconsole/key?application=key 页面申请密钥(AK)

    2、页面引入

    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的密钥"></script>

    3、地图需要一个HTML元素作为容器,这样才能展现到页面上。这里我们创建了一个div元素。

    <body>
    <div id = "allmap"></div>
    </body>

    4、实例化地图

    <script type="text/javascript">
    
        //百度地图API功能
        var map = new BMap.Map("allmap");
        map.centerAndZoom(new BMap.Point(120.378386,30.309756),15);//根据坐标初始化地图
         map.enableScrollWheelZoom(true);
        map.addControl(new BMap.NavigationControl());   //平移缩放控件
        map.addControl(new BMap.ScaleControl());        //比例尺
        map.addControl(new BMap.OverviewMapControl());  //缩略地图
        map.addControl(new BMap.MapTypeControl());      //地图类型
        map.setCurrentCity("杭州"); // 仅当设置城市信息时,MapTypeControl的切换功能才能可用
    
        //添加标注
        var marker = new BMap.Marker(new BMap.Point(120.378386,30.309756));        // 创建标注
        map.addOverlay(marker);                     // 将标注添加到地图中
    </script>

     

    至此,地图已经可以显示了。

    完整代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <!-- baidu map -->
        <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
        <style type="text/css">
            body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
        </style>
        <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的密钥"></script>
    </head>
    <body>
    <div id = "allmap"></div>
    </body>
    </html>
    <script type="text/javascript">
    
        //百度地图API功能
        var map = new BMap.Map("allmap");
        map.centerAndZoom(new BMap.Point(120.378386,30.309756),15);//根据坐标初始化地图
         map.enableScrollWheelZoom(true);
        map.addControl(new BMap.NavigationControl());   //平移缩放控件
        map.addControl(new BMap.ScaleControl());        //比例尺
        map.addControl(new BMap.OverviewMapControl());  //缩略地图
        map.addControl(new BMap.MapTypeControl());      //地图类型
        map.setCurrentCity("杭州"); // 仅当设置城市信息时,MapTypeControl的切换功能才能可用
    
        //添加标注
        var marker = new BMap.Marker(new BMap.Point(120.378386,30.309756));        // 创建标注
        map.addOverlay(marker);                     // 将标注添加到地图中
    </script>

     

     

    关于百度地图API的其他使用,其官方文档说的非常详细和清楚。

    链接如下:http://lbsyun.baidu.com/index.php?title=jspopular3.0

    展开全文
  • 百度地图个人开发demo 源码程序

    千次下载 热门讨论 2020-07-29 14:20:37
    本资源是百度地图开发demo, 包括地图图层展示,覆盖物添加,地理编码+反地理编码,地图控制+定位,poi检索,公交路线查询+路线规划。 详见blog: http://blog.csdn.net/crazy1235/article/details/44069267 ...
  • 百度地图简单实现

    千次阅读 2018-11-03 23:16:53
    步骤一: 在百度开放平台,注册 ak ... 故需要先生成签名文件 ... 然后在签名文件所在文件夹中打开 CMD 命令,输入 keytool -list -v -keystore 签名文件名.jks ... 添加相关 jar 包和 .so 文件(注:jni...

    步骤一:

    在百度开放平台,注册 ak
    注册 ak 时,需要用到 app 的 SHA1 和 包名,而获取 SHA1,需要用到 release 版 的签名文件
    故需要先生成签名文件
    然后在签名文件所在文件夹中打开 CMD 命令,输入 keytool -list -v -keystore 签名文件名.jks

    步骤二:

    添加相关 jar 包和 .so 文件(注:jniLibs下的目录文件需要对应,文件名虽然相同,但文件里边的内容是不同的)

    这里写图片描述

    这里写图片描述

    步骤三:

    配置清单文件(添加 AK 和 相应的权限)

    步骤四:

    在 MyApplication 中 的 onCreate 方法中初始化 BaiduMap

    这里写图片描述

    /**
     * 初始化 BaiduMap
     * 建议该方法放在 Application 的 onCreate 方法中
     * 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext
     * 注意该方法要再setContentView方法之前实现
     */
    private void initBaiduMap() {
    	//在Activity 中 可以通过 getApplicationContext() 获取全局的上下文
    //  	SDKInitializer.initialize(getApplicationContext());
        SDKInitializer.initialize(context);
        //自4.3.0起,百度地图SDK所有接口均支持百度坐标(BD09LL)和国测局坐标(GCJ02),默认是BD09LL坐标
        SDKInitializer.setCoordType(CoordType.BD09LL);//设置为百度坐标,默认为百度坐标
    }
    

    步骤五:

    在需要显示地图的 xml 中 添加 com.baidu.mapapi.map.MapView 布局

    这里写图片描述

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:clickable="true" />
    

    在需要显示地图的 Activity 中 获取 mapView 控件实例

    这里写图片描述

    //获取地图控件引用
    mMapView = (MapView) findViewById(R.id.bmapView);
    

    在需要显示地图的 Activity 中 设置 mapView 控件的生命周期

    这里写图片描述

    @Override
        protected void onResume() {
            super.onResume();
            //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
            mMapView.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
            mMapView.onPause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //如果开启了定位功能,需要在退出时销毁定位
            mLocClient.stop();
            //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
            mMapView.onDestroy();
            mMapView = null;
        }
    

    步骤六:

    配置混淆文件

    这里写图片描述

    #baidu地图    集成地图SDK的应用,在打包混淆的时候,需要注意与地图SDK相关的方法不可被混淆
    -keep class com.baidu.** {*;}
    -keep class mapsdkvi.com.** {*;}
    -dontwarn com.baidu.**
    

    运行程序,即可显示地图。

    获取 mBaiduMap 实例

    这里写图片描述

    //普通地图 ,mBaiduMap 是地图控制器对象
    mBaiduMap = mMapView.getMap();
    

    获取 mUiSettings 实例

    这里写图片描述

    //实例化UiSettings类对象 mUiSettings.setCompassEnabled(enable);//设置指南针是否可用
    mUiSettings = mBaiduMap.getUiSettings();
    

    构造广播监听类,监听 SDK key 验证以及网络异常广播

    这里写图片描述

    /**
     * 构造广播监听类,监听 SDK key 验证以及网络异常广播
     */
    public class SDKReceiver extends BroadcastReceiver {
    
        public void onReceive(Context context, Intent intent) {
            String s = intent.getAction();
            Log.d(TAG, "action: " + s);
            if (s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
                Log.e(TAG, "key 验证出错! 错误码 :" + intent.getIntExtra
                        (SDKInitializer.SDK_BROADTCAST_INTENT_EXTRA_INFO_KEY_ERROR_CODE, 0)
                        +  " ; 请在 AndroidManifest.xml 文件中检查 key 设置");
            } else if (s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK)) {
                Log.e(TAG, "key 验证成功! 功能可以正常使用");
            } else if (s.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
                Log.e(TAG, "网络出错");
            }
        }
    }
    

    设置地图中心坐标

    设置显示在屏幕中的地图地理范围(即,设置屏幕中间默认显示的中心点地图坐标)

    这里写图片描述

    //设置显示在屏幕中的地图地理范围(即,设置屏幕中间默认显示的中心点地图坐标)
    mBaiduMap.setMapStatus(MapStatusUpdateFactory. newLatLngBounds(// 设置显示在屏幕中的地图地理范围
          new LatLngBounds.Builder().include(new LatLng(mCurrentLat, mCurrentLon)).build()));
    // 设置显示在屏幕中的地图地理范围
    //        mBaiduMap.setMapStatus(MapStatusUpdateFactory. newLatLngBounds(bounds),width, height);
    

    设置地图 logo 显示/隐藏

    注:按照百度地图API使用条款 您的应用不得删除或遮盖 百度地图Logo或版权声明
    请保证,百度地图Logo和法律声明始终可见

    这里写图片描述

    //设置地图 logo 显示/隐藏(隐藏 logo : View.INVISIBLE)
    View child = mMapView.getChildAt(1);
    if (child != null && (child instanceof ImageView || child instanceof ZoomControls)){
        child.setVisibility(View.INVISIBLE);
    }
    

    设置底图标注 显示/隐藏(控制地图POI显示)

    这里写图片描述

    //设置底图标注 显示/隐藏(控制地图POI显示)
    //根据使用需要,支持设置poi的显示。默认显示底图标注。利用此属性可将底图标注设置为隐藏,得到仅显示道路信息的地图
    mBaiduMap.showMapPoi(false);
    

    设置地图边界区域(已废弃)

    这里写图片描述

    //地图Logo不允许遮挡,可通过以下方法可以设置地图边界区域,来避免UI遮挡
    mBaiduMap.setPadding(0, 0, 0, 0);//左上右下(padding 值 需大于0)
    

    设置地图边界区域

    这里写图片描述

    //围绕地图边缘添加内边距。地图将继续充满整个屏幕,
    // 但地图logo、比例尺、指南针、缩放按钮等控件、地图手势以及覆盖物,将调整在地图边界内操作。
    // 适用于不希望操作控件被UI遮挡情况。
    mBaiduMap.setViewPadding(0, 0, 0, 0);//左上右下(padding 值 需大于0)
    

    两种设置地图边界区域方法的区别

    这里写图片描述

    设置指南针是否可用

    这里写图片描述

    //设置指南针是否可用
    mUiSettings.setCompassEnabled(true);
    

    设置地图平移功能是否可用

    这里写图片描述

    //控制是否启用或禁用平移的功能,默认开启。如果启用,则用户可以平移地图
    mUiSettings. setScrollGesturesEnabled(false);
    

    设置比例尺 显示/隐藏

    这里写图片描述

    //设置比例尺 显示/隐藏
    mMapView.showScaleControl(false);
    

    设置缩放按钮 显示/隐藏

    这里写图片描述

    //设置缩放按钮 显示/隐藏
    mMapView. showZoomControls(false);
    

    设置 最大缩放级别 MaxZoomLevel 和 最小缩放级别 minZoomLevel

    这里写图片描述

    //设置 最大缩放级别 MaxZoomLevel 和 最小缩放级别 minZoomLevel
    //注:自v5.0.0起,为了优化显示效果,将地图缩放等级由 3-21 调整为 4-21,请开发者注意。
    mBaiduMap.setMaxAndMinZoomLevel(21, 4);
    

    设置地图缩放级别

    这里写图片描述

    /**
     * 缩放到指定的缩放级别
     *
     * @param zoomLevel
     */
    private void zoomLevel(float zoomLevel){
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(zoomLevel));//直接设置指定的缩放级别
    }
    
    /**
     * 放大地图缩放级别
     */
    private void zoomLevel_bigger(){
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());//放大地图缩放级别
    }
    
    /**
     * 缩小地图缩放级别
     */
    private void zoomLevel_smaller(){
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());//缩小地图缩放级别
    }
    

    指定位置添加 marker

    这里写图片描述

    /**
     * 指定位置添加 marker
     * @param view
     */
    public void onAssignLocation(View view){
        //定义Maker坐标点    121.676386,38.934928
        LatLng point = new LatLng(38.934928, 121.676386);
    
        //构建Marker图标
        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
    
        //构建MarkerOption,用于在地图上添加Marker
        OverlayOptions option = new MarkerOptions()
                .position(point)
                .icon(bitmap);
    
        //在地图上添加Marker,并显示
        mBaiduMap.addOverlay(option);
    }
    

    添加自定义 Marker

    这里写图片描述

    /**
     * 绘制自定义Marker
     * 可根据实际的业务需求,在地图指定的位置上添加自定义的 Marker。MarkerOptions 是设置 Marker 参数变量的类
     * 具体使用源码请在 OverlayDemo 中查看
     * <p>
     * OverlayManager /PoiOverlay / IndoorPoiOverlay /IndoorRouteOverlay /TransitRouteOverlay
     * /WalkingRouteOverlay /BikingRouteOverlay /DrivingRouteOverlay /BusLineOverlay
     * /MassTransitRouteOverlay / 以上源码可在BaiduMapsApiDemo工程中找到。
     */
    private MarkerOptions addCustomMarker() {
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_markb))
                .animateType(MarkerOptions.MarkerAnimateType.drop)
                .alpha(0.5f)
                .position(new LatLng(38.935548, 121.678815))//121.678815,38.935548
                .perspective(true)//是否开启近大远小效果
                .draggable(true)//是否可拖拽
                .flat(true)//是否平贴地图
                .rotate(0)
                .title("绘制自定义 Marker")
                .visible(true);
        return markerOptions;
    }
    
    //在地图上添加Marker,并显示
    mBaiduMap.addOverlay(addCustomMarker());
    

    给Marker增加帧动画

    自v3.3.0版本起,SDK提供了给 Marker 增加动画的能力

    这里写图片描述

    /**
     * 给Marker增加帧动画
     *
     * @param view
     */
    public void onAddAnimation(View view){
        //定义 Marker 坐标点
        LatLng pt = new LatLng(38.934928, 121.676386);
    
        BitmapDescriptor bdA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
        BitmapDescriptor bdB = BitmapDescriptorFactory.fromResource(R.drawable.icon_markb);
        BitmapDescriptor bdC = BitmapDescriptorFactory.fromResource(R.drawable.icon_markc);
        BitmapDescriptor bdD = BitmapDescriptorFactory.fromResource(R.drawable.icon_markd);
        BitmapDescriptor bdE = BitmapDescriptorFactory.fromResource(R.drawable.icon_marke);
        BitmapDescriptor bdF = BitmapDescriptorFactory.fromResource(R.drawable.icon_markf);
        BitmapDescriptor bdG = BitmapDescriptorFactory.fromResource(R.drawable.icon_markg);
    
        // 通过Marker的icons设置一组图片,再通过period设置多少帧刷新一次图片资源
        ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();
        giflist.add(bdA);
        giflist.add(bdB);
        giflist.add(bdC);
        giflist.add(bdD);
        giflist.add(bdE);
        giflist.add(bdF);
        giflist.add(bdG);
    
        OverlayOptions ooD = new MarkerOptions()
                .position(pt)
                .icons(giflist)
                .zIndex(0)
                .period(10);
    
        //添加在地图中
        Marker mMarkerD = (Marker) (mBaiduMap.addOverlay(ooD));
    }
    

    加载Marker时的加载动画

    这里写图片描述

    /**
     * 加载Marker时的加载动画
     *
     * @param view
     */
    public void onAddAnim(View view) {
        //定义 Marker 坐标点
        LatLng pt = new LatLng(38.934928, 121.676386);
    
        BitmapDescriptor bdA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
        BitmapDescriptor bdB = BitmapDescriptorFactory.fromResource(R.drawable.icon_markb);
        BitmapDescriptor bdC = BitmapDescriptorFactory.fromResource(R.drawable.icon_markc);
        BitmapDescriptor bdD = BitmapDescriptorFactory.fromResource(R.drawable.icon_markd);
        BitmapDescriptor bdE = BitmapDescriptorFactory.fromResource(R.drawable.icon_marke);
        BitmapDescriptor bdF = BitmapDescriptorFactory.fromResource(R.drawable.icon_markf);
        BitmapDescriptor bdG = BitmapDescriptorFactory.fromResource(R.drawable.icon_markg);
    
        ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();
        giflist.add(bdA);
        giflist.add(bdB);
        giflist.add(bdC);
        giflist.add(bdD);
        giflist.add(bdE);
        giflist.add(bdF);
        giflist.add(bdG);
    
        MarkerOptions ooD = new MarkerOptions()
                .position(pt)
    //                .icon(bdA)
                .icons(giflist)
                .zIndex(0)
                .period(10);
    
        // 生长动画
        ooD.animateType(MarkerOptions.MarkerAnimateType.grow);
    
        Marker mMarkerD = (Marker) (mBaiduMap.addOverlay(ooD));
    }
    

    批量添加 Marker

    这里写图片描述

    //批量添加 Marker
    List<OverlayOptions> options = new ArrayList<OverlayOptions>();
    options.add(option);
    options.add(addCustomMarker());
    mBaiduMap.addOverlays(options);
    

    清除地图上所有覆盖物,无法分成批删除

    这里写图片描述

     /**
      * 清除地图上所有覆盖物,无法分成批删除
      *
      * @param view
      */
     public void onDeleteMarker(View view) {
         mBaiduMap.clear();
     }
    

    添加文字覆盖物

    这里写图片描述

    /**
     * 添加文字
     *
     * @param view
     */
    public void onAddText(View view) {
        //定义文字所显示的坐标点
        LatLng llText = new LatLng(38.934928, 121.676386);
    
        //构建文字Option对象,用于在地图上添加文字
        OverlayOptions textOption = new TextOptions()
                .bgColor(0xAAFFFF00)
                .fontSize(24)
                .fontColor(0xFFFF00FF)
                .text("百度地图SDK")
                .rotate(-30)
                .position(llText);
    
        //在地图上添加该文字对象并显示
        Text text = (Text) mBaiduMap.addOverlay(textOption);
    }
    

    添加信息窗(弹窗覆盖物InfoWindow)

    开发者只需将InfoWindow的显示方法写在Maker的点击事件处理中即可实现该效果

    这里写图片描述

    /**
    * 添加信息窗(弹窗覆盖物InfoWindow)
     * 开发者只需将InfoWindow的显示方法写在Maker的点击事件处理中即可实现该效果
     *
     * @param view
     */
    public void onInfoWindow(View view){
        //创建InfoWindow展示的view
    //        Button button = new Button(getApplicationContext());
        Button button = new Button(this);
        button.setBackgroundResource(R.drawable.popup);
        button.setText("信息框");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(BaiduMapActivity.this, "点我干啥", Toast.LENGTH_SHORT).show();
            }
        });
    
        //定义用于显示该InfoWindow的坐标点
        LatLng pt = new LatLng(38.934928, 121.676386);
    
        //创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量
        InfoWindow mInfoWindow = new InfoWindow(button, pt, -47);
    
        //在地图上显示 InfoWindow
        mBaiduMap.showInfoWindow(mInfoWindow);
    }
    

    点聚合

    自v3.6.0版本起,新增点聚合功能,可通过缩小地图层级,将定义范围内的多个标注点,聚合显示成一个标注点,并在MarkerClusterDemo中开放源码,方便开发者自行修改。
    http://lbsyun.baidu.com/index.php?title=androidsdk/guide/render-map/point

    添加折线图

    这里写图片描述

    /**
     * 添加折线图(实线)
     *
     * @param view
     */
    private Polyline mPolyline;
    public void onAddZheXian(View view){
        //构建折线点坐标
        LatLng p1 = new LatLng(38.931639, 121.681021);//121.681021,38.931639
        LatLng p2 = new LatLng(38.935513, 121.679314);//121.679314,38.935513
        LatLng p3 = new LatLng(38.934741, 121.676403);//121.676403,38.934741
        LatLng p4 = new LatLng(38.931639, 121.681021);//121.681021,38.931639
        List<LatLng> points = new ArrayList<LatLng>();
        points.add(p1);
        points.add(p2);
        points.add(p3);
        points.add(p4);
    
        //绘制折线
        OverlayOptions ooPolyline = new PolylineOptions()
                .width(10)
                .color(0xAAFF0000)
                .points(points);
    
        //添加在地图中
        mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline);
    }
    
    /**
     * 添加折线图(虚线)
     *
     * @param view
     */
     public void onAddZheXian(View view){
    	//设置是否虚线绘制
        //先绘制普通折线,然后通过 setDottedLine(enabled) 来控制显示为虚线。
        mPolyline.setDottedLine(true);
     }
    

    分段颜色绘制折线

    这里写图片描述

    /**
     * 分段颜色绘制折线
     *
     * @param view
     */
    public void onAddZheXianMultiColors(View view){
        // 构造折线点坐标
        List<LatLng> points = new ArrayList<LatLng>();
        points.add(new LatLng(38.934053,121.67732));//121.67732,38.934053
        points.add(new LatLng(38.933576,121.676834));//121.676834,38.933576
        points.add(new LatLng(38.932622,121.679709));//121.679709,38.932622
        points.add(new LatLng(38.930966,121.680068));//121.680068,38.930966
        points.add(new LatLng(38.931162,121.68138));//121.68138,38.931162
    
        //构建分段颜色索引数组
        List<Integer> colors = new ArrayList<>();
        colors.add(Integer.valueOf(Color.BLUE));
        colors.add(Integer.valueOf(Color.RED));
        colors.add(Integer.valueOf(Color.YELLOW));
        colors.add(Integer.valueOf(Color.GREEN));
    
        绘制折线
        OverlayOptions ooPolyline = new PolylineOptions()
                .width(10)
                .colorsValues(colors)
                .points(points);
    
        //添加在地图中
        Polyline  mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline);
    
        //设置是否虚线绘制
        //先绘制普通折线,然后通过 setDottedLine(enabled) 来控制显示为虚线。
        mPolyline.setDottedLine(false);
    }
    

    分段纹理绘制折线

    /**
     * 分段纹理绘制折线
     * 自v3.6.0版本起,扩展了折线多段颜色绘制能力:增加支持分段纹理绘制。
     * 纹理素材格式:纹理图片须是正方形,宽高是2的整数幂,如64*64,否则无效;若设置了纹理图片,设置线颜色、连接类型和端点类型将无效。
     * 注:目前仅支持对折线设置纹理,其余覆盖物目前暂不支持设置纹理。
     * @param view
     */
    public void onAddWenLiMultiColors(View view){
        //构建折线坐标点
        LatLng p111 = new LatLng(38.934053,121.67732);
        LatLng p211 = new LatLng(38.933576,121.676834);
        LatLng p311 = new LatLng(38.932622,121.679709);
        LatLng p411 = new LatLng(38.930966,121.680068);
        LatLng p511 = new LatLng(38.931162,121.68138);
        List<LatLng> points11 = new ArrayList<LatLng>();
        points11.add(p111);
        points11.add(p211);
        points11.add(p311);
        points11.add(p411);
        points11.add(p511);
    
        BitmapDescriptor mRedTexture = BitmapDescriptorFactory.fromResource(R.drawable.icon_road_red_arrow);
        BitmapDescriptor mGreenTexture = BitmapDescriptorFactory.fromResource(R.drawable.icon_road_green_arrow);
        BitmapDescriptor mBlueTexture = BitmapDescriptorFactory.fromResource(R.drawable.icon_road_blue_arrow);
    
        List<BitmapDescriptor> textureList = new ArrayList<BitmapDescriptor>();
        textureList.add(mRedTexture);
        textureList.add(mGreenTexture);
        textureList.add(mBlueTexture);
        List<Integer> textureIndexs = new ArrayList<Integer>();
        textureIndexs.add(0);
        textureIndexs.add(1);
        textureIndexs.add(2);
    
        //构造PolylineOptions对象,并绘制
        OverlayOptions ooPolyline11 = new PolylineOptions()
                .width(20)
                .points(points11)
                .dottedLine(true)//需设置为 true
                .customTextureList(textureList)
                .textureIndex(textureIndexs);
    
        //添加在地图中
        Polyline mTexturePolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline11);
    }
    

    绘制多边形(如何使用几何图形覆盖物)

    这里写图片描述

    /**
     * 绘制多边形
     * 如何使用几何图形覆盖物
     *
     * @param view
     */
    public void onAddMultiSides(View view){
        //构建多边形的五个顶点
        LatLng pt1 = new LatLng(38.9346439, 121.676852);
        LatLng pt2 = new LatLng(38.935948, 121.679475);
        LatLng pt3 = new LatLng(38.934671, 121.68253);
        LatLng pt4 = new LatLng(38.932089, 121.680967);
        LatLng pt5 = new LatLng(38.932748, 121.677984);
        List<LatLng> pts = new ArrayList<LatLng>();
        pts.add(pt1);
        pts.add(pt2);
        pts.add(pt3);
        pts.add(pt4);
        pts.add(pt5);
    
        //构建用户绘制多边形的Option对象
        OverlayOptions polygonOption = new PolygonOptions()
                .points(pts)
                .stroke(new Stroke(5, 0xAA00FF00))
                .fillColor(0xAAFFFF00);
    
        //在地图上添加多边形Option,用于显示
        Polygon polygon = (Polygon) mBaiduMap.addOverlay(polygonOption);
    }
    

    绘制弧线

    这里写图片描述

    /**
     * 绘制弧线
     *
     * @param view
     */
    public void onAddHuXian(View view){
        LatLng p1 = new LatLng(38.931639, 121.681021);
        LatLng p2 = new LatLng(38.935513, 121.679314);
        LatLng p3 = new LatLng(38.934741, 121.676403);
    
        //设置颜色和透明度,均使用16进制显示,0xAARRGGBB,如 0xAA00FF00 其中AA是透明度,00FF00为颜色
        OverlayOptions ooArc = new ArcOptions()
                .color(0xAA00FF00)
                .width(4)
                .points(p1, p2, p3);
    
        //添加在地图中
        Arc arc = (Arc)mBaiduMap.addOverlay(ooArc);
    }
    

    绘制圆形

    这里写图片描述

    /**
     * 绘制圆形
     *
     * @param view
     */
    public void onAddCircle(View view) {
        //构建圆心坐标点
        LatLng llCircle = new LatLng(38.934741, 121.676403);
    
        //设置颜色和透明度,均使用16进制显示,0xAARRGGBB,如 0xAA000000 其中AA是透明度,000000为颜色
        OverlayOptions ooCircle = new CircleOptions()
                .fillColor(0xAAFF0000)
                .center(llCircle)
                .stroke(new Stroke(5, 0xAA0000FF))
                .radius(100);
    
        //添加在地图中
        Circle circle = (Circle) mBaiduMap.addOverlay(ooCircle);
    }
    

    定位

    // TODO 见另外一篇
    这里写图片描述

    定位需要在生命周期中销毁

    这里写图片描述

    @Override
        protected void onDestroy() {
            super.onDestroy();
            //如果开启了定位功能,需要在退出时销毁定位
            mLocClient.stop();
            //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
            mMapView.onDestroy();
            mMapView = null;
        }
    

    自定义地图当前位置的定位图标

    这里写图片描述

    /**
     * 定位 配置
     *
     * @param mCurrentMode  设置地图模式  * NORMAL(普通态)* FOLLOWING(跟随态)* COMPASS(罗盘态)
     * @param openLocDirection  是否开启定位方向
     * @param mCurrentMarker    当前位置的小图标
     * @param accuracyCircleFillColor   精度圈颜色
     * @param accuracyCircleStrokeColor 精度圈边框颜色
     * @return MyLocationConfiguration 根据上述参数生成的配置信息
     */
    private MyLocationConfiguration locationConfig(
            LocationMode mCurrentMode,
            boolean openLocDirection,
            @DrawableRes int mCurrentMarker,
            @ColorRes int accuracyCircleFillColor,
            @ColorRes int accuracyCircleStrokeColor){
        return new MyLocationConfiguration(mCurrentMode, openLocDirection, BitmapDescriptorFactory.fromResource(mCurrentMarker),
                getResources().getColor(accuracyCircleFillColor), getResources().getColor(accuracyCircleStrokeColor));
    }
    
    /**
     * 百度地图 配置
     *
     * @param baiduMapConfig
     */
    private void configBaiduMap(MyLocationConfiguration baiduMapConfig) {
        mBaiduMap.setMyLocationConfiguration(baiduMapConfig);
    }
    

    是否打开室内图

    室内图默认是关闭的
    开启室内地图后,如果可见区域内包含室内地图覆盖区域(如:王府井等知名商场)
    且缩放达到一定级别,便可直接在地图上看到精细室内地图效果
    室内图区域与显示屏幕无交集时,基础地图支持最大缩放到21级
    因路况、卫星图和城市热力图,仅支持20级地图数据显示,室内地图放大到22级
    打开路况、卫星图或城市热力图,无相应数据显示

    // TODO 有瑕疵

    这里写图片描述

    /**
     * 设置是否打开室内图,默认为关闭状态
     * 目前只有初始化时可以设置为打开模式,也可以点击按钮设置为关闭模式
     * 但尚未实现再次点击按钮打开室内图效果
     *
     * @param isIndoorEnable
     */
    private void indoorEnable(boolean isIndoorEnable) {
        mBaiduMap.setIndoorEnable(isIndoorEnable);
    }
    

    地图定位图层的显示与隐藏,即地图当前位置的定位图标的显示与隐藏

    这里写图片描述

    /**
     * 开启定位图层,显示当前位置的定位图标
     *
     * @param showLocation true 显示;false 不显示
     */
    public void showLocationImage(boolean showLocation) {
        mBaiduMap.setMyLocationEnabled(showLocation);
    }
    

    切换地图类型

    这里写图片描述

    /**
     * 切换地图类型:普通地图
     * <p>
     * MAP_TYPE_NONE        空地图
     * MAP_TYPE_NORMAL      普通地图(包含3D地图)
     * MAP_TYPE_SATELLITE   卫星图
     *
     * @param view
     */
    public void onNormalMapClick(View view) {
        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
    }
    
    /**
     * 切换地图类型:卫星地图
     * <p>
     * MAP_TYPE_NONE        空地图
     * MAP_TYPE_NORMAL      普通地图(包含3D地图)
     * MAP_TYPE_SATELLITE   卫星图
     *
     * @param view
     */
    public void onSatelliteMapClick(View view) {
        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
    }
    

    POI城市内检索

    根据关键字检索适用于在某个城市搜索某个名称相关的POI,例如:查找北京市的“小吃”


    POI 检索 和 Sug 检索 的区别及使用场景:
    1)Sug检索的本质是根据部分关键字检索出来可能的完整关键词名称,即关键词匹配;
    2)POI检索的功能是检索POI,如果需要查询某些关键词对应的POI的具体信息,请使用POI检索来完成。
    Sug检索结果的第一条可能存在没有经纬度的情况,该条结果为文字联想出来的关键词结果,不对应任何确切POI点。
    例如输入“肯”,第一条结果为“肯德基”,这条结果是一个泛指的名称,不会带有经纬度等信息。
    常用的使用方式:用户输入“关键字”时以Sug检索做为检索入口,边输入边检索热词;
    输入完成后如还没有搜到结果,再用POI检索以“关键字”为keywords再继续搜索。
    具体使用可以参看POISearchDemo。

    第一步:

    初始化 POI 检索
    创建POI检索监听者

    这里写图片描述

    /**
     * 初始化 POI 检索
     */
     private void initPoiSearch() {
         //创建POI检索实例
         mPoiSearch = PoiSearch.newInstance();
    
         //设置POI检索监听者
         mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
     }
    
    /**
     * 创建POI检索监听者
     */
    OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
    
        public void onGetPoiResult(PoiResult result) {
            //获取POI检索结果
            Log.e(TAG, "result.describeContents()" + String.valueOf(result.describeContents()));
    //            Log.e(TAG, "result.getAllAddr()" + result.getAllAddr());
            Log.e(TAG, "result.getAllPoi()" + result.getAllPoi());
            StringBuilder stringBuilder = new StringBuilder();
            for (PoiInfo poiInfo : result.getAllPoi()) {
                stringBuilder
                        .append("name=" + poiInfo.name).append(" + ")
                        .append("address=" + poiInfo.address).append(" + ")
                        .append("city=" + poiInfo.city).append(" + ")
                        .append("describeContents=" + poiInfo.describeContents()).append(" + ")
                        .append("phoneNum=" + poiInfo.phoneNum).append(" + ")
                        .append("postCode=" + poiInfo.postCode).append(" + ")
                        .append("uid=" + poiInfo.uid).append(" + ")
                        .append("hasCaterDetails=" + poiInfo.hasCaterDetails).append(" + ")
                        .append("isPano=" + poiInfo.isPano).append(" + ")
                        .append("location=" + poiInfo.location).append(" + ")
                        .append("type=" + poiInfo.type).append(" ... ");
            }
            TextView text1 = (TextView) findViewById(R.id.text1);
            text1.setText(stringBuilder);
    
    		//uid是POI检索中获取的POI ID信息,会执行 onGetPoiDetailResult 方法
            int index = 0;
            mPoiSearch.searchPoiDetail((new PoiDetailSearchOption()).poiUid(result.getAllPoi().get(index).uid));
        }
    
        public void onGetPoiDetailResult(PoiDetailResult result) {
            //获取Place详情页检索结果
            Log.e(TAG, "onGetPoiDetailResult 执行了");
    
            if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
                return;
            }
    
            if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                //检索成功
                Log.e(TAG, "onGetPoiDetailResult,result == success");
    
    
            } else {
                //详情检索失败,result.error 请参考 SearchResult.ERRORNO
                Log.e(TAG, "onGetPoiDetailResult,result == error");
    
            }
        }
    
        @Override
        public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
    		//获取Indoor检索结果
            Log.e(TAG, "onGetPoiIndoorResult 执行了");
    
            if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
                return;
            }
    
            if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                //检索成功
                Log.e(TAG, "onGetPoiIndoorResult,result == success");
    
            } else {
                //详情检索失败,result.error 请参考 SearchResult.ERRORNO
                Log.e(TAG, "onGetPoiIndoorResult,result == error");
    
            }
        }
    };
    

    第二步:

    发起检索请求

    这里写图片描述

    /**
     * POI城市内检索
     *
     * @param view
     */
    public void onPOISearch(View view) {
        boolean b = mPoiSearch.searchInCity((new PoiCitySearchOption())
                .city("大连")
                .keyword("美食")
                .pageNum(10));
    }
    

    第三步:

    释放POI检索实例

    这里写图片描述

    //释放POI检索实例
    mPoiSearch.destroy();
    

    Sug检索(地点检索输入提示服务)

    地点检索输入提示服务(也被称为POI热词建议检索、在线建议检索、Suggestion POI search),简称Sug检索,是指根据关键词查询在线建议词。为了帮助开发者实现检索出来的关键词快速定位到地图上,SDK开放了检索结果的经纬度信息及对应POI点的UID信息。


    Sug 检索 和 POI 检索 的区别及使用场景:
    1)Sug检索的本质是根据部分关键字检索出来可能的完整关键词名称,即关键词匹配;
    2)POI检索的功能是检索POI,如果需要查询某些关键词对应的POI的具体信息,请使用POI检索来完成。
    Sug检索结果的第一条可能存在没有经纬度的情况,该条结果为文字联想出来的关键词结果,不对应任何确切POI点。
    例如输入“肯”,第一条结果为“肯德基”,这条结果是一个泛指的名称,不会带有经纬度等信息。
    常用的使用方式:用户输入“关键字”时以Sug检索做为检索入口,边输入边检索热词;
    输入完成后如还没有搜到结果,再用POI检索以“关键字”为keywords再继续搜索。
    具体使用可以参看POISearchDemo。

    第一步:

    创建在线建议查询实例
    创建在线建议查询监听者

    这里写图片描述

    /**
     * 初始化 Sug 检索
     */
     private void initSugSearch() {
         //创建在线建议查询实例
         mSuggestionSearch = SuggestionSearch.newInstance();
    
         //设置在线建议查询监听者
         mSuggestionSearch.setOnGetSuggestionResultListener(listener);
     }
    
    /**
     * 创建在线建议查询监听者
     */
    OnGetSuggestionResultListener listener = new OnGetSuggestionResultListener() {
        public void onGetSuggestionResult(SuggestionResult result) {
    
            if (result == null || result.getAllSuggestions() == null) {
                //未找到相关结果
                return;
            }
    
            StringBuilder stringBuilder = new StringBuilder();
    
            for (SuggestionResult.SuggestionInfo suggestionResult : result.getAllSuggestions()) {
                stringBuilder.append("city=" + suggestionResult.city).append(" + ")
                        .append("district=" + suggestionResult.district).append(" + ")
                        .append("key=" + suggestionResult.key).append(" + ")
                        .append("describeContents=" + suggestionResult.describeContents()).append(" + ")
                        .append("address=" + suggestionResult.address).append(" + ")
                        .append("tag=" + suggestionResult.tag).append(" + ")
                        .append("uid=" + suggestionResult.uid).append(" ... ");
            }
    
            TextView text1 = (TextView) findViewById(R.id.text1);
            text1.setText(stringBuilder);
    
            //uid是POI检索中获取的POI ID信息
            int index = 0;
            mPoiSearch.searchPoiDetail(new PoiDetailSearchOption().poiUid(result.getAllSuggestions().get(index).uid));
        }
    };
    

    第二步:

    发起在线建议查询

    这里写图片描述

     /**
      * Sug 检索
      * 
      * @param view
      */
     public void onSUGSearch(View view){
         // 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
         mSuggestionSearch.requestSuggestion((new SuggestionSearchOption())
                 .keyword("百度")
                 .city("大连"));
     }
    

    第三步:

    释放在线建议查询实例

    这里写图片描述

    //释放在线建议查询实例
    mSuggestionSearch.destroy();
    
    展开全文
  • 百度地图开发(三)之地图控制 + 定位

    万次阅读 多人点赞 2015-02-24 12:28:33
     前两篇关于百度地图的blog写的是,一些基本图层的展示 和 覆盖物的添加+地理编码和反地理编码。  接下来,这篇blog主要说一些关于地图控制方面的内容和定位功能。  百度地图提供的关于地图的操作主要有:单击...

        转载请注明出处:http://blog.csdn.net/crazy1235/article/details/43898451

        前两篇关于百度地图的blog写的是,一些基本图层的展示 和 覆盖物的添加+地理编码和反地理编码

        接下来,这篇blog主要说一些关于地图控制方面的内容和定位功能。

        百度地图提供的关于地图的操作主要有:单击、双击、长按、缩放、旋转、俯视等。

    地图控制

        我们现在已经知道,想要显示一个地图,只需要在xml文件中添加一个MapView控件即可,但是想要对其进行一些控制,就需要通过这个控件返回一个BaiduMap对象。

    从API中先看一下MapView的方法:


        对于MapView这个类,官方解释是一个显示地图的视图,负责从服务器端获取地图数据,并且会捕捉到屏幕触控手势事件。使用这个类必须按照它的生命周期进行操作,从上图可以看到,它包括一些类似于activity生命周期的方法:onResume()、onPause()、onDestory()。所以我们需要在activity的各个生命周期中,把MapView的各个生命周期函数添加进去。

        在使用地图控件之前必须调用SDKInitializer.initialize(Context)函数用以提供全局Context信息。

        默认情况下,地图显示的时候会带着原生的缩放控件:。还有比例尺控件:

    通过showZoomControls(boolean show)showScaleControl(boolean show)这两个方法可以设置显示或者不显示两个控件。还可以通过设置setxxxPosition(Point p)方法来设置控件的位置。

    mapView.showZoomControls(false);// 不显示默认的缩放控件
    mapView.showScaleControl(false);// 不显示默认比例尺控件
        要想实现地图的一些控制,就需要使用到BaiduMap,这个类是专门用来操作地图控件的。



        上面的四个接口就是用来对地图添加相应的事件的。我们主要看一下下面的两个方法,它们都是以动画的方式更新地图状态。不同的是一个可以指定时长,另一个有默认的动画耗时。

        参数MapStatusUpdate描述的是地图状态将要发生的变化。也就是说,要想改变地图的某些状态,需要构造出一个MapStatusUpdate对象,然后使用animateMapStatus()方法来更新地图状态。但是并没有在API中找到它的相关的构造方法。但是在com.baidu.mapapi.map包下面找到了对应的"工厂类"


        打开MapStatusUpdateFactory可以看到很多静态的方法:


        通过这些静态的方法能够构造出各种类型的MapStatusUpdate对象。

        zoomIn()和zoomOut()分别是放大和缩小地图,分别是在当前基础上增加或较少1个级别。zoomTo()可以自己设置某一个缩放级别。百度地图将地图的级别定义为【3~19】。

    放大:

    msu = msuFactory.zoomIn();
    bdMap.animateMapStatus(msu);
    

    缩小:

    msu = msuFactory.zoomOut();
    bdMap.animateMapStatus(msu);
    

    设置地图中心点:

    msu = msuFactory.newLatLng(arg0);
    bdMap.animateMapStatus(msu);
    
        其他的方法就不一一叙述了。
        关于地图控制状态的还有两个类:MapStatusMapStatus.Builder。Builder是MapStatus的一个内部类,用于构造它,我们在API中可以看到MapStatus中是没有构造函数的。

        使用这两个类可以对地图进行旋转、俯视、设置中心点、设置缩放级别等操作。通过这些方法构造出MapStatus方法之后,怎么让BaiduMap调用它呢?

        查阅BaiduMap的所有方法之后也没有找到参数是MapStatus的方法。那么,猜想可能是通过把MapStatus转换成一个其他的对象,然后在由BaiduMap调用。而BaiduMap只有animateMapStatus()方法来更新地图状态。所以很定是MapStatus--->MapStatusUpdate。在MSU的工厂类中有这样一个方法:newMapStatus(MapStatus mapStatus)。OK,通过这个方法,可以把构造的MapStatus对象转成MapStatusUpdate,然后在通过animateMapStatus()调用就行了。

    旋转:

    mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).rotate(rotateAngle += 30).build();
    msu = msuFactory.newMapStatus(mapStatus);
    bdMap.animateMapStatus(msu);

    俯视(-45°~0):

    mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).overlook(overlookAngle -= 10).build();
    msu = msuFactory.newMapStatus(mapStatus);
    bdMap.animateMapStatus(msu);
        这里,lz有一个疑问:MapStaus.Builder中有一个设置地图中心点的方法:

    ,在MapStatusUpdateFactory中也有一个设置中心点的方法:。连个都是设置中心点,不知道区别是什么?希望知道的给我留个言,告知一下!!谢谢!~~
    截屏:

        在BaiduMap中有一个截屏的回调接口和一个截图的请求方法:



    很明显,调用这个截图请求方法,参数是上面的回调接口。在回调接口中只有一个方法:onSnapshotReady(Bitmap snapshot)。我们得到这个bitmap之后,就可以生成图片保存起来了。

        有Bitmap转成图片就需要用到Bitmap.compress()方法:

    bdMap.snapshot(new SnapshotReadyCallback() {
    		@Override
    		public void onSnapshotReady(Bitmap bitmap) {
    			File file = new File("/mnt/sdcard/test.png");
    			FileOutputStream out;
    			try {
    				out = new FileOutputStream(file);
    				if (bitmap.compress(
    						Bitmap.CompressFormat.PNG, 100, out)) {
    					out.flush();
    					out.close();
    				}
    				Toast.makeText(MapControllActivity.this,
    						"屏幕截图成功,图片存在: " + file.toString(),
    						Toast.LENGTH_SHORT).show();
    			} catch (FileNotFoundException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	});
    

    定位

        LZ采用的是百度最新版本5.0的SDK,该版本支持全球定位。

        开发定位功能一般都是按照以下步骤:

    1. 导入库文件。

        下载下来lib压缩包之后,会看到很多文件夹(对应很多架构),官方建议全部拷贝到lib下,这样程序兼容性大大提升,不要忘了把locSDK_5.0.jar拷贝到lib下。
    2. 添加定位service

    <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
    </service>
    3. 添加权限

    <!-- 这个权限用于进行网络定位 -->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
        </uses-permission>
        <!-- 这个权限用于访问GPS定位 -->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
        </uses-permission>
        <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
        </uses-permission>
        <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
        </uses-permission>
        <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
        </uses-permission>
        <!-- 用于读取手机当前的状态 -->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" >
        </uses-permission>
        <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
        </uses-permission>
        <!-- 访问网络,网络定位需要上网 -->
        <uses-permission android:name="android.permission.INTERNET" />
        <!-- SD卡读取权限,用户写入离线定位数据 -->
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
        </uses-permission>
        <!-- 允许应用读取低级别的系统日志文件 -->
        <uses-permission android:name="android.permission.READ_LOGS" >
        </uses-permission>
    4. 编写定位程序
        这一步才是重点。百度地图可以使用GPS和网络定位(WIFI和基站)进行定位。基本定位功能还支持定位结果的反地理编码功能,离线定位,位置提醒功能和地理围栏功能。

        主要会用到LocationClient、BDLocationListener、BDNotifyListener、LocationClientOption等类。
        (1)初始化LocationClient类:

        LocationClient类是定位SDK的核心类,必须在主线程中声明。需要传入一个Context类型的参数,推荐使用getApplicationContext()来获取全局进程有效的context。

        主要会用到该类中的以下几个方法:






       (2)设置定位参数:

        主要的参数有:定位模式、返回坐标类型、是否打开GPS等。

    定位模式分为三种:

    1. 高精度定位模式:同时使用网络定位和GPS定位,优先返回最高精度的定位结果。

    2. 低功耗定位模式:不使用GPS,只使用网络定位(WiFi和基站)。

    3. 仅用设备定位模式: 不适用网络定位,只使用GPS进行定位。但是此模式下不支持室内环境的定位。


        在API中主要关注“setxxx”类型的函数。主要用到红色框标注的方法。

    LocationClientOption locOption = new LocationClientOption();
    		locOption.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
    		locOption.setCoorType("bd09ll");// 设置定位结果类型
    		locOption.setScanSpan(5000);// 设置发起定位请求的间隔时间,ms
    		locOption.setIsNeedAddress(true);// 返回的定位结果包含地址信息
    		locOption.setNeedDeviceDirect(true);// 设置返回结果包含手机的方向
    
    		locationClient.setLocOption(locOption);
        坐标类型分为三种:国测局经纬度坐标系(gcj02),百度墨卡托坐标系(bd09),百度经纬度坐标系(bd09ll)。


        设置请求定位时间间隔:


        设置返回结果包含地址信息:


        设置返回结果中包含手机方向:


        (3)设置定位监听函数

    locationClient.registerLocationListener(locationListener);
    //
    class MyLocationListener implements BDLocationListener {
    		// 异步返回的定位结果
    		@Override
    		public void onReceiveLocation(BDLocation location) {
        }
    }
        百度官网说明有一些是不准确的。实现BDLocationListener接口的时候,在之前的版本是有两个方法需要实现,新版本(5.0)的只有一个方法需要实现:onReceiveLocation()。BDLocation类封装了定位SDK的定位结果,通过该可以获取定位返回的结果、位置坐标、精度半径等信息。



        定位成功与否,定位的错误码都是通过getLocType()这个方法得到的,返回值是int类型。


        注意:只有在使用网络定位的情况下,才能获取当前位置的反地理编码。

    } else if (locType == BDLocation.TypeNetWorkLocation) {
    				addrStr = location.getAddrStr();// 获取反地理编码(文字描述的地址)
    				Toast.makeText(LocationActivity.this, addrStr,
    						Toast.LENGTH_SHORT).show();
    			}
        (4)添加位置提醒监听函数

    notifyListener = new MyNotifyListener();
    notifyListener.SetNotifyLocation(longitude, latitude, 3000, "bd09ll");//精度,维度,范围,坐标类型
    locationClient.registerNotify(notifyListener);

    /**
    	 * 位置提醒监听器
    	 * @author ys
    	 *
    	 */
    	class MyNotifyListener extends BDNotifyListener {
    		@Override
    		public void onNotify(BDLocation bdLocation, float distance) {
    			super.onNotify(bdLocation, distance);
    			mVibrator.vibrate(1000);//振动提醒已到设定位置附近
    	    	Toast.makeText(LocationActivity.this, "震动提醒", Toast.LENGTH_SHORT).show();
    		}
    	}
        (5)开启定位
        LocationClient的start()方法用来启动定位SDK,requestLocation()方法用来请求一次定位,请求过程是异步的。调用start()方法之后,会根据你设置的定位事件间隔来请求定位。

        (6)最后不要忘了在不用的时候注销定位监听和位置提醒监听,并且关闭地图。

    @Override
    	protected void onDestroy() {
    		super.onDestroy();
    		mapview.onDestroy();
    		locationClient.unRegisterLocationListener(locationListener);
    		//取消位置提醒
    		locationClient.removeNotifyEvent(notifyListener);
    		locationClient.stop();
    	}
        此时可以完成了一个基本的地图定位功能和位置提醒。如果要显示在地图上,就想百度那样出现一个点表示地图的定位点,就需要用到MyLocationConfiguration(配置定位图层显示方式)MylocationData(定位数据)

        MyLocationData包含一个内部了Builder用于构建MyLocationData对象:

    // 构造定位数据
    			MyLocationData locData = new MyLocationData.Builder()
    					.accuracy(radius)//
    					.direction(direction)// 方向
    					.latitude(latitude)//
    					.longitude(longitude)//
    					.build();
    			// 设置定位数据
    			bdMap.setMyLocationData(locData);
        通过定位的onReceiveLocation()方法可以得到定位的经纬度,然后可以通过animationMapStatus()方法把定位到的点移动到地图中心。

    LatLng ll = new LatLng(latitude, longitude);
    			MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll);
    			bdMap.animateMapStatus(msu);
        定位图层的显示方式有三种:普通、跟随、罗盘,在MyLocationConfiguration.LocationMode这个内部类中定义为枚举常量。

        我们来看一下MyLocationConfiguration的构造函数:


        第一个参数就是图层的显示方式(LocationMode类型),第二个参数表示是否显示方向信息(booleab类型),第三个参数是(bitmapDescriptor类型,我们在前面的blog有过介绍了)。构造出这个对象之后,就可以调用BaiduMap的setMyLocationConfigeration()方法来设置定位图层配置信息了。


    switch (currentMode) {
    			case NORMAL:
    				locateBtn.setText("跟随");
    				currentMode = MyLocationConfiguration.LocationMode.FOLLOWING;
    				break;
    			case FOLLOWING:
    				locateBtn.setText("罗盘");
    				currentMode = MyLocationConfiguration.LocationMode.COMPASS;
    				break;
    			case COMPASS:
    				locateBtn.setText("普通");
    				currentMode = MyLocationConfiguration.LocationMode.NORMAL;
    				break;
    			}
    			bdMap.setMyLocationConfigeration(new MyLocationConfiguration(
    					currentMode, true, currentMarker));

    总结

        OK,本篇blog主要讲解了地图的控制(缩放、旋转、俯视等)和定位功能,其中定位方面比较复杂一些。
    lz也是自己一个人研究,未免有遗漏或者错误之处,希望大家指出,谢谢!


    展开全文
  • web前端PC端 百度地图的开发指导

    万次阅读 热门讨论 2020-05-09 17:00:53
    先看效果图片: 最终效果描述: 1.搜索:有搜索提示,并且可以根据选择进行定位; 2.获取经纬度:点击地图中某点,在文本框中获取当前... 3.... 4.支持鼠标滚轮控制地图缩放; 5.支持比例尺控件; 6.支持城市列

    先看效果图片:

     

     

    百度地图开发效果图

    最终效果描述:

          1.搜索:有搜索提示,并且可以根据选择进行定位;

          2.获取经纬度:点击地图中某点,在文本框中获取当前点的经纬度的值;

          3.获取详细地址:点击地图中某点时,将该点的详细地址 显示在文本框中;

          4.支持鼠标滚轮控制地图缩放;

          5.支持比例尺控件;

          6.支持城市列表查找,定确定地图中心点;

         7.支持为地图添加文字标签;

    ===========================================================================

     *基于百度地图API开发 地图类应用,最重要的是 要有自己的或者说可以用的 ‘百度API密钥 ’。百度地图所有的功能,都基于这个密钥为前提。

    一、首先 我们先尝试一下,获取 百度API密钥(web前端开发示例)。

      1、根据网址:http://api.map.baidu.com/lbsapi/    找到要操作的页面,点击API控制台

     

    2、进行开发版本选择,并提交。

    3、提交后,得到刚刚注册的秘钥

       密钥 Ak=lhaYXHeYl3GhecbjMm7vbLKvIQcsPbdl  

     那么到这里我们的前期准备工作就准备好了,下面可以进行数据开发了。

    二、上述效果代码开发(百度API里提供大量插件,我们要做的就是根据需求,进行个人的百度地图功能开发):
      代码如下:

     1.图片快速浏览:

          

     

      

       2、代码详情:

      <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>地图定位</title>
    <link rel="stylesheet" type="text/css" href="__ROOT__css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="__ROOT__css/index.css">
    <script type="text/javascript" src="__ROOT__js/jquery-1.11.1.min.js"></script>
    <script type="text/javascript" src="__ROOT__js/bootstrap.min.js"></script>
    <script type="text/javascript" src="__ROOT__js/index.js"></script>
    <style type="text/css">
    body, html,#allmap {
    width:87.5%;
    height:600px;
    margin:0px auto;
    font-family:"微软雅黑";
    }
    a{ cursor: pointer;}
    #staff_city{
    width: 100%;
    height:33px;
    color:blue;
    margin: 35px 91px;
    padding-top: 10px;
    }
    .ui_city_change_inner{
    margin-left:500px;
    border:2px solid blue;
    }
    .citylist_popup_main{
    margin-left:250px;
    }
    .BMap_mask{
    border: 3px solid #ABB1BA;


    }
    .show_p_l{
    font-weight: bold;
    position: relative;
    top:20px;
    left: 90px;
    }
    .show_p_l>.address1{
    margin-left: 90px;
    }
    </style>
    <!-- 引入百度API密钥 -->
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=Pw0FQ4H50yIEKD7hR3Pha1KqkqFd63Yo"></script>
    </head>
    <body>

    <!-- 保留用户当前经纬度和位置名称的值到页面上 -->
    <div class="show_p_l">
    <span  class="position1" ></span>
    <span  class="location1"></span>
    <span class="address1"></span>
    </div>


    <!-- 用户地理位置操作相关 -->
    <div id="staff_city">
    <input type="text" name="suggestId" id="suggestId" size="20" style="width:300px" placeholder="位置搜索">
    <span  id="searchResultPanel" style="border:1px solid #c0c0c0;width:150px;height:auto;display: none;"></span>
      <span style="margin-left:10px;">&gt;&gt;</span>
      <input type="text" name="l-map" id="l-map" style="width:200px;margin-left:30px" value="您当前位置经度信息" >
      <input type="text"  name="r-result" id="r-result" style="width:200px" value="您当前位置纬度信息" >
      <input type="button" name="staff_ensure" id="staff_ensure" value="确定">
      <input type="text" name="" id="staff_toponymy" value="详细地址" style="width:296px;height:26px;font-size:8px;margin-left: 30px">
    </div>






     <!--  显示地图 -->
    <div id="allmap"></div>



    <script type="text/javascript">


    // 获取url的某个字段
    function GetQueryString(name){
       var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
       var r = window.location.search.substr(1).match(reg);
       if(r!=null)return  unescape(r[2]); return null;
    }
    var id=GetQueryString('staff_id');
    var cur=GetQueryString('c');
        //页面刚加载时就发送请求。
    $(function(){
    $.post('http://123.57.45.74/feiybg1/public/index.php/admin/Testnumber/default_address',{staff_id:id},function(data){
    // console.log(data);
    if(data.infor.position==0){
    $('.show_p_l').css('display','none');
    }else{
    //加载后台传递过来的 经纬度
    $(".position1").html("经度坐标:"+data.infor.position+"、");
    $(".location1").html("纬度坐标:"+data.infor.location);
    //加载后台传递过来的 地理位置数据
    $('.address1').html("位置名称:"+data.infor.address+"。");
    $('.show_p_l').css('display','block');
    //打桩测试
    // console.log(data.infor.position,data.infor.location,data.infor.address);


    }




    })
    })
    // 百度地图API功能
    // 创建Map实例
    var map = new BMap.Map("allmap");   
    // 初始化地图,设置中心点坐标和地图级别
    map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); 
    //将map变量存储在全局
    window.map = map;
     //添加地图类型控件
    map.addControl(new BMap.MapTypeControl({
    mapTypes:[
                BMAP_NORMAL_MAP,
                BMAP_HYBRID_MAP
            ]}));  
    // 设置地图显示的城市 此项是必须设置的
    map.setCurrentCity("北京"); 
    //开启鼠标滚轮缩放
    map.enableScrollWheelZoom(true);
        //左上角添加比例尺
    var top_left_control = new BMap.ScaleControl({anchor: BMAP_ANCHOR_TOP_LEFT});
    map.addControl(top_left_control);
    //左上角添加默认缩放平移控件
    var top_left_navigation = new BMap.NavigationControl();
    map.addControl(top_left_navigation);


    //城市列表
    map.enableInertialDragging();
    map.enableContinuousZoom();
    var size = new BMap.Size(10, 20);
    map.addControl(new BMap.CityListControl({
       anchor: BMAP_ANCHOR_TOP_LEFT,
       offset: size,
       // 切换城市之间事件
       // onChangeBefore: function(){
       //    alert('before');
       // },
       // 切换城市之后事件
       // onChangeAfter:function(){
       //   alert('after');
       // }
    }));


    //为地图添加文字标签
    var point = new BMap.Point(116.417854,39.921988);
    map.centerAndZoom(point, 15);
    var opts = {
    // 指定文本标注所在的地理位置
     position : point,  
     //设置文本偏移量  
     offset   : new BMap.Size(30, -30)    
    }

    //单击获取点击的经纬度
    map.addEventListener("click",function(e){
    // alert(e.point.lng + "," + e.point.lat);
    $("#l-map").val("经度坐标:"+e.point.lng);
    $("#r-result").val("纬度坐标:"+e.point.lat);
    });
      //获取用户当前详细地址
      var geoc = new BMap.Geocoder();    


    map.addEventListener("click", function(e){        
    var pt = e.point;
    geoc.getLocation(pt, function(rs){
    var addComp = rs.addressComponents;
    $('#staff_toponymy').val("详细地址:"+addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber);
    console.log("详细地址:"+addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber);
    });        
    });


    //输入信息提示
    function G(id) {
    return document.getElementById(id);
    };
    //建立一个自动完成的对象
    var ac = new BMap.Autocomplete(   
    {"input" : "suggestId"
    ,"location" : map
    });
    //鼠标放在下拉列表上的事件
    ac.addEventListener("onhighlight", function(e) {  
    var str = "";
    var _value = e.fromitem.value;
    var value = "";
    if (e.fromitem.index > -1) {
    value = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
    }    
    str = "FromItem<br />index = " + e.fromitem.index + "<br />value = " + value;

    value = "";
    if (e.toitem.index > -1) {
    _value = e.toitem.value;
    value = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
    }    
    str += "<br />ToItem<br />index = " + e.toitem.index + "<br />value = " + value;
    G("searchResultPanel").innerHTML = str;
    });


    var myValue;
    //鼠标点击下拉列表后的事件
    ac.addEventListener("onconfirm", function(e) {    
    var _value = e.item.value;
    myValue = _value.province +  _value.city +  _value.district +  _value.street +  _value.business;
    G("searchResultPanel").innerHTML ="onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue;

    setPlace();
    });


    function setPlace(){
    //清除地图上所有覆盖物
    map.clearOverlays();   
    function myFun(){
    var pp=local.getResults().getPoi(0).point;
    map.centerAndZoom(pp,18);
    map.addOverlay(new BMap.Marker(pp));
    }
    var local=new BMap.LocalSearch(map,{onSearchComplete:myFun});
    local.search(myValue);
    }


    //点击事件:向testnumber.html页面 传值
    $("#staff_ensure").click(function(){
    var $position=$("#l-map").val().split(":")[1];
    var $location =$("#r-result").val().split(":")[1];
    var $address=$("#staff_toponymy").val().split(":")[1];
    $.ajax({
    type:"post",
    url:"http://123.57.45.74/feiybg1/public/index.php/admin/Testnumber/add_address",
    data:{staff_id:id,position:$position,location:$location,address:$address},
    success:function(data){
    // 对位置信息的点击更新
    $('.position1').html("经度坐标:"+$position+"、");
    $('.location1').html("纬度坐标:"+$location);
    $('.address1').html("位置名称"+$address+"。");
    $('.show_p_l').css('display','block');
    // alert('点击更新');
    }

    })
    });
    $('.back').click(function(){
    window.location.href='http://123.57.45.74/feiybg1/public/index.php/admin/testnumber/testnumber?c='+cur;
    })
    </script>
    </body>
    </html>

      提示:如果要复制该代码到本地运行,请注意更换 ‘引用文件地址’和端口号,否则会一起一系列跨域问题,及资源找不到的问题。文档内容最开始提起的 ‘最终效果描述’ 可能措辞不太严谨,但所提效果都以代码实现,代码开发与 效果描述也不是按顺序来开发的,所以请不必再次处产生疑虑。由于水平有限,本文档仅供初学者或首次开发者提供 参考。如代码有错误之处,请见谅。如果有更好的开发经验,感谢回复。谢谢观看!!!;

    展开全文
  • 百度地图 省市区县 信息展示

    万次阅读 热门讨论 2017-09-21 15:17:03
    1.一级地图 2.二级地图 3.三级地图 、 4.四级地图 概述效果图是不是有点多呀,不过能看到这里的估计这些效果图就是你们想要的效果啦,好,下面就来介绍一下1. 功能概述 1.展示所有省份门店汇总信息,且...
  • 离线版的百度地图 js

    千次阅读 2019-04-24 18:29:18
    前言:最近公司要做个离线版的百度地图,以完成客户的需求。 demo下载 https://github.com/huangxiaolong1992/xh-map/tree/master/map 查看了好多技术文章,推荐的都是水经注瓦片下载器。 但是,吐槽下所推荐 水经注...
  • 百度地图

    2018-05-25 21:18:25
    使用获取SHA1然后去百度搜然后注册,注意密码大小写都要有!!!然后点击控制台然后点击创建应用...只要SHA1就可以了,千万别弄错了,不然出不来,key值不对)最后点击提交就会跳到这个页面然后在清单文件中添加(...
  • 异步加载百度地图 动态引入百度地图的js文件 const ak = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' /** * 异步加载百度地图 * @returns {Promise} * @constructor */ function loadBaiDuMap () { return new Promise...
  • var geoCoordMap = { "1": [119.2070396626, 26.0471838188], "2": [119.2147498638, 26.0481609598], "3": [119.209339, 26.038355], "4": [119.2163806469, 26.0442086921], "5": [119.2132263691, 26....
  • 百度地图API入门使用

    2020-08-20 22:57:59
    百度地图API使用的入门 文章目录百度地图API使用的入门百度开发者平台示例:官方示例文档http://lbsyun.baidu.com/jsdemo.htm#webgl0_1基本地图展示地图添加覆盖物标志地图点击事件及移除标志物逆地址解析计算两地...
  • 百度地图api

    2020-09-09 15:45:52
    关于百度地图api的应用实例 1.准备工作 ​ 1.进入百度地图官网:http://lbsyun.baidu.com/。申请百度地图api使用的秘钥,开源免费的!!! ​ 2.点击控制台 ​ 3.点击右侧应用管理–》我的应用 ​ 4.点击创建应用 ...
  • 百度地图API的使用

    千次阅读 2019-05-23 14:21:26
    ------------------自说自话----------------------------- 好奇怪,习惯性使用有道云笔记记录心得与知识后就很少用博客园来记录了。...下面正题,最近公司项目用百度地图API较多。后面还有使用...
  • 百度地图API密钥

    万次阅读 2017-12-01 14:37:33
    百度地图API 密钥 DD279b2a90afdf0ae7a3796787a0742e
  • 百度地图API授权ak失败

    万次阅读 2014-03-04 10:46:46
    当申请过百度地图密钥后,引用百度地图: 运行网页时提示:“百度未授权使用地图API,可能是因为您提供的密钥不是有效的百度开放平台密钥,或此密钥未对本应用的百度地图JavasoriptAPI授权。……”。下面给出的...
  • Android百度地图默认位置中心点设置

    万次阅读 多人点赞 2014-06-18 10:38:25
    //初始化地图  MapView mMapView = (MapView) findViewById(R.id.map); BaiduMap mBaidumap = mMapView.getMap(); //设定中心点坐标   LatLng cenpt = new LatLng(29.806651,121.606983);   //...
  • IOS百度地图开发系列-百度地图不能正常显示

    万次阅读 多人点赞 2013-08-14 11:08:48
    百度地图不能正常显示,只显示灰色网格。
  • 一个仅供测试的百度地图的AK

    万次阅读 2016-01-26 19:17:31
    String KEY="8BB7F0E5C9C77BD6B9B655DB928B74B6E2D838FD";
  • html页面插入百度地图

    万次阅读 2018-03-16 10:50:40
    方法/步骤1、打开“百度地图生成器”的网址:http://api.map.baidu.com/lbsapi/creatmap/index.html如下图:2、在“1.定位中心点”中,切换城市,并查找具体位置,如下图:3、在“2.设置地图”中,可以按照自己的...
  • 高德地图跟百度地图经纬度互转

    万次阅读 2018-01-05 12:52:55
    高德经纬度转百度经纬度 http://api.map.baidu.com/geoconv/v1/?coords=113.9609047719607,22.537714359860125&from=3&to=5&ak=你的key百度经纬度转高德经纬度 高德地图官方文档有详细介绍...
1 2 3 4 5 ... 20
收藏数 79,661
精华内容 31,864
关键字:

百度地图