# OSMDroid-ohos **Repository Path**: rtzhang_0817/osmdroid-ohos ## Basic Information - **Project Name**: OSMDroid-ohos - **Description**: OSMDroid-ohos是Google开源地图项目OSMDroid移植到HarmonyOS系统上的精简版,可以实现在HarmonyOS系统上做地图应用开发。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-11-08 - **Last Updated**: 2024-11-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OSMDroid-ohos #### 介绍 OSMDroid-ohos是Google开源地图项目OSMDroid移植到HarmonyOS系统上的精简版,可以实现在HarmonyOS系统上做地图应用开发。当前OSMDroid-ohos地图根据国内开发情况,默认移植了高德的瓦片地图显示。 OSMDroid-ohos地图提供基本瓦片地图显示,地图指南针覆盖物,地图定位坐标覆盖物,提供单指手势拖拽地图功能,单指手势双击放大地图功能,双指手势缩放地图功能,双指手势旋转地图功能。 ![地图显示](https://gitee.com/talkwebyunchaung/osmdroid-ohos/raw/master/doc/map001.jpg) ![路径规划](https://gitee.com/talkwebyunchaung/osmdroid-ohos/raw/master/doc/map002.jpg) #### MapView使用 xml布局添加 ```xml ················· ``` ```java mMapContainerView = (DependentLayout) findComponentById(ResourceTable.Id_osm_map_container); mapView = (MapView) findComponentById(ResourceTable.Id_osm_map_view); ``` java代码添加 ```java mMapContainerView = (DependentLayout) findComponentById(ResourceTable.Id_osm_map_container); DependentLayout.LayoutConfig layoutConfig = new DependentLayout.LayoutConfig(); layoutConfig.width = DependentLayout.LayoutConfig.MATCH_PARENT; layoutConfig.height = DependentLayout.LayoutConfig.MATCH_PARENT; //实例化MapView mapView = new MapView(this); mMapContainerView.addComponent(mapView, 0, layoutConfig); ``` #### 请求相应权限 config.json配置文件添加权限 ```json ······ "module": { "reqPermissions": [ {"name": "ohos.permission.LOCATION"}, {"name": "ohos.permission.LOCATION_IN_BACKGROUND"}, {"name": "ohos.permission.ACCELEROMETER"}, {"name": "ohos.permission.GET_NETWORK_INFO"}, {"name": "ohos.permission.SET_NETWORK_INFO"}, {"name": "ohos.permission.INTERNET"}, {"name": "ohos.permission.GYROSCOPE"}, {"name": "ohos.permission.READ_USER_STORAGE"}, {"name": "ohos.permission.WRITE_USER_STORAGE"} ], ······ ``` Ability动态请求权限 ```java public class MainAbility extends Ability { private String[] requestPermissions = { SystemPermission.WRITE_USER_STORAGE, SystemPermission.READ_USER_STORAGE, SystemPermission.LOCATION }; @Override public void onStart(Intent intent) { super.onStart(intent); super.setMainRoute(MainAbilitySlice.class.getName()); PermissionsUtils.getInstance().requestPermissions(this, requestPermissions); } @Override public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) { PermissionsUtils.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults); } } ``` #### 启动多点触控手势 ```java // 启动多点触控放大缩小旋转 MapView.setMultiTouchControls(true); ``` #### 设置地图中心点 ```java mMapController = mapView.getController(); //设置地图中心点位置 mMapController.setCenter(new GeoPoint(28.222567, 112.884651)); ``` #### 设置地图缩放级别 ```java mMapController = mapView.getController(); //设置初始化缩放级别 mMapController.setZoom(15.0); ``` #### 离线地图加载 ```java //加载离线地图 File file = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getParentFile(); String strFilepath = file.getPath() + "/osmdroid/"; File[] files = new File(strFilepath).listFiles(); if (files != null && files.length > 0) { File exitFile = files[0]; if (exitFile.exists()) { String filename = exitFile.getName(); String extension = filename.substring(filename.lastIndexOf(".") + 1); if (ArchiveFileFactory.isFileExtensionRegistered(extension)) { IRegisterReceiver registerReceiver = new SimpleRegisterReceiver(this); File[] offlineFiles = new File[]{exitFile}; OfflineTileProvider tileProvider = new OfflineTileProvider(registerReceiver, offlineFiles); mapView.setTileProvider(tileProvider); IArchiveFile[] archives = tileProvider.getArchives(); if (archives.length > 0) { Set tileSource = archives[0].getTileSources(); if (!tileSource.isEmpty()) { String source = tileSource.iterator().next(); mapView.setTileSource(FileBasedTileSource.getSource(source)); mapView.setUseDataConnection(false); } } } } } ``` #### 添加覆盖物 ##### 添加指南针 ```java //指南针 InternalCompassOrientationProvider compassProvider = new InternalCompassOrientationProvider(this); CompassOverlay mCompassOverlay = new CompassOverlay(this, compassProvider, mapView); mCompassOverlay.enableCompass(); mapView.getOverlays().add(mCompassOverlay); ``` ##### 添加我的定位点 ```java private MapView mapView; private MyLocationNewOverlay mLocationOverlay; @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); if (isGrantedLocationPermission()) { addMyLocationOverlayMark(); } else { PermissionsUtils.getInstance().setRequestListener(permission -> { if (permission.equals(SystemPermission.LOCATION)) { addMyLocationOverlayMark(); } }); } } @Override public void onActive() { super.onActive(); mapView.onResume(); if (mLocationOverlay != null) { mLocationOverlay.enableMyLocation(); } } @Override protected void onInactive() { super.onInactive(); mapView.onPause(); if (mLocationOverlay != null) { mLocationOverlay.disableMyLocation(); } } private boolean isGrantedLocationPermission() { return IBundleManager.PERMISSION_GRANTED == verifyCallingOrSelfPermission(SystemPermission.LOCATION); } private void addMyLocationOverlayMark() { //添加当前设备自动定位点,需要先具有设备位置权限 mLocationOverlay = new MyLocationNewOverlay(mapView); PixelMap personPixelMap = ResourceHelper.getPixmap(this, ResourceTable.Media_person); PixelMap directionPixelMap = ResourceHelper.getPixmap(this, ResourceTable.Media_loc); mLocationOverlay.setDirectionArrow(personPixelMap, directionPixelMap); mapView.getOverlays().add(mLocationOverlay); } ``` ##### 添加地图比例尺 ```java //添加比例尺 ScaleBarOverlay scaleBar = new ScaleBarOverlay(mapView); scaleBar.setCentred(true); scaleBar.setAlignBottom(true); //底部显示 mapView.getOverlays().add(scaleBar); ``` ##### 添加地图自由旋转 ```java //地图自由旋转 RotationGestureOverlay mRotationGestureOverlay = new RotationGestureOverlay(mapView); mRotationGestureOverlay.setEnabled(true); mapView.getOverlays().add(mRotationGestureOverlay); ``` ##### 添加路径规划线路点 ```java //路径规划点 Polyline polyline = new Polyline(); //添加路径上的关键坐标点 for(int i = 0; i < size; i++) { polyline.addPoint(new GeoPoint(latitude, longitude)); } //设置信息框标题 polyline.setTitle("title"); //设置信息框内容 polyline.setSubDescription(polyline.getDistance() + ""); //设置线宽度为50 polyline.getOutlinePaint().setStrokeWidth(20); //设置线的颜色为红色 polyline.getOutlinePaint().setColor(Color.BLUE); polyline.setInfoWindow(new BasicInfoWindow(ResourceTable.Layout_bonuspack_bubble, mapeView)); mapView.getOverlayManager().add(polyline); ``` #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request