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

来源:互联网 发布:房地产库存数据 编辑:程序博客网 时间:2024/06/15 13:46

在前面的定位(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);

}

运行结果如图所示:

 

转自 http://dev.10086.cn/cmdn/wiki/index.php?doc-view-3311.html