`
izuoyan
  • 浏览: 8882549 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

构建Android平台Google Map应用!

阅读更多

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

分享到:
评论

相关推荐

    Android学习每日一例 Google Map XMPP

    • Snake游戏深入解析 • Android学习每日一例——ApiDemos • JetBoy游戏深入解析(上)(中)(下) • 构建Android平台Google Map应用 • Android 中的XMPP 应用

    Android高级编程--源代码

    作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍android的所有基本功能,并...

    GPS定位: Android 手机端,C#电脑端;Google Map显示

    GPS定位,手机端及电脑端构建tcp/ip连接。 Android 手机端获取实时定位信息,发送到C# 电脑端服务器,并在Google地图上打点显示路径。

    疯狂Android讲义源码

     第1章 Android应用与开发环境 1  1.1 Android的发展和历史 2  1.1.1 Android的发展和简介 2  1.1.2 Android平台架构及特性 3  1.2 搭建Android开发环境 5  1.2.1 下载和安装Android SDK 5  1.2.2 安装...

    World Map Globe Edition 2 V14.5

    完整的资产具有强大的可视化功能、示例和丰富的API,适用于为VR、桌面和移动设备构建游戏和应用程序。 ***主要特点*** -从程序上划分了240个国家、4112个省和州的边界,以及世界上7144个人口最多的城市的地理...

    精通ANDROID 3(中文版)1/2

    17.1.1 从Google获取map-api密钥  17.1.2 MapView和MapActivity  17.1.3 使用覆盖图添加标记  17.2 位置包  17.2.1 使用Android进行地理编码  17.2.2 使用后台线程进行地理编码  17.2.3 ...

    android-samples:演示如何使用Android版Maps SDK的示例

    适用于Android的Google Maps SDK示例 演示如何使用示例。 此仓库包含以下示例: :一系列小演示,展示了Android Maps SDK的大多数功能。 :在Wear OS设备上显示地图。 此示例演示了基于gradle的Android Studio...

    一个示例项目,演示如何在Android App中添加“像汽车一样的Uber”动画-Android开发

    以演示如何添加Uber像Android App中的汽车动画一样关于此开源项目此项目包含一个示例应用程序,该示例应用程序显示如何在Google Map上将Uber应用程序的汽车图标从源动画到目标动画。 我们将在该项目中构建以下内容:...

    MapDrawingTools:此库在Google Map中绘制多边形,折线和点,并将坐标返回到您的App

    MapDrawingTools是一个Android库,用于在Google Map中手动绘制多边形,折线和点,并将坐标从库返回到您的App。 该库对于选择多点或绘制土地边界以从用户获取数据的应用程序很有用。 项目设置和依赖项 JDK 8 ...

    精通Android 3 (中文版)2/2

    第1章 Android计算平台简介  1.1 面向新PC的全新平台  1.2 Android的历史  1.3 Dalvik VM剖析  1.4 理解Android软件栈  1.5 使用Android SDK开发最终用户应用程序  1.5.1 Android模拟器  1.5.2 ...

    疯狂Android讲义.part2

    第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 ...

    疯狂Android讲义.part1

    第1章 Android应用与开发环境 1 1.1 Android的发展和历史 2 1.1.1 Android的发展和简介 2 1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 ...

    mmm-Carburez:寻找最近的加油站的Android应用程序

    II - 按照以下步骤访问 Google API,从而访问 Google Map。 导入位于 android sdk 中的“google-play-services_lib”项目。 &lt;path&gt; / extras / google / google_play_services / libproject / google-play-services...

    Android-StreetComplete.zip

    Android-StreetComplete.zip,易于使用的android openstreetmap编辑器,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。

    World Map 2D Edition 2 V7.2.2

    *地图编辑器:使用先进的工具(创建/修改/重塑/合并国家、省、市…)在Unity编辑器中构建您需要的地图 附加功能: -三类城市,包括国家和地区首府。 -使用放置选项自动绘制国家/地区标签。 -给国家、省/州或...

    map_launcher:Flutter插件,用于启动地图

    记号笔导航 当前支持的地图: 谷歌地图 Apple Maps(仅限iOS) Google Maps GO(仅适用于Android) 百度地图 Amap(高德地图) 位智 Yandex地图 Yandex导航器 城市地图 Maps.me 奥斯曼 2地理信息系统 腾讯(QQ地图...

    谷歌师兄的leetcode刷题笔记-APO-DZ-Android:适用于AlphaPhiOmega的DeltaZetaChapter的自适应A

    谷歌师兄的leetcode刷题笔记 安卓版 APO-DZ 这是 Android 版本的存储库。 您可以找到 iOS 存储库。 作为订阅工具的免费替代品,Delta Zeta Chapter 使用一系列 Google 日历、表格和表格来促进服务项目/事件的注册和...

    Food-Decider:内置Kotlin的Android应用程序FOoD决策器

    食品决策者 Android Application FOoD Decider,kotlin中的buit。 它要求用户在列表中输入一些食物,然后当用户单击...than application call for google map api and find nearest restrurant where that food is avai

    MapTask:第一项任务

    任务是使用Google地图创建应用程序,并在当前设备的位置上使用标记(使用GPS),并在地图下方的文本字段中显示当前位置的经度和纬度。 使用了Google Map API v2。 所有测试均使用android模拟器(预先安装了Google ...

Global site tag (gtag.js) - Google Analytics