Android引路蜂地圖開發示例:選擇地圖服務

引路蜂地圖服務缺省使用Google地圖服務,但你也可以選擇其它地圖服務,比方說當Google服務離線時,您可以選擇MapAbc的地圖服務,另外要註意的是中國地圖是有偏移的。如果想使用無偏移的中國地圖,一是采用地圖偏移校正算法,另外一個是使用CloudMade地圖服務。
所前所述,引路蜂地圖開發包在設計時將地圖圖片顯示和地圖服務兩部分設計成相對獨立的兩部分,Google中國地圖圖片,Bing中國地圖圖片,MapAbc中國地圖圖片是有偏移的地圖圖片,CloudMade(OpenStreet)中國地圖圖片是無偏移的。而Google中國地圖服務,MapAbc中國地圖服務是有偏移,CloudMade地圖服務是無偏移的。所以在選擇地圖類型和地圖服務類型時,要麼都選擇有偏移,要麼都選擇無偏移。否則地圖在顯示路徑時或地址時就不匹配。

下面列表是合法的組合:

地圖類型 (MapType)  地圖服務類型 (DigitalMapService)
GOOGLECHINA GOOGLE_MAP_SERVICE
MICROSOFTCHINA GOOGLE_MAP_SERVICE
MAPABCCHINA GOOGLE_MAP_SERVICE
OPENSTREETMAP CLOUDMADE_MAP_SERVICE
GOOGLECHINA MAPABC_MAP_SERVICE
MICROSOFTCHINA MAPABC_MAP_SERVICE
MAPABCCHINA MAPABC_MAP_SERVICE

下述示列地圖類型使用MICROSOFTCHINA,而使用不同的地圖服務時路徑查詢的情況。(南京到天津的路徑)

[java] 
package com.pstreets.gisengine.demo; 
  
import com.mapdigit.gis.MapDirection; 
import com.mapdigit.gis.geometry.GeoLatLng; 
import com.mapdigit.gis.service.DigitalMapService; 
import com.mapdigit.gis.service.IRoutingListener; 
import com.pstreets.gisengine.R; 
import com.pstreets.gisengine.SharedMapInstance; 
  
import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
  
public class MapServiceType extends Activity implements IRoutingListener { 
  
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.main); 
 } 
  
 @Override 
 public void onStart() { 
  super.onStart(); 
  GeoLatLng center = new GeoLatLng(32.0616667, 118.7777778); 
  SharedMapInstance.map.setCenter(center, 15, 
    com.mapdigit.gis.raster.MapType.MICROSOFTCHINA); 
  //SharedMapInstance.map.setCurrentMapService(DigitalMapService.GOOGLE_MAP_SERVICE);  
  // SharedMapInstance.map.setCurrentMapService(DigitalMapService.MAPABC_MAP_SERVICE);  
  SharedMapInstance.map.setCurrentMapService(DigitalMapService.CLOUDMADE_MAP_SERVICE); 
  SharedMapInstance.map.setRoutingListener(this); 
  
 } 
  
 @Override 
 public boolean onCreateOptionsMenu(Menu menu) { 
  MenuInflater inflater = getMenuInflater(); 
  inflater.inflate(R.menu.maprouting_menu, menu); 
  return true; 
 } 
  
 @Override 
 public boolean onOptionsItemSelected(MenuItem item) { 
  // Handle item selection  
  switch (item.getItemId()) { 
  case R.id.getdirection: 
   GeoLatLng latLng1 = new GeoLatLng(32.0418381, 118.7788905); 
   GeoLatLng latLng2 = new GeoLatLng(39.11643, 117.180908); 
   SharedMapInstance.map.getDirections(new GeoLatLng[] { latLng1, 
     latLng2 }); 
  
   return true; 
  
  default: 
   return super.onOptionsItemSelected(item); 
  } 
  
 } 
  
 @Override 
 public void done(String query, MapDirection result) { 
  if (result != null) { 
   SharedMapInstance.map.setMapDirection(result); 
   //SharedMapInstance.map.resize(result.getBound());  
   //SharedMapInstance.map.setZoom(5);  
     
  
   SharedMapInstance.map.setZoom(15); 
   SharedMapInstance.map.panTo(result.routes[0].startGeocode.point); 
  
  } 
  
 } 
  
 @Override 
 public void readProgress(int bytes, int total) { 
  
 } 
  

package com.pstreets.gisengine.demo;
 
import com.mapdigit.gis.MapDirection;
import com.mapdigit.gis.geometry.GeoLatLng;
import com.mapdigit.gis.service.DigitalMapService;
import com.mapdigit.gis.service.IRoutingListener;
import com.pstreets.gisengine.R;
import com.pstreets.gisengine.SharedMapInstance;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
 
public class MapServiceType extends Activity implements IRoutingListener {
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 }
 
 @Override
 public void onStart() {
  super.onStart();
  GeoLatLng center = new GeoLatLng(32.0616667, 118.7777778);
  SharedMapInstance.map.setCenter(center, 15,
    com.mapdigit.gis.raster.MapType.MICROSOFTCHINA);
  //SharedMapInstance.map.setCurrentMapService(DigitalMapService.GOOGLE_MAP_SERVICE);
  // SharedMapInstance.map.setCurrentMapService(DigitalMapService.MAPABC_MAP_SERVICE);
  SharedMapInstance.map.setCurrentMapService(DigitalMapService.CLOUDMADE_MAP_SERVICE);
  SharedMapInstance.map.setRoutingListener(this);
 
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.maprouting_menu, menu);
  return true;
 }
 
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // Handle item selection
  switch (item.getItemId()) {
  case R.id.getdirection:
   GeoLatLng latLng1 = new GeoLatLng(32.0418381, 118.7788905);
   GeoLatLng latLng2 = new GeoLatLng(39.11643, 117.180908);
   SharedMapInstance.map.getDirections(new GeoLatLng[] { latLng1,
     latLng2 });
 
   return true;
 
  default:
   return super.onOptionsItemSelected(item);
  }
 
 }
 
 @Override
 public void done(String query, MapDirection result) {
  if (result != null) {
   SharedMapInstance.map.setMapDirection(result);
   //SharedMapInstance.map.resize(result.getBound());
   //SharedMapInstance.map.setZoom(5);
   
 
   SharedMapInstance.map.setZoom(15);
   SharedMapInstance.map.panTo(result.routes[0].startGeocode.point);
 
  }
 
 }
 
 @Override
 public void readProgress(int bytes, int total) {
 
 }
 
}
 

 

上圖分別為三種地圖服務返回的路徑,Google 地圖服務和MapAbc地圖服務返回的結果基本相同,實際上Google 地圖服務在中國的地圖是來自於MapAbc。而CloudMade地圖返回的結果似乎偏移瞭道路。這是因為Bing 中國地圖是被偏移過的,而CloudMade返回的無偏移的結果。Google 地圖服務和MapAbc地圖服務返回的結果也是偏移過的,所以和偏移過的地圖很“匹配”。

 作者:mapdigit
 

發佈留言