Android使用osmdroid加载在线地图,离线地图以及各种填坑姿势

这篇具有很好参考价值的文章主要介绍了Android使用osmdroid加载在线地图,离线地图以及各种填坑姿势。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近开发需要加载地图,包括离线瓦片和在线地图,因为百度和高德要掏钱并且不支持加载自己的瓦片,想着有没有开源的替代呢?发现了osmdroid这个开源库可以加载地图,但是关于开发资料中文少的可怜,有关博客都是互相抄,找不到有用的信息,于是我狠下心看了遍源码,然后开始了填坑之旅。

首先加入依赖如下:

implementation 'org.osmdroid:osmdroid-android:6.1.11'

然后,在xml里加入组件:

<org.osmdroid.views.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

最后,在activity中开始加载map

 		mapView?.maxZoomLevel = 23.0
        mapView?.minZoomLevel = 0.0
        mapView?.controller?.setZoom(12.0)
        //让瓦片适应不同像素密度:默认地图显示的字体小,图片像素高,可设置以下代码,使地图适应不同像素密度,更美观
        mapView?.isTilesScaledToDpi = true
        //设置缩放按钮可见
        val zoomController = mapView?.getZoomController()
        zoomController?.setVisibility(CustomZoomButtonsController.Visibility.NEVER)
        mapView?.setMultiTouchControls(true) // 触控放大缩小
        mapView?.overlayManager?.tilesOverlay?.isEnabled = true
        mapView?.isSelected = true
        var dm = resources.displayMetrics
        //指南针
        var mCompassOverlay = CompassOverlay(
            this, InternalCompassOrientationProvider(this),
            mapView
        )
        mCompassOverlay.enableCompass()
        mapView?.getOverlays()?.add(mCompassOverlay)
        //比例尺配置
        var mScaleBarOverlay = ScaleBarOverlay(mapView)
        mScaleBarOverlay.setScaleBarOffset(dm.widthPixels / 2, 10)
        mapView?.getOverlays()?.add(mScaleBarOverlay)
        mapView?.overlays?.add(mScaleBarOverlay)
        //定位
        var mLocationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(this), mapView)
        mapView?.overlays?.add(mLocationOverlay)
        mLocationOverlay.enableMyLocation()
        //地图移动到该点
        var startPoint = GeoPoint(GeoPoint(34.360284, 108.859602))
        mapView?.controller?.setCenter(startPoint)

        mapView?.setUseDataConnection(true)
        mapView?.setTileSource(tianDiTuCiaTileSource)

其中,tianDiTuCiaTileSource是地图的在线资源,我用的是天地图,也可以换成别的,只要url配置正确就可以。如下:

 static  String  wz = "tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&tk=自己申请的token";
 	//影像地图 _W是墨卡托投影  _c是国家2000的坐标系
    public static OnlineTileSourceBase tianDiTuImgTileSource = new XYTileSource("Tian Di Tu Img", 1, 18, 256, "",
            new String[]{"https://t0." + wz,
                    "https://t1." + wz,
                    "https://t2." + wz,
                    "https://t3." + wz,
                    "https://t4." + wz,
                    "https://t5." + wz,
                    "https://t6." + wz,
                    "https://t7." + wz
            }) {
        @Override
        public String getTileURLString(final long pMapTileIndex) {
            Log.d("url", getBaseUrl() + "&TILEROW=" + MapTileIndex.getY(pMapTileIndex) + "&TILECOL=" + MapTileIndex.getX(pMapTileIndex)
                    + "&TILEMATRIX=" + MapTileIndex.getZoom(pMapTileIndex));
            return getBaseUrl() + "&TILEROW=" + MapTileIndex.getY(pMapTileIndex) + "&TILECOL=" + MapTileIndex.getX(pMapTileIndex)
                    + "&TILEMATRIX=" + MapTileIndex.getZoom(pMapTileIndex);
        }
    };

把上面地址中的token换成自己申请的,就可以了

至此,在线地图就加载出来了。

接下来,我们来加载离线瓦片。

离线瓦片的格式有很多种,osm也支持好多,这里我用的是.zip瓦片文件,解压开里面是一张一张的图片,然后osm地图会根据你缩放的大小和坐标,找到对应的图片进行显示。废话不多说,代码是最好的老师,代码下:

fun mapViewOtherData(mapView: MapView, str: String) {
		//str是离线瓦片.zip的路径,Android10以上,如果路径没有权限,下面会报错。所以我的做法是,先把zip复制到自己的包名下的私有目录,然后随便进行操作
        val strFilepath = str
        val exitFile = File(strFilepath)

        if (!exitFile.exists()) { //文件不存在,用默认网络的

        } else { //文件存在
            try {
            	//source 是zip解压后文件夹的名称,我zip文件名字和里面文件夹一样,所以代码这么写
                val source = exitFile.name.substring(0, exitFile.name.lastIndexOf("."))
                val archives = arrayOfNulls<IArchiveFile>(1)
                archives[0] = ArchiveFileFactory.getArchiveFile(exitFile)
                val customTiles = CustomTileSource(
                    source,
                    12,
                    23,
                    256,
                    ".png",
                )
                val providers = arrayOfNulls<MapTileModuleProviderBase>(1)
                providers[0] = MapTileFileArchiveProvider(
                    SimpleRegisterReceiver(this),
                    customTiles,
                    archives
                )

                val tileProvider = MapTileProviderArray(
                    customTiles,
                    SimpleRegisterReceiver(this), providers
                )
                var tilesOverlay = TilesOverlay(tileProvider, this)
                tilesOverlay.setLoadingBackgroundColor(Color.TRANSPARENT)
                mapView.getOverlayManager()?.add(tilesOverlay)
                return
            } catch (ex: Exception) {
                ex.printStackTrace()
            }
            Toast.makeText(
                this,
                " did not have any files I can open!",
                Toast.LENGTH_LONG
            ).show()
        }

    }

上面代码CustomTileSource是自定义的一个加载类,如下:

public class CustomTileSource extends BitmapTileSourceBase {
    public CustomTileSource(String aName, int aZoomMinLevel, int aZoomMaxLevel, int aTileSizePixels, String aImageFilenameEnding) {
        super(aName, aZoomMinLevel, aZoomMaxLevel, aTileSizePixels, aImageFilenameEnding);
    }
}

至此,osm离线瓦片也加载出来了。

osmdroid加载地图,确实很强大,官方的demo也有,但是demo里面没有加载zip的例子(吐槽一下,添加marker,画点线面的例子都有,就是没有zip),所以费了好大的功夫才把zip给加载出来。所以,记录一下。文章来源地址https://www.toymoban.com/news/detail-783462.html

到现在,在线地图,离线地图瓦片都加载出来了,osmdroid的地图功能都实现了。

到了这里,关于Android使用osmdroid加载在线地图,离线地图以及各种填坑姿势的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue 3使用 Iconify 作为图标库与图标离线加载的方法、 Icones 开源在线图标浏览库的使用_iconify 图标库

    与FontAwesome不同的是,Iconify配合Icones相当于是一个合集,Iconify提供了快捷引入图标的方式,而Icones是一个大的图标库,收集了大量MIT协议、Apache 2.0开源的图标文件。 Iconify 支持的框架很多,本文以 Vue 3 作为介绍。 官网地址: https://icones.js.org/ Iconify Design: All popular icon sets,

    2024年04月27日
    浏览(23)
  • ArcGIS Pro中怎么加载在线地图

    当我们在制图的时候,有的时候需要加载在线地图,在ArcGIS Pro中加载在线地图的方式有很多,这里为大家介绍一下加载的方法,希望能对你有所帮助。 在菜单栏上选择地图,点击底图,可以看到所有可加载的底图,如下图所示。 可加载底图 选择一个想要加载的底图,即可完

    2024年01月16日
    浏览(44)
  • Android导入其它项目慢,Gradel下载失败,另辟蹊径:使用离线gradle加载,附镜像方式

    最近在开发中需要测试以前写的小项目。结果忘了换本地的gradle,提示下载失败。换了现在用的gradle,项目能跑了。虽然网上有很多很多教程了,但对我的情况也不是都适用。所以自己记录一下。本人水平有限,有不对的地方请帮我指正,万分感谢。 如果您很着急,请直接看

    2024年02月03日
    浏览(33)
  • QGIS-申请天地图key并加载在线地图,在线图源坐标系差异

    从2019年1月1日起,调用天地图的地图服务都需要申请开发接口,通过申请的key构建url地址并在QGIS加载。 在天地图官网(https://www.tianditu.gov.cn/)点击登录按钮登录天地图账号,如果没有账号可以点击注册,注册一个账号,登录账号之后,点击开发资源地图API,如下图所示。

    2024年02月08日
    浏览(29)
  • 如何将测绘数据加载到三维地图中,解决海量测绘数据在线管理难题?

    《四维轻云》是四川兴域技术团队基于浏览器打造的一款地理空间数据在线管理平台,可实现TB级大规模倾斜摄影三维模型、正射影像、激光点云、数字高程模型等数据在线发布、管理及分享,并支持私有化部署和高阶功能定制化开发,解决了海量测绘数据在线管理难题。 在

    2024年02月08日
    浏览(46)
  • uni-app离线打包高德地图导入android studio不能正常显示

    本人使用的uni-app SDK版本:Android-SDK@3.8.7.81902_20230704 1.导入以上文件,依赖已经自动添加了 2.确保这个正常引入 3.修改AndroidMainifest.xml,添加自己的密钥

    2024年02月13日
    浏览(42)
  • elasticdump工具安装及使用详解(在线和离线)

    1.1 安装node和npm 以node版本 V16.18.1为例: 详见博文:Linux系统中安装nodejs(node、npm)_IT之一小佬的博客-CSDN博客 1.2 安装elasticdump 1.3 创建软链接         如果比着1.1安装的话,此时不用创建软链接,直接使用elasticdump --help也是可能成功的。在1.1中配置过环境变量path。 创建软链

    2024年02月03日
    浏览(44)
  • java以及android类加载机制

    java中,每一个类或者接口,在编译后,都会生成一个.class文件。 类加载机制指的是将这些.class文件中的二进制数据读入到内存中并对数据进行校验,解析和初始化。最终,每一个类都会在方法去保存一份元数据,在堆中创建一个与之对应的Class对象。 类的生命周期,经历7个

    2024年02月20日
    浏览(23)
  • 使用mapinfo软件的在线地图插件运行错误解决

    先解决系统的权限不够问题,直接提高登录的普通管理员为超级管理员,然后把【 普通管理权限 】提高到【 超级管理权限 】。 1、按快捷键Win+R,打开运行窗口,输入“gpedit.msc”,这样就打开了组策略页面。 2、进入到组策略,依次展开12345级,点【安全选项】,下拉找到【

    2024年02月05日
    浏览(38)
  • 使用docker进行nextcloud+onlyoffice环境搭建(在线 or 离线)

    1.安装 MySQL(有MySQL就可以不装) -e MYSQL_ROOT_PASSWORD= root   参数是设置MySQL数据密码,根据自己情况修改密码,当前设置密码为 root 2.安装onlyoffice服务  3.安装nextcloud 4.获取onlyoffice秘钥(用于后面nextcloud的onlyoffice插件配置)  进入onlyoffice容器内  查看秘钥 如下图红框内容即为

    2024年01月18日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包