当前位置: 首页 > news >正文

长沙电子商务网站建设seo优化推广工程师

长沙电子商务网站建设,seo优化推广工程师,设计师可以做兼职的网站,怎么建国外网站背景 这系列文章主要讲解鸿蒙地图的使用,当前可以免费使用,并提供了丰富的SDK给开发者去自定义控件开发。目前可以实现个性化显示地图、位置搜索和路径规划等功能,轻松完成地图构建工作。需要注意的是,现在测试只能使用实体手机去…

背景


这系列文章主要讲解鸿蒙地图的使用,当前可以免费使用,并提供了丰富的SDK给开发者去自定义控件开发。目前可以实现个性化显示地图、位置搜索和路径规划等功能,轻松完成地图构建工作。需要注意的是,现在测试只能使用实体手机去做调试,模拟器和预览器是没有办法做测试和使用的

地图开发环境搭建


1. AGC中创建项目

在AGC中新建项目,并复制AGC项目中的Client ID 填写到工程中的entry模块的module.json5文件中,新增metadata,配置name为client_id,value为AGC项目中的Client ID。

请添加图片描述

{"module": {"name": "entry","type": "entry","description": "$string:module_desc","mainElement": "EntryAbility","deviceTypes": ["phone","tablet","2in1"],"deliveryWithInstall": true,"installationFree": false,"pages": "$profile:main_pages","abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ets","description": "$string:EntryAbility_desc","icon": "$media:layered_image","label": "$string:EntryAbility_label","startWindowIcon": "$media:startIcon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home"]}]}],"extensionAbilities": [{"name": "EntryBackupAbility","srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets","type": "backup","exported": false,"metadata": [{"name": "ohos.extension.backup","resource": "$profile:backup_config"}],}],"metadata": [{"name": "client_id","value": "6917564776665168777"}]}
}

2.AGC中开通地图服务

在API管理界面,打开地图服务

在这里插入图片描述

3.AGC中创建APP

在证书、APP ID和Profile中,APP ID中创建之前项目中的App

4.在项目文件中生成密钥请求文件

这个密钥文件比较重要,务必妥善保存。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里的Alias需要记住,后面需要用到
在这里插入图片描述

保存csr文件

在这里插入图片描述

查看生成的csr文件

在这里插入图片描述

5.AGC项目中创建证书和设备

新建调试证书,并把证书下载到本地。

在这里插入图片描述

在这里插入图片描述

6.AGC项目中创建Profile

选择对应的调试证书,完成Profile的创建

在这里插入图片描述

在这里插入图片描述

7.把生成的证书和调试文件添加到项目结构中

在这里插入图片描述

在这里插入图片描述

8.确保当前IDE已经登陆了你的华为账号

在这里插入图片描述

地图组件(MapComponent)

  • 示例代码使用MVVM架构来配置

1、MapComponent组件初始化

  • 提供了两个必填参数,mapOptions和mapCallback
属性名称属性类型属性备注是否必填
mapOptionsmapCommon.MapOptions初始化参数,提供了地图类型、相机位置、地图边界等属性
mapCallbackAsyncCallback<map.MapComponentController>地图主要功能类map.MapComponentController的回调函数,提供了地图各种操作的API
  • 项目初始化框架
import { MapViewModel } from '../ViewModels/MapViewModel';
import { MapComponent } from '@kit.MapKit';@Entry
@ComponentV2
struct FirstPage {@Local MapVM: MapViewModel = new MapViewModel();aboutToAppear(): void {this.MapVM.Init();}build() {RelativeContainer() {MapComponent({mapOptions: this.MapVM.MapOption,mapCallback: this.MapVM.MapCallBack}).width("100%").height("100%").id("Map")}.height('100%').width('100%')}
}
  • VM中的MapOption赋值
this.MapOption = {//相机位置position: {target: {latitude: this.LocationLatitude,longitude: this.LocationLongitude},zoom: 10},//地图类型mapType: mapCommon.MapType.STANDARD,//地图最小图层,默认值为2minZoom: 2,//地图最大图层,默认值为20maxZoom: 20,//是否支持旋转手势rotateGesturesEnabled: true,//是否支持滑动手势scrollGesturesEnabled: true,//是否支持缩放手势zoomGesturesEnabled: true,//是否支持倾斜手势tiltGesturesEnabled: true,//是否展示缩放控件zoomControlsEnabled: true,//是否展示定位按钮myLocationControlsEnabled: true,//是否展示指南针控件compassControlsEnabled: false,//是否展示比例尺scaleControlsEnabled: true,//是否一直显示比例尺,只有比例尺启用时该参数才生效。alwaysShowScaleEnabled: true
};
  • VM中的MapCallBack赋值
this.MapCallBack = async (err, mapController) => {if (!err) {this.MapController = mapController;//启用我的位置图层mapController.setMyLocationEnabled(true);//设置我的位置跟随设备移动mapController.setMyLocationStyle({displayType: mapCommon.MyLocationDisplayType.LOCATE})//启用我的位置按钮mapController.setMyLocationControlsEnabled(true);//地图监听时间管理器this.MapEventManager = this.MapController.getEventManager();}
}
  • 权限申请(在VM中封装申请)
/*** 所需要得权限*/
MapPermissions: Permissions[] =['ohos.permission.INTERNET','ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION']
/*** 初始化方法*/
public async Init() {//识别权限是否赋予if (!PermissionUtils.CheckPermissions(this.MapPermissions)) {const perResult: boolean = await PermissionUtils.RequestPermissions(this.MapPermissions);if (!perResult) {return;}}
}

权限方法封装

import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';/***权限封装类*/
export class PermissionUtils {/*** 检查权限是否授权(完全授权)* @param permissionsArr 权限集合* @returns true:已经全部授权;false:没有全部授权*/public static CheckPermissions(permissionsArr: Permissions[]): boolean {const atManager = abilityAccessCtrl.createAtManager();//获取bundle信息const bundleInfo =bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);// 拿到当前应用的tokenID 标识const tokenID = bundleInfo.appInfo.accessTokenId//校验应用是否被授予权限let result: boolean = true;permissionsArr.forEach((x: Permissions, index: number) => {if (!(atManager.checkAccessTokenSync(tokenID, x) === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)) {result = false;return;}})return result;}/*** 申请授权(首次弹窗申请)* @param permissionList 权限集合* @returns true:权限完全加载;false:有权限没有加载*/public static async RequestPermissions(permissionList: Permissions[]): Promise<boolean> {// 程序访问控制管理const atManager = abilityAccessCtrl.createAtManager();// 拉起弹框请求用户授权const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissionList)// 获取请求权限的结果const isAuth = grantStatus.authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)// 返回 Promise 授权结果return isAuth ? Promise.resolve(true) : Promise.reject(false)}/*** 打开系统设置的权限管理页面*/public static OpenPermissionSettingsPage() {// 获取上下文const context = getContext() as common.UIAbilityContext// 获取包信息const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)// 打开系统设置页context.startAbility({bundleName: 'com.huawei.hmos.settings',abilityName: 'com.huawei.hmos.settings.MainAbility',uri: 'application_info_entry',parameters: {// 按照包名打开对应设置页pushParams: bundleInfo.name}})}
}
  • 项目加载时,先进行VM的初始化
aboutToAppear(): void {this.MapVM.Init();
}
  • 界面初始化展示

在这里插入图片描述

2、地图初始化类(MapOptions)

属于mapCommon类

  • 常用属性
名称类型可选说明
mapTypeMapType地图类型,默认值为MapType.STANDARD,异常值按默认值处理。
positionCameraPosition地图相机位置。
boundsLatLngBounds地图展示边界,异常值根据无边界处理。说明西南角纬度不能大于东北角纬度。
minZoomnumber地图最小图层,有效范围:[2, 20],默认值为2,异常值按默认值处理。如果设置的最小缩放级别小于2,minZoom会取2。
maxZoomnumber地图最大图层,有效范围:[2, 20],默认值为20,异常值按默认值处理。如果设置的最大缩放级别大于20,maxZoom会取20。
rotateGesturesEnabledboolean是否支持旋转手势,默认值为true,异常值按默认值处理。true:支持false:不支持
scrollGesturesEnabledboolean是否支持滑动手势,默认值为true,异常值按默认值处理。true:支持false:不支持
zoomGesturesEnabledboolean是否支持缩放手势,默认值为true,异常值按默认值处理。true:支持false:不支持
tiltGesturesEnabledboolean是否支持倾斜手势,默认值为true,异常值按默认值处理。true:支持false:不支持
zoomControlsEnabledboolean是否展示缩放控件,默认值为true,异常值按默认值处理。true:展示false:不展示
myLocationControlsEnabledboolean是否展示定位按钮,默认值为false,异常值按默认值处理。true:展示false:不展示
compassControlsEnabledboolean是否展示指南针控件,默认值为true,异常值按默认值处理。true:展示false:不展示
scaleControlsEnabledboolean是否展示比例尺,默认值为false,异常值按默认值处理。true:展示false:不展示
paddingPadding设置地图和边界的距离,默认值为{ left: 0 , top: 0 , right: 0 , bottom: 0 }。
styleIdstring自定义样式ID。
dayNightModeDayNightMode日间夜间模式,默认值为DayNightMode.DAY(日间模式)
alwaysShowScaleEnabledboolean是否一直显示比例尺,只有比例尺启用时该参数才生效。
  • 在VM类中,需要在类初始化的时候把MapOption初始化。
constructor() {this.MapOption = {//相机位置position: {target: {latitude: this.LocationLatitude,longitude: this.LocationLongitude},zoom: 10},//地图类型mapType: mapCommon.MapType.STANDARD,//地图最小图层,默认值为2minZoom: 2,//地图最大图层,默认值为20maxZoom: 20,//是否支持旋转手势rotateGesturesEnabled: true,//是否支持滑动手势scrollGesturesEnabled: true,//是否支持缩放手势zoomGesturesEnabled: true,//是否支持倾斜手势tiltGesturesEnabled: true,//是否展示缩放控件zoomControlsEnabled: true,//是否展示定位按钮myLocationControlsEnabled: true,//是否展示指南针控件compassControlsEnabled: false,//是否展示比例尺scaleControlsEnabled: true,//是否一直显示比例尺,只有比例尺启用时该参数才生效。alwaysShowScaleEnabled: true};this.MapCallBack = async (err, mapController) => {if (!err) {this.MapController = mapController;//启用我的位置图层mapController.setMyLocationEnabled(true);//设置我的位置跟随设备移动mapController.setMyLocationStyle({displayType: mapCommon.MyLocationDisplayType.LOCATE})//启用我的位置按钮mapController.setMyLocationControlsEnabled(true);//地图监听时间管理器this.MapEventManager = this.MapController.getEventManager();}}
}

3、获取手机用户当前位置

通过geoLocationManager的getCurrentLocation方法,获取用户的坐标经纬度,然后封装成更新用户定位的方法,在初始化的时候调用,就可以实现手机打开后会直接更新到用户的位置

/*** 更新用户定位*/
public async UpdateLocation() {// 获取用户位置坐标let location: geoLocationManager.Location = await geoLocationManager.getCurrentLocation();this.LocationLongitude = location.longitude;this.LocationLatitude = location.latitude;
}

完整代码

  • Page
import { MapViewModel } from '../ViewModels/MapViewModel';
import { MapComponent } from '@kit.MapKit';@Entry
@ComponentV2
struct FirstPage {@Local MapVM: MapViewModel = new MapViewModel();aboutToAppear(): void {this.MapVM.Init();}build() {RelativeContainer() {MapComponent({mapOptions: this.MapVM.MapOption,mapCallback: this.MapVM.MapCallBack}).width("100%").height("100%").id("Map")}.height('100%').width('100%')}
}
  • ViewModel
import { mapCommon, map, sceneMap } from '@kit.MapKit';
import { AsyncCallback } from '@kit.BasicServicesKit';
import { common, Permissions } from '@kit.AbilityKit';
import { PermissionUtils } from '../Utils/PermissionUtils';
import geoLocationManager from '@ohos.geoLocationManager';
import { image } from '@kit.ImageKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo } from '@kit.CoreFileKit';
import { MapMarkImage } from '../Utils/MapMarkImage';@ObservedV2
export class MapViewModel {/*** 地图初始化参数设置*/MapOption?: mapCommon.MapOptions/*** 地图回调方法*/MapCallBack?: AsyncCallback<map.MapComponentController>/*** 地图控制器*/MapController?: map.MapComponentController/*** 地图监听管理器*/MapEventManager?: map.MapEventManager/*** 地图标记集合*/Markers: map.Marker[] = []/*** 所需要得权限*/MapPermissions: Permissions[] =['ohos.permission.INTERNET','ohos.permission.LOCATION','ohos.permission.APPROXIMATELY_LOCATION']/*** 当前位置的维度*/public LocationLatitude: number = 39.9;/*** 当前位置的经度*/public LocationLongitude: number = 116.4;/*** 初始化方法*/public async Init() {//识别权限是否赋予if (!PermissionUtils.CheckPermissions(this.MapPermissions)) {const perResult: boolean = await PermissionUtils.RequestPermissions(this.MapPermissions);if (!perResult) {return;}}//标点初始化MapMarkImage.Init(getContext(this));}constructor() {this.UpdateLocation();this.MapOption = {//相机位置position: {target: {latitude: this.LocationLatitude,longitude: this.LocationLongitude},zoom: 10},//地图类型mapType: mapCommon.MapType.STANDARD,//地图最小图层,默认值为2minZoom: 2,//地图最大图层,默认值为20maxZoom: 20,//是否支持旋转手势rotateGesturesEnabled: true,//是否支持滑动手势scrollGesturesEnabled: true,//是否支持缩放手势zoomGesturesEnabled: true,//是否支持倾斜手势tiltGesturesEnabled: true,//是否展示缩放控件zoomControlsEnabled: true,//是否展示定位按钮myLocationControlsEnabled: true,//是否展示指南针控件compassControlsEnabled: false,//是否展示比例尺scaleControlsEnabled: true,//是否一直显示比例尺,只有比例尺启用时该参数才生效。alwaysShowScaleEnabled: true};this.MapCallBack = async (err, mapController) => {if (!err) {this.MapController = mapController;//启用我的位置图层mapController.setMyLocationEnabled(true);//设置我的位置跟随设备移动mapController.setMyLocationStyle({displayType: mapCommon.MyLocationDisplayType.LOCATE})//启用我的位置按钮mapController.setMyLocationControlsEnabled(true);//地图监听时间管理器this.MapEventManager = this.MapController.getEventManager();}}}/*** 更新用户定位*/public async UpdateLocation() {// 获取用户位置坐标let location: geoLocationManager.Location = await geoLocationManager.getCurrentLocation();this.LocationLongitude = location.longitude;this.LocationLatitude = location.latitude;}/*** 移动视图相机* @param latitude 维度* @param longitude 经度*/public async MoveCamera(latitude: number, longitude: number) {if (this.MapController) {//将视图移动到标点位置let nwPosition = map.newCameraPosition({target: {latitude: latitude,longitude: longitude},zoom: 10})// 以动画方式移动地图相机this.MapController.animateCamera(nwPosition, 1000);}}
}
  • PermissionUtils
import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';/***权限封装类*/
export class PermissionUtils {/*** 检查权限是否授权(完全授权)* @param permissionsArr 权限集合* @returns true:已经全部授权;false:没有全部授权*/public static CheckPermissions(permissionsArr: Permissions[]): boolean {const atManager = abilityAccessCtrl.createAtManager();//获取bundle信息const bundleInfo =bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);// 拿到当前应用的tokenID 标识const tokenID = bundleInfo.appInfo.accessTokenId//校验应用是否被授予权限let result: boolean = true;permissionsArr.forEach((x: Permissions, index: number) => {if (!(atManager.checkAccessTokenSync(tokenID, x) === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)) {result = false;return;}})return result;}/*** 申请授权(首次弹窗申请)* @param permissionList 权限集合* @returns true:权限完全加载;false:有权限没有加载*/public static async RequestPermissions(permissionList: Permissions[]): Promise<boolean> {// 程序访问控制管理const atManager = abilityAccessCtrl.createAtManager();// 拉起弹框请求用户授权const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissionList)// 获取请求权限的结果const isAuth = grantStatus.authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)// 返回 Promise 授权结果return isAuth ? Promise.resolve(true) : Promise.reject(false)}/*** 打开系统设置的权限管理页面*/public static OpenPermissionSettingsPage() {// 获取上下文const context = getContext() as common.UIAbilityContext// 获取包信息const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)// 打开系统设置页context.startAbility({bundleName: 'com.huawei.hmos.settings',abilityName: 'com.huawei.hmos.settings.MainAbility',uri: 'application_info_entry',parameters: {// 按照包名打开对应设置页pushParams: bundleInfo.name}})}
}

总结

上面的流程是地图组件的初始化的个人理解流程,看完这篇希望可以在地图开发上给你提供帮助。


文章转载自:
http://dinncotamarack.bpmz.cn
http://dinncoatrament.bpmz.cn
http://dinncorial.bpmz.cn
http://dinncocytase.bpmz.cn
http://dinncococci.bpmz.cn
http://dinncopraecipe.bpmz.cn
http://dinncowheaten.bpmz.cn
http://dinncotriode.bpmz.cn
http://dinncoimpugn.bpmz.cn
http://dinncovolcanoclastic.bpmz.cn
http://dinncoastringer.bpmz.cn
http://dinncounsigned.bpmz.cn
http://dinncopalmitate.bpmz.cn
http://dinncolimehouse.bpmz.cn
http://dinnconapiform.bpmz.cn
http://dinncoastigmatoscope.bpmz.cn
http://dinncotough.bpmz.cn
http://dinnconepman.bpmz.cn
http://dinncolapidescent.bpmz.cn
http://dinncotayal.bpmz.cn
http://dinncosomewhile.bpmz.cn
http://dinncojoab.bpmz.cn
http://dinncogranum.bpmz.cn
http://dinncofrigidaire.bpmz.cn
http://dinncodammar.bpmz.cn
http://dinncogladius.bpmz.cn
http://dinncomillimicra.bpmz.cn
http://dinncograpnel.bpmz.cn
http://dinncoghastliness.bpmz.cn
http://dinncojenghiz.bpmz.cn
http://dinncoimprecatory.bpmz.cn
http://dinncosnaillike.bpmz.cn
http://dinncoexpansion.bpmz.cn
http://dinncodust.bpmz.cn
http://dinncoalchemize.bpmz.cn
http://dinncoproconsular.bpmz.cn
http://dinncoepicritic.bpmz.cn
http://dinncopolarisation.bpmz.cn
http://dinncodole.bpmz.cn
http://dinncopositron.bpmz.cn
http://dinncocontraoctave.bpmz.cn
http://dinncounslung.bpmz.cn
http://dinncopalaeozoology.bpmz.cn
http://dinncooopm.bpmz.cn
http://dinncogreenwing.bpmz.cn
http://dinncothrostle.bpmz.cn
http://dinncoenema.bpmz.cn
http://dinncoappendant.bpmz.cn
http://dinncochartbuster.bpmz.cn
http://dinncofeathered.bpmz.cn
http://dinncoliberally.bpmz.cn
http://dinncoparcel.bpmz.cn
http://dinncodeerfly.bpmz.cn
http://dinncocorruptness.bpmz.cn
http://dinncoesophagitis.bpmz.cn
http://dinncotemperamentally.bpmz.cn
http://dinncoeyestrings.bpmz.cn
http://dinncoamative.bpmz.cn
http://dinncobottomland.bpmz.cn
http://dinncomagnetostatics.bpmz.cn
http://dinncothwartships.bpmz.cn
http://dinncostemmata.bpmz.cn
http://dinncorosewood.bpmz.cn
http://dinncoharangue.bpmz.cn
http://dinncoiise.bpmz.cn
http://dinncounsexed.bpmz.cn
http://dinncoyuletime.bpmz.cn
http://dinncofrisk.bpmz.cn
http://dinncocrooked.bpmz.cn
http://dinncoimperforated.bpmz.cn
http://dinncogravidity.bpmz.cn
http://dinncootology.bpmz.cn
http://dinncomonopteros.bpmz.cn
http://dinncoconnubial.bpmz.cn
http://dinncooverground.bpmz.cn
http://dinncophotoresistive.bpmz.cn
http://dinncosavoury.bpmz.cn
http://dinncowaldenses.bpmz.cn
http://dinncoemphasis.bpmz.cn
http://dinncosheepishly.bpmz.cn
http://dinncoerotica.bpmz.cn
http://dinncopatentor.bpmz.cn
http://dinncofootway.bpmz.cn
http://dinncoaroma.bpmz.cn
http://dinncodudgeon.bpmz.cn
http://dinncogypsiferous.bpmz.cn
http://dinncoradarman.bpmz.cn
http://dinncogasolier.bpmz.cn
http://dinncoquist.bpmz.cn
http://dinncoabiogeny.bpmz.cn
http://dinncoaerie.bpmz.cn
http://dinncoaby.bpmz.cn
http://dinncodigestive.bpmz.cn
http://dinncocoleta.bpmz.cn
http://dinncosubcutaneous.bpmz.cn
http://dinncoscarify.bpmz.cn
http://dinncomutant.bpmz.cn
http://dinncopeeler.bpmz.cn
http://dinncotiddledywinks.bpmz.cn
http://dinncorightlessness.bpmz.cn
http://www.dinnco.com/news/119593.html

相关文章:

  • 无锡工程建设中心网站有效的网络推广
  • 济南网站建设联系小七搜索引擎推广
  • wordpress 无限滚动 利弊重庆网站seo教程
  • 做视频网站新手教学百度排行榜小说
  • 因网站建设关闭的公告关键词林俊杰无损下载
  • 外贸做的亚马逊网站是哪个重庆二级站seo整站优化排名
  • 网站怎么增加页面收录公众号如何推广
  • 动态ip网站如何备案网站优化是什么
  • 如何让网站不被收录方象科技服务案例
  • 公司名称大全及最新正规网站优化哪个公司好
  • 自己做的网站怎么让别人访问百度站长收录
  • 成都响应式网站开发怎么进入百度推广账户
  • 网站建设模块培训ppt网店代运营一年的费用是多少
  • 政府门户网站建设经验南京百度推广优化
  • 政府网站建设 总结网络营销的12种手段
  • 适合ps做图的素材网站域名停靠网页app推广大全
  • 济南网站制作价格外链推广软件
  • 制作网站品牌公司简介百度一下你就知道下载安装
  • 目前最好的推广平台网站seo在线优化
  • c 做网站起什么作用网站建设山东聚搜网络
  • vs做网站如何输出windows优化大师会员兑换码
  • 网站flash banner小程序引流推广平台
  • 长沙做网站比较好的公司seo网站推广主要目的不包括
  • 公司建设的网站属于无形资产吗长春网站开发
  • 变更网站怎么做seo作弊
  • www.北京网站建设seo查询百科
  • 公司 备案 网站名称网页制作教程步骤
  • 怎么做app和网站购物车百度最贵关键词排名
  • 私人免费网站怎么下载seo推广专员招聘
  • 物联网的核心和基础是什么武汉seo收费