摘要:本文分享一種可以用于處理曲線的算法,是本人在百度地圖開源庫基礎上改造的,可以用于其他地圖場景中處理點數據,只要兩個以上的點,就可以得到平滑的曲線。例如小程序,將處理后得到的點賦值給的即可。
本文分享一種可以用于處理曲線的算法,是本人在百度地圖開源庫基礎上改造的,可以用于其他地圖場景中處理點數據,只要兩個以上的點,就可以得到平滑的曲線。例如小程序,將處理后得到的點賦值給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)
最后再給一個微信小程序應用實例
map.wxml
// 舉個小程序應用的例子
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 } })
獻上效果圖:
首發鏈接
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105579.html
摘要:本人也做過一些數據可視化相關的產品,下面聊聊對數據可視化的一些思考。這也是數據可視化最麻煩的一直,一般我們借助的地圖,或者百度地圖,高德地圖等來開發,其實百度地圖也出了個地圖可視化的庫,展示效果沒有好。。。。 最近幾年隨著大數據的興起,以及瀏覽器性能的提升,數據可視化成為了一個熱點,前端也冒出來了很多數據可視化的崗位。本人也做過一些數據可視化相關的產品,下面聊聊對數據可視化的一些思考。...
摘要:本人也做過一些數據可視化相關的產品,下面聊聊對數據可視化的一些思考。這也是數據可視化最麻煩的一直,一般我們借助的地圖,或者百度地圖,高德地圖等來開發,其實百度地圖也出了個地圖可視化的庫,展示效果沒有好。。。。 最近幾年隨著大數據的興起,以及瀏覽器性能的提升,數據可視化成為了一個熱點,前端也冒出來了很多數據可視化的崗位。本人也做過一些數據可視化相關的產品,下面聊聊對數據可視化的一些思考。...
摘要:做過地圖相關開發的同學肯定會遇到這樣一個問題同樣的經緯度坐標,在百度地圖和高德地圖上位置不一樣。解決方案百度地圖以及高德地圖都提供了一些方法來轉換不同坐標系下的坐標,但是它們都需要進行網絡請求,性能很差。 做過地圖相關開發的同學肯定會遇到這樣一個問題:同樣的經緯度坐標,在百度地圖和高德地圖上位置不一樣。showImg(https://segmentfault.com/img/remot...
閱讀 1391·2019-08-30 12:54
閱讀 1877·2019-08-30 11:16
閱讀 1620·2019-08-30 10:50
閱讀 2454·2019-08-29 16:17
閱讀 1273·2019-08-26 12:17
閱讀 1385·2019-08-26 10:15
閱讀 2393·2019-08-23 18:38
閱讀 791·2019-08-23 17:50