mapboxgl | feature-state样式交互示例
示例一
需求说明
- 图层要素默认填充颜色为
蓝
;
- 当我鼠标悬浮在某一个要素上时,这个要素的填充颜色是
红
,同时显示标签且颜色也为红
;
- 当我鼠标点击某一个要素时,这个要素的填充颜色是
黄
,同时当鼠标悬浮时标签颜色显示黄
。
有一个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则为绿色
需求说明
- 面图层要素默认填充颜色为
灰
; - 获取要素字段val设置填充颜色,如1为绿,2为红;
- 根据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
})
}
}
分类:
GIS / Mapbox-GL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2021-10-22 C# OpenFileDialog(打开文件对话框)