专注计算机技术: Linux Android 云计算 虚拟化 网络
分类: Android平台
2013-11-18 22:11:50
首届 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
Location location=locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(location==null){
location=locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
//注意要为应用程序添加使用权限
所谓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);
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
既然是“附近”那实际编码时我们没必要把经纬值给的那么精确,而取一个近似的整数,像这样:
/*自经纬度取得地址,可能有多行地址*/
List
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
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");
}
Returns the largest index currently in use to specify an address line. If no address lines are specified, -1 is returned.
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
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.
|
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.
locationName | a user-supplied description of a location |
---|---|
maxResults |
max number of results to return. Smaller numbers (1 to 5) are recommended |
IllegalArgumentException | if locationName is null |
---|---|
IOException |
if the network is unavailable or any other I/O problem occurs |
说了半天还只是个定位,地图还没出来。下面要用到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);
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
在地图上指定一点给出经纬值
@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().