android osmdroid 加载离线地图map格式以及地图网格绘制

2023-12-30 05:50

本文主要是介绍android osmdroid 加载离线地图map格式以及地图网格绘制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

越来越深入了解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;@Overrideprotected 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() {@Overridepublic boolean onScroll(ScrollEvent scrollEvent) {updateGridlines();return false;}@Overridepublic boolean onZoom(ZoomEvent zoomEvent) {updateGridlines();return false;}};protected void updateGridlines(){if (mMapView==null)return; //happens during unit tests with rapid recycling of the fragmentif (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);}@Overridepublic 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;@Overrideprotected 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;@Overridepublic String getSampleTitle() {return "Lat/Lon Gridlines";}@Overrideprotected 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();}@Overridepublic boolean onScroll(ScrollEvent scrollEvent) {updateGridlines();return false;}@Overridepublic boolean onZoom(ZoomEvent zoomEvent) {updateGridlines();return false;}protected void updateGridlines(){if (mMapView==null)return; //happens during unit tests with rapid recycling of the fragmentif (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);}@Overridepublic 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



这篇关于android osmdroid 加载离线地图map格式以及地图网格绘制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/551895

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使