地图开发

概述

基于位置的服务已经深入到了我们生活中的每一个角落,这些服务我们统称为LBS(Location Based Service),我们常见的App(淘宝、QQ、微信、美团、大众点评、百度糯米、饿了么等)都内置了地图定位服务。在我们以后的程序员生涯中难免要和LBS打交道。

国内提供地图服务的公司主要有百度地图、高德地图、腾讯地图、搜狗地图。其中百度地图从用户数量和服务质量上都处于领先地位,高德地图紧随其后,这里我们以百度地图为例来演示如何使用第三方定位服务。

百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序。百度地图不仅包含构建地图的基本接口,还提供了本地搜索、路线规划、地图定位等数据服务。

这篇文章使用的是百度地图在2015年6月18日发布了Android SDK v3.5.0版本。

如今百度地图已经将定位功能,单独剥离出来了,因此在这篇文章中我们还要讨论的第二个重要内容就是百度定位SDK的使用。

百度于2015年7月17日发布了百度定位Android SDK v6.0.3产品,该产品也是本文章所使用的版本。

百度地图功能

百度地图 Android SDK 是一套基于Android 2.1 及以上版本设备的应用程序接口, 您可以通过该接口实现丰富的LBS 功能:

  • 地图:提供地图(2D、3D)的展示和缩放、平移、旋转、改变视角等地图操作
  • POI 检索:可根据关键字,对POI 数据进行周边、区域和城市内三种检索
  • 地理编码:提供地理坐标和地址之间相互转换的能力
  • 线路规划:支持公交信息查询、公交换乘查询、驾车线路规划和步行路径检索
  • 覆盖物:提供多种地图覆盖物(自定义标注、几何图形、文字绘制、地形图图层、热力图图层等),满足开发者的各种需求
  • 定位:采用多种定位模式,使用定位SDK 获取位置信息,使用地图SDK 我的位置图层进行位置展示
  • 离线地图:支持使用离线地图,节省用户流量,同时为用户带来更好的地图体验
  • 调启百度地图:利用SDK 接口,直接在本地打开百度地图客户端或WebApp,实现地图功能
  • 周边雷达:利用周边雷达功能,开发者可在App 内低成本、快速实现查找周边使用相同App 的用户位置的功能
  • LBS 云检索:支持用户检索存储在LBS 云内的自有POI 数据,并展示
  • 瓦片图层:支持开发者在地图上添加自有瓦片数据
  • 特色功能:提供短串分享、Place 详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用

什么是百度地图API

百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序。

百度地图移动版API不仅包含构建地图的基本接口,还提供了本地搜索、路线规划、地图定位等数据服务。

百度地图入门

定位需要的相关权限

<!-- 这个权限用于进行网络定位-->
<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>

准备工作

获取API Key

地址:http://developer.baidu.com/map/android-mobile-apply-key.htm

建立工程

添加地图引擎到Andoid工程中

  • 添加jar包: baidumapapi_v3_3_0.jar和locSDK_5.0.jar
  • 添加.so文件:拷贝libBaiduMapSDK_v3_3_0_15.so 、 liblocSDK5.so到libs\armeabi目录下
  • 注: locSDK_5.0.jar和liblocSDK5.so为百度定位SDK所使用资源,开发者可根据实际需求自行添加。

添加权限
初始化地图引擎
引入布局(地图控件)

Hellworld

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.baidu.mapapi.map.MapView
        android:id="@+id/mapview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>
public class Hellworld extends Activity {
   

    private MapView           mMapView;
    private BaiduMap          baiduMap;
    private BroadcastReceiver receiver;

    double latitude  = 22.582387;//纬度
    double longitude = 113.927331;//经度
    LatLng mLatLng   = new LatLng(latitude, longitude);//经纬度

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initSDK();
        setContentView(R.layout.activity_main);
        initBaiduMap();
    }

    private void initBaiduMap() {
        mMapView = (MapView) findViewById(R.id.mapview);
        baiduMap = mMapView.getMap();
        baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(17));
        baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(mLatLng));
    }

    private void initSDK() {
        SDKInitializer.initialize(getApplicationContext());
        IntentFilter filter = new IntentFilter();
        filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
        filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
        receiver = new MyRecevier();
        registerReceiver(receiver, filter);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_1:  //放大一个级别
            MapStatusUpdate zoomInUpdate = MapStatusUpdateFactory.zoomIn();
            baiduMap.setMapStatus(zoomInUpdate );
            break;
        case KeyEvent.KEYCODE_2: //缩小一个级别
            MapStatusUpdate zoomOutUpdate = MapStatusUpdateFactory.zoomOut();
            baiduMap.setMapStatus(zoomOutUpdate );
            break;
        case KeyEvent.KEYCODE_3: //以一个点为中心旋转 0~360°
            MapStatus mapStatu = baiduMap.getMapStatus();
            float rotate = mapStatu.rotate;
            MapStatus rotateStatus = new MapStatus.Builder().rotate(rotate+30).build();
            MapStatusUpdate rotateUpdate = MapStatusUpdateFactory.newMapStatus(rotateStatus );
            baiduMap.setMapStatus(rotateUpdate );
            break;
        case KeyEvent.KEYCODE_4: //俯角 overlook -45-0  以一条直线为轴
            MapStatus oldStatu = baiduMap.getMapStatus();
            float overlook = oldStatu.overlook;
            MapStatus overlookStatus = new MapStatus.Builder().overlook(overlook-5).build();
            MapStatusUpdate overlookUpdate = MapStatusUpdateFactory.newMapStatus(overlookStatus );
            baiduMap.setMapStatus(overlookUpdate );
            break;

        default:
            break;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
        unregisterReceiver(receiver);
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }

    class MyRecevier extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR.equals(action)) {
                Toast.makeText(getApplicationContext(), "网络错误", Toast.LE
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值