热区管理
热区是地图上的多边形区域,用于高亮显示特定区域或实现区域选择等功能。
addPolygon
添加热区到地图。
javascript
/**
* 添加热区
* @param {string} key - 唯一标识
* @param {thmap.PolygonOptions} options - 配置对象
* @returns {ThMap} - 返回 this 以支持链式调用
*/
addPolygon(key, options)参数说明
| 参数 | 类型 | 描述 |
|---|---|---|
| key | string | 热区的唯一标识 |
| options | thmap.PolygonOptions | 热区的配置选项 |
PolygonOptions 详细配置
| 选项 | 类型 | 默认值 | 必填 | 描述 |
|---|---|---|---|---|
| source | thmap.SourceData | 否 | 数据源,可以是GeoJSON数据集合或数据源ID | |
| beforeId | string | 否 | 在某个图层之前的图层key | |
| defaultColor | thmap.FeatureColor | transparent | 否 | 默认颜色,填写颜色值(如:"#fff")或feature.properties中的属性名称 |
| hoverColor | thmap.FeatureColor | rgba(105,164,236,0.3) | 否 | 覆盖颜色,鼠标悬停时的填充颜色 |
| activeColor | thmap.FeatureColor | rgba(105,164,236,0.5) | 否 | 点击颜色,鼠标点击时的填充颜色 |
| defaultLineColor | thmap.FeatureColor | 否 | 默认边框颜色 | |
| hoverLineColor | thmap.FeatureColor | 否 | 鼠标移入时响应的边框颜色 | |
| activeLineColor | thmap.FeatureColor | 否 | 鼠标点击时响应的边框颜色 | |
| lineWidth | number | 0 | 否 | 边框宽度 |
| onMouseEnter | function | 否 | 鼠标移入事件处理函数,参数为事件对象 | |
| onMouseMove | function | 否 | 鼠标移动事件处理函数,参数为事件对象 | |
| onMouseLeave | function | 否 | 鼠标移出事件处理函数,参数为事件对象 | |
| onClick | function | 否 | 鼠标点击事件处理函数,参数为事件对象 |
示例
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)参数说明
| 参数 | 类型 | 描述 |
|---|---|---|
| key | string | 热区的唯一标识 |
| data | thmap.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)参数说明
| 参数 | 类型 | 描述 |
|---|---|---|
| key | string | 热区的唯一标识 |
示例
javascript
const polygon = map.getPolygon('area-polygon')
// 访问热区属性
console.log(polygon.options)removePolygon
移除热区。
javascript
/**
* 移除热区
* @param {string|string[]} [key] - 唯一标识,不提供则移除所有热区
* @returns {ThMap} - 返回 this 以支持链式调用
*/
removePolygon(key)参数说明
| 参数 | 类型 | 描述 |
|---|---|---|
| key | string | 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)参数说明
| 参数 | 类型 | 描述 |
|---|---|---|
| visibility | string | 显示状态,可选值: 'visible' (显示), 'none' (隐藏) |
| key | string | 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)常见问题
热区不显示:检查数据源是否正确,确保坐标格式符合GeoJSON规范。
事件不触发:确保热区的pointer-events属性没有被设置为none,检查事件回调函数是否正确绑定。
热区样式问题:可以通过调整defaultColor、hoverColor和activeColor等参数来修改热区的外观。
性能优化:对于大量热区数据,可以考虑使用矢量切片或数据聚合来提高性能。