Skip to content

热区管理

热区是地图上的多边形区域,用于高亮显示特定区域或实现区域选择等功能。

addPolygon

添加热区到地图。

javascript
/**
 * 添加热区
 * @param {string} key - 唯一标识
 * @param {thmap.PolygonOptions} options - 配置对象
 * @returns {ThMap} - 返回 this 以支持链式调用
 */
addPolygon(key, options)

参数说明

参数类型描述
keystring热区的唯一标识
optionsthmap.PolygonOptions热区的配置选项

PolygonOptions 详细配置

选项类型默认值必填描述
sourcethmap.SourceData数据源,可以是GeoJSON数据集合或数据源ID
beforeIdstring在某个图层之前的图层key
defaultColorthmap.FeatureColortransparent默认颜色,填写颜色值(如:"#fff")或feature.properties中的属性名称
hoverColorthmap.FeatureColorrgba(105,164,236,0.3)覆盖颜色,鼠标悬停时的填充颜色
activeColorthmap.FeatureColorrgba(105,164,236,0.5)点击颜色,鼠标点击时的填充颜色
defaultLineColorthmap.FeatureColor默认边框颜色
hoverLineColorthmap.FeatureColor鼠标移入时响应的边框颜色
activeLineColorthmap.FeatureColor鼠标点击时响应的边框颜色
lineWidthnumber0边框宽度
onMouseEnterfunction鼠标移入事件处理函数,参数为事件对象
onMouseMovefunction鼠标移动事件处理函数,参数为事件对象
onMouseLeavefunction鼠标移出事件处理函数,参数为事件对象
onClickfunction鼠标点击事件处理函数,参数为事件对象

示例

javascript
// 添加简单热区
map.addPolygon('area-polygon', {
  source: {
    type: 'geojson',
    data: {
      type: 'Feature',
      geometry: {
        type: 'Polygon',
        coordinates: [
          [
            [116.38, 39.90],
            [116.40, 39.90],
            [116.40, 39.91],
            [116.38, 39.91],
            [116.38, 39.90]
          ]
        ]
      }
    }
  },
  defaultColor: 'rgba(255, 0, 0, 0.2)',
  hoverColor: 'rgba(255, 0, 0, 0.4)',
  lineWidth: 2,
  defaultLineColor: '#ff0000',
  onClick: function(e) {
    console.log('点击了热区:', e);
  }
})

setPolygonData

设置热区数据。

javascript
/**
 * 设置热区数据
 * @param {string} key - 唯一标识
 * @param {thmap.SourceData} data - 热区数据
 * @returns {ThMap} - 返回 this 以支持链式调用
 */
setPolygonData(key, data)

参数说明

参数类型描述
keystring热区的唯一标识
datathmap.SourceData热区数据,可以是GeoJSON数据或数据源ID

示例

javascript
// 更新热区数据
map.setPolygonData('area-polygon', {
  type: 'geojson',
  data: {
    type: 'Feature',
    geometry: {
      type: 'Polygon',
      coordinates: [
        [
          [116.37, 39.89],
          [116.41, 39.89],
          [116.41, 39.92],
          [116.37, 39.92],
          [116.37, 39.89]
        ]
      ]
    }
  }
})

getPolygon

获取指定的热区实例。

javascript
/**
 * 获取热区
 * @param {string} key - 唯一标识
 * @returns {PolygonLayer} - 热区实例
 */
getPolygon(key)

参数说明

参数类型描述
keystring热区的唯一标识

示例

javascript
const polygon = map.getPolygon('area-polygon')
// 访问热区属性
console.log(polygon.options)

removePolygon

移除热区。

javascript
/**
 * 移除热区
 * @param {string|string[]} [key] - 唯一标识,不提供则移除所有热区
 * @returns {ThMap} - 返回 this 以支持链式调用
 */
removePolygon(key)

参数说明

参数类型描述
keystring | string[]可选,热区的唯一标识,不提供则移除所有热区

示例

javascript
// 移除特定热区
map.removePolygon('area-polygon')

// 移除多个热区
map.removePolygon(['area-polygon1', 'area-polygon2'])

// 移除所有热区
map.removePolygon()

setPolygonVisibility

设置热区的显示状态。

javascript
/**
 * 设置热区显示状态
 * @param {layer.VisibilityEnum} visibility - 显示状态('visible' 或 'none')
 * @param {string|string[]} [key] - 唯一标识,不提供则设置所有热区
 * @returns {ThMap} - 返回 this 以支持链式调用
 */
setPolygonVisibility(visibility, key)

参数说明

参数类型描述
visibilitystring显示状态,可选值: 'visible' (显示), 'none' (隐藏)
keystring | string[]可选,热区的唯一标识,不提供则设置所有热区

示例

javascript
// 显示特定热区
map.setPolygonVisibility('visible', 'area-polygon')

// 隐藏多个热区
map.setPolygonVisibility('none', ['area-polygon1', 'area-polygon2'])

// 隐藏所有热区
map.setPolygonVisibility('none')

热区操作示例

javascript
// 添加热区并绑定事件
map.addPolygon('area-polygon', {
  source: {
    type: 'geojson',
    data: {
      type: 'FeatureCollection',
      features: [
        {
          type: 'Feature',
          id: 'area1',
          geometry: {
            type: 'Polygon',
            coordinates: [
              [
                [116.38, 39.90],
                [116.40, 39.90],
                [116.40, 39.91],
                [116.38, 39.91],
                [116.38, 39.90]
              ]
            ]
          },
          properties: {
            name: '区域1',
            color: 'rgba(255, 0, 0, 0.2)'
          }
        },
        {
          type: 'Feature',
          id: 'area2',
          geometry: {
            type: 'Polygon',
            coordinates: [
              [
                [116.40, 39.90],
                [116.42, 39.90],
                [116.42, 39.91],
                [116.40, 39.91],
                [116.40, 39.90]
              ]
            ]
          },
          properties: {
            name: '区域2',
            color: 'rgba(0, 255, 0, 0.2)'
          }
        }
      ]
    }
  },
  defaultColor: ['get', 'color'],
  hoverColor: ['case',
    ['==', ['get', 'name'], '区域1'],
    'rgba(255, 0, 0, 0.4)',
    'rgba(0, 255, 0, 0.4)'
  ],
  lineWidth: 2,
  defaultLineColor: '#000',
  onMouseEnter: function(e) {
    console.log('进入热区:', e.features[0].properties.name);
  },
  onClick: function(e) {
    console.log('点击热区:', e.features[0].properties.name);
  }
})

// 稍后更新热区数据
setTimeout(function() {
  map.setPolygonData('area-polygon', {
    type: 'geojson',
    data: {
      type: 'Feature',
      id: 'area3',
      geometry: {
        type: 'Polygon',
        coordinates: [
          [
            [116.39, 39.89],
            [116.41, 39.89],
            [116.41, 39.91],
            [116.39, 39.91],
            [116.39, 39.89]
          ]
        ]
      },
      properties: {
        name: '区域3',
        color: 'rgba(0, 0, 255, 0.2)'
      }
    }
  })
}, 3000)

常见问题

  1. 热区不显示:检查数据源是否正确,确保坐标格式符合GeoJSON规范。

  2. 事件不触发:确保热区的pointer-events属性没有被设置为none,检查事件回调函数是否正确绑定。

  3. 热区样式问题:可以通过调整defaultColor、hoverColor和activeColor等参数来修改热区的外观。

  4. 性能优化:对于大量热区数据,可以考虑使用矢量切片或数据聚合来提高性能。