gpt4 book ai didi

android - Android 应用程序上的谷歌地图离线模式

转载 作者:行者123 更新时间:2023-11-29 19:01:30 25 4
gpt4 key购买 nike

如果您在自己的应用程序中处于离线状态,是否可以显示 Google map ?

如果我为离线模式从谷歌地图应用程序下载一个区域,如果我没有互联网连接,我可以在我开发的应用程序上可视化 map 吗?如果没有,我有什么选择可以使这成为可能?我只想在我的应用离线时可视化 map ...

以下是本帖提供的代码TileProvider using local tiles

@Override
public Tile getTile(int x, int y, int zoom) {
byte[] image = readTileImage(x, y, zoom);
return image == null ? null : new Tile(TILE_WIDTH, TILE_HEIGHT,image);
}
private byte[] readTileImage(int x,int y, int zoom){
InputStream is= null;
ByteArrayOutputStream buffer= null;

try{
is= mAssets.open(getTileFileName(x,y,zoom));
buffer= new ByteArrayOutputStream();

int nRead;
byte[] data= new byte[BUFFER_SIZE];

while ((nRead= is.read(data,0,BUFFER_SIZE)) !=-1){
buffer.write(data,0,nRead);
}
buffer.flush();

return buffer.toByteArray();
}
catch(IOException ex){
Log.e("LINE 60 CustomMap", ex.getMessage());
return null;
}catch(OutOfMemoryError e){
Log.e("LINE 64 CustomMap", e.getMessage());
return null;
}finally{
if(is!=null){
try{
is.close();
} catch (IOException e) {}
}
if(buffer !=null){
try{
buffer.close();
}catch (Exception e){}
}
}
}

private String getTileFileName(int x, int y, int zoom){
return "map/"+ zoom +'/' +x+ '/'+y+".png";
}

我正在寻找信息,我的问题是,我如何才能下载磁贴?

最佳答案

我面临着同样的挑战,我发现的所有示例都没有包含下载磁贴、将它们写入文件以及从文件中读取它们的完整实现。

这是我的代码,它在本地可用时从文件中读取图 block ,在不可用时下载/保存图 block 。这使用 OpenStreetMap.org 切片服务器,但您可以通过更改 URL 使用您喜欢的任何服务器。

private class OfflineTileProvider implements TileProvider {
private static final String TILES_DIR = "your_tiles_directory/";
private static final int TILE_WIDTH = 256;
private static final int TILE_HEIGHT = 256;

private static final int BUFFER_SIZE_FILE = 16384;
private static final int BUFFER_SIZE_NETWORK = 8192;

private ConnectivityManager connectivityManager;

@Override
public Tile getTile(int x, int y, int z) {
Log.d(TAG, "OfflineTileProvider.getTile(" + x + ", " + y + ", " + z + ")");
try {
byte[] data;
File file = new File(TILES_DIR + z, x + "_" + y + ".png");
if (file.exists()) {
data = readTile(new FileInputStream(file), BUFFER_SIZE_FILE);
} else {
if (connectivityManager == null) {
connectivityManager = (ConnectivityManager) getSystemService(
Context.CONNECTIVITY_SERVICE);
}
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetworkInfo == null || !activeNetworkInfo.isConnected()) {
Log.w(TAG, "No network");
return NO_TILE;
}

Log.d(TAG, "Downloading tile");
data = readTile(new URL("https://a.tile.openstreetmap.org/" +
z + "/" + x + "/" + y + ".png").openStream(),
BUFFER_SIZE_NETWORK);

try (OutputStream out = new BufferedOutputStream(new FileOutputStream(file))) {
out.write(data);
}
}
return new Tile(TILE_WIDTH, TILE_HEIGHT, data);
} catch (Exception ex) {
Log.e(TAG, "Error loading tile", ex);
return NO_TILE;
}
}

private byte[] readTile(InputStream in, int bufferSize) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try {
int i;
byte[] data = new byte[bufferSize];

while ((i = in.read(data, 0, bufferSize)) != -1) {
buffer.write(data, 0, i);
}
buffer.flush();

return buffer.toByteArray();
} finally {
in.close();
buffer.close();
}
}
}

将“your_tiles_directory”替换为您要存储图 block 的目录路径。

要使用 TileProvider:

map.setMapType(GoogleMap.MAP_TYPE_NONE);
offlineTileOverlay = map.addTileOverlay(new TileOverlayOptions()
.tileProvider(new OfflineTileProvider()));

编辑:您可能想要设置最大缩放级别,默认值为 21,但 OpenStreetMap 的最大值似乎为 19。

map.setMaxZoomPreference(19);

关于android - Android 应用程序上的谷歌地图离线模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48938723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com