引路蜂地圖服務預設使用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