谷歌开源地图项目移植到鸿蒙!

程序员的自觉 2021-07-28 13:33:40 4147

OSMDroid-ohos 是 Google 开源地图项目 OSMDroid 移植到 HarmonyOS 系统上的精简版,可以实现在 HarmonyOS 系统上做地图应用开发。

当前 OSMDroid-ohos 地图根据国内开发情况,默认移植了高德的瓦片地图显示。

OSMDroid-ohos 地图提供基本瓦片地图显示,地图指南针覆盖物,地图定位坐标覆盖物,提供单指手势拖拽地图功能,单指手势双击放大地图功能,双指手势缩放地图功能,双指手势旋转地图功能。

MapView 使用

xml 布局添加:

<DependentLayout
    ohos:id="$+id:osm_map_container"
    ohos:height="match_content"
    ohos:width="match_parent">

    <com.talkweb.osmharmony.views.MapView
        ohos:id="$+id:osm_map_view"
        ohos:height="match_parent"
        ohos:width="match_parent"
        ohos:horizontal_center="true"/>

    ·················

mMapContainerView = (DependentLayout) findComponentById(ResourceTable.Id_osm_map_container);
mapView = (MapView) findComponentById(ResourceTable.Id_osm_map_view);

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 配置文件添加权限:

······

"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 动态请求权限:

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);
}

}

启动多点触控手势

// 启动多点触控放大缩小旋转
MapView.setMultiTouchControls(true);

设置地图中心点

mMapController = mapView.getController();
//设置地图中心点位置
mMapController.setCenter(new GeoPoint(28.222567, 112.884651));

设置地图缩放级别

mMapController = mapView.getController();
//设置初始化缩放级别
mMapController.setZoom(15.0);

离线地图加载

//加载离线地图
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<String> tileSource = archives[0].getTileSources();
            if (!tileSource.isEmpty()) {
                String source = tileSource.iterator().next();
                mapView.setTileSource(FileBasedTileSource.getSource(source));
                mapView.setUseDataConnection(false);
            }
        }
    }
}

}

添加覆盖物

添加指南针:
//指南针
InternalCompassOrientationProvider compassProvider = new InternalCompassOrientationProvider(this);
CompassOverlay mCompassOverlay = new CompassOverlay(this, compassProvider, mapView);
mCompassOverlay.enableCompass();
mapView.getOverlays().add(mCompassOverlay);

添加我的定位点:
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);
}

添加地图比例尺:
//添加比例尺
ScaleBarOverlay scaleBar = new ScaleBarOverlay(mapView);
scaleBar.setCentred(true);
scaleBar.setAlignBottom(true); //底部显示
mapView.getOverlays().add(scaleBar);

添加地图自由旋转:
//地图自由旋转
RotationGestureOverlay mRotationGestureOverlay = new RotationGestureOverlay(mapView);
mRotationGestureOverlay.setEnabled(true);
mapView.getOverlays().add(mRotationGestureOverlay);

添加路径规划线路点:
//路径规划点
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);

码云仓库地址:
https://gitee.com/talkwebyunchaung/osmdroid-ohos

来源:鸿蒙技术社区

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 93 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
程序员的自觉
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区