特征点位

所有 layer ,需要先加载特征点位到地图上,再通过特征点位的 id 关联 layer

// 点位加工工厂
export class SourceFactory {
  map;
  sources = [];
  sourceOption = {};
  sourceDefaultOption = {
    cluster: false /*是否聚合*/,
    clusterMaxZoom: 15 /* 最大聚合层级 */,
    clusterRadius: 50 /* 聚合半径 */,
  };

  constructor(map, sources) {
    this.map = map;
    this.sources = sources;
  }

  /**重要**
   *               创建出符合图层要求的特征点位
   **************************************************************
   *                  地图点位字段对应为                          *
   * lat 经度 lng 纬度 title 点位名称 kind 点位分类 icon 点位图标  *
   *            icon 的图标必须要在地图初始化时加载到地图中         *
   **************************************************************
   */
  createSourceFeatures(pointList) {
    const sourcePoints = this.createSourcePoints(pointList);
    return sourcePoints.map((point) => {
      return {
        type: 'Feature',
        geometry: {
          type: 'Point',
          coordinates: [point.lng, point.lat],
        },
        properties: {
          lat: point.lat,
          lng: point.lng,
          title: point.title,
          kind: point.kind,
          icon: point.icon,
        },
      };
    });
  }

  /**重要**
   *                系统点位转换为地图点位
   **************************************************************
   *                  地图点位字段对应为                          *
   * lat 经度 lng 纬度 title 点位名称 kind 点位分类 icon 点位图标  *
   *            icon 的图标必须要在地图初始化时加载到地图中         *
   **************************************************************
   */
  createSourcePoints(pointList) {
    return pointList.map((point) => {
      return {
        lat: point.lat,
        lng: point.lng,
        title: point.title,
        kind: point.kind,
        icon: point.icon,
      };
    });
  }

  // 创建符合geojson的数据
  createGeoJson(pointList) {
    // 通过工厂函数加工系统点位
    const features = this.createSourceFeatures(pointList);
    return {
      type: 'FeatureCollection',
      features: features,
    };
  }

  // 添加source到地图上
  addSources(data, sourceId, sourceOption = {}) {
    this.sourceOption = { ...this.sourceDefaultOption, ...sourceOption };
    if (this.map.getSource(sourceId)) {
      console.error(`已添加过${sourceId}的图层`);
      return;
    }
    let jsonData = null;
    /**
     * 如果传入的是字符串则认为传入的是geojson的链接直接使用
     * 否则则是系统内部点位数据则需要加工之后使用
     */
    if (typeof data === 'string') {
      jsonData = data;
    } else {
      // 生成json数据加载source到地图上
      jsonData = this.createGeoJson(data);
    }

    this.map.addSource(sourceId, {
      type: 'geojson',
      data: jsonData,
      ...this.sourceOption,
    });
    this.sources.push(sourceId);
  }

  /**
   * 添加栅格source
   * @param {*} tiles 瓦片服务地址 Array
   * @param {*} sourceId
   * @param {*} tileSize 瓦片尺寸
   */
  addRasterSources(tiles, sourceId, tileSize = 256) {
    this.map.addSource(sourceId, {
      type: 'raster', //数据源类型:栅格数据源
      tiles: tiles,
      tileSize: tileSize,
    });
    this.sources.push(sourceId);
  }

  removeSource(sourceId) {
    if (this.map.getSource(sourceId)) {
      this.map.removeSource(sourceId);
    }
  }
}
上次更新:
贡献者: zml