【转】构建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展示地图的视图
MapView-Map
在详细进入coding 之前, 我们先介绍下经纬度(geocode)。

经度是地球上一个地点离一根被称为本初子午线的南北方向走线以东或以西的度数。本初子午线的经度是0°,地球上其它地点的经度是向东到180°或向西到180°纬度是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间。位于赤道以北的点的纬度叫北纬,记为N,位于赤道以南的点的纬度称南纬,记为S。基于纬度 phi (φ) 和经度 lambda (λ)的地图模型
Mapview-经纬
使用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);
以拉斐特广场为例的地图效果
MapView-lft

你也可以使用zoomTo(int)来缩放到你需要的级别,比如获取当前缩放等级并再缩放一级(zoom out 1 morelevel):mc.zoomTo(mapview.getZoomLevel()-1)
经过缩放以后的地图效果

MapView-Zoom

mapview还提供了卫星图、路况图、街道图的功能:<

  • 获取卫星地图:mapview.setSatellite(true);
    MapView-Satellite
  • 实时路况卫星图:mapview.setTraffic(true);
    MapView-Traffic
  • 获取街道图片: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将虚拟机转换成模板

在制作模板前&#xff0c;先要准备一个干净的操作系统&#xff0c;或者安装上经常使用的软件在虚拟机中&#xff0c;安装好后&#xff0c;将其正常关机&#xff0c;之后就可以转换成模板了。转换后的虚拟机将不会在主机管理中看到&#xff0c;而只能在模板中看到。克隆转换时克…

假如你学过高数,那你这一辈子都不会忘记这个人

▲ 点击查看2020年3月&#xff0c;菲列兹伦敦奖评奖委员会宣布&#xff0c;2020年度菲列兹伦敦奖将授予三位科学家&#xff0c;除开美国的 Vinokur 博士、以及德国的Steglich 教授以外&#xff0c;最后一位就是清华大学副校长、北京量子信息科学研究院院长薛其坤院士。薛其坤院…

.Net Core with 微服务 - 分布式事务 - TCC

上一次我们讲解了分布式事务的 2PC、3PC 。那么这次我们来理一下 TCC 事务。本次还是讲解 TCC 的原理跟 .NET 其实没有关系。TCC Try 准备阶段&#xff0c;尝试执行业务Confirm 完成业务Cancel 回滚准备阶段的业务TCC 事务其实是 2PC 的一个扩展。上一次我们说了 2PC &#xff…

第10章-管理Hadoop集群-hadoop 安全模式相关知识点

为什么80%的码农都做不了架构师&#xff1f;>>> 1、namenode启动时&#xff0c;namenode节点都做了哪些动作&#xff1f;fsimage和edits有什么变化&#xff1f; 2、namenode什么时候开始监听RPC和HTTP请求&#xff1f; namenode启动时&#xff0c;首先将映像文件(f…

oracle挂证多少钱一个月_惊呆,一条sql竟然把Oracle搞挂了

一条sql就能把oracle搞挂了&#xff0c;真的是不敢相信啊&#xff0c;前几天生产上确实出现了这样一个故障&#xff0c;我们来一起做一个事件回放。系统介绍系统架构见下图&#xff1a;fileapplication1和application2是一个分布式系统中的2个应用&#xff0c;application1连接…

linux图形界面鼠标变成小手_加载Linux系统,树莓派变身桌面电脑

开始正文前&#xff0c;我们想听听娃说了什么操作系统&#xff0c;英文名叫做Operation System&#xff0c;简写为OS&#xff0c;是电子设备运行的基础软件&#xff0c;按运行的设备类型来分&#xff0c;操作系统分为手机操作系统&#xff0c;桌面电脑操作系统和服务器操作系统…

二叉查找树转换成有序的双向链表

首先对于二叉查找树的定义和性质&#xff0c;以及如何得到二叉查找树某个节点的子树下的最大值和最小值和插入一个值的内容可以参考这两篇文章&#xff1a; &#xff08;1&#xff09;http://www.cnblogs.com/chenping-987123/archive/2010/09/25/1834341.html &#xff08;2&a…

就你这个求婚态度,能嫁给你才怪!

1 兄弟&#xff01;哪有求着婚还走神的&#xff1f;&#xff01;▼2 喝奶茶专用口罩&#xff01;▼3 把广东茶楼的菜都点一遍是什么体验&#xff1f;▼4 你觉不觉得这个门锁有点像托马斯的小火车▼5 手里的塑料袋像极了塑料兄弟情▼6 小朋友看《喜羊羊》看到的是坏人的愚…

Remoting and MSMQ 结合做的一个DEMO

真的非常感谢CnBlogs.com,因为有很多教程里写的知识点并不全面,而且也没附带例子.通过这里我学习到了很多很多.希望网站能越办越好哦.下面是我学习分布式开发时写的一个小demo,当然功能有限,技术也很低.希望大师们能拍拍砖,不吝赐教.呵呵软件运行的一个截图下面说说流程吧,1:利…

再聊一次值类型和引用类型

C#值类型&#xff0c;作为函数形参&#xff0c;形参被修改&#xff0c;不影响原值。这是我们在初始学习编程时需要记住的内容&#xff0c;我们也是一直这样践行的。先说结论&#xff1a;这是不准确的。为什么提出这样看似很浅显的问题&#xff0c;是因为有次我在使用ArraySegme…

java+字节码工具64位_jclasslib 下载-jclasslib 32位64位(java字节码查看工具) 5.1 官方版 - 河东下载站...

jclasslib是款免费的开源java字节码的查看工具&#xff1b;它支持进行查看您需要进行使用汉字运用到的Java字节码&#xff0c;并且还拥有一个的类库来让开发者进行读取&#xff0c;包括了修改、对JavaClass文件、字节码的写入等&#xff1b;用户这进行使用的过程中&#xff0c;…

ado filter 多条记录_注意!武汉江南中心绿道武九线综合管廊工程开工,青山区多条道路通行规则有变...

楚天都市报10月29日(记者吴昌华 通讯员 李佳 陈菲)今日记者从武汉交管部门获悉&#xff0c;本周六&#xff0c;10月31日&#xff0c;武汉市江南中心绿道武九线综合管廊工程开始施工&#xff0c;青山区多条道路通行规则有变&#xff0c;部分道路禁止通行。交管部门提供详细绕行建…

深度学习框架再次升级,它们都有什么优点?

全世界只有3.14 % 的人关注了爆炸吧知识经过几年的发展&#xff0c;深度学习方法摧枯拉朽般地超越了传统方法&#xff0c;成为人工智能领域最热门的技术。之后&#xff0c;谷歌、亚马逊、百度、Facebook 纷纷开源了自己的深度学习框架。而支撑AlphaGo的核心技术架构--TensorFlo…

SQL Server 2005的安装,SQL Server 2005系列之一

最近复习SQL Server 2005,忽然有了写系列的打算&#xff0c;也不知道能不能写好&#xff0c;今天先写一篇关于SQL Server 2005的安装的博文吧。和往常一样&#xff0c;我们先来看看SQL Server 2005到底是个什么东西&#xff1f;SQL Server 2005是一种以高性能、高可靠性和可用性…

Quartz - 作业调度框架-插件化开发

背景大部分业务都是基于定时的任务&#xff0c;特别适合使用quartz这类框架解决定时问题。具体quartz的使用&#xff0c;看官方文档就可以了。下面谈谈对quartz插件化的封装。我们使用quartz.plugin。然后在quartz_jobs.xml方法里面定义了schedule&#xff0c;其中灵活的地方在…

cgi备份还原和ghost有什么区别_手动GHOST还原重装系统详细教程

一键重装虽好&#xff0c;但也不是万能的。俗语说&#xff1a;治标不治本。也许你懂得用各种一键备份还原工具重装&#xff0c;但不一定懂得手动GHOST重装。为此&#xff0c;吻妻为大家分享一下如何手动GHOST还原重装系统&#xff0c;本教程步骤虽多&#xff0c;但很多都是点“…

图解一步步安装SharePoint Foundation 2010

图解一步步安装SharePoint Foundation 2010 下载后在Windows Server 2008 R2上进行安装安装产品必须的一些组件&#xff0c;比原来好多了不用自己一个个下了。同意许可&#xff0c;此产品为不收费版本&#xff0c;不用序列号了&#xff01;&#xff01;&#xff01;安装相关的…

MYSQ 查看 2 进制日志

方法 1&#xff1a; myqlbinlog filename; -----------------------------------------------------------------------------------------------------------------------------------------------

当身为老师的爸爸上课时......​

1 当身为老师的爸爸上课时......▼2 气氛突然微妙......▼3 隔壁的一家人都馋哭了&#xff01;▼4 结束疫情隔离的你▼5 WOW!AMAZING!▼6 女孩子喜欢帅哥是不分年龄的▼‍‍7 单身狗又做错了什么呢&#xff1f;▼你点的每个赞&#xff0c;我都认真当成了喜欢

amos里CFA可行性辨别结果怎么看_论文用问卷调查法,数据分析怎么做?

论文问卷数据的分析&#xff0c;看起来简单&#xff0c;好像每个人都会做。但是做起来还真的有点难度。很多初次使用问卷调查方法的人大多以为&#xff0c;问卷数据分析嘛&#xff0c;无外乎对单选题做做频率分析&#xff0c;看看选择不同的选项的人占比有多少。对于评分题目&a…