2013-07-03

Google Map 提供三种视图:

1. 传统的矢量地图,提供行政区域、交通以及商业信息等。

2. 不同分辨率的卫星照片,与Google Earth 基本一样。

3. 地形地图,可以显示地形和等高线。

Google Map的姐妹产品Google Earth是一个桌面应用程序,在三维模型上提高街景、更多的卫星视图以及GPS定位的功能。

基于Google Earth 和 Google Map 的游戏举例:

在全球任何地方甚至海底模拟开飞机或者潜水艇,来漫游整个世界,详见:http://www.sea-seek.com/

在地球上任何地方开着自己喜欢的奔跑车,在自己周围以及熟悉的地方模拟驾驶,详见:http://geoquake.jp/en/webgame/DrivingSimulatorGM/

 

手机上如何应用Google Map

1. 我的位置

通过识别你附近无线发射塔的信息广播确定你的位置,在地图上显示出来。通常在1000米范围之内。即使没有GPS,也可以确定位置。支持内置GPS,可以链接到蓝牙GPS传感器。

2. 地图和卫星视图

提供所查看地区的地图和卫星视图,其界面使用感觉与在台式机上相同。

3. 商户列表

不需要输入当前位置即可找到附近的商户。

4. 驾车路线

不需要输入出发点,就可方便地获得驾车路线,其中会清楚地标明每次转弯。

5. 公交换乘

查看公交和地铁路线,确定转车路线。

6. 路况信息

Google Map中的公路会根据实时路况数据,以绿色、黄色或红色显示。

7. 收藏夹

为你常去的地方加上书签,以便能在地图上非常方便地返回到这些地方。

使用 Android Maps API 和 Android Location API 就可以实现这些功能。

 

准备工作

1. 找到/下载Map扩展库:com.google.android.maps

<ANDROID_SDK_ROOT>/add-ons/google_apis-3/libs/

2. 申请Android Map API Key

准备Google账号。Google账号是通用的,Gmail的账号就可以。

当一个APP发布时必须要证明书。证明书就是MD5。

debug版的证明书:debug.keystore

a. 找到debug.keystore文件

Eclipse中,Windows->Preference->Android->Build ,其中Default debug keystore的值便是debug.keystore的路径。

b. 取得debug.keystore的MD5值

在命令提示符下进入debug.keystore文件所在路径,执行命令:keytool –list –keystore debug.keystore ,输入keystore密码:android ,即可取得MD5值。

c. 申请Android Map的API Key

http://code.google.com/intl/zh-CN/android/maps-api-signup.html

d. 记下申请的Android Map API Key值

3. 创建基于Google APIs的AVD

Eclipse中,AVD管理,Create AVD,Target处选择Google APIs-1.5(或其他版本)

4. 创建基于Google APIs的Android 工程

在创建Android工程时,Target处选择Google APIs

在AndroidManifest.xml文件中添加权限

<uses-library android:name=”com.google.android.maps”/>

 

Google Map API 的使用

Android 中定义了一个名为com.google.android.maps的包,其中包含了一系列用于在Google Map上显示、控制和层叠信息的功能类。

MapActivity, 用于显示Google Map的Activity类,需要连接底层网络。必须被扩展并在子类onCreate()方法中创建一个MapView实例。

MapView, 用于显示地图的View组件。派生自android.view.ViewGroup,只能在MapActivity中创建。MapView需要通过后台线程来连接网络或文件系统,这些线程由MapActivity管理。

MapController, 用于控制地图的移动、缩放等。

Overlay, 可显示于地图之上的可绘制的对象。

GeoPoint, 包含经纬度位置的对象。

 

创建MapView的两种方法:

a. 在xml布局文件中创建MapView

<com.google.android.maps.MapView

  android:id=”@+id/mapview01”

  android:layout_width=”fill_parent”

  android:layout_height=”fill_parent”

  android:apiKey=”xxx” />

其中apiKey在之前已经申请。

b. 在代码中创建MapView

MapView map = new MapView(this, apiKey);

 

实现MapActivity

在MapActivity中,方法isRoutedDisplayed必须要被重写

MapView提供三种模式分别是

mapView.setTraffic(true); // 设置为交通模式

mapView.setSatellite(true); // 设置为卫星模式

mapView.setStreetView(true); // 设置为街景模式

 

使用MapController在地图定位到某地以及设置放大的倍数

mapController = mapView.getController();

要定位地点,需要构建一个GeoPoint来表示地点的经度和纬度,然后使用animateTo将地图定位到指定的GeoPoint上

// 在地图上定位到成都

geoPoint = new GeoPoint((int)(30.659259*1000000), (int)(104.065762*1000000));

mapController.animateTo(geoPoint);

 

使用Overlay在地图上标注一些图标文字等信息

首先,将地图上的经度和纬度转换为屏幕上的坐标

Projection.toPixels(GeoPoint in, Point out);

其次,实现Overlay的draw方法

class LocationOverlay extends Overlay {

  public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {

    // 绘制图标文字等信息

    super.draw(canvas, mapView, shadow);

    Paint paint = new Paint();

    Point point = new Point();

    mapView.getProjection().toPixels(geoPoint, point);

    paint.setStrokeWidth(1);

    paint.setARGB(255, 255, 0, 0);

    paint.setStyle(Paint.Style.STROKE);

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.home);

    canvas.drawBitmap(bitmap, point.x, point.y, point);

    canvas.drawText(“天府广场”, point.x, point.y, point);

    return true;

  }

}

创建LocationActivity,将LocationOverlay作为其的内部类

public class LocationActivity extends MapActivity {

  private MapView mapView;

  private MapController mapController;

  private GeoPoint geoPoint;

  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

 

    mapView = (MapView) findViewById(R.id.mapView01);

    mapView.setTraffic(true);

    mapView.setSatellite(true);

    mapView.setStreetView(true);

    mapView.setEnabled(true);

    mapView.setClickable(true);

    mapView.setBuiltInZoomControls(true);

 

    mapController = mapView.getController();

    geoPoint = new GeoPoint((int)(30.659259*1000000), (int)(104.065762*1000000));

    mapController.animateTo(geoPoint);

    mapController.setZoom(12);

 

    LocationOverlay locationOverlay = new LocationOverlay();

    List<Overlay> list = mapView.getOverlays();

    list.add(locationOverlay);

  }

  protected boolean isRouteDisplayed() {

    return false;

  }

}

Android开发之Google Map的更多相关文章

  1. 【Android UI】Android开发之View的几种布局方式及实践

    引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...

  2. Android开发之Java集合类性能分析

    对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...

  3. Android开发之Java必备基础

    Android开发之Java必备基础 Java类型系统 Java语言基础数据类型有两种:对象和基本类型(Primitives).Java通过强制使用静态类型来确保类型安全,要求每个变量在使用之前必须先 ...

  4. Android开发之MdiaPlayer详解

    Android开发之MdiaPlayer详解 MediaPlayer类可用于控制音频/视频文件或流的播放,我曾在<Android开发之基于Service的音乐播放器>一文中介绍过它的使用. ...

  5. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  6. Android开发之Git配置

    Android开发之Git配置 1.首先git配置: 输入命令: git config --global user.name "xxx.xx" git config --globa ...

  7. Android开发之旅: Intents和Intent Filters(理论部分)

    引言 大部分移动设备平台上的应用程序都运行在他们自己的沙盒中.他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互. 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义 ...

  8. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

     今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...

  9. Android开发之PopupWindow

      /* *  Android开发之PopupWindow * *  Created on: 2011-8-8 *  Author: blueeagle *  Email: liujiaxiang@g ...

随机推荐

  1. (转)资源监控工具Spotlight监测LINUX

    个人1.安装spotlight,Spotlight on Unix2.配置spotlight,注意spotlight默认不能使用root用户进行连接,需要用户自己创建一个具有root权限的用户.(1) ...

  2. EntityFramework中几种操作小结

    目前项目中使用到的EntityFramework中几种操作小结,先标记下.没有详细介绍,后续有空的话再补充一些并完善一下. 列中加入RowVersion时间戳 public class Product ...

  3. POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题

    http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...

  4. Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的区别!

    参考: http://www.cnblogs.com/benwu/archive/2009/10/24/1589096.html http://www.cnblogs.com/xuefeng1982/ ...

  5. zookeeper疑难杂症

    1.zookeeper是怎么写数据的?因为是master写再同步广播到follow节点,如果master写完,following在写的过程中出现失败怎么办? :zookeeper支持原子的写入操作,要 ...

  6. FAQ:Domain Event 和 C# 中的 Event 有啥区别?

    问: Domain Event 和 C# 中的 Event 有啥区别? 答: C# 中的 Event,事件.监听者列表和事件发布器是由一个类型承担,事件源和监听者之间的生命周期耦合在一起,C# 帮你提 ...

  7. iOS中WebKit框架应用与解析

    WebKit是iOS8之后引入的专门负责处理网页视图的框架,其比UIWebView更加强大,性能也更优. 引言 在iOS8之前,在应用中嵌入网页通常需要使用UIWebView这样一个类,这个类通过UR ...

  8. iOS:三种数据库的小总结

    三种数据库总结:sqlite.FMDB.CoreData   1.sqlite数据库(C语言)需要方法和属性:  (1)数据类型: –INTEGER 有符号的整数类型 –REAL 浮点类型 –TEXT ...

  9. 数学图形(2.20)3D曲线

    这一节主要是发布我自己写的3D曲线, (1)立体flower线圈 vertices = a = 10.1 b = 3.1 s = (a + b) / b o = i = to (**PI) j = m ...

  10. Informatica 常用组件Source Qualifier之五 User Defined Join

    User defined join :      输入用户定义的联接与输入自定义 SQL 查询类似.但是,只需输入 WHERE 子句的内容,而不是整个查询. 添加用户定义的联接时,源限定符转换包括默认 ...