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给加载出来。所以,记录一下。

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
高德地图提供了一个强大的离线地图开发模块,开发者可以利用它来实现离线地图功能的集成和定制。首先,开发者需要在高德地图官网申请相应的API Key,并在应用程序中配置和使用该Key。在集成离线地图功能之前,开发者需要下载离线地图数据并将其存储在设备的本地存储中,以便在没有网络连接的情况下进行地图展示和定位。开发者可以利用高德地图提供的离线地图下载管理器模块进行地图数据的下载和管理。 通过高德地图离线地图模块,开发者可以实现地图数据的预览、搜索、定位和导航等功能,同时也可以定制地图的样式和功能,以满足不同应用场景的需求。另外,高德地图还提供了一系列离线地图SDK和API接口,方便开发者快速集成和定制离线地图功能。通过高德地图离线地图开发模块,开发者可以实现更加灵活、稳定和高效的离线地图功能,为用户提供更好的地图体验。 在进行android高德离线地图开发时,开发者需要注意用地图API Key、合理存储地图数据和适配不同设备分辨率等问题,确保离线地图功能的稳定性和流畅性。同时,开发者还可以通过高德地图提供的开发者社区和技术支持渠道,获取更多关于离线地图开发的技术文档和经验分享,帮助解决开发过程中遇到的问题。总之,android高德离线地图开发提供了丰富的功能和灵活的定制选项,能够帮助开发者快速实现离线地图功能,提升应用程序的用户体验和价值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值