如何启用点击默认的 Mapbox POI 标记?
How can I enable clicking on default Mapbox POI markers?
是否可以在 Mapbox 上制作默认的 POI 标记 actionable/clickable?
不是自定义 POI 标记包含在图层中,而是默认 POI 标记包含在每个地图中?
在下面的屏幕截图中,您可以看到蓝色和棕色的默认 POI 标记:
Central Station
、Campbria Hotel
、Homewood Suites
、Minute Maid Park
等
这些 POI 标记在缩放时显示出来,并没有添加为单独的图层。我想让它们具有可操作性。
理想的行为是弹出一个带有相关 OSM POI 信息的地图弹出窗口,例如 Google 地图。但即使直接链接到 OSM 地方也是可以接受的。
例如,如果用户单击下面的 Minute Maid Park
POI 图标,是否可以将用户重定向到相关的 OSM 地点? (https://www.openstreetmap.org/way/129025430)
我可以通过 GeoJSON 使用自定义标记来做到这一点 sources/layers,但我想访问所有默认的 POI 标记,而不是一小部分自定义标记。
是的,你可以!这完全取决于您感兴趣的样式层。例如,mapbox://styles/mapbox/streets-v11
有 111 个层来表示数据。
每次单击具有此样式的地图上的任何城市点 returns 从所有这些图层的 1 到 20 个特征。看起来你知道怎么做,但为了解释清楚起见,你可以通过点击访问所有这些:
map.on('style.load', function() {
map.on('click', function(e) {
let l = map.getStyle().layers; // here you can get all the layers of the style
var features = map.queryRenderedFeatures(e.point, {
layers: ['poi-label', 'transit-label', 'landuse', 'national-park']
}); // this filters the features in these 4 layers
new mapboxgl.Popup()
.setLngLat(e.lngLat)
.setHTML('you clicked here: <br/>' + features[0].properties.name)
.addTo(map);
});
});
因此,只需为您感兴趣的图层或图层类型创建过滤器...(我建议您从任何类型 symbol
图层或使用 ID landuse
、poi-label
, national-park
, transit-label
...)
这是我用 a sample on how to locate POIs on default layers 创建的快速 fiddle。我刚刚添加了 4 层,您可能可以轻松创建一个更好的过滤器来适应您的需要。
是否可以在 Mapbox 上制作默认的 POI 标记 actionable/clickable?
不是自定义 POI 标记包含在图层中,而是默认 POI 标记包含在每个地图中?
在下面的屏幕截图中,您可以看到蓝色和棕色的默认 POI 标记:
Central Station
、Campbria Hotel
、Homewood Suites
、Minute Maid Park
等
这些 POI 标记在缩放时显示出来,并没有添加为单独的图层。我想让它们具有可操作性。
理想的行为是弹出一个带有相关 OSM POI 信息的地图弹出窗口,例如 Google 地图。但即使直接链接到 OSM 地方也是可以接受的。
例如,如果用户单击下面的 Minute Maid Park
POI 图标,是否可以将用户重定向到相关的 OSM 地点? (https://www.openstreetmap.org/way/129025430)
我可以通过 GeoJSON 使用自定义标记来做到这一点 sources/layers,但我想访问所有默认的 POI 标记,而不是一小部分自定义标记。
是的,你可以!这完全取决于您感兴趣的样式层。例如,mapbox://styles/mapbox/streets-v11
有 111 个层来表示数据。
每次单击具有此样式的地图上的任何城市点 returns 从所有这些图层的 1 到 20 个特征。看起来你知道怎么做,但为了解释清楚起见,你可以通过点击访问所有这些:
map.on('style.load', function() {
map.on('click', function(e) {
let l = map.getStyle().layers; // here you can get all the layers of the style
var features = map.queryRenderedFeatures(e.point, {
layers: ['poi-label', 'transit-label', 'landuse', 'national-park']
}); // this filters the features in these 4 layers
new mapboxgl.Popup()
.setLngLat(e.lngLat)
.setHTML('you clicked here: <br/>' + features[0].properties.name)
.addTo(map);
});
});
因此,只需为您感兴趣的图层或图层类型创建过滤器...(我建议您从任何类型 symbol
图层或使用 ID landuse
、poi-label
, national-park
, transit-label
...)
这是我用 a sample on how to locate POIs on default layers 创建的快速 fiddle。我刚刚添加了 4 层,您可能可以轻松创建一个更好的过滤器来适应您的需要。