Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android地圖開發中的地理編碼與地理反編碼

Android地圖開發中的地理編碼與地理反編碼

編輯:Android開發實例

地理編碼(Geocoding)與地理反編碼(Reverse Geocoding)是地圖操作中的常見操作,前者表示通過街道地址請求空間坐標,後者表示通過空間坐標請求街道地址。通俗的說,二者就是街道地址與經緯度的轉換。舉例來說,前者就是輸入查詢"上海市楊浦區四平路1239號"得到(31.285207060526762, 121.50546412914991),而後者則表示這個反過程。

 

在實際的移動開發過程中,地圖相關的操作對於地理編碼與地理反編碼的使用都是十分普遍。幸運的是,Android的MapView控件中對於這兩者都進行了封裝,因此可以方便的利用Google Map Service進行二者查詢。下面將對開發過程做一個簡單介紹。

 

首先必須進行MapKey的申請,任何地圖的顯示都需要申請一個MapKey。具體的申請步驟可見

http://code.google.com/intl/zh-CN/android/maps-api-signup.html

 

然後可以建立一個基於Google APIs的程序,並且在AndroidManifest.xml中加入地圖API的支持。

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.       package="net.learn2develop.GoogleMaps" 
  4.       android:versionCode="1" 
  5.       android:versionName="1.0.0"> 
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  7.     <uses-library android:name="com.google.android.maps" />    
  8.         <activity android:name=".MapsActivity" 
  9.                   android:label="@string/app_name"> 
  10.             <intent-filter> 
  11.                 <action android:name="android.intent.action.MAIN" /> 
  12.                 <category android:name="android.intent.category.LAUNCHER" /> 
  13.             </intent-filter> 
  14.         </activity> 
  15.     </application> 
  16.    
  17.     <uses-permission android:name="android.permission.INTERNET" /> 
  18. </manifest> 
  19. </xml> 

 

 

接著可以在主Layout文件中加入對於地圖的顯示,這裡需要加入剛才申請的MapKey,否則地圖將無法正常顯示。

 

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:layout_width="fill_parent"   
  4.     android:layout_height="fill_parent"> 
  5.    
  6.     <com.google.android.maps.MapView   
  7.         android:id="@+id/mapView" 
  8.         android:layout_width="fill_parent" 
  9.         android:layout_height="fill_parent" 
  10.         android:enabled="true" 
  11.         android:clickable="true" 
  12.         android:apiKey="MapKey" 
  13.         /> 
  14.    
  15. </RelativeLayout> 

 

接著在主Activity的JAVA文件進行修改,支持地圖顯示。

 

  1. import com.google.android.maps.MapActivity;  
  2. import com.google.android.maps.MapView;  
  3. import android.os.Bundle;  
  4.    
  5. public class MapsActivity extends MapActivity   
  6. {      
  7.     /** Called when the activity is first created. */ 
  8.     @Override 
  9.     public void onCreate(Bundle savedInstanceState)  
  10.     {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.     MapView mapView = (MapView) findViewById(R.id.mapView);  
  14.     mapView.setBuiltInZoomControls(true);  
  15.     }  

 

 

此時運行程序,地圖應該就可以正常顯示了,見下圖。


 

此時我們再向程序中加入地理編碼與地理反編碼的功能,其參考代碼如下。 

 

地理編碼:

 

  1. Geocoder geoCoder = new Geocoder(this, Locale.getDefault());      
  2. try {  
  3.     List<Address> addresses = geoCoder.getFromLocationName(  
  4.         "上海市楊浦區四平路1239號", 5);  
  5.     String add = "";  
  6.     if (addresses.size() > 0) {  
  7.         p = new GeoPoint(  
  8.                 (int) (addresses.get(0).getLatitude() * 1E6),   
  9.                 (int) (addresses.get(0).getLongitude() * 1E6));  
  10.         mc.animateTo(p);      
  11.         mapView.invalidate();  
  12.     }      
  13. } catch (IOException e) {  
  14.     e.printStackTrace();  

 

地理反編碼,其中MapOverlay為地圖圖層上的疊加圖層,用於標識的顯示以及點擊事件的捕捉。

 

  1. class MapOverlay extends com.google.android.maps.Overlay  
  2.     {  
  3.         @Override 
  4.         public boolean draw(Canvas canvas, MapView mapView,   
  5.         boolean shadow, long when)   
  6.         {  
  7.           //...  
  8.         }  
  9.    
  10.         @Override 
  11.         public boolean onTouchEvent(MotionEvent event, MapView mapView)   
  12.         {     
  13.             //---when user lifts his finger---  
  14.             if (event.getAction() == 1) {                  
  15.                 GeoPoint p = mapView.getProjection().fromPixels(  
  16.                     (int) event.getX(),  
  17.                     (int) event.getY());  
  18.    
  19.                 Geocoder geoCoder = new Geocoder(  
  20.                     getBaseContext(), Locale.getDefault());  
  21.                 try {  
  22.                     List<Address> addresses = geoCoder.getFromLocation(  
  23.                         p.getLatitudeE6()  / 1E6,   
  24.                         p.getLongitudeE6() / 1E6, 1);  
  25.    
  26.                     String add = "";  
  27.                     if (addresses.size() > 0)   
  28.                     {  
  29.                         for (int i=0; i<addresses.get(0).getMaxAddressLineIndex();   
  30.                              i++)  
  31.                            add += addresses.get(0).getAddressLine(i) + "/n";  
  32.                     }  
  33.    
  34.                     Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show();  
  35.                 }  
  36.                 catch (IOException e) {                  
  37.                     e.printStackTrace();  
  38.                 }     
  39.                 return true;  
  40.             }  
  41.             else                  
  42.                 return false;  
  43.         }          
  44.     } 

 

 最終實現結果如下圖所示,地理編碼,查詢“上海市楊浦區四平路1239號”,結果其實略有偏差。中國的地址與郵編比較混亂,所以結果有些地方無法做到完全准確。

 

 

地理反編碼


本文系“首屆 Google 暑期大學生博客分享大賽——2010 Andriod 篇”參賽文章

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved