【maptalks】加载SVG和GIF

加载SVG和GIF


一、加载SVG

方法一:直接载入SVG文件,类似载入图片

缺点:无法进行进一步加工编辑

javascript 复制代码
var marker1 = new maptalks.Marker(
        center.sub(0.009, 0),
        {
          'symbol' : {
            'markerFile'   : '1.svg',
            'markerWidth'  : 28,
            'markerHeight' : 40,
            'markerDx'     : 0,
            'markerDy'     : 0,
            'markerOpacity': 1
          }
        }
      ).addTo(layer);

方法二:载入SVG路径

缺点:无法实现复杂效果,如阴影和渐变色(矢量样式效果会失效)

只能手动替换path,不能解析基础形状代码。

javascript 复制代码
var map = new maptalks.Map('map', {
  center: [-0.113049, 51.49856],
  zoom: 14,
  baseLayer: new maptalks.TileLayer('base', {
    urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
    subdomains: ['a', 'b', 'c', 'd'],
    attribution: '© <a href="http://osm.org">OpenStreetMap</a>  contributors, © <a href="https://carto.com/">CARTO</a> '
  })
});

var layer = new maptalks.VectorLayer('vector').addTo(map);

var tiger = new maptalks.Marker(
  [-0.113049, 51.49856], {
    'symbol': {
      'markerType': 'path',
      'markerPath': getTigerPath(),
      'markerPathWidth': 540,
      'markerPathHeight': 580,
      'markerFillPatternFile': 'fill-pattern.png',
      // 'markerLineColor' : 12,
      'markerWidth': 400,
      'markerHeight': 400,
      'markerDy': 200,
      'markerDx': 0
    }
  }
).addTo(layer);

function getTigerPath() {
  return [ {
     path :"M57 124C56.2 124 55.4 123.851 54.6 123.553C53.8 123.255 53.1 122.857 52.5 122.361C37.9 109.543 27 97.6449 19.8 86.6673C12.6 75.6857 9 65.4255 9 55.8866C9 40.9822 13.826 29.1083 23.478 20.265C33.126 11.4217 44.3 7 57 7C69.7 7 80.874 11.4217 90.522 20.265C100.174 29.1083 105 40.9822 105 55.8866C105 65.4255 101.4 75.6857 94.2 86.6673C87 97.6449 76.1 109.543 61.5 122.361C60.9 122.857 60.2 123.255 59.4 123.553C58.6 123.851 57.8 124 57 124Z"
  
  },{
    transform: "translate(35,35)",
    path: "M39.1579 14.6842H22.8421V6.85263C23.4471 6.51098 23.9271 5.98496 24.2126 5.35158L40.7895 3.26316C41.6904 3.26316 42.4211 2.53254 42.4211 1.63158C42.4211 0.730621 41.6904 0 40.7895 0L23.7558 2.12105C23.1534 1.31734 22.2146 0.836021 21.2105 0.815789C19.8932 0.822316 18.709 1.62048 18.2084 2.83895L1.63158 4.89474C0.730621 4.89474 0 5.62536 0 6.52632C0 7.42727 0.730621 8.15789 1.63158 8.15789L18.6653 6.03684C18.9155 6.36414 19.2255 6.64085 19.5789 6.85263V14.6842H3.26316C1.46092 14.6842 0 16.1451 0 17.9474V40.7895C0 42.5917 1.46092 44.0526 3.26316 44.0526H39.1579C40.9601 44.0526 42.4211 42.5917 42.4211 40.7895V17.9474C42.4211 16.1451 40.9601 14.6842 39.1579 14.6842ZM19.5789 34.2632H6.52632V21.2105H19.5789V34.2632ZM35.8947 34.2632H22.8421V21.2105H35.8947V34.2632Z" , fill:"#fff"
  }
 ];
}

二、加载GIF

由于Maptalks基于canvas,因此需要把gif对象作为maptalks.ui.UIMarker 单独添加到地图中操作

案例为VUE结合npm包,

记得用 npm install maptalks 引入依赖

VUE+maptalks实现GIF可拖拽点

javascript 复制代码
var map = new maptalks.Map('map', {
  center: [-0.113049, 51.498568],
  zoom: 14,
  baseLayer: new maptalks.TileLayer('base', {
  urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
  subdomains: ['a', 'b', 'c', 'd'],
  attribution: '&copy; <a href="http://osm.org">OpenStreetMap</a> contributors, &copy; <a href="https://carto.com/">CARTO</a>',
    }),
      });
    var point = {
      x: -0.113049,
      y: 51.498568
    };
    // 创建 UIMarker
    var markerDiv = document.createElement('div');
    markerDiv.className = 'marker';
    var uiMarker = new maptalks.ui.UIMarker(point, {
      content: markerDiv,
      draggable: true
    }).addTo(map);

VUE+maptalks实现GIF跟随线条动画

javascript 复制代码
<template>
  <div class="container">
    <div id="map" class="map-container"></div>
    <div class="pane">
      <a href="javascript:void(0);" @click="initAnimation">Start Animation</a>
      <a href="javascript:void(0);" @click="removeLineAndMarker">Remove Line & Marker</a>
    </div>
  </div>
</template>

<script>
  import maptalks from 'maptalks';

  export default {
    name: 'MapAnimation',
    data() {
      return {
        map: null,
        vectorLayer: null,
        uiMarker: null,
        lineString: null,
        aniTimer: null,
        path: [
          { x: -0.131049, y: 51.498568 },
          { x: -0.107049, y: 51.498568 },
          { x: -0.107049, y: 51.491568 }
        ]
      };
    },
    mounted() {
      // 初始化地图
      this.initializeMap();
    },
    methods: {
      // 初始化地图
      initializeMap() {
        this.map = new maptalks.Map('map', {
          center: [-0.113049, 51.498568],
          zoom: 14,
          baseLayer: new maptalks.TileLayer('base', {
            urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
            subdomains: ['a', 'b', 'c', 'd'],
            attribution: '&copy; <a href="http://osm.org">OpenStreetMap</a> contributors, &copy; <a href="https://carto.com/">CARTO</a>'
          })
        });
      },
      // 启动动画
      initAnimation() {
        // 清除之前的点和线
        if (this.vectorLayer) {
          this.vectorLayer.remove();
        }
        if (this.uiMarker) {
          this.uiMarker.remove();
        }

        // 创建 LineString 对象
        this.lineString = new maptalks.LineString(this.path, {
          visible: false,
          arrowStyle: 'classic',
          arrowPlacement: 'vertex-last',
          symbol: {
            'lineColor': '#1bbc9b',
            'lineWidth': 6
          }
        });

        // 创建线条图层并将线条添加到地图中
        this.vectorLayer = new maptalks.VectorLayer('vector', this.lineString).addTo(this.map);

        // 创建 UIMarker
        const markerDiv = document.createElement('div');
        markerDiv.className = 'marker';
        this.uiMarker = new maptalks.ui.UIMarker(this.path[0], {
          content: markerDiv
        }).addTo(this.map);

        // 播放动画
        this.replay();

        // 动画结束后回到起点并重新播放
        this.aniTimer = setInterval(() => {
          console.log("Animation restarted");
          this.replay(); // 自动重新播放
        }, 1600); // 延迟稍微大于动画时间,以确保动画播放完再重启
      },
      // 启动动画
      replay() {
        this.lineString.hide(); // 隐藏线条
        this.lineString.animateShow({
          duration: 1500, // 动画持续时间
          easing: 'out', // 动画缓动函数
        }, (frame, currentCoord) => {
          //核心要点:获得线当前位置currentCoord赋给uimarker
          this.uiMarker.setCoordinates(currentCoord); // 更新 UIMarker 的位置
        });
      },
      // 移除线条和 UIMarker
      removeLineAndMarker() {
        // 停止循环播放
        clearInterval(this.aniTimer);
        // 删除线条图层
        this.vectorLayer.remove();
        // 删除 UIMarker
        this.uiMarker.remove();
      }
    }
  };
</script>

以上代码的优化思路:不需要删除线图层,而是在外部初始化线图层后,使用.clear()方法移除对象,并使用.addGeometry()添加对象来实现循环/重置。

H5版本案例请参考地址:https://download.csdn.net/download/qq_35079107/90247851

相关推荐
NoneCoder8 分钟前
JavaScript系列(24)--内存管理机制详解
开发语言·javascript·ecmascript
不修×蝙蝠23 分钟前
vue(七) vue进阶
前端·javascript·vue.js·前端框架·vue·ssm·进阶
甄同学33 分钟前
【WPS】【WORD&WORD】【JavaScript】实现微软WORD自动更正的效果
开发语言·前端·javascript
ASER_19893 小时前
再谈Redux
javascript·typescript·react·redux·redux-toolkit·hooks·toolkit·html5移动前端·redux-hooks
一小只因程序猿3 小时前
《异步编程之美》— 全栈修仙《Java 8 CompletableFuture 对比 ES6 Promise 以及Spring @Async》
前端·javascript·jvm·spring·es6
ZTStory3 小时前
Webpack打包十六进制转十进制异常引发的白屏惨案
前端·javascript·webpack
桃园码工5 小时前
2_CSS3 背景 --[CSS3 进阶之路]
javascript·css3·css3 背景
marshalVS7 小时前
前端学习-事件对象与典型案例(二十六)
前端·javascript·学习
GISer_Jing7 小时前
React中Element&Fiber对象、WorkInProgress双缓存、Reconcile&Render&Commit、第一次挂载过程详解
javascript·react.js·前端框架
72degrees7 小时前
vue2迁移至rsbuild
前端·javascript·vue.js