Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1

首页   代码   文档   问答   资讯   经验   GitHub日报

登录   注册

全部经验分类 

所有分类  >  开发语言与工具  >  移动开发  >  Android开发

Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物

Android   2013-03-31 11:50:10 发布

您的评价:
     
4.5

收藏     5收藏

阐述一个概念,地图覆盖物:所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。

要实现的需求:假如我们知道北京天安门(建筑物)的GPS纬度经度值:39.915,116.404,想要把它在百度地图上标注出来。

实现上述需求的步骤:

一、准备工作:

1、创建android工程,并导入百度地图需要用到的jar包和so文件。

2、在AndroidManifest文件中添加使用百度地图SDK所需的权限及屏幕配置。

3、在布局文件layout中添加显示百度地图的MapView。

4、在继承了Activity类的子类中:

a. 创建并初始化地图引擎管理对象;

b. 通过组件ID获取代表地图显示View的MapView对象,并设置相应属性。

(比如:启用内置的缩放控件、设置允许的地图缩放级别等)

c. 重写Activity的生命周期回调方法onResume()、onPause()和onDestroy(),管理地图引擎管理类对象和显示对象生命周期。

二、在地图上标注出北京天安门:

1、想要在地图上标注一个建筑物,总得有一个标识吧?

获取在地图上标识建筑物的图标对象:

       // 获取用于在地图上标注一个地理坐标点的图标
        Drawable drawable = this.getResources().getDrawable(R.drawable.icon_marka);

2、在基础图上添加覆盖物(添加图层)

a. 编写覆盖物类,自己定义一个类,继承自ItemizedOverlay

注:从2.0.0开始,SDK不支持直接继承Overlay , 用户可通过继承ItemizedOverlay来添加覆盖物。

b. 在自定义的覆盖物类(继承自ItemizedOverlay)中, 声明一个用于存放覆盖物的集合:

/**覆盖物列表集合*/
        private ArrayList

声明double类型的变量存储北京天安门的纬度、经度值:

 // 声明double类型的变量存储北京天安门的纬度、经度值
        private double mLat1 = 39.915; // point1纬度

        private double mLon1 = 116.404; // point1经度

c. 在构造函数中,将GPS纬度经度值转换成以微度的整数形式存储的地理坐标点

  /*  注:GeoPoint对象构造方法的参数列表:第一个是参数表示纬度,第二个是经度
                                    (我们平时都是经纬度这么叫的,想着应该是经度在前的,呵呵。)
                                      在网上查了下,GPS的值官方给的就是纬度经度,也就是说纬度是在前的,以前一直没太注意。*/
            GeoPoint geoPoint1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));

构造OverlayItem对象并添加到mOverlayList集合里

mOverlayList.add(new OverlayItem(geoPoint1, "point1", "point1"));

必须调用的方法:

   /*
             * 官方的解释:在一个新ItemizedOverlay上执行所有操作的工具方法。
             * 没搞明白啥意思,但是必须的调用这个方法,否则程序运行报错*/
            populate();

d. 返回的是从指定List集合中,取出的一个OverlayItem对象。

  /*
         * 返回的是从指定List集合中,取出的一个OverlayItem对象。
         * mOverlayList集合里一旦有了数据,在调用其之前,
         * 一定的在MyOverlayItem的构造函数里调用这个方法populate();
         */
        @Override
        protected OverlayItem createItem(int index) {
            return mOverlayList.get(index);
        }

e. 获取当前覆盖物列表的大小

  @Override
        public int size() {
            return mOverlayList.size();
        }

自定义的覆盖物类的完整代码:

 /**
     * 包含了一个覆盖物列表的覆盖物类
     * @author android_ls
     */
    final class MyOverlayItem extends ItemizedOverlay

创建覆盖物(MyOverlayItem)对象并添加到覆盖物列表中:

  mMapView.getOverlays().add(new MyOverlayItem(drawable));

3、刷新地图

mMapView.refresh();

运行效果图如下:

完整代码:

package com.android.baidu.map;

import java.util.ArrayList;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.Toast;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.ItemizedOverlay;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.OverlayItem;
import com.baidu.platform.comapi.basestruct.GeoPoint;

/**
 * 在地图上标注已知GPS纬度经度值的建筑物
 * 场景:假如我们知道北京天安门(建筑物)的GPS纬度经度值:39.915,116.404,想要把它在地图上标注出来。
 * @author android_ls
 *
 */
public class BaiduMapOverlayActivity extends Activity {

    /**地图引擎管理类*/
    private BMapManager mBMapManager = null;

    /**显示地图的View*/
    private MapView mMapView = null;

    /**
     * 经研究发现在申请KEY时:应用名称一定要写成my_app_应用名(也就是说"my_app_"是必须要有的)。
     * 百度地图SDK提供的服务是免费的,接口无使用次数限制。您需先申请密钥(key),才可使用该套SDK。
     * */
    public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 注意:请在调用setContentView前初始化BMapManager对象,否则会报错
        mBMapManager = new BMapManager(this.getApplicationContext());
        mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {

            @Override
            public void onGetNetworkState(int iError) {
                if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
                    Toast.makeText(BaiduMapOverlayActivity.this.getApplicationContext(),
                            "您的网络出错啦!",
                            Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onGetPermissionState(int iError) {
                if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
                    // 授权Key错误:
                    Toast.makeText(BaiduMapOverlayActivity.this.getApplicationContext(),
                            "请在 DemoApplication.java文件输入正确的授权Key!",
                            Toast.LENGTH_LONG).show();
                }
            }
        });

        setContentView(R.layout.main);

        mMapView = (MapView) this.findViewById(R.id.bmapsView);
        // 设置启用内置的缩放控件
        mMapView.setBuiltInZoomControls(true);

        // 获取地图控制器,可以用它控制平移和缩放
        MapController mMapController = mMapView.getController();
        // 设置地图的缩放级别。 这个值的取值范围是[3,18]。
        mMapController.setZoom(13);

        // 获取用于在地图上标注一个地理坐标点的图标
        Drawable drawable = this.getResources().getDrawable(R.drawable.icon_marka);

        // 创建覆盖物(MyOverlayItem)对象并添加到覆盖物列表中
        mMapView.getOverlays().add(new MyOverlayItem(drawable));

        // 刷新地图
        mMapView.refresh();

    }

    /**
     * 包含了一个覆盖物列表的覆盖物类
     * @author android_ls
     */
    final class MyOverlayItem extends ItemizedOverlay

三、在地图上标注出北京天安门附近的几个点:

从2.0.0开始,SDK不支持直接继承Overlay 。 在地图上显示一个或一组覆盖物,都可以通过继承ItemizedOverlay来添加覆盖物。

在上面讲解的基础上,修改覆盖物类的部分代码就可以了。直接上代码:

  class MyOverlayItem extends ItemizedOverlay

对代码进行优化:

GPSPonit 实体类:

package com.android.baidu.map.entity;

/**
* 类名: Ponit.java
* 功能描述:存放GPS纬度、经度值
* @author android_ls
* 创建日期: 2013-2-10 下午07:43:47
* @version V1.0
*/
public class GPSPonit {

    private double mLat; // 纬度

    private double mLon; // 经度

    public double getmLat() {
        return mLat;
    }

    public void setmLat(double mLat) {
        this.mLat = mLat;
    }

    public double getmLon() {
        return mLon;
    }

    public void setmLon(double mLon) {
        this.mLon = mLon;
    }

    public GPSPonit(double mLat, double mLon) {
        this.mLat = mLat;
        this.mLon = mLon;
    }

    public GPSPonit() {
    }

    @Override
    public String toString() {
        return "Ponit [mLat=" + mLat + ", mLon=" + mLon + "]";
    }

}

优化后的Activity类:

package com.android.baidu.map;

import java.util.ArrayList;

import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.Toast;

import com.android.baidu.map.entity.GPSPonit;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.ItemizedOverlay;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.OverlayItem;
import com.baidu.platform.comapi.basestruct.GeoPoint;

/**
 * 在地图上标注已知GPS纬度经度值的一组建筑物
 * @author android_ls
 *
 */
public class BaiduMapOverlayItemsActivity extends Activity {

    /**地图引擎管理类*/
    private BMapManager mBMapManager = null;

    /**显示地图的View*/
    private MapView mMapView = null;

    /**
     * 经研究发现在申请KEY时:应用名称一定要写成my_app_应用名(也就是说"my_app_"是必须要有的)。
     * 百度地图SDK提供的服务是免费的,接口无使用次数限制。您需先申请密钥(key),才可使用该套SDK。
     * */
    public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 注意:请在调用setContentView前初始化BMapManager对象,否则会报错
        mBMapManager = new BMapManager(this.getApplicationContext());
        mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {

            @Override
            public void onGetNetworkState(int iError) {
                if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
                    Toast.makeText(BaiduMapOverlayItemsActivity.this.getApplicationContext(),
                            "您的网络出错啦!",
                            Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onGetPermissionState(int iError) {
                if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
                    // 授权Key错误:
                    Toast.makeText(BaiduMapOverlayItemsActivity.this.getApplicationContext(),
                            "请在 DemoApplication.java文件输入正确的授权Key!",
                            Toast.LENGTH_LONG).show();
                }
            }
        });

        setContentView(R.layout.main);

        mMapView = (MapView) this.findViewById(R.id.bmapsView);
        // 设置启用内置的缩放控件
        mMapView.setBuiltInZoomControls(true);

        // 获取地图控制器,可以用它控制平移和缩放
        MapController mMapController = mMapView.getController();
        // 设置地图的缩放级别。 这个值的取值范围是[3,18]。
        mMapController.setZoom(13);

        //TODO 构建一组数据
        GPSPonit gp1 = new GPSPonit(39.90923, 116.397428);
        GPSPonit gp2 = new GPSPonit(39.9022, 116.3922);
        GPSPonit gp3 = new GPSPonit(39.917723, 116.3722);
        GPSPonit gp4 = new GPSPonit(39.915, 116.404);

        /**存放GPS纬度、经度值的数组*/
        GPSPonit[] mGPSPonit = new GPSPonit[4];
        mGPSPonit[0] = gp1;
        mGPSPonit[1] = gp2;
        mGPSPonit[2] = gp3;
        mGPSPonit[3] = gp4;

        Drawable drawable = this.getResources().getDrawable(R.drawable.icon_marka);
        // 创建覆盖物(MyOverlayItem)对象并添加到覆盖物列表中
        mMapView.getOverlays().add(new MyOverlayItem(drawable, mGPSPonit));

        // 刷新地图
        mMapView.refresh();
    }

    final class MyOverlayItem extends ItemizedOverlay

运行效果图如下:

来自:http://blog.csdn.net/android_ls/article/details/8578044

同类热门经验

  1. 上百个Android开源项目分享
  2. android json解析及简单例子
  3. Android 软件自动更新功能的实现
  4. 自定义 Android 对话框 (AlertDialog) 的样式
  5. adb shell 命令详解
  6. android定位和地图开发实例

阅读目录


相关文档  — 更多


相关经验  — 更多


相关讨论  — 更多

null

时间: 2024-12-14 18:10:56

Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1的相关文章

android 百度地图系列之地图初始化及定位

在Android应用中,很多时候需要地图功能,回顾过去写的项目和百度地图api,开始总结一下Android百度地图的实现.首先总结一下怎么开始一个Android百度地图功能. 当使用百度地图的时候,提到一个appkey."在使用百度地图SDK为您提供的各种LBS能力之前,您需要获取百度地图移动版的开发密钥,该密钥与您的百度账户相关联.因此,您必须先有百度帐户,才能获得开发密钥.并且,该密钥与您创建的过程名称有关.Key地址为:http://lbsyun.baidu.com/apiconsole/

3*3 的矩阵,值限定为1-9不重复,已知横竖的和,和一个斜着的值,求这个矩阵,有啥快速的方法没?

 x     x     x 11 x     x     x 15 x     x     x 19 16  14   15 15 讨论贴: http://bbs.csdn.net/topics/391816265 先求横竖斜三行的精确匹配方法: // puzzl.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // puzzle.cpp : Defines the entry point for the console applicati

Android百度地图

  帖子   热搜: 二维码 聊天 二维码扫描 传感器 游戏 定位 手势绘图 小项目 相框 绘图 涂鸦 拨打电话 记事本 定时器 通话记录 短信群发 listview 音乐播放器 项目例子 百度地图 Android开发论坛 - 安卓开发论坛 - Android开发 - 安卓论坛 - 移动互联网门户»安卓巴士论坛 › Android开发资料共享区 › Android实例教程 › Android百度地图系列教程 123456789 / 9 页下一页 返回列表 查看: 39747|回复: 82 And

C# 序列化过程中的已知类型(Known Type)

WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML.由于类型定义了对象的数据结构,所以无论对于序列化还是反序列化,都必须事先确定对象的类型.如果被序列化对象或者被反序列化生成的对象包含不可知的类型,序列化或者反序列化将会失败.为了确保DataContractSerializer的正常序列化和反序列化,我们需要将“未知”类型加入DataContractSerializer“已知”类型列表中. 一.未知类型导致序列化失败 .NET的类型可以分为两种:声明类型和真实类

Android应用中使用百度地图API并加入标注(一)

网上一些资料这样的的内容已经过时了,这里是最新的内容,假设哪里不正确,请吐槽... 1)下载百度地图移动版API(Android)开发包      要在Android应用中使用百度地图API,就须要在project中引用百度地图API开发包,这个开发包包括两个文件: 下载地址:http://pan.baidu.com/s/1i31enrB 2)申请API Key //包名 格式:比如:B7:6C:CF:E2:47:50:9B:3E:34:F7:08:72:F3:AC:F1:BE:55:D3:77

Android应用中使用百度地图API并添加标注(一)

网上一些资料这种的内容已经过时了,这里是最新的内容,如果哪里不对,请吐槽... 1)下载百度地图移动版API(Android)开发包 要在Android应用中使用百度地图API,就需要在工程中引用百度地图API开发包,这个开发包包含两个文件: 下载地址:http://pan.baidu.com/s/1i31enrB 2)申请API Key //包名 格式:例如:B7:6C:CF:E2:47:50:9B:3E:34:F7:08:72:F3:AC:F1:BE:55:D3:77:FB;com.maji

[android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

       前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Interest)搜索.该篇讲述定位当前自己的位置及使用getLastKnownLocation获取location总时为空值的问题. 一. 定位当前位置的原理及实现       定位当前位置可以通过LBS(Location Based Service,基于位置的服务),主要工作原理是利用无线网络Network或GPS定

[android] 百度地图开发 (二).定位城市位置和城市POI搜索

一. 百度地图城市定位和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了如何申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述如何定位城市位置.定位自己的位置和进行城市兴趣点POI(Point of Interest)搜索.那么如何在百度地图上定位某一个位置呢?       通过类GeoPoint可以定义经纬度,它存放着纬度值和经度值,通过getLastKnownLocation()方法可以获取Location对象,再定位经纬度设置其为地图中心即可显示当

[android] 百度地图开发 (两).所在地的城市定位和城市POI搜索

一个. 百度地图城市位置和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定位自己的位置和进行城市兴趣点POI(Point of Interest)搜索.那么怎样在百度地图上定位某一个位置呢?       通过类GeoPoint能够定义经纬度,它存放着纬度值和经度值,通过getLastKnownLocation()方法能够获取Location对象,再定位经纬度设置其为地图中心就可以显