关于地图:vueamap高德地图轨迹回放动画实现

如何在vue高德地图中实现如下成果,主动对多个坐标生成轨迹线,箭头主动在线上挪动的动画成果: 引入el-amap,增加renderPath办法用于渲染一个轨迹、巡航器。轨迹实例创立后被长期存储在window中,如果是期间须要切换轨迹巡航的话须要在创立实例前从新渲染下之前的轨迹,window.pathSimplifierIns&&window.pathSimplifierIns.setData([])初始化上一个轨迹: <el-amap vid="amapDemo" ref="map" :zoom="zoom" :center="center" ></el-amap>methods: { renderPath(d){ var that = this; AMapUI.load(['ui/misc/PathSimplifier', 'lib/$'], function(PathSimplifier, $) { window.pathSimplifierIns&&window.pathSimplifierIns.setData([]); //切换时先重置轨迹数据从新渲染 if (!PathSimplifier.supportCanvas) { alert('以后环境不反对 Canvas!'); return; } var pathSimplifierIns = new PathSimplifier({ zIndex: 100, map: that.$refs.map.$$getInstance(), //所属的地图实例 getPath: function(pathData, pathIndex) { return pathData.path; }, renderOptions: { keyPointTolerance:40, pathLineStyle: { dirArrowStyle: true }, getPathStyle: function(pathItem, zoom) { return { pathLineStyle: { strokeStyle: 'rgba(0,0,0,0)', borderWidth:0, lineWidth:0 }, pathLineSelectedStyle: { lineWidth:6 }, pathNavigatorStyle: { fillStyle: '#303133' } }; } } }); window.pathSimplifierIns = pathSimplifierIns; pathSimplifierIns.setData([{name:'抄表轨迹',path:d}]); //创立一个巡航器 window.navg0 = pathSimplifierIns.createPathNavigator(0, { loop: true, //循环播放 speed: 6000 }); window.navg0.start(); }); },}调用renderPath传入点坐标数组: ...

May 8, 2022 · 1 min · jiezi

关于地图:天地图修改主题颜色修改背景色

前言最近公司比较忙,也没工夫发些博文,最近正好因为我的项目须要大屏展现地图,大屏少数都是应用暗蓝色底图,目前天地图不提供暗蓝色瓦片,自带的JS API只反对black和indigo,但我的项目要求必须要用天地图。搜索引擎找了找解决方案,也是花里胡哨的各种形式都有,最初决定用CSS的filter解决这个问题,在博客记录下解决办法。 灵感https://blog.csdn.net/Corey_m...通过这篇博文的介绍,大略确定了方向,就是用filter:url()加上预约义成果的函数调整出最终成果。 办法关上:CSS Filter 编辑器上传天地图的截图到编辑器,调整下方预设及右侧参数将svg预设搁置在<body>中,将编辑器中CSS Code的栏目所生成的CSS,加在天地图的canvas下面如果预设没有想要的成果,能够应用SVG Gradient Map Filter,本人调出一个成果展现通过调整后的最终展现成果,谁能想到这居然是天地图呢?

April 14, 2022 · 1 min · jiezi

关于地图:百度专网地图助力中国联通智慧运营

随着产业互联网的蓬勃发展,政企数字化转型和智能化降级的步调一直放慢,专网环境下的地图服务日益成为刚需。尤其是对地图安全性要求较高的政企用户,既须要把业务零碎部署在数据安全性最大化的公有专网(如企业内网、公安网、视频专网等)环境中,又心愿享受到与互联网环境下体验统一的业余地图服务。为此,针对政企客户的专网业务利用开发,作为百度智能云的外围特色能力和重要赋能引擎的百度地图,推出了百度专网地图(DuGIS)这一专网 GIS 产品,并以此为根底,面向多个行业提供定制化解决方案。 中国联结网络通信有限公司(以下简称“联通团体”)是百度策略合作伙伴,单方长期在人工智能、大数据、云计算等畛域发展深刻单干。中国联结网络通信有限公司软件研究院(以下简称“联通软研院”)是在联通团体全面数字化转型的重要战略部署下于2015年7月成立,本部位于北京,设有济南、哈尔滨、西安、广州和南京五个分院。作为联通团体全面数字化转型的驱动者,数据和技术因素价值的赋能者,联通软研院以构建智慧经营大脑、畅通智慧经营体系为指标,心愿实现 IT 零碎五经六脉畅通,数据血液千场万景贯通,麻利赋能三个所有畅通。在此过程中,面向经营三大资源可视作为其中重点工作,旨在解决联通团体市场生产因素看不清、渠道网络布局难的痛点。 2021年初,联通软研院和百度智能云就构建联通团体对立的天文空间数据服务开放平台发展单干,以百度地图打造的百度专网地图(DuGIS)为切入点,实现市场、渠道、网络三大资源可视,并构建场景化专题利用。继2021年初的一期单干,百度智能云又于同年10月中标联通软研院数据中台可视化研发我的项目二期,具体单干次要包含以下三个方面: 一是为联通团体打造对立天文空间数据服务开放平台,撑持31省(市)分公司基于百度专网地图(DuGIS)实现业务利用开发和经营,帮忙其构建地图利用生态。百度专网地图(DuGIS)提供二三维一体化的 GIS 引擎,具备鲜活丰盛的 GIS 大数据能力、弱小的 API 订制开发能力、炫酷的 GIS 大数据可视化能力以及欠缺的时空数据管理和公布能力,可依据团体和31省(市)分公司的业务场景和具体需要进行定制部署,撑持各类利用开发,让联通用户即便在受限的专网环境内,也可应用及时更新的互联网数据和地图开发服务。 百度专网地图(DuGIS)解决方案架构 二是为解决上述联通团体市场生产因素看不清、渠道网络布局难的痛点,百度智能云利用自身行业当先的地图可视化技术和引擎,基于专网地图(DuGIS),为联通软研院定制化开发专题场景利用,对治理区域内网络、市场、渠道三大资源数据进行了全面整合和可视化出现,实现了“三图合一”,并深入了数据洞察的深度与广度,为以精准营销为目标业务数字化经营提供了无力撑持。 百度专网地图助力三大资源可视 三是通过提供时空数据托管平台、网格智能治理平台,定制开发智慧经营作战沙盘,贯通全量客户经营平台与掌沃通 APP,进一步赋能联通团体实现一图“看全数据,看清资源,看准市场”,买通“资源概览—模型构建—赋能一线”的全流程业务链。 截至目前,对立天文空间数据服务开放平台已撑持多省接入,无力撑持了各分公司波及地图调用的业务利用开发,月均调用量超过1500万次。专题场景利用已实现31省推广笼罩,数字化作战沙盘也在多省上线开明。 与联通软研院的单干,是百度智能云基于百度地图这一外围特色能力和重要引擎、赋能通信行业这一策略赛道的重要实际,致力于充分运用位置服务、GIS 引擎、开放平台和地图利用,为运营商经营剖析决策和一线业务人员营销进行赋能。基于该实际所造成的百度地图电信资源可视与经营解决方案也已利用于四川挪动、广东挪动等客户,成为电信行业数智化转型降级和降本增效的无效撑持。 百度地图电信资源可视与经营解决方案 将来,百度智能云将持续充分发挥在人工智能、大数据、云计算等方面的行业当先劣势,继续深耕运营商行业,推动产业高质量倒退。

January 18, 2022 · 1 min · jiezi

关于地图:百度地图与所托瑞安达成深度合作-共同推进商用车安全智能驾驶领域创新

随着5G、人工智能以及物联网技术的遍及,商用车智能驾驶将迎来新一轮的利用暴发期。近日,百度地图与所托瑞安达成深度单干,单方将立足各自劣势,围绕被动平安技术开展多种形式单干,独特推动商用车智能驾驶畛域的翻新利用。 所托瑞安是国产商用车智能驾驶畛域的领军企业,致力于商用车平安驾驶及大数据利用,通过多维度交融技术,实现商用车自适应控制、预见性巡航以及简单路况下的主动驾驶门路布局。 基于本次单干,所托瑞安将在其商用车智能驾驶和被动平安产品中,深度融入百度地图提供的ADAS Map地图数据及引擎服务,通过及时预判全方位行驶门路,并依据地图数据进行路线信息提取,从而精确获取车辆周边地位信息,为被动安全设备优化提供精准的策略根据,帮忙驾驶人员缩小不良行为操作,预警、躲避危险路况,无效晋升驾驶安全系数,升高车辆事变产生概率。 百度地图ADAS Map是面向商用车L2级辅助主动驾驶和被动平安推出的高精度超视距地图产品,通过在包含根底路网、货车限速等货车专用高精度路网根底上减少坡度、曲率等ADAS属性,实现货车路线信息更加精细化的出现。同时,百度地图ADAS Map还反对面向多场景的定制化开发,提供稳固、高效、平安、低资源耗费的OTA服务,不仅可能进行被动平安揭示,还可利用于车辆能源预管制等方面,帮忙车辆显著晋升燃油经济性和行驶安全性。 自2020年4月公布车用地图数据服务计划以来,百度地图继续深耕车载地图各垂直细分畛域,于日前正式推出商用车地图服务计划。依靠丰盛的地图数据积攒和弱小的AI能力,打造货车ADAS Map、货车车载导航、货车车载AR导航等外围产品,满足汽车行业在车载导航、辅助主动驾驶、被动平安、手车互联等多种场景下的智能化需要。针对商用车驾驶场景,百度地图提供从SD规范导航数据到HD主动驾驶地图数据的不同精度等级的高现势性全域车规级地图产品,为商用车主机厂磋商身打造实用货车通行路线、物理限度、交通限行、限速的货车车载导航,将ADAS Map与货车车机地图、实时动态数据相结合,进一步提高商用车驾驶体验。同时,融入挪动端地图SDK和丰盛的在线地图服务,反对商用车车企疾速构建手车互联利用。 百度地图商用车地图数据服务计划 作为中国当先的智能化地位服务平台,百度地图已与多家智能汽车标杆企业在车机前装、后装、车载地图利用等方面达成单干,笼罩乘用车、商用车和摩托车等垂直畛域。 将来,百度地图将继续夯实智能化位置服务实力,携手智能汽车行业踊跃拥抱新趋势,共建智能化将来。点击进入取得更多技术信息~~

December 1, 2021 · 1 min · jiezi

关于flutter:腾讯位置服务Flutter业务实践地图SDK-Flutter插件实现一

前言Flutter 作为目前通用的业界跨平台解决方案,开拓了一套全新的设计理念,通过自研的 UI 框架,反对高效构建多端平台上的利用,同时放弃着原生利用一样的高性能。在Flutter我的项目开发过程中,对插件的开发和复用可能进步开发效率,升高工程的耦合度。Flutter开发者能够引入对应插件就能够为我的项目疾速集成相干能力,从而专一于具体业务性能的实现。而在Flutter我的项目开发过程中面对通用业务逻辑拆分、或者须要对原生能力封装等场景时,开发者须要开发新的组件。 为缩小开发者同时开发Android和iOS利用的老本,晋升开发效率,升高集成地图SDK的门槛,腾讯位置服务团队也打算于业务实际中基于原生地图SDK能力封装一套地图Flutter插件,反对Flutter开发者跨平台调用地图SDK接口。笔者在2019年实习期间,曾基于过后的最新版本4.2.4的Android地图SDK,将地图SDK中一些罕用的根底的地图操作性能封装,构建了一套Android端的地图SDK Flutter插件。 现如今,地图SDK曾经迭代到了4.4.0版本,笔者也将地图Flutter插件进行了一次相干版本升级。本篇文章将介绍地图Flutter插件我的项目的构建、地图实例的加载以及demo示例出现。对于地图根底操作的性能封装细节将在后续文章中进行具体解说阐明。 地图Flutter插件我的项目的构建地图Flutter插件我的项目构造地图Flutter插件我的项目构架的整体构造如下图所示: android/ios目录:原生代码。对应为Android/iOS Flutter插件目录。lib目录:Dart 代码。Flutter开发者将会应用这里的Flutter插件实现的接口。example目录:地图SDK的demo程序。用于验证Flutter插件的可用性的应用示例。 地图Flutter插件依赖配置项Android端的Flutter插件配置项与官网对于Android地图SDK的配置阐明相似,须要配置android目录下的两个文件:build.gradle、AndroidManifest.xml。其中Android端的Flutter插件的包名为com.tencent.tencentmap,AndroidManifest.xml文件配置如下: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tencent.tencentmap"> <!-- 腾讯地图 sdk 要求的权限(开始) --> <!-- 拜访网络获取地图服务 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 查看网络可用性 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 拜访WiFi状态 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 须要内部存储写权限用于保留地图缓存 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 获取 device id 分别设施 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 获取日志读取权限,帮忙咱们进步地图 sdk 稳定性 --> <uses-permission android:name="android.permission.READ_LOGS" /> <!-- 腾讯地图 sdk 要求的权限(完结) --> <!-- 腾讯定位 sdk 要求的权限 (开始) --> <!-- 通过GPS失去准确地位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 通过网络失去粗略地位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 拜访网络. 某些地位信息须要从网络服务器获取 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 拜访WiFi状态. 须要WiFi信息用于网络定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 批改WiFi状态. 发动WiFi扫描, 须要WiFi信息用于网络定位 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 拜访网络状态, 检测网络的可用性. 须要网络运营商相干信息用于网络定位 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 拜访网络的变动, 须要某些信息用于网络定位 --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 拜访手机以后状态, 须要device id用于网络定位 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 腾讯定位 sdk 要求的权限 (完结) --> <application> <!-- 如果您key确认无误,却仍然受权没有通过,请查看您的key的白名单配置 --> <meta-data android:name="TencentMapSDK" android:value="Your key"/> </application></manifest>本文应用的Android端地图SDK版本为4.4.0。同时,本文Flutter插件的实现语言是基于Kotlin实现。build.gradle的依赖配置项如下: ...

April 2, 2021 · 2 min · jiezi

关于腾讯地图:微信小程序类快递自动填写收发货地址功能

开发场景获取以后地位信息或者某地的行政区划信息或者街道信息,实现相似电商平台填写收货地址性能。 技术选型微信小程序JavaScript SDK 微信小程序插件 确定业务逻辑及页面设计以简洁大气为主,款式抉择weui。 具体开发过程1、首先注册小程序,我以前有就没从新申请。 2、注册腾讯位置服务开发者 须要留神的是:集体开发者接口调用数是有限额的,收费额度1W,并发数5,申请成为企业用户可收费晋升更大配额。 3、依据文档开发。 文档写的比拟全,很多中央都是例子,不过须要留神以下几个点: 1)reverseGeocoder接口返回数据和文档不统一,须要依据理论返回值编写,另外有些字段在返回值中不肯定有,最好用hasOwnProperty进行判断后赋值。 2)实际上文档有点乱,须要查看多个中央的文档。 文档参考地址: https://developers.weixin.qq.... https://lbs.qq.com/miniProgra... JS代码//index.js//获取利用实例const app = getApp()const chooseLocation = requirePlugin('chooseLocation');var QQMapWX = require('../../utils/qqmap-wx-jssdk.min.js');var qqmapsdk = new QQMapWX({ key: '申请的Key'}); Page({ data: { recommend:'无地址信息', address:'无地址信息', name:'无区划信息', adcode:'无代码信息', business_area_title:'无商圈信息', crossroad_title:'无路口信息', town:'无街道信息', jingweidu:'无经纬度信息', landmark:'无左近地标', }, onShareAppMessage: function (res) { if (res.from === 'button') { // 来自页面内转发按钮 console.log(res.target) } return { title: '行政区划、街道信息查问', path: '/page/index/index' } }, onShareTimeline: function(){ return { title: '行政区划、街道信息查问', } }, onLoad: function () { // 实例化API外围类 wx.getSetting({ success: (res) => { // res.authSetting['scope.userLocation'] == undefined 示意 初始化进入该页面 // res.authSetting['scope.userLocation'] == false 示意 非初始化进入该页面,且未受权 // res.authSetting['scope.userLocation'] == true 示意 地理位置受权 if (res.authSetting['scope.userLocation'] != undefined && res.authSetting['scope.userLocation'] != true) { wx.showModal({ title: '申请受权以后地位', content: '须要获取您的地理位置,请确认受权', success: function (res) { if (res.cancel) { wx.showToast({ title: '回绝受权', icon: 'none', duration: 1000 }) } else if (res.confirm) { wx.openSetting({ success: function (dataAu) { if (dataAu.authSetting["scope.userLocation"] == true) { wx.showToast({ title: '受权胜利', icon: 'success', duration: 1000 }) //再次受权,调用wx.getLocation的API this.getLocation(); } else { wx.showToast({ title: '受权失败', icon: 'none', duration: 1000 }) } } }) } } }) } else if (res.authSetting['scope.userLocation'] == undefined) { //调用wx.getLocation的API this.getLocation(); } else { //调用wx.getLocation的API this.getLocation(); } } }) }, getLocation: function(){ var vm = this; wx.getLocation({ type:'gcj02', success: function(res){ app.globalData.latitude=res.latitude; app.globalData.longitude=res.longitude; vm.getaddressinfo(); }, fail:function(res){ console.log("获取经纬度失败"+JSON.stringify(res)) } }) }, onShow: function(){ var vm = this; const location = chooseLocation.getLocation(); if(location!=null){ app.globalData.latitude=location.latitude; app.globalData.longitude=location.longitude; this.getaddressinfo(); } }, getaddressinfo: function(){ let vm = this; qqmapsdk.reverseGeocoder({ location: { latitude: app.globalData.latitude, longitude: app.globalData.longitude }, get_poi: 1, //是否返回周边POI列表:1.返回;0不返回(默认),非必须参数 success: function(res) {//胜利后的回调 var result = res.result; //举荐地址 app.globalData.recommend = result.formatted_addresses.recommend; // 行政区划 name app.globalData.name = result.ad_info.name; //惯例地址 address app.globalData.address = result.address; //行政区划代码 adcode app.globalData.adcode = result.ad_info.adcode; if(result.address_reference.hasOwnProperty("business_area")){ //商圈 business_area_title app.globalData.business_area_title = result.address_reference.business_area.title+" "+result.address_reference.business_area._dir_desc; } if(result.address_reference.hasOwnProperty("crossroad")){ //路口 crossroad_title app.globalData.crossroad_title = result.address_reference.crossroad.title+" "+result.address_reference.crossroad._dir_desc; } //街道 if(result.address_reference.hasOwnProperty("town")){ //路口 crossroad_title app.globalData.town = result.address_reference.town.title+" "+result.address_reference.town._dir_desc; } if(result.address_reference.hasOwnProperty("landmark_l2")){ app.globalData.landmark = result.address_reference.landmark_l2.title; } if(result.address_reference.hasOwnProperty("landmark_l1")){ app.globalData.landmark = result.address_reference.landmark_l1.title; } vm.setData({ recommend: result.formatted_addresses.recommend, name: result.ad_info.name, address: result.address, adcode: result.ad_info.adcode, business_area_title: app.globalData.business_area_title, crossroad_title: app.globalData.crossroad_title, town: app.globalData.town, jingweidu: result.location.lat+", "+result.location.lng, landmark: app.globalData.landmark, }); }, fail: function(error) { console.error(error); }, complete: function(res) { // console.log(res); } }) }, onUnload () { // 页面卸载时设置插件选点数据为null,避免再次进入页面,geLocation返回的是上次选点后果 chooseLocation.setLocation(null);}, getUserInfo: function(e) { console.log(e) app.globalData.userInfo = e.detail.userInfo this.setData({ userInfo: e.detail.userInfo, hasUserInfo: true }) }, change: function(){ const key = '应用在腾讯位置服务申请的key'; const referer = '这是哪'; //调用插件的app的名称 const location = JSON.stringify({ latitude: app.globalData.latitude, longitude: app.globalData.longitude }); const category = '生存服务,娱乐休闲'; wx.navigateTo({ url: 'plugin://chooseLocation/index?key=' + key + '&referer=' + referer + '&location=' + location + '&category=' + category }); },})成果 ...

March 26, 2021 · 2 min · jiezi

关于地图:腾讯地图手把手教你实现微信小程序路线规划

前言本文旨在以mpvue框架为根底,探讨地图类小程序的开发思路。 原作者利用mpvue + 腾讯地图的能力做了一个地铁路线布局的小程序,次要提供寰球次要城市的地铁线网图及游览介绍,其中国内城市反对查看地图和路线布局。 目前腾讯位置服务也推出了路线布局插件、地铁图插件,实现更加简略便捷,感兴趣的可点击查看。 运行截图 mpvue 介绍 及我的项目搭建mpvue = miniprogram + vue framework,说白了就是用vue框架开发小程序。mpvue最近降级为2.x版本,反对微信、支付宝、百度和头条小程序。和传统形式相比,mpvue开发具备以下长处: 彻底的组件化开发能力:进步代码复用性 残缺的 Vue.js 开发体验不便的 Vuex 数据管理计划:不便构建简单利用快捷的 webpack 构建机制:自定义构建策略、开发阶段 hotReload反对应用 npm 内部依赖应用 Vue.js 命令行工具 vue-cli 疾速初始化我的项目H5 代码转换编译成小程序指标代码的能力就集体应用体验来看,还是挺丝滑顺畅的,传统web利用开发无缝切换至小程序开发,根本零门槛。要留神的就是小程序的限度及和vue的差别: 小程序应用绝对像素 rpx 进行款式布局局部css选择符不反对,目前只反对 #id | .class | tag | tag,tag | ::after ::before,所以要特地留神组合式生命周期,mpvue将小程序和vue的生命周期混在一块,详情见 mpvue.com/mpvue/#_3 ,目前这个中央还有很多坑,比方在小程序page unload时,vue实例却没被销毁,导致下次进入页面时,页面状态不变,必须在unLoad时手动重置状态等mpvue 会封装小程序数据对象,通常以$mp结尾,如event.$mp.detail.target等小程序的组件和vue组件有差别,不要空想vue组件的个性都能用,如slot,异步组件等等vue store 和 wx localstorage 最好不要弄混,要依据不同须要抉择不同的存储形式不要用vue路由,要采纳小程序原生的导航机制而后,咱们搭建开发环境,mpvue脚手架是开箱即用的: # 全局装置 vue-cli# 个别是要 sudo 权限的$ npm install --global vue-cli@2.9# 创立一个基于 mpvue-quickstart 模板的新我的项目# 老手一路回车抉择默认就能够了$ vue init mpvue/mpvue-quickstart my-project# 装置依赖,走你$ cd my-project$ npm install$ npm run dev接着,欠缺文件构造,减少 config、store、mixins等模块,如图: ...

March 5, 2021 · 3 min · jiezi

地图中添加沿线文字标注

以下内容转载自工程师Nero8421 的文章《 地图中添加沿线文字标注》作者:Nero8421 链接:https://www.cnblogs.com/Allen...来源:博客园著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。最近需要实现导航功能,其中路线规划和导航场景如下图所示: 上面的截图中,路线上面都绘制出了路名,方便用户查看自己选择的路线都经过了哪些道路。这里用到的地图的能力即为沿线文字标注腾讯地图 Android SDK v4.2.7 已经开放了实现此功能的能力。 主要涉及接口如下: 接口名称功能概述PolylineOptions.text(Text text)置沿 polyline 展示的文字PolylineOptions.Text.Builder(SegmentText segmentTextPolylineOptions.Text 构造器PolylineOptions.Text.Builder.addSegmentText(SegmentText segmentText)添加线上展示文字的点串范围PolylineOptions.Text.Builder.color(int color)设置文字颜色PolylineOptions.Text.Builder.strokeColor(int color)设置文字描边颜色PolylineOptions.Text.Builder.size(int size)设置文字尺寸PolylineOptions.Text.Builder.priority(TextPriority priority)设置文字优先级从这个功能涉及到的接口可以看出沿线文字标注是作为 Polyline 的一个属性供用户在添加线的时候展示所需文字。 为一条线添加文字标注1、选择合适的点串作为文字标注的路径。如下,我们选择了 苏州街-北四环西路辅路-彩和坊路 的一个点串作为 Polyline 绘制的路径。 //这一个点串表示了经 苏州街-北四环-彩和坊路 的一条路线List<LatLng> points = new ArrayList<>();//苏州街points.add(new LatLng(39.982382, 116.305883));//北四环西路辅路points.add(new LatLng(39.984914, 116.305690));//彩和坊路points.add(new LatLng(39.985045, 116.308136));points.add(new LatLng(39.983570, 116.308088));points.add(new LatLng(39.980063, 116.308297));2、绘制 Polyline 及其文字标注 public Polyline createLineWithText() { if (mTencentmap == null) { return null; } Polyline polyline = mTencentmap.addPolyline( new PolylineOptions() .addAll(points) .color(0xff54ce4d) .text(createText())); return polyline;}public PolylineOptions.Text createText() { List<PolylineOptions.SegmentText> segmentTexts = new ArrayList<>(); //苏州街 的绘制范围是从第0个点开始,第1个点结束 segmentTexts.add(new PolylineOptions.SegmentText(0, 1, "苏州街")); //北四环西路辅路 的绘制范围是从第1个点开始,第2个点结束 segmentTexts.add(new PolylineOptions.SegmentText(1, 2, "北四环西路辅路")); //彩和坊路 的绘制范围是从第2个点开始,第4个点结束 segmentTexts.add(new PolylineOptions.SegmentText(2, 4, "彩和坊路")); return new PolylineOptions.Text.Builder(segmentTexts).build();}最终的效果: ...

October 14, 2019 · 1 min · jiezi

地图POI类别标签体系建设实践

导读POI是“Point of interest”的缩写,中文可以翻译为“兴趣点”。在地图上,一个POI可以是一栋房子、一个商铺、一个公交站、一个湖泊、一条道路等。在地图搜索场景,POI是检索对象,等同于网页搜索中的网页。在地图客户端上,用户选中一个POI,会有一个悬浮的气球指向这个POI。 如上图左边,这家商场内的屈臣氏是一个POI;而所谓类别标签,就是在类别维度对POI属性的一种概括,比如,屈臣氏的类别标签化妆品,而屈臣氏所坐落的凯德mall,类别标签是商场;右侧则是商场query搜索召回的一系列POI,都具有和query相匹配的类别属性。 上图也展示了类别标签的两种主要使用场景:为用户提供丰富信息和支持决策,一方面在前端为用户显示更丰富的信息,另一方面支持搜索的类别搜索需求,主要是在地图场景query和POI双方都具有丰富的多义表达,通过传统的文本匹配引擎或者简单的同义词泛化是难以达到目的的,因此挖掘标签作为召回和排序依据。 我们的类目体系建设主要依据以下几点: 用户实际的query表达,主要为了支持用户的搜索需求;真实世界的客观类目分布,以及pm对该分布的认知;不同标签间的从属、并列关系。最终每个大类将构建一个多层的多叉树体系,比如购物类别的划分: 类别标签建设的难点我们的目标是打标,就是将POI映射到上面类目树体系的各个节点上,很显然这是一个分类问题,但又不是一个单纯的分类问题: 多标签问题:屈臣氏打上化妆品的标签,是一个一对一的映射;而部分POI,可能同时具有多个标签,比如汤泉良子,可以洗浴、按摩、足疗;xx家具店,打上家具店标签同时,必须打上其父节点家居建材标签。整体上,这是一个多标签问题,而不是多分类问题;文本相关问题:大多数的POI具有比较直观的文本标题,比如小牛电动车、海尔专卖店、东英茗茶、熙妍精衣、新生贵族,通过名称文本分析,可以预测出比较正确的结果。另一方面,又不是纯文本问题,比如苹果专卖,仅从文本无法确认是一个手机店,还是一个水果店;还有一些表达,比如老五批发,低频表达或者不含类别信息,则需要引入其他特征来进行解决;综合性问题:算法可能解决主要问题,但现实世界的复杂,通过单纯的算法是难以完全覆盖的,比如酒吧中夜店和清吧的区分,三甲医院、汽车4S店的打标,低频品牌的识别等,通过受限的样本和特征无法尽数解决,但又无法置之不理。此外,应用方对于标签的准召和产出速率也有较高的要求:打标准确率低,则可能导致用户搜索时召回错误POI;覆盖率低,则可能导致用户期待的结果被漏掉;而待建设的大分类有20+,同时每个大分类有数十个子标签,大小标签总量上千。则必须使用高速高效、准召均有保障的方法进行打标,才能有效落地收益。 综上,我们要解决的类别标签打标的主要问题,是一个多标签分类问题,主要使用文本进行识别,但有必要引入其他非文本特征或手段,才能比较完满的解决。 技术方案整体方案设计 如图,为了高效完成打标,我们设计了主要的流程模块,具体描述如下: 特征工程:文本特征解决最主要的打标问题,但同时地图场景下POI文本偏短,长尾分布广泛,具有较多的低频文本或者完全不含类目信息的低频品牌等,而评论、简介等长文本描述往往偏于高频,而难点在于解决低频。因此特征设计上,尽可能使用一些通用特征,比如POI名称、typecode(生产方维护的另一套分类体系)、来源类别(数据提供方的原始零件类别)、品牌等通用特征;对于高频专有特征或数据,一般不在通用模型中进行识别;样本工程:样本的挖掘和清洗、以及模型的设计也是旨在解决通用性的打标问题,POI表达的多样性,而同时标签数量极多,导致需要的样本量也极大,标注成本较高时,必须考虑人工标注之外的样本来源;分类模型:单纯的文本分类模型,不能解决非文本的问题,同时多标签的问题,也不能单纯使用多分类模型来解决;我们设计了多种贴合业务的模型改造工作;多路融合:分类模型能解决主要的问题,但不是全部问题。在地图场景下,总有些算法之外的待解问题,如5A景点、三甲医院,以及各类品牌,模型难以尽数处理。我们设计多路打标,如品牌库对品牌效果进行兜底,引入外部资源批量解决非算法问题,引入专项挖掘解决非通用的打标类别等等……总体上对模型之外的问题引入外部知识辅助进行打标,从整体上收敛问题。后面将重点介绍业务的主要难点,在样本和模型上的主要工作。 样本工程 样本来源&清洗 样本方面,经过一些实验论证,标签数量多,每个标签需要的样本量大,人工标注几乎不可能满足要求,因此考虑主要使用点击日志和一些现成的外部资源: 点击日志数据量大,能够循环产生,同时反映了用户最直接的意图;缺点是含有的噪声大,同时用户点击往往偏向于高频,低频表达较为稀缺;外部资源数据量小,但多样性较好,能够弥补点击数据在低频表达不足的问题。通过引入这两方面的样本,我们很快得到了数百万的原始样本,这么大量级的样本,即使清洗依然是一个及其巨大的工作量,为了高效地清洗样本,我们设计了结合主动学习的两级模式: 在两方面的初始样本引入后: 首先对数据进行抽样清洗,并将清洗过程抽象为业务规则,进行全局清洗和迭代;当整体系统且明显的噪声趋于收敛后,我们通过对剩余数据进行划分,每次抽取部分数据建模,对另一部分数据进行识别,然后对识别不好的一部分数据进行人工标注;如此反复迭代多轮。通过一种类似主动学习的方式,使人工标注的价值最大化,避免低信息量重复样本的反复标注造成人力浪费。下面具体介绍点击样本的挖掘思路。 点击样本挖掘 搜索点击日志凝聚了无数用户的需求与智慧,大多数的搜索业务都能从中挖掘最原始的训练样本。具体到当前的挖掘业务,首先要解决的问题是样本表达形式的不一致问题。具体描述为: 点击数据:query -> POI需要样本:tag -> POI解决方案:tag -> query -> POI如下图,要挖掘内衣的样本集,人工定义了该标签的映射的query集合seed query,再通过这个query集合去召回对应的click样本,就可以直接作为标签内衣的样本。 在实际操作中,我们增加了seed query到泛化集合的映射,即由人工定义的高频query集合泛化到一个更大的同义集合后,再由同义集合进行click样本的召回,其出发点在于: 高频的query主要点击集中于高频的样本,要解决的问题难点在于低频表达的挖掘,因此对query进行从高频到低频的泛化,以期通过低频query召回低频的样本表达,比如丝袜到休闲棉袜,内衣到维密、都市丽人等方面的扩展。 query泛化过程: query的泛化,需要通过高频集合获得近义的低频表达,同时又要保证不会过度的语义扩散,导致泛化集合偏离了标签原本的语义。我们主要尝试了以下方案: word2vec:通过对点击或外部语料学习word粒度的向量表达,对query中的多个word进行maxpooling,得到query的向量表达,再通过query向量去全量集合中搜索向量距离近的其他query。该方法的主要问题是通过word粒度的embedding刻画的query表达,在泛化过程中不太受控,容易引入大量的噪声,清洗难度大,同时存在显著case的漏召。同义词:该方法召回非常受限,且得到的query不一定符合用户的自然表达。Session上下文:地图场景的session普遍较短,召回受限且语义有偏离,准召均不高。推荐方法:继续考虑点击日志的挖掘,将各个query比作user,点击的POI作为item,考虑引入推荐的思想进行相似query挖掘——即点击相同或相似POI的query具有某种程度上的相似性,而query和POI点击关系天然构成一个社交网络,由此参考了两种基于图的推荐方式:SimRank,通过query与POI间的点击关系形成二部图,两个节点间的相似度由他们共同关联的其他所有点加权平均得到,通过反复迭代多轮后,相似度趋于稳定,得到两两query间相似度; a、b表示图中的两个节点,定义自相关度为1,即s(a, a)=1,I(a)、I(b)表示与ab相连的节点集合,对于不同的a、b,其相似度描述为: DeepWalk,是一种学习网络中节点的表示的新的方法,是把language modeling的方法用在了网络结构上,从而使用深度学习方式学习网络中节点间的关系表示。类似simrank方式,通过query与POI间的点击关系构成点击网络,在点击网络上进行随机游走,通过对游走片段的学习,得到query的向量表达,再通过向量表达计算query的相似召回。 推荐方法的两种方案中,simrank计算量极大,在小数据量上实验经过了较长时间的迭代,而数千万点击数据计算资源和计算时间都将变得极大,成本上不合算;而DeepWalk随机游走方式在实际测试中取得了较好的效果: 比如,原始query为涂料,泛化得到其子分类、品牌等,ETC可以得到一些地方性的命名表达。 不同于将query分词后学习其word粒度embedding表达,DeepWalk在这里直接学习整个query,即Sentence的表达,避免了将query分词为多个word再pooling过程中语义偏移;而且直接query粒度的表示学习,得到的挖掘结果更加符合线上的实际表达,便于我们后续召回点击POI样本的操作;同时粗粒度的学习对网络节点间社会关系会有更优的保留。 整体上,通过query泛化步骤,样本集合的低频表达比例明显提升。 模型设计与迭代 使用分类的方式解决打标问题,是业类相似场景的通用做法。具体到业务角度,我们需要模型解决的打标数据范畴主要分为四类: 高频后缀识别低频后缀识别品牌识别非文本识别(typecode、来源类别等)前三类可以使用纯文本分类模型,但非文本特征无法直接用文本模型进行整合;同时,样本数据在前期具有噪声大、分布不均衡的特点,都需要兼顾。 分层多分类 前期使用多分类模型解决分类问题,对于每一个非叶节点构建一个多分类器,从根部开始构建,分到最后一级输出为叶节点。其特点是直观,和标签体系比较匹配。 这种方式有比较明显的缺陷:方案结构复杂不稳定,维护难,样本组织相当繁杂;上级分类模型的错漏,将层层影响下级的分类效果。 每个标签二分类 业务前期受限于优化前的搜索效果,样本集有一定量的噪声,同时体系在调研期间也会时常迭代,不断优化,需要一个解释性强、兼容变化,同时又能直接支持多标签的模型。 因此,我们尝试了对每个标签训练二分类模型,待识别的POI经过所有的二分类模型预测后结果合并使用,再进行后续的业务逻辑建设,该方式较好地解决了业务多标签的场景,避免同一POI多个标签间的冲突。 在样本方面,使用ovr方式组织样本,样本比例可调整(正负例比例、负例来源比例等),兼容了业务样本不均衡问题。 统一模型 单标签的二分类模型具有良好的解释性,以及每个标签建模带来的灵活性,很好匹配了业务的前期需求,迅速推进标签效果落地,线上恶劣case大量收敛,同时较原来的人工专家规则方式,召回明显提升的同时,效率也提升十倍以上。 前期为了短平快地推进业务,使用简单二分类模型迅速解决了主要问题,随着搜索效果的不断提升,业务上也有了更高的质量要求,而LR二分类模型依然存在一些问题: 使用词袋特征,维度膨胀特征选择造成低频特征损失泛化性能一般,需要大量建设业务规则独立建模,标签间的关系识别不充分(父子、共现、互斥)负样本大量降采样,浪费样本模型数量极多,维护成本高为了达到更好的效果,深度模型的升级有了必要,深度文本分类,常用的模型有cnn、rnn以及基于attention的各种模型,而attention模型主要解决的是长文本的深层语义理解问题,我们业务场景需要解决的是短文本简单语义的泛化问题,同时考虑到需要和非文本特征结合,以及分类效率方面的考虑,我们选择textCNN模型。 ...

August 28, 2019 · 1 min · jiezi

微信小程序实现定位及到指定位置导航

一:实现定位及到指定位置导航所需组件及API 1:组件:map(地图组件) 2:API:wx.getLocation(Object object)(获取当前的地理位置、速度),wx.openLocation(Object object)(使用微信内置地图查看位置) 二:代码实现 1:wxml <view><map id="map"longitude="{{longitude}}"latitude="{{latitude}}"scale="14"markers="{{markers}}"bindmarkertap="markertap"bindregionchange="regionchange"show-locationstyle="width: 100%; height: 300px;"></map></view><view><button type="primary" bindtap="navigate">导航</button></view>2:js //jsPage({/** * 页面的初始数据 */data: {//设置标记点markers: [{iconPath: "/images/ljx.png",id: 4,latitude: 31.938841,longitude: 118.799698,width: 30,height: 30}],//当前定位位置latitude:'',longitude: '',},navigate() {////使用微信内置地图查看标记点位置,并进行导航wx.openLocation({latitude: this.data.markers[0].latitude,//要去的纬度-地址longitude: this.data.markers[0].longitude,//要去的经度-地址})},onLoad() {//获取当前位置wx.getLocation({type: 'gcj02',success: (res) => {console.log(res)this.setData({latitude: res.latitude,longitude: res.longitude})}})}})根据如上即可实现自身定位及到指定位置的导航,如下:

August 19, 2019 · 1 min · jiezi

Plain使用同一套代码创建你的-web-地图应用

使用同一套代码创建你的 web 地图应用。 ✨ https://github.com/XingzheFE/... English | 简体中文 特性Layers MarkerPolylinePopupMap Controls zoomfitViewpanToEventedUtils getBoundlocatecoordinate translate如何使用安装使用 npm 安装 plain-js,你也可以在页面中引入构建后的 js 文件。 $ npm install plain-js --save创建地图创建地图的方式很简单,最直接的方式是在 html 文件中引入地图库的脚本文件以及 plain.min.js // 首先初始化一个 plain 对象let plain = new Plain();// 设置需要使用的坐标系,如果不设置的话所有地图使用默认的坐标系,// Google 和 高德地图在大陆使用 GCJ02,百度地图使用 BD09,// 为了方便开发建议设置为 GCJ02plain.setCoordType("GCJ02");// 告诉 plain 你需要使用 Google 地图,// 可选的参数有 Google Map "GMAP", 高德地图 "AMAP", 百度地图 "BMAP"plain.use("GMAP");// 创建一个 Google 地图实例let map = plain.Map({ container: "#map", // DivElement center: [39.908012, 116.399348], zoom: 15});或者使用回调的方式创建 ...

June 21, 2019 · 2 min · jiezi

微信小程序地图(map)组件点击(tap)获取经纬度

微信小程序中使用地图(map)组件,通过点击(tap)获取经纬度,按照官方的回应,暂时是没法做到的,从地图组件API多有残缺判断,怀疑是个实习生干的…做个变通,适用性有限,请大家参考。基本思路就是在地图上铺满一层marker,从而通过点击marker获得经纬度。<map id=“map” longitude=“102.324520” latitude=“40.099994” scale=“4” bindcontroltap=“controltap” polygons="{{polygons}}" bindregionchange=“regionchange” markers="{{markers}}" bindmarkertap=“markertap” show-location style=“width: 100%; height: 700px;"></map>const app = getApp()const markersize = 30function range(start, edge, step) { for (var ret = []; (edge - start) * step > 0; start += step) { ret.push(start); } return ret;}function markers(northeast, southwest, scale, width, height) { const markerslng = (northeast.longitude - southwest.longitude) * markersize / width const markerslat = (northeast.latitude - southwest.latitude) * markersize / height const maxlon = northeast.longitude const minlon = southwest.longitude const maxlat = northeast.latitude const minlat = southwest.latitude const lons = range(minlon, maxlon, markerslng) const lats = range(minlat, maxlat, markerslat) let _markers = [] lons.forEach((lon, i) => { lats.forEach((lat, j) => { _markers.push({ id: lon + ‘,’ + lat, latitude: lat, longitude: lon, iconPath: ‘/marker.png’, alpha: 0.1, //将图片设置为透明,通过开发者工具看不出效果,但真机是有效果的 width: markersize, height: markersize }) }) }) return _markers}Page({ data: { polygons: [], controls: [{ id: 1, position: { left: 0, top: 300 - 50, width: 50, height: 50 }, clickable: true }], markers: [] }, createMarkers() { this.mapCtx = wx.createMapContext(‘map’) const query = wx.createSelectorQuery() const map = query.select(’#map’).boundingClientRect() let that = this that.mapCtx.getRegion({ success(res1) { that.mapCtx.getScale({ success(res2) { query.exec((res) => { let width = res[0].width; let height = res[0].height; let _markers = markers(res1.northeast, res1.southwest, res2.scale, width, height) that.data.markers = _markers that.setData(that.data) }) } }) } }) }, regionchange(e) { this.createMarkers() }, markertap(e) { console.log(e.markerId) }, controltap(e) { console.log(e.controlId) }, onReady(e) { this.createMarkers() }})效果如图 ...

January 9, 2019 · 2 min · jiezi

「腾讯地图」微信小程序插件:提供简单的路线多方案规划服务

上期,我们在《「腾讯视频」微信小程序插件介绍》一文中介绍了「腾讯视频」小程序插件的意义、使用场景以及使用方法。今天我们会与大家分享一款同样优秀的小程序插件——「腾讯地图」插件,从使用场景到使用方法,都将作出详细的介绍。「腾讯地图」插件能做什么?顾名思义,「腾讯地图」插件由腾讯地图官方出品,旨在为开发者提供简单的路线多方案规划服务,可在插件中显示指定位置间的路线方案,支持驾车、公交、步行的路线规划能力及 ETA 等基础路线信息。如果你想像「腾讯地图+」小程序一样实现地图的基础功能,使用「腾讯地图」插件是你的最佳选择。「腾讯地图+」小程序截图作为首批推出的小程序插件,「腾讯地图」插件经过了多个版本的优化,从最初的显示目标位置信息以及提供附近地图功能,到现在已经支持路线规划等能力,地图的功能几乎已经全部配备齐全。「腾讯地图」插件的使用场景场景一:收到小程序的婚礼请柬,但是请柬上的地址找不到?怎么办?如果你开发的是请柬邀请类的小程序,就会遇到上述场景。在传统开发模式中,引入完整的地图选点、路线规划组件,开发成本非常高,更多开发者选择让用户直接输入文字地址进行展示,以此作为降低开发成本的妥协方案。这样的设计不可点击,更没有路线规划的能力,用户还需手动输入去查询地址和交通路线。传统请柬 不可交互但如果开发者选择使用腾讯地图提供的同名小程序插件,开发成本将大幅降低,用户体验也能直线上升。我们在这里以婚庆请柬小程序为例进行说明:用户在编辑请柬小程序的过程中,提前设置好婚礼举办地点;当婚礼宾客收到请柬,点击地点,「腾讯地图」插件就能根据其宾客当前位置和目的地坐标,自动生成精准的导航路线。一键导航 简洁明了场景二:会议服务小帮手——提前了解参会路线与会者应该如何从高铁站、机场、火车站前往会议地点,一直都是各类会议邀请的必备内容。但长期以来,此类信息都习惯以纯文字形式进行发布,体验上存在不便理解、记忆难的问题。如果小程序能够使用「腾讯地图」插件,这类场景的体验将发生质的改变:会议组织方在小程序中提前设置多组起终点(如:机场 - 会议中心、高铁站 - 会议中心),与会者收到会议邀请后点击指定线路,就能在地图插件中查看到精确的参会路线。这样是不是比枯燥的文字多了几分智能呢?如何接入「腾讯地图」插件?「腾讯地图」的功能强大,使用起来却十分简单:1.申请使用插件。在「小程序管理后台 - 设置 - 第三方服务 - 插件管理」中查找插件名称「腾讯地图」(目前最新版本:1.0.6,appid:wx5bc2ac602a747594),并申请使用。2.引入插件代码后修改配置文件 JSON:{ “usingComponents”: { “map-route”: “plugin://myPlugin/mapRoute” }}3.使用地图插件。在相应的 WXML 文件中添加以下标签:<map-route route-info="{{routeInfo}}"></map-route>4.最后,按需求在 JS 文件中处理传入插件数据,数据包括:起点,终点经纬度及名称,路线算路方式,封装在 routeInfo 结构中:let plugin = requirePlugin(“myPlugin”)let routeInfo = { startLat: 39.90469, // 起点纬度 选填 startLng: 116.40717, // 起点经度 选填 startName: “我的位置”, // 起点名称 选填 endLat: 39.94055, // 终点纬度必传 endLng :116.43207, // 终点经度 必传 endName:“来福士购物中心”, // 终点名称 必传 mode:“car” //算路方式 选填}Page({ data: { routeInfo: routeInfo }})参数说明:起点:不填写或 startName=“我的位置” 或 startName=“当前位置” 或 startName=“currentLocation” 则插件会获取当前的定位位置作为起点位置发起算路,若正确填写起点信息,则以传入的起点信息发起算路。终点:必传参数,不正确传入则不会发起算路或者算路失败。算路方式:mode,目前支持三种算路方式,分别是:驾车(car),公交(bus),步行(walk);不传则默认发起驾车算路。注意:数据要在 data 中初始化,不要在 onLoad 中直接 setData,因为 onLoad 中直接 setData,properties 的 routeInfo 的 observer: function (newVal, oldVal),newVal 接收不到参数,导致参数报错,之后可以通过 bind 其他事件 setData 更新 routeInfo 达到变更起终点参数的效果。「腾讯地图」插件使用效果图如果你想了解更多「腾讯地图」插件详情,欢迎访问开发者社区插件版块相应页面(建议电脑访问):????https://developers.weixin.qq….手机端用户也可以扫码访问 ????内容来自:微信开放社区《小程序·小故事》栏目原作者:熊明钧任何问题,欢迎前往微信开放社区:https://developers.weixin.qq.com了解更多小程序开发相关内容,欢迎微信扫描下方二维码关注微信极客WeGeek公众号,共筑微信生态。 ...

November 14, 2018 · 1 min · jiezi

根据经纬度计算两地距离

最近工作需要,网上搜索了下根据经纬度计算两地距离的方法,发现要么是几何法,画图、作一堆辅助线,然后证明推理,要么二话不说直接套公式。这篇文章介绍一种容易理解的方式来求这个距离。0b00 思路地球是个不规则的椭球体、为了简便我们当作球体来计算。 球体上两地的最短距离就是经过两点的大圆的劣弧长度。思路如下:弧长 ← 弦长(两点距离) ← 两点坐标(直角坐标) ← 经纬度0b01 计算1. 坐标转换设地球半径为 $R$地心到 E 0° N 0° 的连线为 x 轴地心到 E 90° N 0° 的连线为 y 轴地心到 E 0° N 90° 的连线为 z 轴地球表面有一点 $A$, 经度为 $e$, 纬度为 $n$, 单位为弧度则 $A$ 的坐标可表示为:$$x = R cdot cos(n) cdot cos(e)\y = R cdot cos(n) cdot sin(e)\z = R cdot sin(n)$$代码const R = 6371const {cos, sin, PI} = Mathlet getPoint = (e, n) => { //首先将角度转为弧度 e = PI/180 n = PI/180 reutrn { x: Rcos(n)cos(e), y: Rcos(n)sin(e), z: Rsin(n) }}2. 根据坐标计算两点距离这个太简单,跳过3. 根据弦长求弧长这个可以画个图,帮助理解:现在已知弦长 $c$, 半径 $R$, 要求弧 $r$ 的长度这很简单, 只需先求出 $∠alpha$ 的大小 :$$alpha = arcsin(c/2/R)\r = 2alpha cdot R$$代码const {asin} = Mathconst R = 6371r = asin(c/2/R)2R0b10 最终代码/* * 获取两经纬度之间的距离 * @param {number} e1 点1的东经, 单位:角度, 如果是西经则为负 * @param {number} n1 点1的北纬, 单位:角度, 如果是南纬则为负 * @param {number} e2 * @param {number} n2 /function getDistance(e1, n1, e2, n2){ const R = 6371 const { sin, cos, asin, PI, hypot } = Math /* 根据经纬度获取点的坐标 */ let getPoint = (e, n) => { e *= PI/180 n = PI/180 //这里 R 被去掉, 相当于先求单位圆上两点的距, 最后会再将这个距离放大 R 倍 return {x: cos(n)*cos(e), y: cos(n)*sin(e), z: sin(n)} } let a = getPoint(e1, n1) let b = getPoint(e2, n2) let c = hypot(a.x - b.x, a.y - b.y, a.z - b.z) let r = asin(c/2)2R return r} ...

September 2, 2018 · 2 min · jiezi