Android使用HereMap教程

  • 关于
    • 配置
    • 简单使用
    • 关于定位
    • 使用自定义地图

关于

  前几天公司要求调研一下here map地图是否支持等值路由等线图这个功能,然后就去google了一下。因为不是国内的地图,然后在最后下载Android对应的sdk(探索版explore)需要有对应支付的功能,即使不收费,所以也需要有类似PayPal等支付账号。本篇文章即提供最新版的explore 版Android sdk(导入项目的是aar文件)
 目前最新版基于时间 2022-5-29
sdk的下载链接我会放到文章末尾,以百度网盘形式。

配置

  继续不需要下载,如果你想真正使用到项目而不是仅限于测试的话也需要注册账号然后填写一系列信息,然后创建一个项目如下:

  然后会有提示你下载一个文件,文件里面包括对应的项目的id和secret,打开如下图:

  然后我们将它写到我们项目的Androidmanifest.xml里面:

<meta-dataandroid:name="com.here.sdk.access_key_id"android:value="JqOFpFBmTqMAMn_s49QIVw" /><meta-dataandroid:name="com.here.sdk.access_key_secret"android:value="zHujQuPPQVVxb2aMrUfW-1iXkmVGBUKQ3FBR4Y3Qq7h67RA0zH8Q_PlQ-jO15ph485qlM3ITDJhFfVbDZX2hNw" />

  还有就是对应的here map的aar文件导入以及build文件的修改如下:


项目build文件:

implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'], exclude : ['*mock*.jar'])

  重新sync一下build,然后我们就可以使用here map地图了

简单使用

  here map 的几乎所有功能都是基于mapScene,简单实现地图展示。
  首先添加地图控件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".HereMapActivity"><com.here.sdk.mapview.MapViewandroid:id="@+id/map_view"android:layout_width="match_parent"android:layout_height="match_parent"></com.here.sdk.mapview.MapView></androidx.constraintlayout.widget.ConstraintLayout>

  然后在代码里面使用:

private var mapView: MapView? = nullprivate val locationRequest = registerForActivityResult(ActivityResultContracts.RequestPermission()){if(it){loadMapScene()}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_here_map)mapView = findViewById(R.id.map_view)mapView!!.onCreate(savedInstanceState)locationRequest.launch(Manifest.permission.ACCESS_FINE_LOCATION)}private fun loadMapScene() {MapView.setPrimaryLanguage(LanguageCode.EN_US) //设置显示语言mapView!!.mapScene.setLayerVisibility(MapScene.Layers.EXTRUDED_BUILDINGS,VisibilityState.HIDDEN)//一些图层的显示与隐藏mapView!!.mapScene.setLayerVisibility(MapScene.Layers.LANDMARKS,VisibilityState.HIDDEN)mapView!!.mapScene.loadScene(MapScheme.NORMAL_NIGHT//五种模式地图,正常白黑、卫星地图、混合卫星和正常白黑) { mapError ->if (mapError == null) {val distanceInMeters = (1000 * 10).toDouble()mapView!!.camera.lookAt(GeoCoordinates(52.530932, 13.384915))} else {}}}

  效果图如下:

关于定位

  首先是here map的开发文档
  第一种方式如下:
新建一个PlatformPositioningProvider类

public class PlatformPositioningProvider implements LocationListener {public static final String LOG_TAG = PlatformPositioningProvider.class.getName();public static final int LOCATION_UPDATE_INTERVAL_IN_MS = 100;private Context context;private LocationManager locationManager;@Nullableprivate PlatformLocationListener platformLocationListener;public interface PlatformLocationListener {void onLocationUpdated(Location location);}public PlatformPositioningProvider(Context context) {this.context = context;}@Overridepublic void onLocationChanged(android.location.Location location) {if (platformLocationListener != null) {platformLocationListener.onLocationUpdated(location);}}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {switch(status){case LocationProvider.AVAILABLE:Log.e(LOG_TAG, "PlatformPositioningProvider status: AVAILABLE");break;case LocationProvider.OUT_OF_SERVICE:Log.e(LOG_TAG, "PlatformPositioningProvider status: OUT_OF_SERVICE");break;case LocationProvider.TEMPORARILY_UNAVAILABLE:Log.e(LOG_TAG, "PlatformPositioningProvider status: TEMPORARILY_UNAVAILABLE");break;default:Log.e(LOG_TAG, "PlatformPositioningProvider status: UNKNOWN");}}@Overridepublic void onProviderEnabled(String provider) {Log.e(LOG_TAG, "PlatformPositioningProvider enabled.");}@Overridepublic void onProviderDisabled(String provider) {Log.e(LOG_TAG, "PlatformPositioningProvider disabled.");}public void startLocating(PlatformLocationListener locationCallback) {if (this.platformLocationListener != null) {throw new RuntimeException("Please stop locating before starting again.");}if (ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&ActivityCompat.checkSelfPermission(context,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {Log.e(LOG_TAG, "Positioning permissions denied.");return;}this.platformLocationListener = locationCallback;locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) &&context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)) {locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_UPDATE_INTERVAL_IN_MS, 1,this);} else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, LOCATION_UPDATE_INTERVAL_IN_MS, 1,this);} else {Log.e(LOG_TAG, "Positioning not possible.");stopLocating();}}public void stopLocating() {if (locationManager == null) {return;}locationManager.removeUpdates(this);platformLocationListener = null;}
}

  然后在刚才初始化地图成功那里修改:

private var locationIndicator: LocationIndicator? = nullmapView!!.mapScene.loadScene(MapScheme.NORMAL_NIGHT) { mapError ->if (mapError == null) {val distanceInMeters = (1000 * 10).toDouble()mapView!!.camera.lookAt(GeoCoordinates(52.530932, 13.384915))val platformPositioningProvide = PlatformPositioningProvide(this)platformPositioningProvide.startLocating {addMyLocationToMap(convertLocation(it))}} else {}}private fun addMyLocationToMap(myLocation: Location) {locationIndicator = LocationIndicator()locationIndicator?.locationIndicatorStyle = LocationIndicator.IndicatorStyle.PEDESTRIANlocationIndicator?.updateLocation(myLocation)mapView?.addLifecycleListener(locationIndicator!!)mapView?.camera?.lookAt(myLocation.coordinates)}     private fun convertLocation(nativeLocation: android.location.Location): Location {val geoCoordinates = GeoCoordinates(nativeLocation.latitude,nativeLocation.longitude,nativeLocation.altitude)val location = Location(geoCoordinates)if (nativeLocation.hasBearing()) {location.bearingInDegrees = nativeLocation.bearing.toDouble()}if (nativeLocation.hasSpeed()) {location.speedInMetersPerSecond = nativeLocation.speed.toDouble()}if (nativeLocation.hasAccuracy()) {location.horizontalAccuracyInMeters = nativeLocation.accuracy.toDouble()}return location}

  但是没有定位成功,可能是中国的保护问题。也有可能是因为用的是explore版本的sdk原因。
也可以参考navigate版示例应用:的定位demo,这里因为项目调研目标不是这个,就没有深入研究。

使用自定义地图

  首先要有自定义好的地图资源文件放到assets文件夹内,如下:

然后调用方法如下:

private fun loadMapStyle() {// Place the style into the "assets" directory.// Full path example: app/src/main/assets/mymapstyle.scene.json// Adjust file name and path as appropriate for your project.val fileName = "omv/omv-traffic-traffic-normal-night.scene.json"val assetManager: AssetManager = assetstry {assetManager.open(fileName)} catch (e: IOException) {Log.e("CustomMapStylesExample", "Error: Map style not found!")return}mapView!!.mapScene.loadScene("" + fileName) { mapError ->if (mapError == null) {val distanceInMeters = (1000 * 10).toDouble()mapView!!.camera.lookAt(GeoCoordinates(52.530932, 13.384915), distanceInMeters)} else {Log.d("CustomMapStylesExample", "onLoadScene failed: $mapError")}}}

效果图如下:


  大致的使用方法就是这样,其他的几乎类似google地图百度地图等,就不做介绍了,文章内使用到的here的sdk以及自定义的地图资源下载链接考虑到百度网盘可能会丢失,所以放到了csdn上面,需要两积分。
  到此文章结束,有问题欢迎批评指正,觉得不错的也请点个赞,谢谢

Android使用HereMap教程相关推荐

  1. Android WiFi开发教程(三)——WiFi热点数据传输

    在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)--WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...

  2. Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库

    Android基础新手教程--1.5.2 Git之使用GitHub搭建远程仓库 标签(空格分隔): Android基础新手教程 本节引言: 在上一节中.我们学习了怎样使用Git.构建我们的本地仓库.轻 ...

  3. android studio控件使用方法,android studio使用教程

    android studio使用教程 Android Studio是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studi ...

  4. Xamarin Android组件篇教程RecylerView动画组件RecylerViewAnimators(1)

    Xamarin Android组件篇教程RecylerView动画组件RecylerViewAnimators(1) RecyclerView是比ListView和GridView更为强大的布局视图, ...

  5. android oppo 权限,OPPO Reno可尝鲜Android Q:教程如下

    原标题:OPPO Reno可尝鲜Android Q:教程如下 5月8日凌晨,Android Q在谷歌I/O开发者大会上正式亮相.在I/O大会现场,谷歌公布了首批Android Q升级名单,其中OPPO ...

  6. [Android Studio 权威教程]Windows下安装Android Studio

    从AS 0.5版本号開始使用.也是AS的推行者,在ApkBus公布的第一篇Android Studio Perview 2 获得了50K的浏览,1800多条回复下载. 在我的[Android Stud ...

  7. Android新手系列教程(申明:来源于网络)

    Android新手系列教程(申明:来源于网络) 地址:http://blog.csdn.net/column/details/androidcoder666.html 转载于:https://www. ...

  8. android,项目,一些教程

    常用的自定义view和第三方类库 Android快速开发框架,MVP架构 Java无框架实现爬取知乎用户信息.图片和知乎推荐内容并下载到本地或数据库中 让接口和文档见鬼去吧!客户端定义服务端返回JSO ...

  9. linux安装 Android Studio详细教程,支持性较差,需要安装最新底层库内核的linux

    安装 Android Studio详细教程 libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 jdk1.8.0_25 android-st ...

最新文章

  1. 美国一大型数据中心将24h由光伏+储能供电
  2. POPUP_TO_CONFIRM_WITH_MESSAGE
  3. 简明writeStream实现
  4. 1个不为人知的 Jupyter notebook 使用技巧,今天分享出来。
  5. spreedrest
  6. 升级php影响zabbix吗,zabbix2.0升级到zabbix3.0
  7. xenserver 虚拟机扩容lvm磁盘分区的方法_Linux磁盘扩容
  8. 在树莓派是安装并配置NTP服务
  9. 小程序底部弹窗css_微信小程序之animation底部弹窗动画(两种方法)
  10. git钩子放服务器_如何使用Git 钩子来自动化开发和部署任务
  11. 转]最长递增子序列问题的求解
  12. java json字符串转对象
  13. 1.1 波士顿房价预测
  14. Zeppelin求学之路(3)—Zeppelin基本模块介绍和Paragraph源码深入了解以及Note,NoteBook 简介,
  15. 2020年国内 IoT物联网平台横向对比报告
  16. Linux云计算虚拟化-使用rancher搭建k8s集群并发布电商网站
  17. Apache OpenNLP介绍(一)
  18. Android PackageManagerService分析一:PMS的启动
  19. 中控百傲瑞达系统说明书_百傲瑞达一卡通系统.PDF
  20. 教你一招搞定 Homebrew 下载加速!

热门文章

  1. 计算机科学与技术选修课方向,计算机与科学专业主要的课程和学习方向是什么?...
  2. 用ps提取彩色图像的线稿
  3. proe5.0启动失败,光标转了几圈后没有任何反应
  4. 水木-如何解压.iso文件
  5. 嵌入式入门学习笔记2
  6. 什么是RPA? ——业务流程自动化的革命
  7. 基于halcon的二维椭圆测量实例
  8. 图像处理中的 亮度, 灰度, 对比度等概念
  9. Notion 的插件介绍和使用
  10. csv文件用excel打开不分列