基于android和googlemap的地图定位程序的设计与实现--王树伟、陈阵、汪亚文内容摘要:
首先要引用 ,创建一个 MapView对象 来显示地图。 通过 MapController对象 来设置地图显示的地点以及放大的倍数,要定位地点需要构建一个 GeoPoint 对象 来表示地点的经度和纬度,然后使用 animateTo方法将地图定位到指定的 GeoPoint对象 上 ,再 新建一个 Overlay 对象 并在 上 面 标注一些图标文字信息。 通过地名定位 的设计思路 本功 能的实现目标是:在一个 EditText里输入一个地名,点击 Button,在 MapView里便会显示出该地。 实际上, 由于在 Google Map中必须获得经纬度才能定位,故本 定位方法不过是 前一种定位方法的加强版 , 即 先通过地名获得该地的经纬度, 再通过 经纬度进行定位。 由此 可知,本设计的核心内容,便是如何通过地名获得该地的经纬度。 本来此问题应该很好解决,因为 Google提供了一个用于实现该功能的 Geocoder类, 只要 使用该类生成一个对象,并使用 getFromLocationName()方法 ,只需几句代码便可轻松将地名转换为相应的经纬度 , 我们手中的 android开发教材和网络上能够搜索到的绝大部分资料中使用的都是 该方法, 如下: Geocoder geocoder=new Geocoder(this)。 ListAddress list=(Address,1)。 //Address是输入的地址信息 if(!()){ Address address=(0)。 double latitude=()*1E6。 double longitude=()*1E6。 GeoPoint geopoint=new GeoPoint((int)latitude,(int)longitude)。 } 但我们在实际的开发过程中发现, 在调试程序时 ,点击 Button后,程序没有任何响应。 经反复调查研究后我们得知,由于 google map中的 Getcoder反转经纬度一直存在 BUG,在前一段时间 google终止了这项服务 ,故 Geocoder返回 List为 null,得不到地址信息。 当我们正一筹莫展之时, 我们 从一份资料上获得了另一种新的但较为麻烦的获取地理位置经纬度的方法 :通过 JSON数据解析地址。 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 它基于JavaScript( Standard ECMA262 3rd Edition December 1999)的一个子集。 JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯 , 这些特性使 JSON成为理想的数据交换语言 , 易于人阅读和编写,同时也 易于机器解析和生成。 在浏览器的地址栏里输入以下网址 :“ 10 n?address=合肥 学院新区 amp。 sensor=false”(其中“ 合肥学院新区 ”可以更换成任意地址,中英文皆可),便可得到一份 JSON数据(见附录),里面包含了许多关于 合肥学院新区站 的地理位置信息的键值对,其中我们可以找到 合肥学院新区站 的经纬度 location : {lat : ,lng : }。 那么,程序所要 做的,就是 通过该网址发送 请求,获得 Json数据,并且把我们需要的经纬度 数据 “抽取”出来, 填入到 GeoPoint的对象中,就可以 用上一种方法 定位了。 设计思路大体如此,具体的设计过程中会涉及到在 android 中通过 请求网络资源和 Json数据的解析等较为高级的核心技术,手中的几本 android 开发教材中 都 找不到相关的 介绍 ,只能通过从网上搜集到的一些少量的、零散的 资料 中略窥一斑,因此我们也是摸着石头过河。 11 四 、 设计过程 Map API 的使用 Android中定义了一个名为 ,其中包含了一系列用于在Google Map上显示、 控制和层叠信息的功能类,以下是该包中最重要的几个类: MapActivity:这个类是用于显示 Google Map 的 Activity 类,它需要连接底层网络MapActivity是一个抽象类,任何想要显示 MapView的 activity都需要派生自 MapActivity,并且在其派生类的 onCreate()中,都要创建一个 MapView实例。 MapView:用于显示地图的 View 组件。 它派生自。 它必须和MapActivity配合使用,而且只能被 MapActivity创建,这是因为 MapView需要通过后台的线程来连接网络或者文件系统,而这些线程要由 MapActivity来管理。 MapController:用于控制地图的移动、缩放等。 Overlay:可 用于显示 地图之上的可绘制的对象。 GeoPoint:一个包含经纬度位置的对象。 通过经纬度定位的实现 创建工程 在 Eclipse 环境下,选择 FileNewProjectAndroid,选择 Android Project。 创建方法同普通 Java项目 和 其他 Android 项目 并无明显区别,但 必须在 Build Target 中勾选 Google API。 修改 文件 因为地图应用使用的是 Google Maps 的类库,而不是 Android 的标准类库,所以需要在 文件 的 /application标签 中声明 : useslibrary android:name= / 由于需要从网络获取地图数据,所以需要访问网络的权限 : usespermission android:name= / 修改 需要 在 创建一个来自 MapView标签。 其中 clickable 属性设置了是否允许用户和地图的交互, apiKey 里填写的就是刚刚申请到的 apiKey: android:id=@+id/mapView 12 android:layout_width=fill_parent android:layout_height=wrap_content android:clickable=true android:apiKey=0avAw1ozxNMipBtFVOvv9zzbSNrxLcMqhp_DA / 实现 MapActivity MapView 需要由 MapActivity 来管理,所以程序部分应该继承自 Activity 的一个特殊子类 MapActivity 类 , 同时必须实现 isRouteDisplayed()函数 , 获得 MapView 实例以后,通过 setBuiltZoomControls 方法设置地图是否支持缩放。 另外 MapView提供了 三种 模式的地图,分别可以通过以下方式设置采用什么模式来显示地图 : (true)。 //设置为交通模式 (true)。 //设置为卫星模式 (false)。 //设置为街景模式 MapController 的使用 如果需要设置地图显示的地点以及放大倍数等,就需要使用 MapController 来控制地图。 可以通过如下代码获得 MapController对象: MapController mapController。 mapController = ()。 要定位地点,需要构造一个 GeoPoint 来表示地点的经纬度,然后使用 animateTo方法将地 图定位到指定的 GeoPoint上,代码如下: GeoPoint geoPoint01。 geoPoint01= new GeoPoint((int) (editText01double * 1000000), (int) (editText02double * 1000000))。 (geoPoint01)。 增加标记 为了给地图多增加一些自定义的功能,比如可以在地图上进行一些标注。 为了实现这样的功能,我们可以继承 Overlay 这个类,这个类 是一个基类,提供了可以在地图上添加图层的基本功能。 在定位的目标地点 引入 一张图片 做标记 ,代码如下: (bmp, , , paint)。 在定位的目标地点添加文字做标记,代码如下: (定位目标 , , , paint)。 13 通过地名定位的实现 监听 响应 函数 的实现 TextView对象中获取输入的地址 信息 : String address=().toString()。 getLocationInfo()和 getGeoPoint(),前者通过 取得 Json数据,返回的是 JsonObject对象,交给后者;后者解析出 JsonObject对象中的经纬度数据,交给 GeoPoint对象,并将 GeoPoint对象返回 : geoPoint02=getGeoPoint(getLocationInfo(address))。 3. 使用 animateTo方法 将定位 : (geoPoint02)。 getLocationInfo()函数的实现 url地址创建 HttpGet请求 对象 : HttpGet Get=new HttpGet( geocode/json?address= + address + amp。 sensor=false)。 客户端对象 : HttpClient Client=new DefaultHttpClient()。 响应对象 : HttpResponse Response。 ,与一般的 String对象的区别是 StringBuffer对象里面的内容可以增加和修改,用于存储从 InputStream对象中读取出的字符串 : StringBuffer stringBuffer=new StringBuffer()。 HttpClient对象执行一次 GET方式的 请求,并返回一个 HttpResponse对象作为服务器的响应 : Response=(Get)。 ,这里需注意 HttpResponse 对象只是代表了服务器的响应,HttpEntity对象才是该响应的实体 : HttpEntity Entity=()。 , getContent()方法可以得到其内容 : InputStream inputStream=()。 将从 InputStream对象中读取出的字符元素赋值给整型对象 b,一般来说赋值的结果不可能是 1,只有当 InputStream对象读完时才会得到 1。 在该循环里将整型对象 b 的内容转换成字符元素并追加给 stringBuffer,注意此时字符元素对象 b 的内容与从 InputStream对象中读取出的字符元素一致,这样就实现了读取服务器响 应 : int b。 while ((b=())!=1){ ((char)b)。 } : 14 ()。 JSONObject对象 : JSONObject jsonObject=new JSONObject()。 StringBuffer对象里的字符串转换为 JSONObject对象 : jsonObject=new JSONObject(())。 JSONObject对象 : return jsonObject。 getPoint()函数的实现 double数组,用于储存经纬度信息 : Double lon=new Double(0)。 Double lat=new Double(0)。 JSONObject对象中取出代表纬度的 lng的值 ,具体过程是:先得到 ” result” 里的值,从值里取得第一个结果,在逐步往下 ” geometry” ” location” ” lng” ,最终得到 lng里的值 : lon=((JSONArray)(results)).getJSONObject(0).getJSONObject(geometry).getJSONObject(location).getDouble(lng)。 JSONObject对象中取出代表经度的 lat的值 ,过程同上 : lat=((JSONArray)(results)).getJSONObject(0).getJSONObject(geometry).getJSONObject(location).getDouble(lat)。 GeoPoint对象并返回 : return new GeoPoint((int)(lat*1E6),(int)(lon*1E6))。 15。基于android和googlemap的地图定位程序的设计与实现--王树伟、陈阵、汪亚文
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。