是的,您可以在Android Maps API v2中使用自定义图块-您可以在Github上的适用于Android的OpenTripPlanner应用程序中看到一个完整的示例。(您也可以直接从Google Play下载该应用程序)
我们支持以下图块提供程序:
- LyrkOpenStreetMap
- MapQuestOpenStreetMap
- 马普尼克
- 周期图
- 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磁贴的屏幕截图:
有关制作自己的图块的更多信息,请参见Google文档TileOverlay以及有关“创建自己的图块”的OpenStreetMap Wiki。
具体来说,Google文档说:
请注意,世界是使用Mercator投影(请参阅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 /图像必须是移动设备可以公开访问的(即,不能用密码保护)。