首页 > 其他分享 >OpenLayers 绘制带箭头的LineString

OpenLayers 绘制带箭头的LineString

时间:2023-03-13 10:57:38浏览次数:52  
标签:supermap style ol const map 箭头 OpenLayers new LineString

<!--********************************************************************
* Copyright© 2000 - 2022 SuperMap Software Co.Ltd. All rights reserved.
*********************************************************************-->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title data-i18n="resources.title_tiledMapLayer3857"></title>
    <script type="text/javascript" src="../js/include-web.js"></script>
    <script type="text/javascript" src="../../dist/ol/include-ol.js"></script>
  </head>
  <body style="margin: 0; overflow: hidden; background: #fff; width: 100%; height: 100%; position: absolute; top: 0">
    <div id="map" style="width: 100%; height: 100%"></div>
    <script type="text/javascript">
      var map,
        url =
          (window.isLocal ? window.server : 'https://iserver.supermap.io') +
          '/iserver/services/map-china400/rest/maps/China';
      // 方式一:1.调用 ol.supermap.initMap,根据 SuperMap iServer 地图服务的地图信息,创建地图和底图
    //   ol.supermap.initMap(url, {
    //     mapOptions: {
    //       controls: ol.control
    //         .defaults({ attributionOptions: { collapsed: false } })
    //         .extend([new ol.supermap.control.Logo()])
    //     }
    //   });
      /* 方式二:1.调用 ol.supermap.MapService,获取 SuperMap iServer 地图服务的地图信息
                2.调用 ol.supermap.viewOptionsFromMapJSON 获取地图视图参数
                3.调用 ol.Map 创建地图
                4.调用 ol.layer.Tile 与 ol.source.TileSuperMapRest 创建底图
      */
      new ol.supermap.MapService(url).getMapInfo(function (serviceResult) {
        const mapObj = serviceResult.result;
        window.maps = map = new ol.Map({
          target: 'map',
          controls: ol.control
            .defaults({ attributionOptions: { collapsed: false } })
            .extend([new ol.supermap.control.Logo()]),
          view: new ol.View(ol.supermap.viewOptionsFromMapJSON(mapObj))
        });
        var layer = new ol.layer.Tile({
          source: new ol.source.TileSuperMapRest(ol.source.TileSuperMapRest.optionsFromMapJSON(url, mapObj, true))
        });
        map.addLayer(layer);
        map.addControl(new ol.supermap.control.ScaleLine());
        
        //
        // #################################################################################################
        // 从这里 往上的 都是 
        // https://iclient.supermap.io/examples/openlayers/editor.html#01_tiledMapLayer3857
        // 的原本内容
        // 往下的,才是绘制箭头
        // #################################################################################################
        //
        
        const coords = [[-1986139.7429620195, 78271.51696402021], [4070118.882129064, -596820.3168506557], [821850.928122214, 870770.6262247274], [-3492866.4445194136, 1399103.365731866]] // 该地图所用为3857底图,坐标值不是经纬度
        
        const sourceVector = new ol.source.Vector()
        const feature = new ol.Feature({
            geometry: new ol.geom.LineString([coords[0], coords[1], coords[2], coords[3]])
        })
        sourceVector.addFeature(feature)
                
        const styleFunction = function (feature) {
          const geometry = feature.getGeometry();
          const styles = [
            // linestring
            new ol.style.Style({
              stroke: new ol.style.Stroke({
                color: '#ffcc33',
                width: 2,
              }),
            }),
          ];
        
          geometry.forEachSegment(function (start, end) {
            const dx = end[0] - start[0];
            const dy = end[1] - start[1];
            const rotation = Math.atan2(dy, dx);
            const coord = [start[0] + dx/2, start[1] + dy / 2]
            // arrows
            styles.push(
              new ol.style.Style({
                geometry: new ol.geom.Point(coord),
                image: new ol.style.Icon({
                  src: 'https://bpic.51yuansu.com/pic2/cover/00/48/42/5815eb37ed3d8_610.jpg',
                  anchor: [0.75, 0.5],
                  rotateWithView: true,
                  rotation: -rotation,
                  scale: 0.03
                }),
              })
            );
          });
        
          return styles;
        };
		
	//#######################################################################################//
	//#     !!!IMPORTANT:在layer初始化时传入了style配置,设置的风格函数,会返回一个style        #//
	//#######################################################################################//
        const layerVector = new ol.layer.Vector({
            source: sourceVector,
            style: styleFunction,// !!!IMPORTANT
        })
        map.addLayer(layerVector);
      });
    </script>
  </body>
</html>

RESULT:

image

Reference:

  1. supermap 3857
  2. openlayers line-arrows

标签:supermap,style,ol,const,map,箭头,OpenLayers,new,LineString
From: https://www.cnblogs.com/echo-lovely/p/17210567.html

相关文章

  • Vue3 使用 vant中的swipe,添加左右箭头切换轮播
    vant中的 swipe 是带有左右箭头切换轮播方法的,只不过文档中没有相关的案例。  我这边使用的是vue3ts写的这个功能。页面部分   定义一个方法,ref="swi......
  • setTimeout中的this指向问题和箭头函数结合的区别
    1、首先首先要解释下,函数体内变量的作用域是在函数定义的时候就确定的,而不是运行时;函数的上下文是在调用时确定的,函数体内的this指向其上下文;箭头函数没有自己的this,......
  • 箭头函数
    箭头函数箭头函数是传统函数表达式的简写方式,它简化了函数的编写,也带来了一些限制导致在一些场景下它无法使用。特点:箭头函数没有自己的this,无法通过call、apply、bind......
  • geotools:LineString转SimpleFeature
    publicstaticList<SimpleFeature>toSimpleFeature(List<SimpleFeature>simpleFeatureList){List<SimpleFeature>resultList=newArrayList<>();......
  • linux-history没内容-上下箭头用不了
    history命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。默认是不显示命......
  • ES6-ES11 箭头函数的实践与应用
    视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>......
  • ES6-ES11 箭头函数以及声明特点
    视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>......
  • Vue+Openlayers 试手(待更新)
    选用Vue2.0+Webpack+Openlayers。参考链接:https://blog.csdn.net/qq_43274430/article/details/102580903官方文档API(v6.15.1):https://openlayers.org/en/v6.15.1/apidoc......
  • openlayers 在地图上绘制矩形框,非鼠标框选
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"/><titledata-i18n="resources.title_tiledMapLayer3857"></title><scripttype="text/javascript"src="../js......
  • 各种情况的箭头函数 es6 230222
    无参无返回varfn=()=>{console.log(666)}fn()无参有返回varfn=()=>{return123}varres=fn()alert(res)有参无返回varfn=(num1,num2)=>{cons......