摘要:本文分享一種可以用于處理曲線(xiàn)的算法,是本人在百度地圖開(kāi)源庫(kù)基礎(chǔ)上改造的,可以用于其他地圖場(chǎng)景中處理點(diǎn)數(shù)據(jù),只要兩個(gè)以上的點(diǎn),就可以得到平滑的曲線(xiàn)。例如小程序,將處理后得到的點(diǎn)賦值給的即可。
本文分享一種可以用于處理曲線(xiàn)的算法,是本人在百度地圖開(kāi)源庫(kù)基礎(chǔ)上改造的,可以用于其他地圖場(chǎng)景中處理點(diǎn)數(shù)據(jù),只要兩個(gè)以上的點(diǎn),就可以得到平滑的曲線(xiàn)。例如小程序,將處理后得到的點(diǎn)賦值給polyline的points即可。
function getCurveByTwoPoints(obj1, obj2) { if (!obj1 || !obj2) { return null } var B1 = function (x) { return 1 - 2 * x + x * x }; var B2 = function (x) { return 2 * x - 2 * x * x }; var B3 = function (x) { return x * x }; curveCoordinates = []; var count = 30; var isFuture = false; var t, h, h2, lat3, lng3, j, t2; var LnArray = []; var i = 0; var inc = 0; if (typeof(obj2) == "undefined") { if (typeof(curveCoordinates) != "undefined") { curveCoordinates = [] } return } var lat1 = parseFloat(obj1.lat); var lat2 = parseFloat(obj2.lat); var lng1 = parseFloat(obj1.lng); var lng2 = parseFloat(obj2.lng); if (lng2 > lng1) { if (parseFloat(lng2 - lng1) > 180) { if (lng1 < 0) { lng1 = parseFloat(180 + 180 + lng1) } } } if (lng1 > lng2) { if (parseFloat(lng1 - lng2) > 180) { if (lng2 < 0) { lng2 = parseFloat(180 + 180 + lng2) } } } j = 0; t2 = 0; if (lat2 == lat1) { t = 0; h = lng1 - lng2 } else { if (lng2 == lng1) { t = Math.PI / 2; h = lat1 - lat2 } else { t = Math.atan((lat2 - lat1) / (lng2 - lng1)); h = (lat2 - lat1) / Math.sin(t) } } if (t2 == 0) { t2 = (t + (Math.PI / 5)) } h2 = h / 2; lng3 = h2 * Math.cos(t2) + lng1; lat3 = h2 * Math.sin(t2) + lat1; for (i = 0; i < count + 1; i++) { curveCoordinates.push( { lng: (lng1 * B1(inc) + lng3 * B2(inc)) + lng2 * B3(inc), lat: (lat1 * B1(inc) + lat3 * B2(inc) + lat2 * B3(inc)) } ); inc = inc + (1 / count) } return curveCoordinates } function getCurvePoints(points) { var curvePoints = []; for (var i = 0; i < points.length - 1; i++) { var p = getCurveByTwoPoints(points[i], points[i + 1]); if (p && p.length > 0) { curvePoints = curvePoints.concat(p) } } return curvePoints } let trackPoints = [{lng:113.281, lat:29.203}, {lng:113.567, lat:29.301}] let convertPoints = getCurvePoints(trackPoints) console.log(convertPoints)
最后再給一個(gè)微信小程序應(yīng)用實(shí)例
map.wxml
// 舉個(gè)小程序應(yīng)用的例子
map.js
Page({ data: { markers: [{ iconPath: "/resources/marker.png", id: 0, latitude: 23.099994, longitude: 113.324520, width: 50, height: 50 }], polyline: [], controls: [{ id: 1, iconPath: "/resources/location.png", position: { left: 0, top: 300 - 50, width: 50, height: 50 }, clickable: true }] }, onLoad() { this.setData({ polyline:[{ points: this.getCurvePoints([{ lng: 113.3245211, lat: 23.10229 }, { lng: 113.324520, lat: 23.21229 }]), color: "#FF0000DD", width: 2 }] }) }, regionchange(e) { console.log(e.type) }, markertap(e) { console.log(e.markerId) }, controltap(e) { console.log(e.controlId) }, getCurveByTwoPoints(obj1, obj2) { if (!obj1 || !obj2) { return null } var B1 = function (x) { return 1 - 2 * x + x * x }; var B2 = function (x) { return 2 * x - 2 * x * x }; var B3 = function (x) { return x * x }; var curveCoordinates = []; var count = 30; var isFuture = false; var t, h, h2, lat3, lng3, j, t2; var LnArray = []; var i = 0; var inc = 0; if (typeof (obj2) == "undefined") { if (typeof (curveCoordinates) != "undefined") { curveCoordinates = [] } return } var lat1 = parseFloat(obj1.lat); var lat2 = parseFloat(obj2.lat); var lng1 = parseFloat(obj1.lng); var lng2 = parseFloat(obj2.lng); if (lng2 > lng1) { if (parseFloat(lng2 - lng1) > 180) { if (lng1 < 0) { lng1 = parseFloat(180 + 180 + lng1) } } } if (lng1 > lng2) { if (parseFloat(lng1 - lng2) > 180) { if (lng2 < 0) { lng2 = parseFloat(180 + 180 + lng2) } } } j = 0; t2 = 0; if (lat2 == lat1) { t = 0; h = lng1 - lng2 } else { if (lng2 == lng1) { t = Math.PI / 2; h = lat1 - lat2 } else { t = Math.atan((lat2 - lat1) / (lng2 - lng1)); h = (lat2 - lat1) / Math.sin(t) } } if (t2 == 0) { t2 = (t + (Math.PI / 5)) } h2 = h / 2; lng3 = h2 * Math.cos(t2) + lng1; lat3 = h2 * Math.sin(t2) + lat1; for (i = 0; i < count + 1; i++) { curveCoordinates.push( { longitude: (lng1 * B1(inc) + lng3 * B2(inc)) + lng2 * B3(inc), latitude: (lat1 * B1(inc) + lat3 * B2(inc) + lat2 * B3(inc)) } ); inc = inc + (1 / count) } return curveCoordinates }, getCurvePoints(points) { var curvePoints = []; for (var i = 0; i < points.length - 1; i++) { var p = this.getCurveByTwoPoints(points[i], points[i + 1]); if (p && p.length > 0) { curvePoints = curvePoints.concat(p) } } return curvePoints } })
獻(xiàn)上效果圖:
首發(fā)鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105579.html
摘要:本人也做過(guò)一些數(shù)據(jù)可視化相關(guān)的產(chǎn)品,下面聊聊對(duì)數(shù)據(jù)可視化的一些思考。這也是數(shù)據(jù)可視化最麻煩的一直,一般我們借助的地圖,或者百度地圖,高德地圖等來(lái)開(kāi)發(fā),其實(shí)百度地圖也出了個(gè)地圖可視化的庫(kù),展示效果沒(méi)有好。。。。 最近幾年隨著大數(shù)據(jù)的興起,以及瀏覽器性能的提升,數(shù)據(jù)可視化成為了一個(gè)熱點(diǎn),前端也冒出來(lái)了很多數(shù)據(jù)可視化的崗位。本人也做過(guò)一些數(shù)據(jù)可視化相關(guān)的產(chǎn)品,下面聊聊對(duì)數(shù)據(jù)可視化的一些思考。...
摘要:本人也做過(guò)一些數(shù)據(jù)可視化相關(guān)的產(chǎn)品,下面聊聊對(duì)數(shù)據(jù)可視化的一些思考。這也是數(shù)據(jù)可視化最麻煩的一直,一般我們借助的地圖,或者百度地圖,高德地圖等來(lái)開(kāi)發(fā),其實(shí)百度地圖也出了個(gè)地圖可視化的庫(kù),展示效果沒(méi)有好。。。。 最近幾年隨著大數(shù)據(jù)的興起,以及瀏覽器性能的提升,數(shù)據(jù)可視化成為了一個(gè)熱點(diǎn),前端也冒出來(lái)了很多數(shù)據(jù)可視化的崗位。本人也做過(guò)一些數(shù)據(jù)可視化相關(guān)的產(chǎn)品,下面聊聊對(duì)數(shù)據(jù)可視化的一些思考。...
摘要:做過(guò)地圖相關(guān)開(kāi)發(fā)的同學(xué)肯定會(huì)遇到這樣一個(gè)問(wèn)題同樣的經(jīng)緯度坐標(biāo),在百度地圖和高德地圖上位置不一樣。解決方案百度地圖以及高德地圖都提供了一些方法來(lái)轉(zhuǎn)換不同坐標(biāo)系下的坐標(biāo),但是它們都需要進(jìn)行網(wǎng)絡(luò)請(qǐng)求,性能很差。 做過(guò)地圖相關(guān)開(kāi)發(fā)的同學(xué)肯定會(huì)遇到這樣一個(gè)問(wèn)題:同樣的經(jīng)緯度坐標(biāo),在百度地圖和高德地圖上位置不一樣。showImg(https://segmentfault.com/img/remot...
閱讀 1396·2019-08-30 12:54
閱讀 1880·2019-08-30 11:16
閱讀 1622·2019-08-30 10:50
閱讀 2459·2019-08-29 16:17
閱讀 1277·2019-08-26 12:17
閱讀 1388·2019-08-26 10:15
閱讀 2398·2019-08-23 18:38
閱讀 794·2019-08-23 17:50