android osmdroid 加载常用离线地图格式(开源的在线地图)

osmdroid是(几乎)完整/免费更换为Android MapView(v1 API)类。它还包括一个模块化的瓷砖供应商系统支持众多的在线和离线瓷砖来源和覆盖支持内置覆盖绘制图标,跟踪位置和形状。如果想在你项目中使用osmdroid,绝对是灵活度最高,不用申请百度,高德等的key。还有一堆规则要遵循。osmdroid可以支持多图层叠加,绘制自已的图层。离线加载常用地图格式zip,sqlite,.mbtiles,gemf。也可以在线加载地图等。

github官网:https://github.com/osmdroid/osmdroid

osmdroid api解释:http://osmdroid.github.io/osmdroid/

维基解释:https://github.com/osmdroid/osmdroid/wiki

这篇博客代码的下载地址:http://download.csdn.net/detail/qq_16064871/9728127

1,图片展示

在线地图:



网格形式:还没加载出来



加载sd卡下面一个离线地图



2,部分离线地图参考代码

package com.example.osmdroiddemo;

import java.io.File;
import java.util.Set;

import org.osmdroid.tileprovider.IRegisterReceiver;
import org.osmdroid.tileprovider.modules.ArchiveFileFactory;
import org.osmdroid.tileprovider.modules.IArchiveFile;
import org.osmdroid.tileprovider.modules.OfflineTileProvider;
import org.osmdroid.tileprovider.tilesource.FileBasedTileSource;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.tileprovider.util.SimpleRegisterReceiver;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		MapView mapView = (MapView)findViewById(R.id.MapView);
		initMapOverlays(mapView);
	}

	public void initMapOverlays(MapView mapView) {
		if (mapView.getOverlays().size()<=0) {
			mapViewOtherData(mapView);
//			mapView.setTileSource(TileSourceFactory.MAPNIK);
			mapView.setDrawingCacheEnabled(true);
			mapView.setMaxZoomLevel(20);
			mapView.setMinZoomLevel(6);
			mapView.getController().setZoom(12);
			mapView.getController().setCenter(new GeoPoint(23.12655, 113.366575));
			mapView.setUseDataConnection(true);
			mapView.setMultiTouchControls(true);// 触控放大缩小   
			mapView.getOverlayManager().getTilesOverlay().setEnabled(true);
			
			//自己图层
//			mapView.getOverlays().add();
			
//			".zip"".sqlite"".mbtiles"".gemf"
		}
	}
	
	public void mapViewOtherData(MapView mapView){
		String strFilepath = Environment.getExternalStorageDirectory().getPath() + "/test.mbtiles";
		File exitFile = new File(strFilepath);
		String fileName = "test.mbtiles";
		if (!exitFile.exists()) {
			mapView.setTileSource(TileSourceFactory.MAPNIK);
		}else {
			fileName = fileName.substring(fileName.lastIndexOf(".") + 1);
			if (fileName.length() == 0)
				return;
			if (ArchiveFileFactory.isFileExtensionRegistered(fileName)) {
				try {
					OfflineTileProvider tileProvider = new OfflineTileProvider((IRegisterReceiver) new SimpleRegisterReceiver(this), new File[] { exitFile });
					mapView.setTileProvider(tileProvider);

					String source = "";
					IArchiveFile[] archives = tileProvider.getArchives();
					if (archives.length > 0) {
						Set<String> tileSources = archives[0].getTileSources();
						if (!tileSources.isEmpty()) {
							source = tileSources.iterator().next();
							mapView.setTileSource(FileBasedTileSource.getSource(source));
						} else {
							mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
						}

					} else
						mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
					Toast.makeText(this,"Using " + exitFile.getAbsolutePath() + " "+ source, Toast.LENGTH_LONG).show();
					mapView.invalidate();
					return;
				} catch (Exception ex) {
					ex.printStackTrace();
				}
	             Toast.makeText(this,  " did not have any files I can open! Try using MOBAC", Toast.LENGTH_LONG).show();
	        } else{
	             Toast.makeText(this, " dir not found!", Toast.LENGTH_LONG).show();
	        }
		}
	}

}

离线地图的格式支持:".zip"".sqlite"".mbtiles"".gemf"


3,权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

4,在线地图数据源

可以加载不同的在线数据源

mapView.setTileSource(TileSourceFactory.MAPNIK);


5,xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <org.osmdroid.views.MapView
        android:id="@+id/MapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="2.00" />

</RelativeLayout>



  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: leaflet是一种流行的JavaScript库,用于创建交互式地图地图应用程序。它具有轻量级、灵活和易于使用的特点,可以使用离线地图加载进行浏览。 要加载离线地图,首先需要准备地图图块。可以使用开源软件如MapBox Studio或TileMill来制作地图。将地图图块保存在磁盘或服务器上,并使用leaflet中的TileLayer来将其加载地图上。 例如,在leaflet中添加离线地图的代码如下: ```javascript var offlineMap = L.tileLayer('path/to/tiles/{z}/{x}/{y}.png', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors' }); var map = L.map('map').setView([51.505, -0.09], 13); map.addLayer(offlineMap); ``` 这里,tileLayer将离线地图图块的路径传递给tileLayer对象,然后将其添加到地图上。此处设置了最大缩放级别和属性信息。最后,使用L.map创建一个地图对象,并将TileLayer添加到地图上。 使用leaflet加载离线地图涉及了对地图数据的准备和处理,但一旦地图加载到页面上,它将非常流畅和快速,使离线地图的浏览变得容易。 ### 回答2: Leaflet 是一款轻量级的开源 JavaScript 地图库,它可以用于创建交互式、可定制化的地图,支持多种数据格式和多种地图样式。其中一个重要的功能就是加载离线地图加载离线地图需要以下几个步骤: 1. 下载地图切片数据:离线地图需要下载相应的地图切片数据,可以从专门的地图数据提供商处获取,也可以使用自己的切片数据。地图切片数据通常以图块的形式存储,每个图块包含地图上的一小部分。 2. 将切片数据转换为合适的格式:Leaflet 支持的地图数据格式包括 PNG、JPEG、GIF、SVG 和 WebP 等,因此需要将切片数据转换为其中一种格式。 3. 将切片数据加载到 Leaflet:在 Leaflet 中,可以使用 TileLayer 类加载离线地图数据。可以通过指定切片数据存储的路径、分辨率、缩放级别等属性来设置 TileLayer。 4. 在 Leaflet 中显示地图:在 TileLayer 加载离线地图数据之后,需要将其添加到 Leaflet 地图对象中以进行显示。可以使用 map.addLayer() 方法将 TileLayer 添加到地图中。 需要注意的是,离线地图数据通常占用大量的存储空间,因此在下载和处理数据时需要谨慎。此外,离线地图数据也需要及时更新以保证地图的准确性和实时性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值