【转】构建Android平台Google Map应用
http://www.moandroid.com/?p=1360
Android 的新版本提供了的功能,通过这段视频,大家可以先简单了解下:
Android 提供的地图(Map)功能可能是广大开发者非常关心的一个部分。到目前为止,开发内嵌式地图应用的软件是相当的困难,而且往往还需要支付很高的地图厂商的版权费
用,加之手机上GPS功能的不完善,导致很多可以基于当前位置来开发功能的软件少之又少。就算是几个比较著名的LBS(Location-Based Service)软件,使用者也是寥寥。Android的出现打破这一格局,提供给普通开发者非常灵活的地图展示与控制功能。本文根据AndroidAPI 以及笔者亲身体验,给读者简单介绍下Android里面的MapView和MapActivity,通过简单的代码例子,期望给大家有所启示及探讨。
MapView是个展示地图的视图。它可以获取键盘事件(onKeyDown 和onKeyUp) 来支持地图移动(东南西北)和缩放功能。它还支持多层Overlay,可以在地图上面画坐标,写地名,画图片等等。MapView只能通过MapActivity来建立。因为MapView需要在后台使用文件系统和网络,所有这些线程需要在Activity的生命周期中被控制。
Android 是通过布局(layout)来定义UI(用户界面)的。一般视图(View)可以直接在布局的xml 里面申明。但MapView不行,不知道是Google 故意的,还是当前API 没有实现。不过可以以自定义类来申明来实现:
<view id=”@+id/mapview”
class=”com.google.android.maps.MapView”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:layout_weight=”1″ />
这样你可以添加你自己需要的其他视图,比如一个工具栏,或者一个EditText 来输入地址。基于MapView展示地图的视图
在详细进入coding 之前, 我们先介绍下经纬度(geocode)。
经度是地球上一个地点离一根被称为本初子午线的南北方向走线以东或以西的度数。本初子午线的经度是0°,地球上其它地点的经度是向东到180°或向西到180°纬度是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间。位于赤道以北的点的纬度叫北纬,记为N,位于赤道以南的点的纬度称南纬,记为S。基于纬度 phi (φ) 和经度 lambda (λ)的地图模型
使用geocode,地球上任何一个地点都可以用精度+维度来代表。当然,geocode涉及的范围很广,本身就是一个很大的课题,以后有机会我们再讲。
回到Android,com.google.android.maps.Point 这个类代表了一个地点的经纬度:Point(int latitudeE6, int longitudeE6),E6 是微度(microdegrees),就是度数再乘以1000000。目前如果要指定地图地点,一定要传递一个Point的类到地图中:
// 纽约帝国大厦的经度和纬度
Point p = new Point(40.748356*1000000,-73.984621*1000000);
// 获取当前地图的控制器
MapController mc = mapview.getController();
// 地图中心移动到指定的点上
mc.animateTo(p);
// 放大到21级(level),level范围1-21
mc.zoomTo(21);
以拉斐特广场为例的地图效果
你也可以使用zoomTo(int)来缩放到你需要的级别,比如获取当前缩放等级并再缩放一级(zoom out 1 morelevel):mc.zoomTo(mapview.getZoomLevel()-1)
经过缩放以后的地图效果
mapview还提供了卫星图、路况图、街道图的功能:<
- 获取卫星地图:mapview.setSatellite(true);
- 实时路况卫星图:mapview.setTraffic(true);
- 获取街道图片:mapview.setStreetView(true);
大家可以清楚的看到,使用Android 的地图功能是非常的简单然后又很强大。那如何拿到一个地址的经度和纬度呢?有很多在线的服务可以使用。笔者比较喜欢Yahoo的Geo API :http://developer.yahoo.com/maps/rest/V1/geocode.html。Yahoo 的用户可以去免费申请一个appid,就可以使用所有Yahoo 提供的服务了。最简单的获取geocode的请求就是提供location的值:
http://local.yahooapis.com/MapsService/V1/geocode?appid你的appid&location=350+5th+Ave,+New+York,+NY+10118
在返回的XML中,我们只关心Latitude和Longitude的值:
<Latitude>40.748396</Latitude>
<Longitude>-73.984703</Longitude>
在Android 中,可以通过包里面org.xml.sax 包来分析xml,也可以通过substring来做。如果你需要在地图上画地标、坐标、图片等等,那就需要定义你自己的Overlay 类:
public class MyOverlay extends Overlay {
// com.google.android.maps.Overlay
然后override draw(Canvas canvas, PixelCalculatorcalculator, boolean shadow)这个方法。比如你想画个图标在当前的点上:
super.draw(canvas, calculator, shadow)
// 下面两行把当前的点转换成地图上的xy坐标
int[] xyCoordinates = new int[2];
calculator.getPointXY(p, xyCoordinates);
// 在坐标这点画图(bitmap是Bitmap类,可以读取图片资源
//(drawable resources)来生成)
canvas.drawBitmap(bitmap, xyCoordinates[0],xyCoordinates[1], new Paint());
// 在mapview中获得OverlayController:
OverlayController oc = myMapView.createOverlayController();
MyOverlay mo = new MyOverlay();
// 加入到Overlay控制器就可以了
oc.add(om, true);
当然,你也可以在draw里面写字,画几何图形等等,这里就不一一叙述。
最后,我们看看如何获取键盘事件:
public boolean onKeyDown(View v, int keyCode,KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_I)
{
// 放大
mapview.getController().zoomTo(myMapView.getZoomLevel() + 1);
return true;
}
else if (keyCode == KeyEvent.KEYCODE_O)
{
// 缩小
mapview.getController().zoomTo(myMapView.getZoomLevel() – 1);
return true;
}
else if (keyCode == KeyEvent.KEYCODE_S)
{
// 转换到卫星地图
mapview.toggleSatellite();
return true;
}
else if (keyCode == KeyEvent.KEYCODE_T)
{
// 转换到路况图
mapview.toggleTraffic();
return true;
}
return false;
}
有兴趣的读者,可以去andoridcn 看看笔者发表的minigoogle map(包含所有source)。如果有机会,可以继续深入关于GPS的操作,如何在没有GPS硬件的情况下估计当前GPS位置,以及使用kml,nmea来模拟GPS路线等等。
总结和技术展望
Android本身设计和系统的实现是一个极其复杂的工作。就发稿时的m3-rc22a 版来看,系统还有需要充实的地方,相信在明年全面发布,真机发布之时,Android会变得更加强壮和易用。感谢Androidcn 社区的 lordhong( 吴宏) 和 风雷( 李锟) 对本文成稿的贡献。
阅读后记
更多关于Android 中如何使用Google Map的文章,请阅读Maps External Library。
转载于:https://www.cnblogs.com/justinprc/archive/2010/10/12/1848973.html
【转】构建Android平台Google Map应用相关推荐
- Android使用Google Map服务 - 根据GPS信息在地图上定位
Android使用Google Map服务 - 根据GPS信息在地图上定位 自暑假7月7日开始,到今天的8月7日,整个一个月,我总算是学到了Google Map这部分的内容.原本挺兴奋的,却被注册ap ...
- android在google map上画出导航路线图
android在google map上画线比较容易实现的,但是现在问题在于如何获取起点和终点之间的路线图.这里我们使用Google Directions API来实现, Google Directio ...
- Cocos Creator Android 平台 Google 原生登录
在海外项目中,我们通常需要接入 Google 帐号登录,这样可以提高应用使用率. 下面以 Android 平台 接入 Google 原生登录为例,进行详细说明. 一.准备工作 1.需要 Android ...
- Android 集成google map,Markers ,定位,聚合
集成谷歌地图 前期准备 1.注册谷歌账号,然后再开发者平台登录 开发者平台传送门(需翻墙) 谷歌地图的文档 2.进入控制台,新建项目 3.此时成功创建项目,接下来是添加API,因为谷歌将谷歌地图的功能 ...
- 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | 使用 Makefile 构建 Android 平台 NDK 应用 )
文章目录 一.Visual Studio 中创建 Makefile 项目 二.配置 Makefile 文件 三.配置 Android.mk 四.配置 Application.mk 五.主函数源码 六. ...
- android 使用Google map api v3 不用申请key!
装载google 地图,老师说用v3 版本的,于是搜索,网页上铺天盖地的都是怎么使用v2的,怎么申请key的. 我问老师怎么使用v3,我还一直以为要升级什么的 老师说v3可以不用key, 这不是废话吗 ...
- Android Google Map 开发指南(一)解决官方demo显示空白只展示google logo问题
这两天一直在做google map接入前的准备工作 特此在这里将自己在加载官方demo时出现的问题以及详细的接入步骤进行记录,已免后者踩坑 注:项目实际运行时不要使用虚拟机 因为电脑ip和虚拟机ip不 ...
- Android平台研发人才缺口30万
随着采用Android系统的谷歌手机.平板电脑等产品逐渐扩大市场占有率,Android平台人才的缺口日益显现.据业内统计,目前国内的3G研发人才缺口有三.四百万,其中Android研发人才缺口至少30 ...
- Google Map和桌面组件 Android开发教程
本文节选于机械工业出版社推出的<Android应用开发揭秘>一 书,作者为杨丰盛.本书内容全面,详细讲解了Android框架.Android组件.用户界面开发.游戏开发.数据存储.多媒体开 ...
最新文章
- 使用Typescript的巧妙React上下文技巧-不是Redux
- GLIBC 升级安装与 SCL 知识盲区
- Tomcat安全加固
- 只读字符串的c语言命令,C语言只读空间 - C 语言程序设计
- 2017年我国智能卡行业市场现状及发展趋势分析
- 5道谷歌面试题:即使是天才也要怀疑自己能力了(附答案)
- 无线网状网、Zigbee、RFID三种技术分析
- 前端学习(1341):mongoose验证规则延伸
- 由最小生成树算法改到最短路径算法代码----为了区分两者的区别
- android_x86安装时遇到的问题与修改开机分辨率
- 查询sql执行计划_使用SQL执行计划进行查询性能调整
- live555 linux 编译
- c51单片机时钟程序汇编语言,51单片机数字钟汇编程序精选.docx
- MATLAB(R2021a)软件下载和安装教程
- BP神经网络代码和原理
- 让你的手机不输kindle的3款epub阅读器
- 程序流程图、N-S图、PAD图
- 关于写作,村上春树提供的几个方法
- 【转录调控网络】代谢组学与其他组学的联合分析经典模式简介
- 抽象类+接口+内部类作业题及答案
热门文章
- 程序员辞职的7个常用理由,你用的是哪一个?
- 嵌入式设备带操作系统的启动过程
- java 无法注入service_SpringBoot集成shiro,MyRealm中无法@Autowired注入Service的问题
- inur new.php id,Cmsez(随易)全站系统注入0day
- qt ui指针和本类对象_您需要了解的有关UI设计的形状和对象的所有信息
- 面试官问:跨域请求如何携带cookie?
- Onew积极开拓国际市场,为全球用户提供全方位金融服务
- Nodejs 文件上传
- NSA泄露的恶意软件DoublePulsar感染了数万台Windows电脑
- restful-api-design-references