使用 mapbox-gl-js 为要素集合中的每个要素添加自定义图标
Adding custom icons for each feature in feature collection with mapbox-gl-js
我需要使用 mapbox-gl-js 为地图中的每个点设置不同的自定义图像,但我找不到为要素集合中的每个要素提供自定义图标的方法
incidentMarkers = {
"type": "FeatureCollection"
"features": [{
"type": "geojson",
"data": {
"type": "Feature",
"properties": {
},
"geometry": {
"type": "Point",
"coordinates": [
longitude
latitude
]
}
}
},
{
"type": "geojson",
"data": {
"type": "Feature",
"properties": {
},
"geometry": {
"type": "Point",
"coordinates": [
longitude
latitude
]
}
}
}]
}
map.addSource('incidentMarkers', {
"type": "geojson"
"data": incidentMarker
})
window.map.addLayer({
"id": 'incidentMarkers',
"type": "symbol",
"source": 'incidentMarkers'
"layout": {
"icon-image": "image-1",
"icon-size": 0.25,
"icon-allow-overlap": true,
"text-allow-overlap": true
}
})
现在我将每个点添加为单独的图层,以便为每个图标添加自定义图像,但是为了使用标记进行聚类,我需要将所有标记作为相同的图层,有没有办法为每个图层添加自定义图像
pointsData.forEach (data) ->
window.map.loadImage("#{data.category_image_path}", (e, image) ->
window.map.addImage("image-#{data.id}", image)
incidentMarker = {
"type": "Feature",
"properties": {
},
"geometry": {
"type": "Point",
"coordinates": [
data.longitude
data.latitude
]
}
}
map.addSource('incidentMarkers' + data.id, {
"type": "geojson",
"data": incidentMarker
})
window.map.addLayer({
"id": 'incidentMarkers' + data.id,
"type": "symbol",
"source": 'incidentMarkers' + data.id
"layout": {
"icon-image": "image-#{data.id}",
"icon-size": 0.25,
"icon-allow-overlap": true,
"text-allow-overlap": true
}
})
如果我在同一个 latlng 上有多个标记,则只有一个标记出现,即使我将 icon-allow-overlap
选项设置为 true
如果您引用每个要素的属性中应使用哪个图标,您可以使用 mapbox 的数据驱动样式功能为每个要素使用不同的图标:
const geojson = {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
properties: {icon: 'image-1'},
geometry: {/* */}
},
{
type: 'Feature',
properties: {icon: 'image-2'},
geometry: {/* */}
}
]
}
// add source
map.addLayer({
type: 'symbol',
source: 'source-id',
layout: {
'icon-image': ['get', 'icon']
}
})
['get', 'icon']
是一个表达式,其中 "gets" 属性 "icon" 来自每个特征,并将其用作 icon-image
的值。
我需要使用 mapbox-gl-js 为地图中的每个点设置不同的自定义图像,但我找不到为要素集合中的每个要素提供自定义图标的方法
incidentMarkers = {
"type": "FeatureCollection"
"features": [{
"type": "geojson",
"data": {
"type": "Feature",
"properties": {
},
"geometry": {
"type": "Point",
"coordinates": [
longitude
latitude
]
}
}
},
{
"type": "geojson",
"data": {
"type": "Feature",
"properties": {
},
"geometry": {
"type": "Point",
"coordinates": [
longitude
latitude
]
}
}
}]
}
map.addSource('incidentMarkers', {
"type": "geojson"
"data": incidentMarker
})
window.map.addLayer({
"id": 'incidentMarkers',
"type": "symbol",
"source": 'incidentMarkers'
"layout": {
"icon-image": "image-1",
"icon-size": 0.25,
"icon-allow-overlap": true,
"text-allow-overlap": true
}
})
现在我将每个点添加为单独的图层,以便为每个图标添加自定义图像,但是为了使用标记进行聚类,我需要将所有标记作为相同的图层,有没有办法为每个图层添加自定义图像
pointsData.forEach (data) ->
window.map.loadImage("#{data.category_image_path}", (e, image) ->
window.map.addImage("image-#{data.id}", image)
incidentMarker = {
"type": "Feature",
"properties": {
},
"geometry": {
"type": "Point",
"coordinates": [
data.longitude
data.latitude
]
}
}
map.addSource('incidentMarkers' + data.id, {
"type": "geojson",
"data": incidentMarker
})
window.map.addLayer({
"id": 'incidentMarkers' + data.id,
"type": "symbol",
"source": 'incidentMarkers' + data.id
"layout": {
"icon-image": "image-#{data.id}",
"icon-size": 0.25,
"icon-allow-overlap": true,
"text-allow-overlap": true
}
})
如果我在同一个 latlng 上有多个标记,则只有一个标记出现,即使我将 icon-allow-overlap
选项设置为 true
如果您引用每个要素的属性中应使用哪个图标,您可以使用 mapbox 的数据驱动样式功能为每个要素使用不同的图标:
const geojson = {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
properties: {icon: 'image-1'},
geometry: {/* */}
},
{
type: 'Feature',
properties: {icon: 'image-2'},
geometry: {/* */}
}
]
}
// add source
map.addLayer({
type: 'symbol',
source: 'source-id',
layout: {
'icon-image': ['get', 'icon']
}
})
['get', 'icon']
是一个表达式,其中 "gets" 属性 "icon" 来自每个特征,并将其用作 icon-image
的值。