[Mapbox GL]高亮包含相似数据的特性

本文介绍如何使用Mapbox GL JS实现地图上相同名称区域的高亮显示及信息查询功能。通过鼠标悬停交互,可以高亮显示地图上所有具有相同郡名的区域,并展示这些区域的总人口数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        鼠标悬停在某个郡上面时,高亮使用相同郡名的其他郡

<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8' />
    <title></title>
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.29.0/mapbox-gl.js'></script>
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.29.0/mapbox-gl.css' rel='stylesheet' />
    <style>
        body { margin:0; padding:0; }
        #map { position:absolute; top:0; bottom:0; width:100%; }
    </style>
</head>
<body>

<style>
.map-overlay {
    font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif;
    background-color: #fff;
    box-shadow: 0 1px 2px rgba(0,0,0,0.10);
    border-radius: 3px;
    position: absolute;
    width: 25%;
    top: 10px;
    left: 10px;
    padding: 10px;
    display: none;
}
</style>

<div id='map'></div>
<div id='map-overlay' class='map-overlay'></div>

<script>
mapboxgl.accessToken = '<your access token here>';
var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/streets-v9',
    center: [-98, 38.88],
    minZoom: 2,
    zoom: 3
});

var overlay = document.getElementById('map-overlay');

// Create a popup, but don't add it to the map yet.
var popup = new mapboxgl.Popup({
    closeButton: false
});

map.on('load', function() {
    // Add the source to query. In this example we're using
    // county polygons uploaded as vector tiles
    map.addSource('counties', {
        "type": "vector",
        "url": "mapbox://mapbox.82pkq93d"
    });

    map.addLayer({
        "id": "counties",
        "type": "fill",
        "source": "counties",
        "source-layer": "original",
        "paint": {
            "fill-outline-color": "rgba(0,0,0,0.1)",  /* 轮廓颜色 */
            "fill-color": "rgba(0,0,0,0.1)"           /* 填充颜色 */
        }
    }, 'place-city-sm'); // Place polygon under these labels.

    map.addLayer({
        "id": "counties-highlighted",
        "type": "fill",
        "source": "counties",
        "source-layer": "original",
        "paint": {
            "fill-outline-color": "#484896",
            "fill-color": "#6e599f",
            "fill-opacity": 0.75        /* 填充透明度 */
        },
        "filter": ["in", "COUNTY", ""]  /* 数据过滤器 */
    }, 'place-city-sm'); // Place polygon under these labels.

    map.on('mousemove', function(e) {   /* mousemove 鼠标指针移动时发生 */
        var features = map.queryRenderedFeatures(e.point, {    /* queryRenderedFeatures  ([geometry], [parameters]):在特定的几何形状内查询满足条件的可视化的GeoJSON特性对象数组  */
            layers: ['counties']
        });

        // Change the cursor style as a UI indicator.
        map.getCanvas().style.cursor = features.length ? 'pointer' : '';  /* 设置鼠标样式 */

        // Remove things if no feature was found.
        if (!features.length) {
            popup.remove();
            map.setFilter('counties-highlighted', ['in', 'COUNTY', '']);  /* 更新数据过滤器 */
            overlay.style.display = 'none';       /* 隐藏该标签 */
            return;
        }

        // Single out the first found feature on mouseove.
        var feature = features[0];

        // Query the counties layer visible in the map. Use the filter
        // param to only collect results that share the same county name.
        var relatedFeatures = map.querySourceFeatures('counties', {    /* querySourceFeatures  (sourceID, [parameters]):在GeoJSON source或者矢量瓦片内查询满足条件的GeoJSON特性对象数组 */
            sourceLayer: 'original',
            filter: ['in', 'COUNTY', feature.properties.COUNTY]  /* ["in", key, v0, ..., vn] set inclusion: feature[key] ∈ {v0, ..., vn} */
        });

        // Render found features in an overlay.
        overlay.innerHTML = '';

        // Total the population of all features
        var populationSum = relatedFeatures.reduce(function(memo, feature) {
            return memo + feature.properties.population;
        }, 0);

        var title = document.createElement('strong');
        title.textContent = feature.properties.COUNTY + ' (' + relatedFeatures.length + ' found)';  /* 更新文本内容 */

        var population = document.createElement('div');
        population.textContent = 'Total population: ' + populationSum.toLocaleString();

        overlay.appendChild(title);
        overlay.appendChild(population);
        overlay.style.display = 'block';

        // Add features that share the same county name to the highlighted layer.
        map.setFilter('counties-highlighted', ['in', 'COUNTY', feature.properties.COUNTY]);   /* 更新高亮layer的过滤器,显示相关数据 */

        // Display a popup with the name of the county
        popup.setLngLat(e.lngLat)
            .setText(feature.properties.COUNTY)
            .addTo(map);
    });
});
</script>

</body>
</html>

原文:https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/


### 在 Mapbox GL 中实现线边缘高亮效果的方法 为了在 Mapbox GL 地图中实现线边缘高亮的效果,可以采用 **双层叠加技术** 来模拟这一视觉效果。具体来说,通过创建两层线条图层来分别表示外侧的高亮边框和内部的主要线条部分。 以下是详细的实现方案: #### 方法概述 1. 创建一个较宽的第一条线(用于表现高亮边框),并赋予其一种颜色。 2. 在第一条线上方再添加一条稍窄的第二条线(用于表现主要线条的颜色)。 3. 调整两条线之间的宽度差值以及透明度属性,从而达到理想的视觉效果。 此方法基于 Mapbox GL 的分层渲染机制,允许开发者灵活控制每层的表现形式[^1]。 #### 示例代码 下面是一个完整的 JavaScript 示例,展示如何使用 Mapbox GL 实现线边缘高亮效果: ```javascript // 初始化地图实例 mapboxgl.accessToken = 'YOUR_ACCESS_TOKEN'; const map = new mapboxgl.Map({ container: 'map', // 容器ID style: 'mapbox://styles/mapbox/streets-v10', // 风格URL center: [-74.5, 40], // 初始视图位置 [经度, 纬度] zoom: 9 // 缩放级别 }); // 当地图加载完成后执行回调函数 map.on('load', function () { // 添加GeoJSON数据源 map.addSource('route-source', { 'type': 'geojson', 'data': { "type": "Feature", "properties": {}, "geometry": { "type": "LineString", "coordinates": [ [-74.50, 40], [-74.45, 40.2], [-74.4, 40.1] ] } } }); // 第一层:较宽的外部高亮边框 map.addLayer({ 'id': 'highlight-border', 'type': 'line', 'source': 'route-source', 'layout': {}, 'paint': { 'line-color': '#ffcc00', // 外部高亮颜色 'line-width': 8 // 较宽的线宽 } }); // 第二层:较窄的内部主线 map.addLayer({ 'id': 'main-route', 'type': 'line', 'source': 'route-source', 'layout': {}, 'paint': { 'line-color': '#ffffff', // 主要线条颜色 'line-opacity': 0.8, // 设置一定的透明度 'line-width': 6 // 较窄的线宽 } }); }); ``` 在此示例中: - `highlight-border` 是用来呈现外部高亮边框的一层,它的颜色被设定为黄色 (`#ffcc00`) 并且拥有较大的宽度 (8px)[^1]。 - `main-route` 表达的是实际的道路或路径本身,它位于前者的上方,因此会遮挡住一部分底层的黄色彩带,最终呈现出带有白色核心与金色边缘的整体观感。 #### 进一步优化建议 如果想要进一步增强用户体验或者适应不同设备上的显示差异,还可以尝试以下改进措施: - 动态调整线条粗细以匹配缩放比例变化; - 结合动画功能使高亮效果更具互动性和吸引力; - 引入更多样化的配色方案满足个性化需求。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值