はい、Android Maps API v2でカスタムタイルを使用できます。GithubのOpenTripPlanner for Androidアプリで完全に機能する例を見ることができます。(またできるGoogleのプレイから直接アプリをダウンロードしてください)
次のタイルプロバイダーをサポートしています。
- LyrkOpenStreetMap
- MapQuestOpenStreetMap
- マプニク
- CycleMap
- Google(通常、衛星、ハイブリッド、地形)
CustomUrlTileProviderクラスはGithubで確認できます。また、以下に貼り付けました。
public class CustomUrlTileProvider extends UrlTileProvider {
private String baseUrl;
public CustomUrlTileProvider(int width, int height, String url) {
super(width, height);
this.baseUrl = url;
}
@Override
public URL getTileUrl(int x, int y, int zoom) {
try {
return new URL(baseUrl.replace("{z}", "" + zoom).replace("{x}", "" + x)
.replace("{y}", "" + y));
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
}
そして、ユーザーの好みに基づいて、マップタイルプロバイダーを切り替えるコードを次に示します。
/**
* Changes the tiles used to display the map and sets max zoom level.
*
* @param overlayString tiles URL for custom tiles or description for
* Google ones
*/
public void updateOverlay(String overlayString) {
int tile_width = OTPApp.CUSTOM_MAP_TILE_SMALL_WIDTH;
int tile_height = OTPApp.CUSTOM_MAP_TILE_SMALL_HEIGHT;
if (overlayString == null) {
overlayString = mPrefs.getString(OTPApp.PREFERENCE_KEY_MAP_TILE_SOURCE,
mApplicationContext.getResources()
.getString(R.string.map_tiles_default_server));
}
if (mSelectedTileOverlay != null) {
mSelectedTileOverlay.remove();
}
if (overlayString.startsWith(OTPApp.MAP_TILE_GOOGLE)) {
int mapType = GoogleMap.MAP_TYPE_NORMAL;
if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_HYBRID)) {
mapType = GoogleMap.MAP_TYPE_HYBRID;
} else if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_NORMAL)) {
mapType = GoogleMap.MAP_TYPE_NORMAL;
} else if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_TERRAIN)) {
mapType = GoogleMap.MAP_TYPE_TERRAIN;
} else if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_SATELLITE)) {
mapType = GoogleMap.MAP_TYPE_SATELLITE;
}
mMap.setMapType(mapType);
mMaxZoomLevel = mMap.getMaxZoomLevel();
} else {
if (overlayString.equals(getResources().getString(R.string.tiles_mapnik))) {
mMaxZoomLevel = getResources().getInteger(R.integer.tiles_mapnik_max_zoom);
} else if (overlayString.equals(getResources().getString(R.string.tiles_lyrk))) {
mMaxZoomLevel = getResources().getInteger(R.integer.tiles_lyrk_max_zoom);
tile_width = OTPApp.CUSTOM_MAP_TILE_BIG_WIDTH;
tile_height = OTPApp.CUSTOM_MAP_TILE_BIG_HEIGHT;
} else {
mMaxZoomLevel = getResources().getInteger(R.integer.tiles_maquest_max_zoom);
}
mMap.setMapType(GoogleMap.MAP_TYPE_NONE);
CustomUrlTileProvider mTileProvider = new CustomUrlTileProvider(
tile_width,
tile_height, overlayString);
mSelectedTileOverlay = mMap.addTileOverlay(
new TileOverlayOptions().tileProvider(mTileProvider)
.zIndex(OTPApp.CUSTOM_MAP_TILE_Z_INDEX));
if (mMap.getCameraPosition().zoom > mMaxZoomLevel) {
mMap.moveCamera(CameraUpdateFactory.zoomTo(mMaxZoomLevel));
}
}
}
以下は、MapQuest OpenStreetMapタイルのスクリーンショットです。
独自のタイルを作成する方法の詳細については、TileOverlayに関するGoogleのドキュメントと、「独自のタイルを作成する」ためのOpenStreetMap wikiを参照してください。
具体的には、Googleのドキュメントには次のように書かれています。
世界はメルカトル図法(Wikipediaを参照)を使用して投影され、マップの左側(西)は経度-180度に対応し、マップの右側(東)は経度180度に対応します。マップを正方形にするために、マップの上(北)側は85.0511度の緯度に対応し、マップの下(南)側は-85.0511度の緯度に対応します。この緯度の範囲外の領域はレンダリングされません。
各ズームレベルで、マップはタイルに分割され、画面に重なるタイルのみがダウンロードされてレンダリングされます。各タイルは正方形であり、マップは次のようにタイルに分割されています。
カメラがサポートする最小ズームレベル(さまざまな要因によって異なる)はGoogleMap.getMinZoomLevelであり、最大ズームレベルはGoogleMap.getMaxZoomLevelです。
タイルの座標は、マップの左上(北西)のコーナーから測定されます。ズームレベルNでは、タイル座標のx値は0〜2N-1の範囲で西から東に増加し、y値は0〜2N-1の範囲で北から南に増加します。
各タイルプロバイダーを参照するためにOTP Android内で使用されるフォーマットされたURLは、次のようになります。
したがって、上記のプロバイダーの場合、タイル画像は、Googleのドキュメントで示されているディレクトリ構造に配置されたPNGファイルです。同様の形式に従って、独自のサーバーでホストされる独自のマップタイルを作成します。これらのURL /画像は、モバイルデバイスからパブリックにアクセスできる必要があります(つまり、パスワードで保護することはできません)。