如何在不同的google地图添加标记账户间共享地图标签,地图标记

地图汇 – 自定义标记自己的地图[Web]
Loading...
比如要创建一个类似于的地图,首先需要有数据,地图汇是支持 Excel 导入的,那么事情简单了,选择地图模板(或者自定义),导入数据,地图成型。
地图汇支持分段设色、脚印、柱状图、热度图、气泡、统计、流向地图等多种专业地图模板,可以选择不同的地图范围,比如国家、省份、城市。每一个做好的地图都可以以 Flash 或者 HTML 的形式发布到第三方网站上。
地图汇还有个离线 Windows 版本的 (update:谨慎,有同学留言发现木马。尽可能使用在线服务),离线下载的地图仍可嵌入 PPT/Word/Web 等。
沙发?前排混脸熟~
按分类查看文章:
大家都在讨论些什么
: 怎么不介绍 bitkiller: 怎么不介绍 bitkiller: 卧槽,这效果千万别被产品经理看到,不然又有得抄了: 这个软件我装了,wifi和usb都连不上,蓝牙连上了但电脑没声音。寻求支持谢了!: /image/detail/827C_56F931791
专门为你上传的,不谢。: 表示已经弃坑,play早上架了(最晚是3月2日),国内的听说是昆仑代理,游戏挺消磨时间,开一个箱子至少8小时,一共才4个宝箱位,满了的话再打是没有箱子得的,而且箱子要手动开启下一个,不会开完了这个之后就自动开下一个宝箱,搞得你总打开来看看宝箱有没有开好。
有时候掉线了,游戏也不暂停的,别人照样打你,而你什么也干不了。所以网不好的时候还是不要玩了,否则坐看自己被人家一波推掉……: 博主不用这货...
最热门标签
传说中的小众软件 让你的手机应用与众不同。
个人 blog 转载时请遵循 “署名-非商业性使用-相同方式共享” 的创作共用协议;
商业网站或未授权媒体不得复制本站内容。学范文网,范文,作文,教案,简历,诗词鉴赏!
||||||||||
您当前的位置: > &>>&google地图安卓
google地图安卓
第一篇:google地图安卓3.1.2 程序功能的概述 用户界面为地图模式下的地图图层,界面最上方标明实时卫星数据,包括用 户当前所在位置的经度、纬度、海拔高度和用户的移动速度以及卫星的精度、数 量等信息。界面正中央的小点则指明了用户当前所在的位置。界面下方为 Menu 菜单,实现本程序的主要功能,包括图层分类,图层清除 和程序退出等功能。图层分类可显示用户当前所在位置周边的娱乐、购物、交通 等信息,使得用户对其周边有所了解,方便出行。点击 Menu 菜单的相应按钮, 则会在地图图层上叠加出娱乐、购物、交通等图标。点击这些图标,则会弹出对 话框显示详细信息以供用户查看。当不再需要显示以上图层时,可选择清除图层按钮,则界面还原为初始的地 图图层。点击退出程序按钮,程序将退出到 Android 主界面。如图 3-2 所示,显示了软件的运行流程。
显示地图图层 否
用户位置有无改变? 是 采集更新的位置信息
定位用户位置
侦听用户点击事件
判断命令类型
显示分类图层
图 3-2 软件运行流程图
3.2 功能模块实现的基本原理
3.2.1 GPS 位置信息的获取 Android 系统使应用程序可以利用 android.location 类来使用移动设备提 供的 GPS 定位服务,获取位置的相关信息,包括如下四个类或接口? ? ? LocationManager 类 LocationListener 接口 Location 类
LocationProvider 类
其中 LocationManager 系统服务是 GPS 定位服务的中心组件,它提供了 API 来 确定位置和方位。GPS 卫星数据的获取可通过如下代码实现:
mLocationManager = (LocationManager) getSystemService(LOCATION_SERVI CE); mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,0,mLocationListener) ; public LocationListener mLocationListener = new LocationListener() { public void onlocationChanged(Location location){ int lat, lat = location.getLatitude(); lon = location.getLongitude(); } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle ext ras) { } }
代码说明如下1.调用 getSystemService(Context.LOCATION_SERVICE)方法可实例化一个 LocationManager 类对象。2.调用 requestLocationUpdates(String, long,float,LocatonListener)方 法可以获取 GPS 地理位置的更新数据。其中,第 1 个参数是定位的方法,GPS 定位或网络定位;第 2 个参数是产生位置改变事件的时间间隔,单位为微秒; 第 3 个参数是距离条件,单位是米;第 4 个参数是 LocationListener 接口, 当 GPS 位置更新时,可通过此接口取得数据。3.当 GPS 位置有所改变时,LocationListener 接口用来接收来自 LocationManager 的通知,同时调用 onLocationChanged(Location location)方法, 根据 location 类(getLatitude()、getLongitude()、getAccuracy()等)的 参数可读出 GPS 位置详细信息。
4.onProviderDisabled()在用户禁用具有定位功能的硬件时被调用;onProviderEnabled()在用户启用具有定位功能的硬件时被调用;onStatusChanged()在提供定位功能的硬件的状态改变时被调用,如从不可获取位置信息状 态到可以获取位置信息的状态,反之亦然。5.为了使 GPS 定位功能生效,还需要在 AndroidManifest.xml 文件中加入用 户许可,实现代码如下&uses-permission android:name=&android.permission.ACCESS_FINE_LOCA TION&/& 3.2.2 Google 地图服务 获取 Google 地图服务首先要向 Google 申请一组经过验证的 “地图密钥” (Map API Key) ,然后使用 MapView(com.google.android.maps.MapView) 就可以将 Google 地图嵌入到 Android 应用程序中,从而正常使用 Google 的 地图服务。取得 Maps API Key 授权步骤1.产生 keystore 并取得认证指纹(MD5)码 利用 keytool.exe 读出 MD5 码, C:\ProgramFiles\Java\jre1.5.0_06\bin 在 目录下执行命令&keytool Clist Ckeystore ” C:\Documents and settings\adminstrator \.android\debug.keystore”,如图 3-3,可得到认证指纹(MD5)码。
图 3-3 取得认证指纹(MD5)码
2.经 Google 网站的签署取得 Maps API Key 授权码 进入“Android Maps API Key Signup”,网址为/intl/ja/android/maps-api-signup.html,在“My certificate’s MD5 fingerprint:”字段输入获取到的认证指纹(MD5)码, 单击“Generate API Key”按钮后,弹出如图 3-4 的页面,显示得到的 Maps API Key 。
图 3-4 Map API Key
在/res/layout/main.xml 文件内建立&com.google.android.maps.MapView&标签,并设置 Maps API Key,如图 3-5 所示,
图 3-5 建立&com.google.android.maps.MapView&标签
由于获取 Google 地图是需要使用互联网的,所以在运行前还需要在 AndroidManifest.xml 文件中,添加允许访问互联网的许可,即分别建立&user-library&标签 &uses-permission&标签 &uses-library android:name=&com.google.android.maps&/& &uses-permission android:name=&android.permission.INTERNET&/&
完成上述准备工作后,就可以从 Google 地图服务系统获得地图了。3.2.3 地图叠层技术的基本原理 通过在地图上添加覆盖层, 可以在指定的位置加添加注解、绘制图像或处理 鼠标点击事件等。Google 地图上可以加入多个覆盖层,所有覆盖层均都在地图 图层之上,每个覆盖层均可以对用户的点击事件做出响应。要实现地图上覆盖对象, 首先要实现一个 ItemizedOverlay 类,它可以管理 一套覆盖项目功能。以下是创建 ItemizedOverlay 类的基本代码:
public class MyItemizedOverlay extends ItemizedOverlay { private ArrayList&OverlayItem& mOverlays = new ArrayList&OverlayItem&(); public MyItemizedOverlay(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); // TODO Auto-generated constructor stub } public void addOverlay(OverlayItem overlay) { mOverlays.add(overlay); populate(); } @Override protected OverlayItem createItem(int i) { return mOverlays.get(i); } @Override public int size() { return mOverlays.size(); } }
代码说明如下1. 首行代码的作用为建立一个 OverlayItem ArrayList 数组,这个数组可以放 置所有要贴在地图上的标记对象。2. 为使 Drawable 标记可以贴上,必须界定它的范围。地图上的标记希望贴在地 图底部中心点,使用 boundCenterBottom()方法来处理。3. addOverlay 方法中的代码使得一个新的 OverlayItem 加入到 ArratList 数组 上。每一次增加一个新的 OverlayItem,一定要调用 populate()方法,它会 读出每一个 OverlayItem 并准备它可以被贴上。
4. 为了读出每一个 OverlayItem 会调用 populate()方法,必须定义 creatItem ()请求,确认是从 ArrayList 数组读出。5. 还需要一个覆盖 size()方法,在处理 size()方法的返回时加入如下代码:
return mOverlays.size();
以上为实现 ItemizedOverlay 类的基本程序。实现了一个 ItemizedOverlay 类后,就为后续的地图贴图工作打下了基础。
4 软件的详细分析与设计
4.1 地图图层的显示
按照 3.2.2 小结获得 Maps API Key 授权码,并对相关文件进行配制后,就 可以使用 Google 的地图服务了,本节将论述产生地图图层的详尽方案。以下代码实现了 Google 地图图层的显示,
mapView = (MapView) findViewById(R.id.mv2); mapView.setSatellite(false); mapView.setTraffic(false); mapView.setBuiltInZoomControls(true); int maxZoom = mapView.getMaxZoomLevel(); int initZoom = (int)(0.90*(double)maxZoom); mapControl = mapView.getController(); mapControl.setZoom(initZoom); GeoPoint newPoint = new GeoPoint((int)(lat*1e6),(int)(lon*1e6)); mapControl.animateTo(newPoint);
说明如下1. MapView为地图的显示控件,可以设置不同的显示模式,例如卫星模式、街道 模式或交通模式。本例通过mapView.setSatellite(false);mapView.setTraffic(false);两条语句将所显示的图层设置为地图模式。2. MapController则是MapView的控制器, 可以控制MapView的显示中心和缩放级
别等功能。程序中的缩放级别为最大级别的0.9倍。3. mapControl.animateTo(newPoint);使得地图以用户当前所在位置的经纬度 为中心显示。运行结果如图4-1所示:
图 4-1 地图图层的显示
4.2 卫星数据的获取与显示
4.2.1 获取卫星数据 当用户移动致使当前位置有所改变时,软件应能侦测到这一变化,并随 时更新卫星数据。侦测这种变化的方法已在 3.2.1 小结中讨论过了,本节将 研究侦测到变化后,如何读取更新的卫星数据。当用户的位置改变时,函数 onLocationChanged(Location location)
会调用 centerOnLocation()函数,获取经度、纬度等卫星信息。
centerOnlocation()函数代码如下:
private void centerOnLocation() { loc = locman.getLastKnownLocation(provider); if(loc != null){ lat = loc.getLatitude()-0.002; lon = loc.getLongitude()+0.003; GeoPoint newPoint = new GeoPoint((int)(lat*1e6),(int)(lon*1e6)); mapControl.animateTo(newPoint); getSatelliteData(); } if(displayOverlay != null){ displayOverlay.putSatStuff(lat, lon, satAccuracy, bearing, altitude, speed, currentProvider, numberSats); } } public void getSatelliteData(){ if(loc != null){ locBundle = loc.getExtras(); if(locBundle != null){ numberSats = locBundle.getInt(&satellites&,-1); } satAccuracy = loc.getAccuracy(); bearing = loc.getBearing(); altitude = loc.getAltitude(); speed = loc.getSpeed(); } }
说明如下1.getLastKnowLocation()方法可以获取当前的位置信息,在其返回的loc对象 中包含了可以确定位置的信息,如经度、纬度等。需要说明的是,在手机上实 际测试时, 会发现定位位置与实际位置将出现偏差,因此要对获取到的数据进 行修正以消除这一偏差。2. mapControl.animateTo(newPoint);语句以获取到的最新经纬度为中心,显示 地图图层。3.调用getSatelliteData()函数可以得到卫星精度、运动方位角,运动速度及海
拔高度等信息。4. displayOverlay.java程序的putSatStuff()函数用来接收获取到的卫星数 据,以便将其显示在用户的手机屏幕上。
4.2.2 卫星数据的显示 取得到卫星数据后, 接下来要解决的问题则是怎样将数据显示到手机屏幕 上去。程序 displayOverlay.java 将完成此项功能, 它通过使用 Canvas(画布) 类来显示当前位置信息。Canvas 类主要实现屏幕的绘制过程,其中包含了很 多实用的方法,比如绘制一条路径、区域、贴图、画点、画线、渲染文本等。如前一小节所述,函数 putSatStuff()用来接收得到的卫星数据,而显示 这些数据则通过如下代码实现:
public void draw(Canvas canvas, MapView mapview, boolean shadow) { super.draw(canvas, mapview, shadow); if(showData){ paint = new Paint(); paint.setAntiAlias(true); paint.setARGB(80,255,255,255); canvas.drawRect(0,0,350,33,paint); paint.setTextSize(11); paint.setARGB(180, 0, 0, 0); canvas.drawText(&Lat = &+lat+& &+(int)altitude+& m&, 8, 14, paint); canvas.drawText(&Sat = &+numberSats+& Accur = &+(int)satAccuracy+& m& +& speed = &+(int)speed+& m/s deg&, 8, 27, paint); } } bearing = &+(int)bearing+& Long = &+lon+& Alt =
代码说明如下1.首先通过 paint = new Paint();语句实例化一个 Paint 类变量。2.paint.setAntiAlias()函数设置了Paint类对象具有平滑锯齿状功能; paint.setARGB()函数设置了Paint对象的颜色; paint.setTextSize()函数设置字体大小。3.canvas.drawRect()函数使得绘制区域为一矩形区域,并规定其范围(左上顶 点与右下顶点的坐标) ,canvas.drawText()函数则将卫星数据显示于画布之上。运行结果如图4-2所示,屏幕最上方显示了当前得到的卫星信息:
图 4-2 卫星数据的显示
4.3 地图叠层技术的实现
4.3.1 用 SQLite Databases 处理地图信息 Android 操作系统采用标准 SQLite 数据库,提供管理数据库相关的 API。SQLite 数据库与常用的 PostgreSQL 和 MySQL 一样,是属于 RDBMS 的一种,但不 同的是 SQLite 数据库是可以用在本地应用程序的轻量级数据库,并不提供在服 务器上使用。SQLite 常用到以下几种类:
SQLiteOpenHelper 类:负责创建与打开数据库和版本管理,建立此类时,同 时需要建立三个回调(Call Back)方法,分别是创建 onCreate(SQLiteDat a-base)、更新 onUpgrade(SQLiteDatabase,int,int)和打开 onOpen(SQLite D-atabase)。
SQLiteDataBase 类:管理数据库本体,提供添加(Insert) 、更新(Update) 、 删除(Delete) 、检索(Query) 、执行 SQL 指令和其他管理数据库的功能。在同一应用程序里数据库名称必须是唯一的。
SQLiteCursor 类:检索(Query)数据库时,指示查询结果的初始位置。以下将详细介绍如何创建一个 SQLite 数据库并检索地图信息。
ContentValues 类:用来存储和保持表中的某行相关数据。首先要定义一个接口 MapSchema,包括数据库的表名称和字段名称,
public interface MapSchema { String TABLE_NAME = &MapInfo&; String ID = &_id&; String TITLE = &Title&; String NAME = &name&; String LONGITUDE= &longitude&; String LATITUDE = &latitude&; String DETAILINFO1 = &detailinfo1&; String DETAILINFO2 = &detailinfo2&; }
接着通过 SQLiteOpenHelper 类来建立数据库 MapInfoDB,并使用 Call Back 方法 onCreate()函数来建立表 MapInfo,
public static class DBConnection extends SQLiteOpenHelper { private static final String DATABASE_NAME = &MapInfoDB&; private static final int DATABASE_VERSION = 1; private DBConnection(Context ctx) { super(ctx, DATABASE_NAME, null, DATABASE_VERSION); } public void onCreate(SQLiteDatabase db) { String sql = &CREATE TABLE & + MapSchema.TABLE_NAME + & (&
+ MapSchema.ID
+ & INTEGER primary key autoincrement, &
+ MapSchema.TITLE + & text not null, & + MapSchema.NAME + & text not null, & + MapSchema.LONGITUDE + & text not null, & + MapSchema.LATITUDE+ & text not null, & + MapSchema.DETAILINFO1+ & text not null, & + MapSchema.DETAILINFO2+ & text not null &+ &);&; db.execSQL(sql); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
建立好数据库和表后,可通过定义 SQLiteDataBase 类变量 db,来添加和检 索地图信息。首先定义 SQLiteDataBase 类变量 db,db 数据库为可写入的,
helper = new DBConnection(this); SQLiteDatabase db = helper.getWritableDatabase();
插入一行数据到数据库中,
db.insert(MapSchema.TABLE_NAME, null, values);
从数据库中检索一行数据,
Cursor c = db.query(MapSchema.TABLE_NAME, FROM, null, null, null, null, null);
4.3.2 将分类图层覆盖于地图图层上
在 3.2.3 节通过程序 MyItemizedOverlay.java 实现了一个 ItemizedOverla y 类后,我们将研究怎样把贴图对象覆盖于地图图层上。首先实例化一个 List&Overlay&类对象 mapOverlays 作为地图图层, “/ 并从 res/drawable”文件里取得图标 knifefork_small.PNG,
mapOverlays = mapView.getOverlays(); drawable = this.getResources().getDrawable(R.drawable.knifefork_s mall);
其次, 实例化一个 MyItemizedOverlay 类对象 itemizedOverlay 来放置标记,
itemizedOverlay = new MyItemizedOverlay(drawable,this,title);
实例化一个 OverlayItem 类对象 overlayitem 来存放贴图信息, 并将贴图信 息加入到 itemizedOverlay 对象上,
OverlayItem overlayitem = new OverlayItem(new GeoPoint(Latitude,L ongitude),name,text); itemizedOverlay.addOverlay(overlayitem);
最后,将贴图覆盖于地图图层上,
mapOverlays.add(itemizedOverlay);
运行结果如图 4-3 所示,
图 4-3 分类图层的实现
4.3.3 处理用户点击事件并显示地图信息
在 MyItemizedOverlay.java 程序中建立 onTap()函数,用来实现对用户点 击事件的处理并显示地图信息。代码如下:
protected boolean onTap(int i){ GeoPoint gpoint = myOverlays.get(i).getPoint(); double lat = gpoint.getLatitudeE6()/1e6;
double lon = gpoint.getLongitudeE6()/1e6; String text = &Title&+myOverlays.get(i).getTitle(); text += &\nCoordinates\nLat = &+lat+& Lon = &+lon+&&; text += &\nText&+myOverlays.get(i).getSnippet(); Builder builder = new Builder(context); builder.setTitle(title); builder.setMessage(text); builder.setPositiveButton(&关闭&, null); builder.show(); return(true); }
本例通过定义Builder类变量builder来创建弹出窗口,显示地图信息,实现 效果如图4-4所示,
图 4-4 地图信息的显示
5 软件的测试与运行
通过 Android 虚拟设备 AVD 可测试软件的运行情况, 如图 5-1 为软件主界面,
图 5-1 软件主界面
界面上方显示出了用户当前的位置信息,包括经纬度、海拔高度、速度等。
正中蓝点则标明了用户当前位置。Menu 菜单对用户当前所在的周边作以分类, 包括餐饮、购物、宾馆及出行等,此外还有清除图层及退出等功能。
选择 Menu 菜单上的分类,如餐饮,则程序将会查询用户周边的餐馆并标记 在地图图层上,如图 5-2 所示,
图 5-2 显示贴图标记
点击贴图标签,则弹出相应的对话框,显示标记对象的具体信息,如图 5-3 所示,
图 5-3 显示地图信息
在 Menu 菜单上选择清除图层,则贴图标签将被移除,如图 5-4 所示,
图 5-4 清除图层
选择退出按钮,则程序将退至 Android 主界面,如图 5-5 所示,
图 5-5 退出程序
通过以上测试表明,程序能够正常运行并实现了预期的目标。
第一篇:google地图安卓Google地图开发与定位
? Google地图开发 ? MapView控件、MapController使用 ? LBS应用 C LocationManager C 两种LocationProvider C 通过Overlay进行地图标注 C 在GoolgeMap中通过经纬度显示当前位置 ? 思考:
C 当你所在位置发生变化(无真机可通过模拟器模拟手机位置的变 化),如何更新map? C 搜索某个地名如“北京大学”,如何更新地图?
? 地址--经纬度 IP-DNS域名
C 观察各地图API的精确度
? LBS(Location Based Service) 基于地理位置的服务。? 从技术层面上讲,有几个方案实现定位1. 基站:目前手机所使用的基站位置,即可知道手机所在位置。优 点刚好弥补GPS所有缺点。缺陷是即便GSM网络非常普及,但是 相比GPS精确度不高,一般有几公里的误差。2. WIFI热点:手机或笔记本设备利用其连接的热点发现其位置,并 发现周边商户。适合于大型城市。3. GPS:全球定位系统,精度高,但室内无信号。耗电量大也是个问 题。定位速度慢。不少手机无GPS模块. 目前Google地图有1公里 的偏差,可通过第三方进行偏差纠错接口。
LocationManager
? LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SE RVICE); ? Location location = locationManager.getLastKnownLocation(LocationManager.G PS_PROVIDER);//通过GPS获取当前位置 ? Location location = locationManager.getLastKnownLocation(LocationManager.NE TWORK_PROVIDER);//通过网络获取当前位置 ? location.getLongitude();//获取经度 ? location.getLatitude();//获取纬度
Google地图开发基础
? 需注意几点C 和开发一般应用差不多,只是需要提供Google Map的类库 而不是平台的基本类库。所以 建立项目时,SDK要选择 Google APIs。C 需申请Google 的 API key,方能开发基于Google地图的应 用。
Google Map API key申请
? 当一个程序发布时必须要证明书,证明书其实就是MD5.若只是为了开发测试,可以使 用Debug版的证明书,下面我们就来学习如何申请Debug版的Key1.找到你的debug.keystore文件 在Eclipse工具下,选择windows--&Preference--&Android--&Build,其中Default debug keystore的值便是debug.keystore的路径了。2.取得debug.keystore的MD5值 首先cmd命令行进入debug.keystore文件所在的路径,执行命令:keytool -list keystore debug.keystore,这时可能会提示你输入密码,这里默认的密码是“android&, 这样即可取得MD5值。3.申请Android Map 的API Key. 打开浏览器,输入网址:/android/maps-api-signup.html(需要有 GMAIL帐号),填入你的认证指纹(MD5)即可获得apiKey了。(放在layout文件的 MapView中android:apiKey=&0gnJLG_-Irzqdt51t1Au8wE5GlPtkvxcs9-jDTg&)
Google Map API的使用
? Android中定义了一个名为com.google.android.map的包,其中包含了一系列 用于在google map上显示、控制和叠层信息的功能类,以下是该包中最重要 的几个类1.MapActivity:这个类是用于显示Google Map的Activity类,它需要连接底层 网络。MapActivity是一个抽象类,任何想要显示MapView的activity都需要派 生自MapActivity,并且在其派生类的onCreate()中,都要创建一个 MapActivity onCreate MapView实例。2.MapView:MapView是用于显示地图的View组件。它派生自 android.view.ViewGroup。它必须和MapActivity配合使用,而且只能被 MapActivity创建,这是因为MapView需要通过后台的线程来连接网络或者文 件系统,而这些线程需要有MapActivity来管理。
C mapView.setBuiltInZoomControls(true);//设置是否显示缩放
Google Map API的使用
C mapView.setSatellite(false);//false为常规模式,true为卫星模式 C mapView.setStreetView(true);//启用街景
3.MapController:MapController用于控制地图的移动、缩放等。C MapController mapController = mapView.getController();
C mapController.setZoom(12);//放大到12 C mapController.setCenter(new GeoPoint(经度,纬度));//设置定位到该经纬度的 center C mapController.animateTo(new GeoPoint(经度,纬度));//移动到该位置
4.OverLay:这是一个可显示于地图之上的可绘制的对象。5.GeoPoint:这是一个包含经纬度位置的对象。
其他地图API
? 除了Google地图,以下几个也都可通过SDK嵌入到程序 中去:
1. Google地图API:/intl/zh-CN/apis/maps/ 2. Mapbar地图API:/ 3. Mapabc地图API:/
? 以上地图服务的功能甚至API调用都非常类似,对目前我们需要的 功能列举说明如下:
1. 2. 3. 4. 5. 地图移动以及缩放功能:都有。根据经纬度定位功能:都有。添加/显示标注功能:都有。POI查询功能:只有Mapbac提供。精确地理位置信息:只有Mapabc提供。
第一篇:google地图安卓本周主要任务? 给手机提供定位功能; ? 将坐标标记在地图上 ? 实现手动选择位置的功能,并且同时获得所选位置的坐标 ? 根据坐标获得周围的地理位置,包括街道,城市名等 ? 根据街道,城市名获得坐标 ? 关于使用百度地图的问题
第一步:安装 Google Map API 开发基于谷歌地图的应用和普通的 android 应用差不多都要使用它提供给我们的 类库,所不同的是 google map 的类库不是 android 平台的基本类库,是 google api 的一部分,所以建立项目时,SDK 要选择 Google APIs;
第二步:获得 Google Map API Key
在正式使用 Google Map API 前,必须先生成 Google Map API KEY。具体 的详细步骤请参考 (/intl/zh-CN/android/add-ons/google-apis/map key.html) 1.找到你的 debug.keystore 文件 在 Eclipse 工具下, 选择 windows--&Preference--&Android--&Build,其中 Default debug keystore 的值便是 debug.keystore 的路径了。2.取得 debug.keystore 的 MD5 值 首先 cmd 命令行进入 debug.keystore 文件所在的路径,执行命令:keytool -list -keystore debug.keystore,这时可能会提示你输入密码,这里默认的密码是 “android&,这样即可取得 MD5 值。
3.申请 Android Map 的 API Key. 打开浏览器, 输入网址/android/maps-api-signup.html, 填入你的认证指纹(MD5)即可获得 apiKey 了,结果显示如下:
Google Map API 的简介和使用 Android 中定义了一个名为 com.google.android.map 的包, 其中包含了一系列 用于在 google map 上显示、控制和叠层信息的功能类,以下是该包中最重要的几个 类1.MapActivity:这个类是用于显示 Google Map 的 Activity 类,它需要连接底层 网络。MapActivity 是一个抽象类,任何想要显示 MapView 的 activity 都需要派生自 MapActivity,并且在其派生类的 onCreate()中,都要创建一个 MapView 实例。2.MapView:MapView 是用于显示地图的 View 组件。它派生自 android.view.ViewGroup。它必须和 MapActivity 配合使用,而且只能被 MapActivity 创建, 这是因为 MapView 需要通过后台的线程来连接网络或者文件系统, 而这些线程需要有 MapActivity 来管理。3.MapController:MapController 用于控制地图的移动、缩放等。4.OverLay:这是一个可显示于地图之上的可绘制的对象。5.GeoPoint:这是一个包含经纬度位置的对象。
第三步:简单的实例开发 1. 创建工程
注意必须在 Build Target 中勾选 Google API 2. 修改 AndroidManifest.xml 文件 因为地图应用使用的是 Google Maps 的类库,而不是 android 的标准类库,所以需 要在 AndroidManifest.xml 文件中声明
&uses-library android:name=&com.google.android.maps& /&
由于需要从网络获取地图数据,所以需要访问网络的权限
&uses-permission android:name=&android.permission.INTERNET& /&
3. 修改 main.xml 需要创建一个来自 com.google.android.maps.MapView 的 MapView
&?xml version=&1.0& encoding=&utf-8&?& &RelativeLayout xmlns:android=&/apk/res/androi d& android:id=&@+id/mainlayout& android:orientation=&vertical& android:layout_width=&fill_parent& android:layout_height=&fill_parent& & &com.google.android.maps.MapView android:id=&@+id/mapview& android:layout_width=&fill_parent& android:layout_height=&fill_parent& android:clickable=&true& android:apiKey=&Your Maps API Key& /& &/RelativeLayout&
clickable 属性设置了是否允许用户和地图的交互
apiKey 需要填写刚刚申请到的 KEY
4. 实现 MapActivity - MapView 需要由 MapActivity 来管理, 所以程序部分应该继承自 Activity 的一个 特殊子类 MapActivity 类 - 同时必须实现 isRouteDisplayed()函数 获得 MapView 实例以后, 通过 setBuiltZoomControls 方法设置地图是否支持缩放。另外 MapView 提供了 3 中模式的地图,分别可以通过以下方式设置采用什么模式 来显示地图。mMapView.setTraffic(true); //设置为交通模式 mMapView.setSatellite(true); //设置为卫星模式// mMapView.setStreetView(false); //设置为街景模式 到目前为止,已经可以成功的运行了, 5. MapController 的使用 - 如果需要设置地图显示的地点以及放大倍数等, 就需要使用 MapController 来 控制地图。可以通过如下代码获得 MapController 对象mMapController = mMapView.getController();
要定位地点,需要构造一个 GeoPoint 来表示地点的经纬度,然后使用 animateTo 方法将地图定位到指定的 GeoPoint 上,代码如下mGeoPoint = new GeoPoint((int) (latitudeE6 * 1000000), (int) (longitudeE6 * 1000000)); mMapController.animateTo(mGeoPoint);
6. 增加标记
为了给地图多增加一些自定义的功能,比如可以在地图上进行一些标注。为了实现这样的功能,我们可以继承 Overlay 这个类,这个类是一个基类,提 供了可以在地图上添加图层的基本功能。而另外的选择是,我们可以继承 itemzedOverlay 这个类, 它提供了一种快捷的方法,可以把标记图片和相关的文本分配给特定的地 理位置。ItemizedOverlay 实例可以处理每一个 OverlayItem(OverlayItem 可以简单理解为在地图上的每一个标记)标记的绘制、放置、单击处理、焦点控 制和布局优化。? ? 创建 CustomItemizedOverlay 类并且继承 ItemizedOverlay&OverlayItem& 创建 OverlayItem 的 ArrayList, 其中存放每个需要放进地图的 OverlayItem Object
private ArrayList&OverlayItem& mOverlays = new ArrayList&OverlayItem&();
Constructor 用来设置画在地图上的图片。为了使图片真正的画上,一定要定 义图片的边界,同时使图片底边的中心点与坐标重合。这里需要用 boundCenterBottom() 函数来完成。
super(boundCenterBottom(defaultMarker));
? 添加函数来把 OverlayItem Object 加进 ArrayList
public void addOverlay(OverlayItem overlay) { mOverlays.add(overlay); populate(); }
populate()函数用来读取每一个 OverlayItem Object,并准备画在地图 上
为 了 使 populate() 函 数 读 取 每 一 个 OverlayItem Object , 需 要 给 createItem(int)发送请求,每次用 get 函数从 ArrayList 返回 OverlayItem Object 还需要重写 size()函数,获得 ArrayList 的大小
return mOverlays.size();
CustomItemizedOverlay 这给类已经可以使用了 7. 现在回到 Activity 思路:先创建一个 OverlayItem 把他添加到 CustomItemizedOverlay 的实例里面,然后添加到 MapView 里
? 首先,创建一些实例
List&Overlay& mapO D CustomItemizedOverlay mCustomItemizedO
? 然后在 OnCreate()函数中,实例化新的 type
mapOverlays = mapView.getOverlays(); drawable = this.getResources().getDrawable(R.drawable.androidmarker ); mCustomItemizedOverlay = new CustomItemizedOverlay (drawable);
由于所有的 overlay 元素都由 MapView 控制,所以先用 getOverlays 获得 overlay 元素的 list 然后把获得的 drawable 作为默认的 marker
创建 GeoPoint 坐标,然后把它传给一个新的 OverlayItem
GeoPoint point = new GeoPoint(120000); OverlayItem overlayitem = new OverlayItem(point, &&, &&);
最后把新的 OverlayItem 添加到 mCustomItemizedOverlay 实例的中,再
把这个合集添加到从 MapView 获取的 Overlay 对象的列表中 mCustomItemizedOverlay.addOverlay(overlayitem); mapOverlays.add(mCustomItemizedOverlay);
8. 实现手动选择位置的功能,并且同时获得所选位置的坐标 思路1. 单击 MapView 获得屏幕坐标 2. 将屏幕坐标转换为地理坐标 3. 根据坐标在 MapView 画标记
Projection proj=mMyMap.getProj(); mTapedPoint = proj.fromPixels((int) ev.getX(), (int)ev.getY()); String longitude=Double.toString(mTapedPoint.getLongitudeE6()/1000000); String latitude=Double.toString(mTapedPoint.getLatitudeE6()/1000000);
Projection类 提 供了 物 理坐 标和 屏 幕坐 标 的转 换 功能 , 可 在经 度 和纬 度 表示 的 GeoPoint点和屏幕上Point点进行转换 ? toPixels()方法将物理坐标转换为屏幕坐标 ? fromPixels()方法将屏幕坐标转换为物理坐标
9. 根据坐标获得周围的地理位置,包括街道,城市名等 ? 利用map api向Google发送位置请求,进行地址解析 ? 术语“地址解析”通常是指将人类可读的地址转换成地图上的位置。反之,将地图上的位 置转换成人类可读的地址这一过程则称为“反向地址解析”。Google Geocoding API 支持直接使用 latlng 参数进行反向地址解析。例如,下列查询包 含了布鲁克林某一位置的纬度/经度值:
/maps/api/geocode/json?latlng=40..961452&se
nsor=true_or_false
请求数据:
//取得取得默认的 HttpClient 实例 DefaultHttpClient httpClient = new DefaultHttpClient(); //创建 HttpGet 实例 HttpGet httpGet = new HttpGet(&/maps/api/geocode/json?latlng=&+latit ude+&,&+longitude+&&sensor=false&); //连接服务器 HttpResponse response =httpClient.execute(httpGet); /取得数据记录 HttpEntity entity = response.getEntity(); //取得数据记录内容 InputStream is = entity.getContent(); //存储数据记录内容 BufferedReader in = new BufferedReader(new InputStreamReader(is)); String str = &&;//in.readLine(); StringBuffer s = new StringBuffer(&&); //建立JSON,将返回的数据存在JSON中 JSONObject jsonObject = new JSONObject(); try { jsonObject = new JSONObject(stringBuilder.toString()); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } ? 分析数据//建立ArrayList存储取得的地址 ArrayList&String& addressList=new ArrayList&String&(); //取得&formatted_address&字段后的文字,即为所需地址 try { for (int i=0;i&NUM_OF_FORMATTED_ADDRESS;i++){ tempAddress=((JSONArray)jsonObject.get(&results&)).getJSONObject(i).getSt ring(&formatted_address&); if (tempAddress!=null){ addressList.add(tempAddress); }else{ } } } catch (JSONException e) {
// TODO Auto-generated catch block e.printStackTrace(); }
10. 用GPS或者网络定位
Location Provider 提供数据的 content provider 方式一:GPS 特点:精度高,耗电量大,不耗费流量 权限&uses-permission Android:name=&Android.permission.ACCESS_FINE_LOCAT ION&/& 方式二:NETWORK 特点:精度低,省电,需要网络访问 权限&uses-permission Android:name=&Android.permission.ACCESS_FINE_LOCAT ION&/& 或者权限&uses-permission Android:name=&Android.permission.ACCESS_COARSE_LOC ATION&/& 方式三 PASSIVE_PROVIDER 资料比较少,只用于特定的情景下,SDK 的解释是,并不自 己实例化去获取地理位置, 而是通过 getProvider 获取其他的服务或者 activity 更新位置, 被动的获取更新。
// Acquire a reference to the system Location Manager LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
//ocationManager 这个类提供了对系统位置服务的访问, 这些服务允许应用程序获取设备 地理位置的定期的更新,也可以在设备 接近一个指定的地理位置的时候发起一个指定 activity 的 intent。你不需要创建 LocationManager 的实例,取而代之的是通过 Context.getSystemService(Context.LOCATION_SERVICE)获取
// Define a listener that responds to location updates LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { // Called when a new location is found by the network location provider. makeUseOfNewLocation(location); }
public void onStatusChanged(String provider, int status, Bundle extras) {} public void onProviderEnabled(String provider) {} public void onProviderDisabled(String provider) {} };
// Register the listener with the Location Manager to receive location updates locationManager.requestLocationUpdates(LocationManager.N ETWORK_PROVIDER, 0, 0, locationListener);
注册当前的 activity 定时的被 provider 的被通知。相当于注册事件。每隔一段时间, LocationListenner 会被调用,同时当前的位置或者状态进行更新 接受最新的位置信息可能会花费一会时间,如果需要立刻获得位置信息,程序可以使用 上面讲的 getLastKonwnLocation 方法
假如 provider 被用户停止, (比如关闭 GPS 等),更新会停止。并且 onProviderDisabled 方法(监听器中一个需要复写的方法)会被 调用,只要 provider 再次变为可用状态,onProviderEnable 方法会被调用,并且更新操作 立刻开始
通知(更新)的频率可以通过使用 minTime(最小更新时间 单位:毫秒)和 minDistance(单 位参数, 米) 如果 minTime 大于 0, LocationManager 能够在 minTime 时间内休息来保 存 电量,如果 minDistance 大于 0,每变化这个距离就会进行一次更新,如果希望尽可能频 繁的更新的数据,则把两个参数均设置为 0. 使用该方法的线程必须时开启消息循环的线程,例如被调用 activity 的主线程(可以参考 Android 线程机制,默认新建的线程是没有开启消息循环的,主线程开启消息循环,可以 参考 SDK 的 Looper 类)
LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER; // Or use LocationManager.GPS_PROVIDER Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
返回一个 Location,这个 location 标明从给定 provider 获得最后已知的位置,也就是最近 获取的位置。这个操作可以不必要启动 provider,注意这个地址可能是已经过期的,例如 使用的设备可能已经被关闭或者转向了另一个位置 这个类用来表示在一个特定时间被感应的地理位置信息,一个 location 包括一个经度,纬 度,一个世界时间戳还有一些关于海拔,速度和方向的可选信息
// Remove the listener you previously added locationManager.removeUpdates(locationListener);
11. 关于使用百度地图的问题 据说是因为行货手机,网络定位被阉割。(设置网络定位以后,报错:illegalArgumentException provider=network) 虽然GPS可以定位,但是时间要求太长,所以考虑使用百度地图 百度有如下描述:在百度地图移动版API中,我们提供一个重要的特色功能:定位,通过这 个功能,能获取到用户当前所在位置。在程序中,如果使用此功能,必须注册GPS和网络的 使用权限。在获取用户位置时,优先使用GPS进行定位;如果GPS定位没有打开或者没有可 用位置信息,则判断是否通过wifi连接,如果是,则通过请求百度网络服务,根据wifi热点位 置定位;如果否,则通过百度网络服务根据基站信息进行定位 看完百度地图文档的简介, 百度地图基本能完成目前所需的功能, 但是缺点是只有中国地图。于是改用百度地图作为显示媒介。参考/guide/tutorials/views/hello-mapview.html /guide/topics/location/obtaining-user-location.html http://blog.csdn.net/dadoneo/article/details/6255486 /intl/zh-CN/apis/maps/documentation/geocoding/ /html/Android/news/84.html /playing/archive//2025419.html http://wang-/blog/661586 /wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0
更多应用请关注:
本文标题:google地图安卓

我要回帖

更多关于 google地图标记 的文章

 

随机推荐