OSMdroid开发

OSMdroid开发

获取OSM数据

  1. 可以通过该网站下载世界各地的OpenStreetMap地图矢量数据,可以下载pbf,shapefile,geojson格式的数据。缺点:只能选择国家范围的数据,无法精确到一个省或市。

    比如:从这个页面下载中国的地图,选择bz2格式,使用7-zip解压,可以得到一个osm文件,也就是xml文件。

    image-20210505231509077
  2. openstreetmap.org 网站本身提供地图数据的下载服务(范围不能过大),点击地图上端的“输出”,然后选择范围和输出格式即可,下载格式为osm格式。如果范围太大可以选择从下方的镜像站下载。

    image-20210505234410251
  3. 全球范围的数据https://planet.openstreetmap.org/

Osmdroid的使用

在线OSM街道地图的加载

  1. 添加依赖

    在module级别的build.gradle中的dependencies中添加

    implementation 'org.osmdroid:osmdroid-android:6.1.0'
    
    image-20210510183346674
  2. 权限配置

    打开AndroidManifest.xml文件,在application的外面添加如下的代码

    <!--添加访问权限-->
        <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_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
    image-20210510183653031
  3. MainActivity

    在其中添加如下的代码:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //获取布局文件中的mapView
            MapView mMapView = (MapView) findViewById(R.id.mapView);
            //获取地图控制器
            IMapController mcontroller = mMapView.getController();
            //设置在线地图源为MAPNIK(OSM街道)
            mMapView.setTileSource(TileSourceFactory.MAPNIK);
            //设置多指触控可用
            mMapView.setMultiTouchControls(true);
            //设置缩放按钮可见
            mMapView.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.ALWAYS);
            //设置缩放界别
            mcontroller.setZoom(15);
            //添加比例尺
            ScaleBarOverlay mScaleBarOverlay = new ScaleBarOverlay(mMapView);
            mMapView.getOverlays().add(mScaleBarOverlay);
            //地图可旋转
            RotationGestureOverlay mRotationGestureOverlay = new RotationGestureOverlay(this, mMapView);
            mRotationGestureOverlay.setEnabled(true);
            mMapView.getOverlays().add(mRotationGestureOverlay);
            //设置地图中心
            GeoPoint geopoint = new GeoPoint(30.4653, 114.4281);
            MapController mMapController= (MapController) mMapView.getController();//获取MapView控制器
            mMapController.setCenter(geopoint);//设置地图中心
        }
    }
    

启动后Osmdroid可能会出现

android.database.sqlite.SQLiteCantOpenDatabaseException: Cannot open database ‘/storage/emulated/0/osmdroid/tiles/cache.db’: Directory /storage/emulated/0/osmdroid/tiles doesn’t exist报错,无法打开数据库

需要在onCreate中添加如下代码

//获取访问数据库的权限
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        Context ctx = getApplicationContext();
        Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OSMDroid 是一个开源的 Android 地图库,它允许开发者在 Android 应用程序中嵌入 OpenStreetMap 数据和地图功能。与原生 Google Maps API 不同,OSMDroid 是基于轻量级的 OSM 数据,这意味着它可以提供更好的离线地图支持,并且对隐私更加友好。 防止内存泄露(Memory Leaks)是 Android 开发中非常重要的一环,特别是在处理地图相关组件时,因为地图数据加载和绘制可能会占用大量内存。以下是一些避免 OSMDroid 防止内存泄露的方法: 1. **及时释放资源**:确保每次不再使用地图视图(MapView)、图层(Overlay)或数据源(TileProvider)时,调用相应的 `dispose()` 或 `removeAllOverlays()` 方法释放它们。 2. **使用弱引用**:对于持有地图对象的引用,可以考虑使用 WeakReference,这样即使其他强引用消失,弱引用也不会阻止垃圾回收。 3. **监听生命周期**:地图视图的 `OnDestroy()` 或 `onSaveInstanceState()` 方法中,记得清除地图相关的回调和监听器,以防止内存泄漏。 4. **批处理操作**:尽量减少在主线程执行耗时的操作,如绘制大图层或加载大量数据,可以使用异步任务或者 `AsyncTask` 来处理。 5. **使用 LruCache**:对于频繁访问但占用空间较大的地图数据,可以使用 LruCache 来缓存,当内存不足时自动清理最久未使用的数据。 6. **跟踪内存使用**:利用 Android 的内存分析工具(如 Android Studio 的 Memory Profiler 或第三方库如 LeakCanary)定期检查应用内存状况,找出可能的泄漏点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值