| 
                            
                                  效果展示
 原始数据
	
		
			| 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",     });   }, }; |  
 |