OSMDroid-ohos
OSMDroid-ohos — это упрощённая версия Google-проекта с открытым исходным кодом OSMDroid, перенесённая на систему HarmonyOS. Она позволяет разрабатывать приложения для работы с картами на системе HarmonyOS.
В настоящее время в OSMDroid-ohos по умолчанию перенесена карта Baidu Tiles. Она предоставляет базовые функции отображения фрагментов карты, включая:
Добавление 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"/>
·················
Добавление кода Java:
mMapContainerView = (DependentLayout) findComponentById(ResourceTable.Id_osm_map_container);
mapView = (MapView) findComponentById(ResourceTable.Id_osm_map_view);
или
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_CONTENT;
// Создание экземпляра 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()) {
``` **Добавление наложений**
**Добавление компаса**
```java
// Компас
InternalCompassOrientationProvider compassProvider = new InternalCompassOrientationProvider(this);
CompassOverlay mCompassOverlay = new CompassOverlay(this, compassProvider, mapView);
mCompassOverlay.enableCompass();
mapView.getOverlays().add(mCompasOverlay);
Добавление моего местоположения
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);
Участие в разработке
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )