成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

一種在地圖中處理曲線(xiàn)的通用方法

anRui / 2397人閱讀

摘要:本文分享一種可以用于處理曲線(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ān)文章

  • 對(duì)web數(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ù)可視化的一些思考。...

    andong777 評(píng)論0 收藏0
  • 對(duì)web數(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ù)可視化的一些思考。...

    gotham 評(píng)論0 收藏0
  • gcoord: 轉(zhuǎn)換WGS84、GCJ02、BD09坐標(biāo),解決百度地圖高德地圖坐標(biāo)系不統(tǒng)一問(wèn)題

    摘要:做過(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...

    yimo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<