Android地图和定位学习总结

时间:2024.4.14

Android地图和定位学习总结

首届 Google 暑期大学生博客分享大赛——2010 Android 篇

android.location包下有这么一些接口和类:

Interfaces

GpsStatus.Listener

GpsStatus.NmeaListener

LocationListener

Classes

Address

Criteria

Geocoder

GpsSatellite

GpsStatus

Location

LocationManager

LocationProvider

com.google.android.maps包下有这些类:

All Classes

GeoPoint

ItemizedOverlay

ItemizedOverlay.OnFocusChangeListener

MapActivity

MapController

MapView

MapView.LayoutParams

MapView.ReticleDrawMode

MyLocationOverlay

Overlay

Overlay.Snappable

OverlayItem

Projection

TrackballGestureDetector

我们边看代码边熟悉这些类。

要获取当前位置坐标,就是从Location对象中获取latitude和longitude属性。那Location对象是如何创建的?

LocationManager

locMan=(LocationManager)getSystemService(Context.LOCATION_SERVICE);//LocationManager对象只能这么创建,不能用new

Locationlocation=locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);

if(location==null){

location=locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); }

//注意要为应用程序添加使用权限

<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>

所谓getLastKnownLocation自然是获取最新的地理位置信息,那LocationManager.GPS_PROVIDER和LocationManager.NETWORK_PROVIDER有什么区别呢?俺也不是学通信的,对这个不了解,在网上看到有人想“在室外有GPS定位,在室内想用Wifi或基站定位”。

除了直接使用LocationManager提供的静态Provider(如GPS_PROVIDER和NETWORK_PROVIDER等)外,还可以使用我们自己创建的LocationProvider对象。 创建LocationProvider对象一般要先创建Criteria对象,来设置我们的LocationProvider要满足什么样的标准

Criteria myCri=new Criteria();

myCri.setAccuracy(Criteria.ACCURACY_FINE);//精确度

myCri.setAltitudeRequired(false);//海拔不需要

myCri.setBearingRequired(false);//Bearing是“轴承”的意思,此处可理解为地轴线之类的东西,总之Bearing Information是一种地理位置信息的描述

myCri.setCostAllowed(true);//允许产生现金消费

myCri.setPowerRequirement(Criteria.POWER_LOW);//耗电

String myProvider=locMan.getBestProvider(myCri,true);

public String getBestProvider (Criteria criteria, boolean enabledOnly)

Returns the name of the provider that best meets the given criteria. Only providers that are permitted to be accessed by the calling activity will be returned. If several providers meet the criteria, the one with the best accuracy is returned. If no provider meets the criteria, the criteria are loosened in the following sequence: power requirement

accuracy

bearing

speed

altitude

Note that the requirement on monetary cost is not removed in this process. Parameters

criteria the criteria that need to be matched

enabledOnly if true then only a provider that is currently enabled is returned Returns

name of the provider that best matches the requirements

only翻译为“最适合的"

Location location=locMan.getLastKnownLoation(myProvider);

double latitude=location.getLatitude();//获取纬度

double longitude=location.getLongitude();//获取经度

我想知道当前位置描述(比如“武汉华中科技大学”而不是一个经纬值)呢?这就要使用

GeoCoder创建一个Address对象了。

Geocoder gc=new Geocoder(context,Locale.CHINA);//Locale是java.util中的一个类 List<Address> listAddress=gc.getFromLocation(latitude,longitude,1);

List<Address> getFromLocation(double latitude, double longitude, int maxResults)

Returns an array of Addresses that are known to describe the area immediately surrounding the given latitude and longitude.(返回给定经纬值附近的一个Address) 既然是“附近”那实际编码时我们没必要把经纬值给的那么精确,而取一个近似的整数,像这样: /*自经纬度取得地址,可能有多行地址*/

List<Address> listAddress=gc.getFromLocation((int)latitude,(int)longitude,1); StringBuilder sb=new StringBuilder();

/*判断是不否为多行*/

if(listAddress.size()>0){

Address address=listAddress.get(0);

for(int i=0;i<address.getMaxAddressLineIndex();i++){

sb.append(address.getAddressLine(i)).append("\n");

}

sb.append(address.getLocality()).append("\n");

sb.append(address.getPostalCode()).append("\n");

sb.append(address.getCountryName ()).append("\n");

}

public int getMaxAddressLineIndex ()

Since: API Level 1

Returns the largest index currently in use to specify an address line. If no address lines are specified, -1 is returned.

public String getAddressLine (int index)

Since: API Level 1

Returns a line of the address numbered by the given index (starting at 0), or null if no such line is present.

String getCountryName()

Returns the localized country name of the address, for example "Iceland", or null if it is unknown.

String getLocality()

Returns the locality of the address, for example "Mountain View", or null if it is unknown.

反过来我们可以输入地址信息获取经纬值

Geocoder mygeoCoder=new Geocoder(myClass.this,Locale.getDefault());

List<Address> lstAddress=mygeoCoder.getFromLocationName(strAddress,1); //strAddress是输入的地址信息

if(!lstAddress.isEmpty()){

Address address=lstAddress.get(0);

double latitude=address.getLatitude()*1E6;

double longitude=adress.getLongitude()*1E6;

GeoPoint geopoint=new GeoPoint((int)latitude,(int)longitude);

}

A class for handling geocoding and reverse geocoding. Geocoding is the process of transforming a street address or other description of a location into a (latitude, longitude) coordinate.

Public Constructors

Geocoder(Context context, Locale locale)Constructs a Geocoder whose

responses will be localized for the given Locale.

Geocoder(Context context)Constructs a Geocoder whose responses will be

localized for the default system Locale. public List<Address>

maxResults)

Since: API Level 1 getFromLocationName (String locationName, int

Returns an array of Addresses that are known to describe the named location, which may be a place name

such as "Dalvik, Iceland", an address such as "1600 Amphitheatre Parkway, Mountain View, CA", an airport

code such as "SFO", etc.. The returned addresses will be localized for the locale provided to this class's

constructor.

The query will block and returned values will be obtained by means of a network lookup. The results are a best

guess and are not guaranteed to be meaningful or correct. It may be useful to call this method from a thread

separate from your primary UI thread.

Parameters

locationNa

me

maxResul

ts

Returns

a user-supplied description of a location max number of results to return. Smaller numbers (1 to 5) are recommended a list of Address objects. Returns null or empty list if no matches were found or service available. there is no backend

Throws

IllegalArgumentExce

ption

IOException

说了半天还只是个定位,地图还没出来。下面要用到com.google.android.maps包了 下面的代码我们让地图移到指定点

GeoPoint p=new GeoPoint((int)(latitude*1E6),(int)(longitude*1E6)); MapView mapview=(MapView)findViewById(R.id.mv);

MapController mapContr=mapview.getController();

mapview.displayZoomControls(true);//显示地图缩放的按钮

mapContr.animateTo(p);//带动画移到p点

mapContr.setZoom(7);

setZoom

public int setZoom(int zoomLevel)

Sets the zoomlevel of the map. The value will be clamped to be between 1 and 21 inclusive, though

not all areas have tiles at higher zoom levels. This just sets the level of the zoom directly; for a

step-by-step zoom with fancy interstitial animations, use if locationName is null if the network is unavailable or any other I/O problem occurs zoomIn() or zoomOut().

Parameters:

zoomLevel - At zoomLevel 1, the equator of the earth is 256 pixels long.

Each successive zoom

level is magnified by a factor of 2.

Returns:

the new zoom level, between 1 and 21 inclusive. 在地图上指定一点给出经纬值

@Override

public boolean onTouchEvent(MotionEvent ev){

int actionType=ev.getAction();

switch(actionType){

case MotionEvent.ACTION_UP:

Projection projection=mapview.getProjection();

GeoPoint loc=projection.fromPixels((int)arg0.getX(),(int)arg0.getY()); String lngStr=Double.toString(loc.getLongitudeE6()/1E6);

String latStr=Double.toString(loc.getLatitudeE6()/1E6);

}

return false;

}

public interface Projection

A Projection serves to translate between the coordinate system of x/y on-screen pixel coordinates and that

of latitude/longitude points on the surface of the earth. You obtain a Projection from MapView.getProjection().

如果需要我们还可以把经纬值转换成手机的屏幕坐标值

Point screenCoords=new Point(); //android.graphics.Point;

GeoPoint geopoint=new GeoPoint((int)(latitude*1E6),(int)(longitude*1E6));

mapview.getProjection().toPixels(geopoint,screenCoords);

int x=screenCoords.x;

int y=screenCoords.y;

放大缩小地图主要就是用setZoom(int ZoomLevel)函数,让ZoomLevel不停往上涨(或往下降)就可以了

下面给出一个com.google.android.maps.Overlay的使用例子

import com.google.android.maps.GeoPoint;

import com.google.android.maps.MapActivity;

import com.google.android.maps.MapController;

import com.google.android.maps.MapView;

import com.google.android.maps.Overlay;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Point;

import android.os.Bundle;

import android.view.View;

public class MapsActivity extends MapActivity

{

MapView mapView;

MapController mc;

GeoPoint p;

class MapOverlay extends com.google.android.maps.Overlay

{

@Override

public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)

{

super.draw(canvas, mapView, shadow);

//---translate the GeoPoint to screen pixels---

Point screenPts = new Point();

mapView.getProjection().toPixels(p, screenPts);

//---add the marker---

Bitmap bmp = BitmapFactory.decodeResource(

getResources(), R.drawable.pushpin);

canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null); return true;

}

}

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)

{

//...

}

@Override

protected boolean isRouteDisplayed() {

// TODO Auto-generated method stub

return false;

}

}

public void draw(android.graphics.Canvas canvas,

MapView mapView,

boolean shadow)

Draw the overlay over the map. This will be called on all active overlays with shadow=true, to lay down

the shadow layer, and then again on all overlays with shadow=false. By default, draws nothing.

Parameters:

canvas - The Canvas upon which to draw. Note that this may already have a transformation applied, so be sure

to leave it the way you found it.

mapView - the MapView that requested the draw. Use MapView.getProjection() to convert between

on-screen pixels and latitude/longitude pairs.

shadow - If true, draw the shadow layer. If false, draw the overlay contents.

public boolean draw(android.graphics.Canvas canvas,

MapView mapView,

boolean shadow,

long when)

when - The timestamp of the draw.

Draw call for animated overlays. By default, calls through to draw(Canvas, MapView, boolean) and returns false.

Canvas公共方法

void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)

Draw the specified bitmap, scaling/translating automatically to fill the destination rectangle.

更多相关推荐:
Android学习心得

Android学习心得这学期我们新开了一门课程android的研发在老师们的介绍下我们了解android的开发环境以及控件的功能刚开始接触Android觉得既陌生又亲切陌生在于没有学过具体的开发软件亲切在于它在...

Android的学习总结

Android的学习总结现在对于Android的学习已有斗个学期了,但它对我来说其实还是一个大大的谜,还有待我去对它一一揭晓。在还没有学习Android这门课之前,当听到别人谈到它时,知道它离我们很近,但是它给…

Android学习笔记总结初学者必看

Android学习笔记总结第一步Android1在Windows下搭建Android开发环境以及HelloWorld程序搭建Android的开发环境以及写一个简单的示例程序在Windows下搭建Android开...

Android学习总结

1Text和text2Button和imagebutton区别1相同点都可以作为一个按钮产生点击事件产生明显的点击效果都有background属性都有一个onclick事件通过自身的setOnClickList...

Android学习总结

Android学习总结零零碎碎的总结1客户端的功能逻辑不难UI界面也不难但写UI花的时间是写功能逻辑的两倍2写代码前的思考过程非常重要即使在简单的功能也需要在本子上把该功能的运行过程写出来3要有自己的知识库可以...

一周学习Android 的总结

初学Android的总结一对Android的初步认识有以下几方面1Android是什么Android是Google在20xx年11月首次发布的当时它被定位成一款针对智能手机的操作系统现在是一个专门针对移动设备的...

android 学习总结

第六周总结20xx103120xx1141Android学习3Android当中的常见控件Android当中的常见控件为TextViewEditTextButtonMenu1在Activity03当中要声明四个...

Android RIL&Call学习总结

AndroidRIL与Call代码学习总结前言本文分五部分Android电信业务系统RILTelephonyAPPFrameworkPhoneAPPAndroid通话简单流程1Android电信业务系统主要叙述...

Android学习心得

Android入门心得工具使用1打开已有工程方法1EclipsegtfilegtnewgtAndroidProjectgtNextgtCreateProjectexistingsourcegt选择你的项目该方法...

Android画图学习总结

Android画图学习总结一类的简介首先如何获取res中的资源数据包packageandroidcontentres主要类ResourcesAndroidSDK中的简介Classforaccessinganap...

Android实战技巧:Android学习资源总结(杰瑞教育整理)

Android实战技巧Android学习资源总结要想对一门技术有所了解或是掌握一门技术或是想成为高手或专家学习是必然的途径而烟台杰瑞教育科技的杨经理告诉我们有二个因素决定着学习的效率和成果一个是学习方法和个人的...

Android 个人总结

Android个人总结通过本学期的的学习我知道了android是由google开发的一款手机平台android的基本架构是基于linux内核由内核向外的反别为库和应用架构然后就是我们手机上的可视化应用了andr...

android学习总结(40篇)