Android(OPhone) 学习笔记 - 定位(2)

在前面的定位(1)中,我们学会了如何获取经纬度信息。在地图(4)中,我们学会了如何用控制和显示地图。本文我们介绍定位的高级功能,包括:定位图标文本标记、手动缩放、自动跟踪、获取卫星信息。非关键代码以地图(4)中的代码为基础。

一、定位图标和文本

在网页形式的Google地图上搜索地名时,往往会有个小的标记来指示地名,并有一段文本指示该名称,甚至有的会有附近的超市宾馆饭店的指示。在OPhone上也可以实现该功能。

我们需要以下的库:

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;

先找一个marker的图标,放入res/drawable。

在地图中,标记和文本是作为另外一个层显示在地图上的,我们需要在其上新建一个layer。

这里override了一个draw方法。分为步:1.获得屏幕坐标。2.设置画笔属性。3.绘制标记图标。4.绘制文本。 stroke在这里是轮廓的意思,paint的style有FILL_AND_STROKE 、FILL 、 STROKE 三种属性,大家可以尝试一下。

在oncreate中,添加图层,代码如下:


可以看到如下效果:




二、手动缩放。

地图可以很好地和缩放控制结合起来,需要以下库:

import android.view.ViewGroup.LayoutParams; 
import android.widget.ZoomControls;
import android.view.ViewGroup;
import android.view.View.OnTouchListener;
import android.view.MotionEvent;


首先在oncreate中新建一个缩放控制器对象:

为了实现手在地图区域触摸时自动出现缩放图标,我们要新建一个listener。

在触摸屏上触摸后,效果如图:


三、自动跟踪

当手机在移动时,GPS坐标也在变化,为了可以看到自己实时位置,我们需要添加一个动态更新的功能。大家可以想到,这又是一个listener。

在oncreate中,新建一个位置管理对象:

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, this);
该函数将GPS服务注册至this, 即listener。

在程序实体上添加:

public class AndroidLBS extends MapActivity implements LocationListener

为了实现该implementation,我们要加入下面方法:


代码中的onLocationChanged方法的监测周期为1秒,在500米距离的改变之后进行调用。默认使用的 LocationProvider是“gps” (GPS_PROVIDER) 。可以根据需要,使用其他的 LocationProvider,如定位更加准确的卫星或者网络数据。


四、获取卫星信息

本段代码参考http://www.ophonesdn.com/article/show/46,本以为可以看到模拟器上的卫星信息,没想到都是空的。只能在真机上看到卫星信息。

mLoc = mService.getLastKnownLocation(LocationManager.GPS_PROVIDER);
String mLongitude,mLatitude,mAltitude,mSpeed,mBearing,mTime,mAccuracy,mSatelliteInfo;
mSatelliteInfo = "";
  if (mLoc != null) {
// 经度
mLongitude = String.valueOf(mLoc.getLongitude());
// 纬度
mLatitude = String.valueOf(mLoc.getLatitude());
// 高度
mAltitude = String.valueOf(mLoc.getAltitude());
// 速度
mSpeed = String.valueOf(mLoc.getSpeed());
// 方位 0 - 360度
mBearing = String.valueOf(mLoc.getBearing());
// 世界戳 从1970/1/1起始,单位: 毫秒
  mTime = String.valueOf(mLoc.getTime());
  // 定位精度,单位: 米  
if (mLoc.hasAccuracy())
mAccuracy = String.valueOf(mLoc.getAccuracy());
else
  mAccuracy = "no accuracy";
  Bundle bundle = mLoc.getExtras();
  if (null != bundle){  
// 首次定位时间 TTFF = Time to First Fix,单位: 秒
int ttff = bundle.getInt("TTFF", 0);
String mTTFF = String.valueOf(ttff);
// 参与定位的卫星个数
int numSatellite = bundle.getInt("NumSatellite", 0);
  String mNumSatellite = String.valueOf(numSatellite);
  if (numSatellite != 0) {
for (int m = 0; m < numSatellite; m++) {
// 卫星的ID
mSatelliteInfo += String.valueOf(m + 1) + ": " + "ID " + String.valueOf(bundle.getInt("SatelliteID" + m, 0)) + ", ";
// 卫星的信号强度 C/NO
mSatelliteInfo += "Strength: " + String.valueOf(bundle.getInt("SignalStrength" + m, 0)) + ", ";
// 方位角
mSatelliteInfo += "Azimuth: " + String.valueOf(bundle.getInt("Azimuth" + m, 0)) + ", ";
// 标高
  mSatelliteInfo += "ElevationAngle: " + String.valueOf(bundle.getInt("ElevationAngle" + m, 0)) + "/n";}  }  }  
tv.setText("longtitude:"+mLongitude+";"+"/n"+"latitude:"+mLatitude+";"+"/n"+"altitude:"+mAltitude+"/n"+"speed:"+mSpeed+"/n"+"bearing:"+mBearing+"/n"+"time:"+mTime+"/n"+"Accuracy:"+mAccuracy+"/n"+"satinfo:"+mSatelliteInfo);

}

运行结果如图所示:






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值