[Mapbox GL]根据缩放水平更新等值线图

        根据2014年的人口普查数据,展示不同缩放水平下的国家或州的人口

<!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>

.legend {
    background-color: #fff;
    border-radius: 3px;
    bottom: 30px;
    box-shadow: 0 1px 2px rgba(0,0,0,0.10);
    font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif;
    padding: 10px;
    position: absolute;
    right: 10px;
    z-index: 1;
}

.legend h4 {
    margin: 0 0 10px;
}

.legend div span {
    border-radius: 50%;
    display: inline-block;
    height: 10px;
    margin-right: 5px;
    width: 10px;
}

</style>

<div id='map'></div>

<div id='state-legend' class='legend'>   /* 图例1  */
    <h4>Population</h4>
    <div><span style='background-color: #723122'></span>25,000,000</div>
    <div><span style='background-color: #8B4225'></span>10,000,000</div>
    <div><span style='background-color: #A25626'></span>7,500,000</div>
    <div><span style='background-color: #B86B25'></span>5,000,000</div>
    <div><span style='background-color: #CA8323'></span>2,500,000</div>
    <div><span style='background-color: #DA9C20'></span>1,000,000</div>
    <div><span style='background-color: #E6B71E'></span>750,000</div>
    <div><span style='background-color: #EED322'></span>500,000</div>
    <div><span style='background-color: #F2F12D'></span>0</div>
</div>

<div id='county-legend' class='legend' style='display: none;'>  /* 图例2*/
    <h4>Population</h4>
    <div><span style='background-color: #723122'></span>1,000,000</div>
    <div><span style='background-color: #8B4225'></span>500,000</div>
    <div><span style='background-color: #A25626'></span>100,000</div>
    <div><span style='background-color: #B86B25'></span>50,000</div>
    <div><span style='background-color: #CA8323'></span>10,000</div>
    <div><span style='background-color: #DA9C20'></span>5,000</div>
    <div><span style='background-color: #E6B71E'></span>1,000</div>
    <div><span style='background-color: #EED322'></span>100</div>
    <div><span style='background-color: #F2F12D'></span>0</div>
</div>

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

var zoomThreshold = 4;

map.on('load', function() {

    map.addSource('population', {
        'type': 'vector',                    /* 矢量瓦片数据 */      
        'url': 'mapbox://mapbox.660ui7x6'    /* vector 类型数据url格式必须是mapbox://格式*/
    });
    /* 通过两个layer从同一个数据源进行不同的显示 */
    map.addLayer({
        'id': 'state-population',
        'source': 'population',
        'source-layer': 'state_county_population_2014_cen',   /* 所有使用vector类型资源的layer必须指定"source-layer"属性值 */
        'maxzoom': zoomThreshold,  /* layer的最大缩放水平 */
        'type': 'fill',            /* 用来显示面 */
        'filter': ['==', 'isState', true],  /* 过滤州的数据 */
        'paint': {
            'fill-color': {     
                property: 'population',     /* 函数的输入来源,population属性值 */
                stops: [                    /* Property function */
                    [0, '#F2F12D'],         /* 不同的population的值绘制相应的填充颜色 */
                    [500000, '#EED322'],
                    [750000, '#E6B71E'],
                    [1000000, '#DA9C20'],
                    [2500000, '#CA8323'],
                    [5000000, '#B86B25'],
                    [7500000, '#A25626'],
                    [10000000, '#8B4225'],
                    [25000000, '#723122']
                ]
            },
            'fill-opacity': 0.75           /* 填充透明度 */
        }
    }, 'waterway-label');

    map.addLayer({
        'id': 'county-population',
        'source': 'population',
        'source-layer': 'state_county_population_2014_cen',
        'minzoom': zoomThreshold,            /* 最小缩放水平,越大越显示越具体 */
        'type': 'fill',
        'filter': ['==', 'isCounty', true],    /* 过滤郡的数据 */
        'paint': {
            'fill-color': {
                property: 'population',
                stops: [
                    [0, '#F2F12D'],
                    [100, '#EED322'],
                    [1000, '#E6B71E'],
                    [5000, '#DA9C20'],
                    [10000, '#CA8323'],
                    [50000, '#B86B25'],
                    [100000, '#A25626'],
                    [500000, '#8B4225'],
                    [1000000, '#723122']
                ]
            },
            'fill-opacity': 0.75
        }
    }, 'waterway-label');

});

var stateLegendEl = document.getElementById('state-legend');  /* 获取对应id的DOM元素 */
var countyLegendEl = document.getElementById('county-legend');
map.on('zoom', function() {         /* 为zoom事件添加监听器 */
    if (map.getZoom() > zoomThreshold) {   /* getZoom获取当前的zoom水平 */
        stateLegendEl.style.display = 'none';  /* e.style.display设置DOM可见性 */
        countyLegendEl.style.display = 'block';
    } else {
        stateLegendEl.style.display = 'block';
        countyLegendEl.style.display = 'none';
    }
});

</script>

</body>
</html>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你使用`mapboxgl`库中的`source.setTiles`方法更新瓦片后,如果地图图层没有更新,可能的原因有以下几个: 1. 确保你正确地设置了图层的数据源和样式。 在调用`source.setTiles`方法之前,你需要先设置好地图的数据源,并将其与相应的图层关联。确保你已经正确地设置了图层的`source`属性,并且该数据源包含了你更新后的瓦片数据。 2. 确保你设置了适当的瓦片坐标和URL。 在调用`source.setTiles`方法时,你需要提供正确的瓦片坐标和对应的URL。确保你的瓦片坐标与更新后的瓦片数据匹配,并且URL正确指向瓦片数据的位置。 3. 确保你使用了正确的刷新方法。 在调用`source.setTiles`方法后,你需要使用适当的刷新方法来更新地图图层。在`mapboxgl`中,可以使用`map.triggerRepaint()`方法来强制刷新地图,以便更新图层。 以下是一个示例代码,演示了如何使用`source.setTiles`方法更新地图的瓦片,并刷新地图以显示更新后的图层: ```javascript // 设置地图样式和初始数据源 mapboxgl.accessToken = 'your-access-token'; const map = new mapboxgl.Map({ container: 'map', style: 'mapbox://styles/mapbox/streets-v11', center: [lng, lat], zoom: 10 }); map.on('load', () => { // 创建一个新的瓦片源 map.addSource('my-tiles', { type: 'raster', tiles: ['http://example.com/{z}/{x}/{y}.png'], tileSize: 256 }); // 创建一个新的图层 map.addLayer({ id: 'my-layer', type: 'raster', source: 'my-tiles' }); // 更新瓦片数据源 map.getSource('my-tiles').setTiles(['http://example.com/{z}/{x}/{y}.png']); // 刷新地图以显示更新后的图层 map.triggerRepaint(); }); ``` 请注意,上述代码中的URL和其他参数仅作示例用途,你需要根据你自己的数据源和需求进行相应的设置。 希望这个示例能帮助你解决问题!如果你还有其他疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值