mapboxgl | feature-state样式交互示例

示例一

需求说明

  1. 图层要素默认填充颜色为
  2. 当我鼠标悬浮在某一个要素上时,这个要素的填充颜色是,同时显示标签且颜色也为
  3. 当我鼠标点击某一个要素时,这个要素的填充颜色是,同时当鼠标悬浮时标签颜色显示

    有一个geojson面图层数据,加载到地图上。

代码实现

const addGeoJson = (geojson) => {
  let source = map.getSource('testlayer')
  if (source) {
    source.setData(geojson)
  } else {
    map.addSource('testlayer', {
      type: 'geojson',
      data: geojson,
      generateId: true
    })

    map.addLayer({
      id: 'state-fills',
      type: 'fill',
      source: 'testlayer',
      layout: {},
      paint: {
        'fill-color': [
          'case',
          ['boolean', ['feature-state', 'click'], false],
          'yellow',
          ['boolean', ['feature-state', 'hover'], false],
          'red',
          'blue'
        ],
        'fill-opacity': 0.2,
        'fill-outline-color': 'red'
      }
    })
    map.addLayer({
      id: 'charts_symbol',
      type: 'symbol',
      source: 'testlayer',
      paint: {
        'text-opacity': ['case', ['boolean', ['feature-state', 'hover'], false], 1, 0],
        'text-color': [
          'case',
          ['boolean', ['feature-state', 'click'], false],
          'yellow',
          ['boolean', ['feature-state', 'hover'], false],
          'red',
          'blue'
        ]
      },
      layout: {
        'text-field': '{scale}',
        'text-font': ['Open Sans Semibold'],
        'text-anchor': 'center',
        'text-offset': [0, 0.6],
        'text-size': 12,
        'text-padding': 75,
        'text-letter-spacing': 0.4,
        // "icon-image": "monument-15",
        // "icon-anchor": "center",
        'text-ignore-placement': true,
        'symbol-placement': 'point'
      }
    })

    map.on('click', 'state-fills', (e) => {
      if (e.features.length > 0) {
        let polygon = e.features[0]
        let clickPolygonId = polygon.id
        let state = map.getFeatureState({
          source: 'testlayer',
          id: clickPolygonId
        })
        if (state?.click === true) {
          map.setFeatureState({ source: 'testlayer', id: clickPolygonId }, { click: false })
        } else {
          map.setFeatureState({ source: 'testlayer', id: clickPolygonId }, { click: true })
        }
      }
    })
    let hoveredPolygonId = null
    map.on('mousemove', 'state-fills', (e) => {
      if (e.features.length > 0) {
        if (hoveredPolygonId !== null) {
          map.setFeatureState({ source: 'testlayer', id: hoveredPolygonId }, { hover: false })
        }
        hoveredPolygonId = e.features[0].id
        map.setFeatureState({ source: 'testlayer', id: hoveredPolygonId }, { hover: true })
      }
    })
    map.on('mouseleave', 'state-fills', () => {
      if (hoveredPolygonId !== null) {
        map.setFeatureState({ source: 'testlayer', id: hoveredPolygonId }, { hover: false })
      }
      hoveredPolygonId = null
    })
  }
}

示例二

mapboxgl的面图层,根据字段val设置填充颜色,如1为红,2为蓝,3为黄,并且根据feature-state状态hover则为绿色

需求说明

  1. 面图层要素默认填充颜色为
  2. 获取要素字段val设置填充颜色,如1为绿,2为红;
  3. 根据feature-state状态hover则为橙。

有一个geojson面图层数据,加载到地图上。

代码实现

const addGeoJson = (geojson) => {
  let source = map.getSource('geojson')
  if (source) {
    source.setData(geojson)
  } else {
    map.addSource('chartsbox', {
      type: 'geojson',
      data: geojson,
      generateId: true
    })

    map.addLayer({
      id: 'geojson_fill',
      type: 'fill',
      source: 'geojson',
      layout: {},
      paint: {
        'fill-color': [
          'case',
          ['boolean', ['feature-state', 'hover'], false],
          'orange',
          ['match', ['get', 'hoding_status'], '1', 'green', '2', 'red', 'gray']
        ],
        'fill-opacity': 0.5,
        'fill-outline-color': 'red'
      }
    })

    let hoveredPolygonId = null
    map.on('mousemove', 'geojson_fill', (e) => {
      if (e.features.length > 0) {
        if (hoveredPolygonId !== null) {
          map.setFeatureState({ source: 'geojson', id: hoveredPolygonId }, { hover: false })
        }
        hoveredPolygonId = e.features[0].id
        map.setFeatureState({ source: 'geojson', id: hoveredPolygonId }, { hover: true })
      }
    })
    map.on('mouseleave', 'charts_fill', () => {
      if (hoveredPolygonId !== null) {
        map.setFeatureState({ source: 'geojson', id: hoveredPolygonId }, { hover: false })
      }
      hoveredPolygonId = null
    })
  }
}
posted @   槑孒  阅读(301)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
历史上的今天:
2021-10-22 C# OpenFileDialog(打开文件对话框)
点击右上角即可分享
微信分享提示