Android开发之Google Map
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的更多相关文章
- 【Android UI】Android开发之View的几种布局方式及实践
引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...
- Android开发之Java集合类性能分析
对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...
- Android开发之Java必备基础
Android开发之Java必备基础 Java类型系统 Java语言基础数据类型有两种:对象和基本类型(Primitives).Java通过强制使用静态类型来确保类型安全,要求每个变量在使用之前必须先 ...
- Android开发之MdiaPlayer详解
Android开发之MdiaPlayer详解 MediaPlayer类可用于控制音频/视频文件或流的播放,我曾在<Android开发之基于Service的音乐播放器>一文中介绍过它的使用. ...
- Android开发之InstanceState详解
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- Android开发之Git配置
Android开发之Git配置 1.首先git配置: 输入命令: git config --global user.name "xxx.xx" git config --globa ...
- Android开发之旅: Intents和Intent Filters(理论部分)
引言 大部分移动设备平台上的应用程序都运行在他们自己的沙盒中.他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互. 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义 ...
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...
- Android开发之PopupWindow
/* * Android开发之PopupWindow * * Created on: 2011-8-8 * Author: blueeagle * Email: liujiaxiang@g ...
随机推荐
- web前端 -- 页面设计小技巧
1:进入网页时淡入淡出的效果. <meta http-equiv=”Page-Exit”; content=”blendTrans(Duration=1.0)”> 在头部head之间加入此 ...
- windows如何查看删除记录
方法 打开组策略中的计算机配置-Windows设置-安全设置-本地策略-审核策略的审核对对像防问, 双击出现的对话框中钩选成功和失败,经过上面的设置,现在就可以设置文件和文件夹的审核了.(注须在NTF ...
- 使用BabeLua3.x在cocos2d-x中编辑和调试Lua
BabeLua是一款基于VS2012/2013的Lua集成开发环境,具有Lua语法高亮,语法检查,自动补全,快速搜索,注入宿主程序内对Lua脚本进行调试,设置断点观察变量值,查看堆栈信息等功能. 如何 ...
- C#类和结构体的异同点简单总结
类和结构的异同点?异: 1.关键字不同 一个是class,一个是struct 2.类型不同,一个是引用类型,一个是值类型(一个堆区,一个栈区) 3.成员不同,结构体没有默认的构造函数 ...
- 【GISER&&Painter】Chapter01:WebGL渲染初体验
基于上一篇OpenGL的渲染原理,这两周又陆续接触了一些关于WebGL绘图的一些内容,因为刚入门,很多东西又很晦涩,所以特意花了小半天的时间整理了一下,特此记录. 零 画一个多边形吧! 把一个多边形 ...
- Latex中为作者添加多个单位属性(IEEE模板)
\author{ \IEEEauthorblockN{name1 name1\IEEEauthorrefmark{1}\IEEEauthorrefmark{2}, name2 name2\IEEEa ...
- iOS开源项目:AudioPlayer
AudioPlayer是一个基于AVAudioStreamer的在线音乐播放软件. https://github.com/marshluca/AudioPlayer 首先将歌曲信息存储在NSArray ...
- C++keyword大总结
register: 假设有一些变量使用频繁,则为存取变量的值少花一些时间, 能够将该局部变量的值放在CPU的寄存器中,须要时直接从寄存器 中取出參加运算,不必去内存中去存取. 由于寄存器的存取速度 远 ...
- 通过javascript获取元素position
function getOffset( el ) { var _x = 0; var _y = 0; while( el && !isNaN( el.offsetLeft ) & ...
- Powerdesigner数据库建模--概念模型--ER图
目标: 本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念. 一.概念数据模型概述 数据模型是现实世界中数据特征的抽象.数据模型应该满足三个方面的要求: 1)能够比较真实地模拟现实 ...