安卓上使用免费的地图OpenStreetMap

前一段使用了微信的地图,非常的好用。但是存在的问题是海外无法使用,出国就不能用了;

其实国内三家:百度,高德,微信都是一样的问题,当涉及到商业使用的时候需要付费;

国外除了谷歌还有一个选择,OpenSteetMap,这里记录一下使用流程。

1)模块的build.gradle添加


dependencies {
implementation 'org.osmdroid:osmdroid-android:6.1.11'
}

2)AndroidManifest.xml中添加依赖

 <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3)布局文件中添加地图的占位的控件:

<!-- MAP -->
    <org.osmdroid.views.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="test"
        android:visibility="visible" />

4)主文件初始化中添加,

// MainActicity.kt 
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // set user agent to prevent getting banned from the osm servers
        Configuration.getInstance().userAgentValue = BuildConfig.APPLICATION_ID
        // 缓存路径,在应用程序目录下 ,设置nl在根目录下(e.g. tile cache)
        Configuration.getInstance().osmdroidBasePath = //File("/trackbook/mapdata/")
            this.getExternalFilesDir(null)

5) Fragment中添加初始化函数

  fun initMap(){



        val mapView = binding.map
        val controller = mapView.controller
        mapView.isTilesScaledToDpi = true
        mapView.setTileSource(TileSourceFactory.MAPNIK)
        //mapView.setTileSource(TileSourceFactory.OpenTopo)
        mapView.setMultiTouchControls(true)
        mapView.zoomController.setVisibility(org.osmdroid.views.CustomZoomButtonsController.Visibility.SHOW_AND_FADEOUT)
        val zoomLevel = 11.0
        controller.setZoom(zoomLevel)

        val compassOverlay = CompassOverlay(context, InternalCompassOrientationProvider(context), mapView)
        compassOverlay.enableCompass()
//        compassOverlay.setCompassCenter(36f, 36f + (statusBarHeight / densityScalingFactor)) // TODO uncomment when transparent status bar is re-implemented
        compassOverlay.setCompassCenter(36f, 36f)
        mapView.overlays.add(compassOverlay)

        val animated = true
        val position = GeoPoint(40.0, 116.0)
        when (animated) {
            true -> controller.animateTo(position)
            false -> controller.setCenter(position)
        }
    }

编译运行即可;

我在手机上直接运行,方便使用clash设置网络,我最近发现真机调试比模拟器好用多了。

### 如何使用 OpenStreetMap API 进行开发 #### 使用 JavaScript 加载 OpenStreetMap 地图并展示在网页上 为了在 Web 应用程序中集成 OpenStreetMap (OSM),可以利用 Leaflet.js 或者其他类似的库简化这一过程。Leaflet 是一个轻量级开源的 JavaScript 库,专为移动友好设计的地图而构建。 下面是一段简单的 HTML 和 JavaScript 代码片段用于加载 OSM 并将其嵌入到网页中: ```html <!DOCTYPE html> <html> <head> <title>OpenStreetMap Example</title> <!-- 引入 Leaflet CSS --> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css"/> <style>#map { height: 400px; width: 80%; }</style> </head> <body> <div id="map"></div> <!-- 引入 Leaflet JS 文件 --> <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script> <script type="text/javascript"> var map = L.map('map').setView([51.505, -0.09], 13); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' }).addTo(map); </script> </body> </html> ``` 这段代码创建了一个基本的地图实例,并设置了初始视图位置和缩放级别[^2]。 #### 关于 SHP 和 OSM 数据格式 SHP(Shapefile)是一种由 ESRI 开发的空间矢量数据存储格式,广泛应用于地理信息系统(GIS)软件之间交换空间数据。它通常包含多个文件(.shp,.shx,.dbf等),其中 .shp 存储几何对象(点线面). 相比之下,OSM 的 XML 格式的源数据则更为灵活,支持更复杂的功能集。OSM 数据模型定义了几种主要元素:节点(node)表示单个地理位置;路径(way)是由一系列有序节点组成的线条或多边形;关系(relation)用来描述不同要素之间的关联方式。这些特性使得 OSM 成为众包制图项目的理想选择[^3]. 对于 Android 中 OSM 开发而言,虽然 ArcGIS 提供了一套完整的解决方案,但对于仅需简单地图功能的应用来说可能显得过于庞大。此时可以选择像 OSMDroid 这样的轻量化框架来处理离线地图缓存等问题[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值