广告位联系
返回顶部
分享到

openlayers模仿高德箭头导航路线图的代码

相关技巧 来源:互联网 作者:酷站 发布时间:2022-05-28 18:27:10 人浏览
摘要

效果展示 原始数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 const routeFeature = { type: Feature, geometry: { type: LineString, coordinates: [ [105.9420397836494, 27.911864399055588, 0.0]

效果展示

原始数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

const routeFeature = {

  type: "Feature",

  geometry: {

    type: "LineString",

    coordinates: [

      [105.9420397836494, 27.911864399055588, 0.0],

      [105.94204506457491, 27.911868653873896, 0.0],

      [105.94203985374624, 27.911863549317346, 0.0],

      [105.9894250218576, 28.057236450358882, 0.0],

      [106.10215274353018, 28.284607012841803, 0.0],

      [106.07371540920602, 28.280436458801173, 0.0],

      [106.07873615012684, 28.28931130115016, 0.0],

      [106.05978977915458, 28.29067898838156, 0.0],

      [106.01532125560543, 28.29250735826644, 0.0],

      [106.11251696408775, 28.335110012326794, 0.0],

      [106.07311049420407, 28.334906534881487, 0.0],

      [106.02507910445651, 28.336362174118438, 0.0],

      [106.02489694766722, 28.359663055160034, 0.0],

      [106.01964893419249, 28.36218521264283, 0.0],

      [106.02051116393352, 28.363011171722473, 0.0],

      [106.02205644084118, 28.363104546940434, 0.0],

      [106.02162537170554, 28.362978005991447, 0.0],

      [106.06032150948916, 28.372102355412082, 0.0],

      [106.04706634723237, 28.410958515915414, 0.0],

      [106.16865262249493, 28.364800431812483, 0.0],

      [106.15259292905644, 28.30510828317908, 0.0],

    ],

  },

};

export{

   routeFeature

}

起点/终点寻找

1

2

3

const coordinates = routeFeature.geometry.coordinates;

let start = coordinates[0].slice(0, 2),

 end = coordinates[coordinates.length - 1].slice(0, 2);

起点和终点样式函数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

function styleFn(text) {

  return new Style({

    image: new Icon({

      src: mark,

      scale: 1,

    }),

    text: new Text({

      textAlign: "center",

      textBaseline: "middle",

      font: "normal 14px 微软雅黑",

      text,

      fill: new Fill({ color: "#aa3300" }),

      stroke: new Stroke({ color: "#ffcc33", width: 2 }),

      offsetX: 0,

      scale: 1,

      offsetY: 0,

    }),

  });

}

起点和终点layer创建函数

1

2

3

4

5

6

7

8

9

10

11

12

13

const Mark = (point, name) => {

  return new VectorLayer({

    style: styleFn(name),

    source: new VectorSource({

      features: [

        new Feature({

          geometryName: "centerMark",

          geometry: new Point(point),

        }),

      ],

    }),

  });

};

路线feature创建

1

2

3

4

5

6

7

8

9

var lineFeature = new GeoJSON({

  geometryName: "line",

}).readFeature(routeFeature.geometry);

const polyLineLayer = new VectorLayer({

  source: new VectorSource({

    features: [lineFeature],

  }),

  style: styleFunction,

});

路线样式函数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

function styleFunction(featrue, resolution) {

  var geometry = featrue.getGeometry();

  var length = geometry.getLength(); //获取线段长度

  var radio = (100 * resolution) / length;

  var dradio = 10000;  //投影坐标系,如EPSG3857设置dradio=1,在EPSG:4326下可以设置dradio=10000,其他坐标系可以调整

  var styles = [

    new Style({

      stroke: new Stroke({

        color: "green",

        width: 10,

      }),

    }),

  ];

  for (var i = 0; i <= 1; i += radio) {

    var arrowLocation = geometry.getCoordinateAt(i);

    geometry.forEachSegment(function (start, end) {

      if (start[0] == end[0] || start[1] == end[1]) return;

      var dx1 = end[0] - arrowLocation[0];

      var dy1 = end[1] - arrowLocation[1];

      var dx2 = arrowLocation[0] - start[0];

      var dy2 = arrowLocation[1] - start[1];

      if (dx1 != dx2 && dy1 != dy2) {

        if (Math.abs(dradio * dx1 * dy2 - dradio * dx2 * dy1) < 0.001) {

          var dx = end[0] - start[0];

          var dy = end[1] - start[1];

          var rotation = Math.atan2(dy, dx);

          styles.push(

            new Style({

              geometry: new Point(arrowLocation),

              image: new Icon({

                size: toSize([13, 7]),

                src: arrow,

                anchor: [0.5, 0.5],

                rotateWithView: false,

                rotation: -rotation + (Math.PI * 3) / 2, //旋转角度可能跟图标角度有关,自行调整

              }),

            })

          );

        }

      }

    });

  }

  return styles;

}

初始化地图生成线路图

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

export default {

  name: "arrowMap",

  data() {

    return {

      map: null,

    };

  },

  mounted() {

 

    let map = new Map({

      // 设置地图图层

      layers: [

        gaodeMapLayer,

        polyLineLayer,

        Mark(start, "起点"),

        Mark(end, "终点"),

      ],

      // 设置显示地图的视图

      view: new View({

        center: start,

        zoom: 10,

        minZoom: 2,

        maxZoom: 18,

        projection: "EPSG:4326",

        rotation: 0,

      }),

      // 让id为map的div作为地图的容器

      target: "arrowMap",

    });

  },

};


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 : https://juejin.cn/post/7102307614171758605
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计