android osm 离线地图,android openStreetMap 离线地图
一 Mobile_Atlas_Creator_1.8的使用
png1.png
1.Map source
選擇Microsoft Maps China(因?yàn)槠渌貓D源都不怎么行,沒開APN的問題?)
2.zoom levels
選擇你需要的發(fā)大比例,可以多選,放數(shù)值越大下載的地圖瓦塊也多,離線地圖包就越大。自行選擇。
3.地圖的選擇
選擇所要制作離線地圖的區(qū)域,可以通過長按鼠標(biāo)左鍵并且拖拽選擇,也可以在軟件左側(cè)-坐標(biāo)信息填寫經(jīng)緯度范圍去選擇,選擇好之后記得點(diǎn)擊“選擇該區(qū)域”按鈕;
,
4點(diǎn)擊Atlas Content下的Mapnik,確定好自己勾選的zoom levels,點(diǎn)擊Add selection,再點(diǎn)擊create atlas 開始下載
png2.png
建議修改文件名稱為Mapnik 如圖:
png3.png
好了,離線地圖就下載好了。地圖路徑:Mobile_Atlas_Creator_1.8\Mobile_Atlas_Creator_1.8\atlases
二 離線地圖的加載
權(quán)限
提示:編譯版本為23或以上版本,要注意動態(tài)獲取讀寫存儲空間權(quán)限,否則地圖可能不顯示
布局:
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
讀取離線地圖方法
private void readMap(File f) {
//f是離線地圖的壓縮包(Mapnik .zip的路徑獲取的file)
if (f.exists()) {
File[] list = f.listFiles();
if (list != null) {
for (int i = 0; i < list.length; i++) {
if (list[i].isDirectory()) {
continue;
}
String name = list[i].getName().toLowerCase();
if (!name.contains(".")) {
continue; // 跳過沒有擴(kuò)展名的文件
}
name = name.substring(name.lastIndexOf(".") + 1);
if (name.length() == 0) {
continue;
}
if (ArchiveFileFactory.isFileExtensionRegistered(name)) {
try {
// ok found a file we support and have a driver for
// the format, for this demo, we'll just use the
// first one
// 離線創(chuàng)建的provider瓦,它只會做
// 離線文件archives
// 一次使用的第一個文件
OfflineTileProvider tileProvider = new OfflineTileProvider(
new SimpleRegisterReceiver(getActivity()),
new File[] { list[i] });
// tell osmdroid to use that provider instead of the
// default rig which is (asserts, cache,
// files/archives, online
mMapView.setTileProvider(tileProvider);
// this bit enables us to find out what tiles
// sources are available. note, that this action may
// take some time to run
// and should be ran asynchronously. we've put it
// inline for simplicity
String source = "";
IArchiveFile[] archives = tileProvider
.getArchives();
if (archives.length > 0) {
// cheating a bit here, get the first archive
// file and ask for the tile sources names it
// contains
Set tileSources = archives[0]
.getTileSources();
// presumably, this would be a great place to
// tell your users which tiles sources are
// available
if (!tileSources.isEmpty()) {
// ok good, we found at least one tile
// source, create a basic file based tile
// source using that name
// and set it. If we don't set it, osmdroid
// will attempt to use the default source,
// which is "MAPNIK",
// which probably won't match your offline
// tile source, unless it's MAPNIK
source = tileSources.iterator().next();
this.mMapView
.setTileSource(FileBasedTileSource
.getSource(source));
} else {
this.mMapView
.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
}
} else {
this.mMapView
.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
}
// Toast.makeText(
// this,
// "Using " + list[i].getAbsolutePath() + " "
// + source, Toast.LENGTH_SHORT)
// .show();
this.mMapView.invalidate();
return;
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
// Toast.makeText(
// this,
// f.getAbsolutePath()
// + " did not have any files I can open! Try using MOBAC",
// Toast.LENGTH_SHORT).show();
} else {
// Toast.makeText(this, f.getAbsolutePath() + " dir not found!",
// Toast.LENGTH_SHORT).show();
}
}
地圖初始化
private MapView mMapView;
private IMapController mapControl;
public View CreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_national_weather,
container, false);
mMapView = (MapView) view.findViewById(R.id.mapView);
mMapView.setUseDataConnection(false); // 設(shè)置取消通過網(wǎng)絡(luò)加載
readMap(China);//加載離線地圖
mMapView.setClickable(true);//設(shè)置可點(diǎn)擊
mMapView.setBuiltInZoomControls(true);//放大縮小功能開啟
mapControl = mMapView.getController();//獲得控制器
mMapView.setMultiTouchControls(true);// 設(shè)置多指觸控可用
mMapView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);// 關(guān)閉硬件加速(繪制軌跡時需要)
mMapView.getOverlays().clear();//清空地圖上的標(biāo)記
GeoPoint cententGeo=new GeoPoint(37.926868, 112.543945);
mapControl.setCenter(cententGeo);//設(shè)置地圖中心點(diǎn),注意中心點(diǎn)請根據(jù)自己截取的地圖,獲取其中點(diǎn)的經(jīng)緯度
mMapView.setMinZoomLevel(6); //設(shè)置最小放大級別
mMapView.setMaxZoomLevel(7);//設(shè)置最大放大級別
mapControl.setZoom(6);//設(shè)置縮放級別
}
//添加maker
private void addPointe(GeoPoint dian, Drawable draw) {
Marker marker = new Marker(mMapView);
marker.setIcon(draw);// 設(shè)置圖標(biāo)
marker.setPosition(dian);// 設(shè)置位置
marker.setAnchor(0.5f, 1f);// 設(shè)置偏移量
// marker.setTitle("我是Titile");//設(shè)置標(biāo)題
// marker.setSubDescription("我是SubDescription");//設(shè)置說明
mMapView.getOverlays().add(marker);// 添加marker到MapView
}
總結(jié)
以上是生活随笔為你收集整理的android osm 离线地图,android openStreetMap 离线地图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【matlab 图像处理】邻域处理与模板
- 下一篇: (转载)超级精仿高仿金山手机卫士源码