越来越深入了解osmdroid开源地图,越发现强大。继上次记载离线地图文章之后android osmdroid 加载常用离线地图格式(开源的在线地图)。再讲支持map地图格式的数据。还有怎么绘制地图的网格,绘制网络分为两种,一种是直接在地图上绘制,监听缩放等级。还有一种是利用Fragment加一层进行绘制。
osmdroid 仓库地址:http://jcenter.bintray.com/org/osmdroid/osmdroid-android/ 这里面有示例apk,还有源码以及文档。
github官网:https://github.com/osmdroid/osmdroid
mapsforge相关库的仓库地址:http://jcenter.bintray.com/org/mapsforge/
map地图格式文件下载:http://ftp-stud.hs-esslingen.de/pub/Mirrors/download.mapsforge.org/maps/
1,先看实现的界面
网格实现
map地图格式
2,地图网格相关代码
直接加载版本,增加缩放监听即可
package com.osmdroid.sample;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import org.osmdroid.events.MapListener;
import org.osmdroid.events.ScrollEvent;
import org.osmdroid.events.ZoomEvent;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.FolderOverlay;
import org.osmdroid.views.overlay.gridlines.LatLonGridlineOverlay;
public class DirectGridActivity extends AppCompatActivity implements View.OnClickListener {
FolderOverlay activeLatLonGrid;
private MapView mMapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
initView();
}
private void initView() {
mMapView = (MapView)findViewById(R.id.mymapview);
LatLonGridlineOverlay.setDefaults();
mMapView.setMaxZoomLevel(20);
mMapView.setMinZoomLevel(6);
mMapView.getController().setZoom(12);
mMapView.setTilesScaledToDpi(true);
mMapView.getController().setCenter(new GeoPoint(23.12645, 113.365575));
mMapView.setUseDataConnection(true);
mMapView.setMultiTouchControls(true);// 触控放大缩小
mMapView.getOverlayManager().getTilesOverlay().setEnabled(true);
mMapView.setMapListener(mapListener);
LatLonGridlineOverlay.fontSizeDp=16;
LatLonGridlineOverlay.fontColor= Color.argb(255,0,255,0);
LatLonGridlineOverlay.backgroundColor=Color.BLACK;
LatLonGridlineOverlay.lineColor=LatLonGridlineOverlay.fontColor;
updateGridlines();
}
MapListener mapListener = new MapListener() {
@Override
public boolean onScroll(ScrollEvent scrollEvent) {
updateGridlines();
return false;
}
@Override
public boolean onZoom(ZoomEvent zoomEvent) {
updateGridlines();
return false;
}
};
protected void updateGridlines(){
if (mMapView==null)
return; //happens during unit tests with rapid recycling of the fragment
if (activeLatLonGrid != null) {
mMapView.getOverlayManager().remove(activeLatLonGrid);
activeLatLonGrid.onDetach(mMapView);
}
LatLonGridlineOverlay.backgroundColor= Color.BLACK;
LatLonGridlineOverlay.fontColor= Color.BLUE;
LatLonGridlineOverlay.lineColor= Color.BLUE;
activeLatLonGrid = LatLonGridlineOverlay.getLatLonGrid(this, mMapView);
mMapView.getOverlays().add(activeLatLonGrid);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
break;
}
}
}
使用Fragment绘制格网
package com.osmdroid.sample;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import com.osmdroid.sample.util.SampleGridlines;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
public class GridFragmentActivity extends AppCompatActivity {
private SampleGridlines mSampleGridlines = null;
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment);
initView();
}
private void initView() {
mapView = (MapView)findViewById(R.id.mymapview);
// mapView.setTileSource(TileSourceFactory.MAPNIK);
mapView.setDrawingCacheEnabled(true);
mapView.setMaxZoomLevel(20);
mapView.setMinZoomLevel(6);
mapView.getController().setZoom(12);
mapView.getController().setCenter(new GeoPoint(23.12645, 113.365575));
mapView.setUseDataConnection(true);
mapView.setMultiTouchControls(true);// 触控放大缩小
//是否显示地图数据源
mapView.getOverlayManager().getTilesOverlay().setEnabled(false);
FragmentManager fm = this.getSupportFragmentManager();
if (fm.findFragmentByTag("SampleGridlines") == null) {
mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
mSampleGridlines = new SampleGridlines();
fm.beginTransaction().add(R.id.samples_container, mSampleGridlines, "SampleGridlines").commit();
}
}
}
这个类也是osmdroid里面示例代码来的。我稍微修改了一下。
package com.osmdroid.sample.util;
import android.graphics.Color;
import com.osmdroid.sample.util.MapViewBaseSampleFragment;
import org.osmdroid.events.MapListener;
import org.osmdroid.events.ScrollEvent;
import org.osmdroid.events.ZoomEvent;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.overlay.FolderOverlay;
import org.osmdroid.views.overlay.gridlines.LatLonGridlineOverlay;
/**
* An example on how to use the lat/lon gridline overlay.
*
* basically, listen for map motion/zoom events and remove the old overlay, then add the new one.
* you can also override the color scheme and font sizes for the labels and lines
*/
public class SampleGridlines extends MapViewBaseSampleFragment implements MapListener {
FolderOverlay activeLatLonGrid;
@Override
public String getSampleTitle() {
return "Lat/Lon Gridlines";
}
@Override
protected void addOverlays() {
super.addOverlays();
LatLonGridlineOverlay.setDefaults();
mMapView.setMaxZoomLevel(20);
mMapView.setMinZoomLevel(6);
mMapView.getController().setZoom(12);
mMapView.getController().setCenter(new GeoPoint(23.12645, 113.365575));
mMapView.setTilesScaledToDpi(true);
mMapView.setMapListener(this);
LatLonGridlineOverlay.fontSizeDp=16;
LatLonGridlineOverlay.fontColor= Color.argb(255,0,255,0);
LatLonGridlineOverlay.backgroundColor=Color.BLACK;
LatLonGridlineOverlay.lineColor=LatLonGridlineOverlay.fontColor;
updateGridlines();
}
@Override
public boolean onScroll(ScrollEvent scrollEvent) {
updateGridlines();
return false;
}
@Override
public boolean onZoom(ZoomEvent zoomEvent) {
updateGridlines();
return false;
}
protected void updateGridlines(){
if (mMapView==null)
return; //happens during unit tests with rapid recycling of the fragment
if (activeLatLonGrid != null) {
mMapView.getOverlayManager().remove(activeLatLonGrid);
activeLatLonGrid.onDetach(mMapView);
}
LatLonGridlineOverlay.backgroundColor= Color.BLACK;
LatLonGridlineOverlay.fontColor= Color.BLUE;
LatLonGridlineOverlay.lineColor= Color.BLUE;
activeLatLonGrid = LatLonGridlineOverlay.getLatLonGrid(getActivity(), mMapView);
mMapView.getOverlays().add(activeLatLonGrid);
}
@Override
public void onDestroyView(){
if (activeLatLonGrid!=null)
activeLatLonGrid.onDetach(mMapView);
activeLatLonGrid=null;
super.onDestroyView();
}
}
还有这个类的父类我就不贴出来。感兴趣下载示例代码以及apk对照。很多东西多看几眼就明白了。接下来说加载map格式地图
3,map与mapsforge
相关的库
compile(name: 'osmdroid-android-5.6.3', ext: 'aar')
compile files('libs/mapsforge-map-android-0.6.1.jar')
compile files('libs/mapsforge-map-0.6.1.jar')
compile files('libs/mapsforge-core-0.6.1.jar')
compile files('libs/mapsforge-map-reader-0.6.1.jar')
还有这三个类
在osmdroid 示例代码也是可以找到的,或者jar包。
//加载map地图格式
if(fileName.contains(".map")){
File[] mapfile = new File[1];
mapfile[0] = exitFile;
XmlRenderTheme theme = null;
try {
theme = new AssetsRenderTheme(context, "renderthemes/","rendertheme-v4.xml");
AndroidGraphicFactory.createInstance(context.getApplication());
}catch (Exception ex){
ex.printStackTrace();
return;
}
MapsForgeTileProvider forge = new MapsForgeTileProvider(new SimpleRegisterReceiver(context),
MapsForgeTileSource.createFromFiles(mapfile,theme, "rendertheme-v4"),null);
mapView.setTileProvider(forge);
return;
}
里面涉及到一个assets目录下建一个文件夹renderthemes,把rendertheme-v4.xml拷贝进去,相当于一个读取默认样式的。
最后嘱咐加上权限,联网以及读取目录的。
4,附上几张图,多了解一下
资源下载:后面上传之后再更新。
本博客源码下载:http://download.csdn.net/detail/qq_16064871/9763983