Maplibre GL JS 中文文档Maplibre GL JS 中文文档
介绍
插件
样式规范
API
案例
指南
介绍
插件
样式规范
API
案例
指南
  • 介绍
  • 插件
  • 样式规范
    • 弃用功能
    • 表达式
    • 字形
    • 图层
    • 光照
    • 投影
    • 根属性
    • 天空
    • 数据源
    • 精灵图
    • 状态
    • 地形
    • 过渡
    • 类型
  • API
    • media

      • 为 MapLibre GL JS 做贡献
    • Classes

      • AJAXError
      • Actor
      • AlphaImage
      • AttributionControl
      • BoxZoomHandler
      • CanonicalTileID
      • CanvasSource
      • CircleStyleLayer
      • ClickZoomHandler
      • CooperativeGesturesHandler
      • DEMData
      • Dispatcher
      • DoubleClickZoomHandler
      • DragPanHandler
      • DragRotateHandler
      • EdgeInsets
      • ErrorEvent
      • Event
      • Evented
      • FeatureIndex
      • FullscreenControl
      • GeoJSONFeature
      • GeoJSONSource
      • GlobeControl
      • Hash
      • HeatmapStyleLayer
      • ImageAtlas
      • ImageManager
      • ImageSource
      • KeyboardHandler
      • Layout<Props>
      • LngLat
      • LngLatBounds
      • LogoControl
      • Map
      • MapMouseEvent
      • MapTouchEvent
      • MapWheelEvent
      • Marker
      • MercatorCoordinate
      • NavigationControl
      • OverscaledTileID
      • Popup
      • RGBAImage
      • RasterDEMTileSource
      • RasterTileSource
      • ScaleControl
      • ScrollZoomHandler
      • Style
      • abstract StyleLayer
      • SubdivisionGranularityExpression
      • SubdivisionGranularitySetting
      • TapDragZoomHandler
      • TapZoomHandler
      • TerrainControl
      • ThrottledInvoker
      • Tile
      • TouchPanHandler
      • 抽象 TwoFingersTouchHandler
      • TwoFingersTouchPitchHandler
      • TwoFingersTouchRotateHandler
      • TwoFingersTouchZoomHandler
      • TwoFingersTouchZoomRotateHandler
      • VectorTileSource
      • VideoSource
      • WorkerPool
    • Enumerations

      • MessageType
      • ResourceType
      • TextFit
    • Functions

      • addProtocol()
      • addSourceType()
      • clearPrewarmedResources()
      • createTileMesh()
      • getMaxParallelImageRequests()
      • getRTLTextPluginStatus()
      • getVersion()
      • getWorkerCount()
      • getWorkerUrl()
      • importScriptInWorkers()
      • prewarm()
      • removeProtocol()
      • setMaxParallelImageRequests()
      • setWorkerCount()
      • setWorkerUrl()
    • Interfaces

      • ActorTarget
      • AttributeBinder
      • Bucket
      • CustomLayerInterface
      • Handler
      • IActor
      • IControl
      • MousePanHandler
      • MousePitchHandler
      • MouseRollHandler
      • MouseRotateHandler
      • Projection
      • Source
      • StyleImageInterface
      • Subscription
    • Type aliases

      • ActorMessage<T>
      • AddLayerObject
      • AddProtocolAction
      • Alignment
      • AnimationOptions
      • AroundCenterOptions
      • AttributionControlOptions
      • CalculateTileZoomFunction
      • CameraForBoundsOptions
      • CameraOptions
      • CameraUpdateTransformFunction()
      • CanvasSourceSpecification
      • CenterZoomBearing
      • CircleGranularity
      • ClusterIDAndSource
      • Complete<T>
      • Config
      • ControlPosition
      • Coordinates
      • CreateTileMeshOptions
      • CrossFaded<T>
      • CustomRenderMethod()
      • CustomRenderMethodInput
      • DEMEncoding
      • DashEntry
      • DistributiveKeys<T>
      • DistributiveOmit<T, K>
      • DragPanOptions
      • DragRotateHandlerOptions
      • EaseToOptions
      • ExpiryData
      • FeatureIdentifier
      • FitBoundsOptions
      • FlyToOptions
      • FullscreenControlOptions
      • GeoJSONFeatureDiff
      • GeoJSONFeatureId
      • GeoJSONSourceDiff
      • GeoJSONSourceOptions
      • GeoJSONWorkerOptions
      • GeoJSONWorkerSourceLoadDataResult
      • GeolocateControlOptions
      • GestureOptions
      • GetClusterLeavesParams
      • GetGlyphsParameters
      • GetGlyphsResponse
      • GetImagesParameters
      • GetImagesResponse
      • GetResourceResponse<T>
      • GlyphPosition
      • GlyphMetrics
      • GridKey
      • HandlerResult
      • IndicesType
      • JumpToOptions
      • Listener()
      • LngLatBoundsLike
      • LngLatLike
      • LoadGeoJSONParameters
      • LogoControlOptions
      • MapContextEvent
      • MapDataEvent
      • MapEventType
      • MapGeoJSONFeature
      • MapLayerEventType
      • MapLayerMouseEvent
      • MapLayerTouchEvent
      • MapLibreEvent
      • MapLibreZoomEvent
      • MapOptions
      • MapProjectionEvent
      • MapSourceDataType
      • MapSourceDataEvent
      • MapStyleDataEvent
      • MapStyleImageMissingEvent
      • MapTerrainEvent
      • MarkerOptions
      • MessageData
      • NavigationControlOptions
      • /api/type-aliases/Offset.html
      • OverlapMode
      • PaddingOptions
      • PluginState
      • PointLike
      • PointProjection
      • PopupOptions
      • PositionAnchor
      • PossiblyEvaluatedValue<T>
      • ProjectionData
      • ProjectionDataParams
      • QueryRenderedFeaturesOptions
      • QuerySourceFeatureOptions
      • RTLPluginStatus
      • Rect
      • RemoveSourceParams
      • RequestParameters
      • RequestResponseMessageMap
      • RequestTransformFunction()
      • RequireAtLeastOne<T>
      • ScaleControlOptions
      • Serialized
      • SerializedObject<S>
      • SerializedStructArray
      • SetClusterOptions
      • SourceClass()
      • SpriteOnDemandStyleImage
      • StyleGlyph
      • StyleImage
      • StyleImageData
      • StyleImageMetadata
      • StyleOptions
      • StyleSetterOptions
      • StyleSwapOptions
      • SymbolQuad
      • TileMesh
      • TileParameters
      • TileState
      • TransformStyleFunction()
      • Unit
      • UpdateImageOptions
      • UpdateLayersParamaeters
      • WorkerDEMTileParameters
      • WorkerTileParameters
      • WorkerTileResult
  • 案例
    • 3D建筑显示
    • 3D室内地图多边形挤出
    • 3D地形
    • 使用babylon.js添加3D模型
    • 使用three.js添加带阴影的3D模型
    • 在地形上使用three.js添加3D模型
    • 使用three.js添加3D模型
    • 添加默认标记
    • 添加云优化地理TIFF (COG)
    • 使用REST API添加DeckGL图层
    • 添加动画图像
    • 添加生成的图像
    • 动态生成并添加缺失图标到地图
    • 向地图添加可拉伸图片
    • 向地图添加图标
    • 动画线条
    • 绕点相机动画
    • 图像序列动画
    • 标记动画
    • 点动画
    • 沿路径点动画
    • 符号跟随鼠标动画
    • 更改版权信息位置
    • 自定义相机动画
    • 添加Canvas数据源
    • 使地图在点击符号时居中
    • 设置地面以上的中心点
    • 根据缩放级别更改建筑物颜色
    • 更改标签大小写
    • 检查是否支持WebGL
    • 使用自定义属性显示HTML集群
    • 创建和样式化集群
    • 使用按钮更改图层颜色
    • 添加等高线
    • 合作手势
    • 使用自定义标记图标
    • 添加自定义样式图层
    • 使用数据驱动属性设置线条样式
    • 禁用地图旋转
    • 禁用滚动缩放
    • 显示和样式丰富文本标签
    • 创建可拖动标记
    • 创建可拖动点
    • 绘制一个圆形
    • 使用备用图像
    • 使用addProtocol转换特性属性
    • 向多边形添加图案
    • 通过文本输入过滤符号
    • 通过切换列表过滤符号
    • 在图层内过滤
    • 将地图适配到边界框
    • 缓慢飞行到位置
    • 飞行到位置
    • 查看全屏地图
    • 使用游戏控制导航地图
    • 在标签下方添加新图层
    • 添加GeoJSON线条
    • 添加自定义标记
    • 添加GeoJSON多边形
    • 在地球仪上加载3D模型
    • 地球仪大气层
    • 简单自定义地球仪
    • 自定义瓦片地球仪
    • 在地球仪上显示填充挤出层
    • 使用矢量地图显示地球仪
    • 地球仪上缩放和行星大小的关系
    • 哈希路由
    • 地球仪上带地形高程的热力图
    • 创建热力图图层
    • 添加多方向山体阴影图层
    • 添加山体阴影图层
    • 创建悬停效果
    • 显示带地形高程的混合卫星地图
    • 显示非交互式地图
    • 跳转到一系列位置
    • 切换地图语言
    • 显示跨越180度子午线的线条
    • 使用表达式创建渐变线条
    • 添加实时数据
    • 实时更新地图要素
    • 查看本地GeoJSON文件(实验性)
    • 查看本地GeoJSON文件
    • 使用本地生成的表意文字
    • 定位用户位置
    • 细节层次控制
    • 添加栅格瓦片源
    • 使用Mapbox GL Draw绘制多边形
    • 支持从右到左文本
    • 使用 Terra-Draw 绘制几何图形
    • 测量距离
    • 获取鼠标指针坐标
    • 从单个GeoJSON源添加多个几何图形
    • 显示地图导航控件
    • 使用内边距偏移消失点
    • PMTiles 源和协议
    • 点击多边形显示信息
    • 点击显示弹出窗口
    • 悬停显示弹出窗口
    • 显示弹出窗口
    • 获取鼠标指针下的要素
    • 渲染世界副本
    • 限制地图平移到某个区域
    • 显示卫星地图
    • 基于滚动位置飞行到特定位置
    • 设置俯仰角和方位角
    • 为标记添加弹出窗口
    • 显示一个地图
    • 天空、雾和地形
    • 同步多个地图的移动
    • 创建时间轴滑块
    • 切换deck.gl图层
    • 切换交互功能
    • 可变标签放置
    • 可变偏移标签放置
    • 添加矢量瓦片源
    • 在地图上播放视频
    • 可视化人口密度
    • 添加WMS服务
    • 缩放至线要素
  • 指南
    • 优化MapLibre性能: 大型GeoJSON数据集的技巧
    • Leaflet迁移指南
    • Mapbox迁移指南
    • OpenLayers迁移指南

天空、雾和地形

展示带有天空、雾和地形的地图;

<!DOCTYPE html>
<html lang="en">
<head>
    <title>天空、雾和地形</title>
    <meta property="og:description" content="展示带有天空、雾和地形的地图" />
    <meta charset='utf-8'>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel='stylesheet' href='https://unpkg.com/maplibre-gl@5.5.0/dist/maplibre-gl.css' />
    <script src='https://unpkg.com/maplibre-gl@5.5.0/dist/maplibre-gl.js'></script>
    <style>
        body { margin: 0; padding: 0; }
        html, body, #map { height: 100%; }

        .panel {
            position: absolute;
            top: 10px;
            right: 10px;
            background: rgba(255, 255, 255, 0.9);
            padding: 15px;
            border-radius: 6px;
            box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15);
            width: 300px;
            font-family: 'Arial', sans-serif;
            z-index: 1;
        }

        .panel h3 {
            margin: 0 0 10px 0;
            font-size: 16px;
            font-weight: 600;
            border-bottom: 1px solid #ddd;
            padding-bottom: 6px;
        }

        .control-group {
            margin-bottom: 15px;
        }

        .control-group h4 {
            margin: 0 0 8px 0;
            font-size: 14px;
        }

        label {
            display: flex;
            align-items: center;
            margin-bottom: 8px;
            cursor: pointer;
        }

        input[type="checkbox"] {
            margin-right: 8px;
        }

        input[type="range"] {
            width: 100%;
            margin: 5px 0;
        }

        .slider-container {
            margin-bottom: 10px;
        }

        .slider-container label {
            margin-bottom: 3px;
            font-size: 13px;
        }

        .slider-value {
            font-size: 12px;
            font-weight: 600;
            color: #3887be;
            text-align: right;
        }

        .preset-buttons {
            display: flex;
            flex-wrap: wrap;
            gap: 6px;
            margin-top: 10px;
        }

        button {
            background: #3887be;
            color: white;
            border: none;
            padding: 6px 10px;
            border-radius: 4px;
            font-size: 12px;
            cursor: pointer;
        }

        button:hover {
            background: #2d6a94;
        }
        
        .info-text {
            font-size: 12px;
            color: #777;
            margin-top: 10px;
        }
    </style>
</head>
<body>
<div id="map"></div>
<div class="panel">
    <h3>天空、雾和地形设置</h3>

    <div class="control-group">
        <h4>可见性控制</h4>
        <label>
            <input type="checkbox" id="toggle-sky" checked />
            显示天空
        </label>
        <label>
            <input type="checkbox" id="toggle-fog" checked />
            显示雾
        </label>
        <label>
            <input type="checkbox" id="toggle-terrain" checked />
            显示地形
        </label>
    </div>

    <div class="control-group">
        <h4>雾设置</h4>
        <div class="slider-container">
            <label>雾密度</label>
            <input type="range" id="fog-density" min="0" max="1" step="0.01" value="0.3" />
            <div class="slider-value"><span id="fog-density-value">0.3</span></div>
        </div>
        <div class="slider-container">
            <label>雾近处距离</label>
            <input type="range" id="fog-range-near" min="0" max="10" step="0.1" value="2" />
            <div class="slider-value"><span id="fog-range-near-value">2.0</span></div>
        </div>
        <div class="slider-container">
            <label>雾远处距离</label>
            <input type="range" id="fog-range-far" min="1" max="20" step="0.1" value="10" />
            <div class="slider-value"><span id="fog-range-far-value">10.0</span></div>
        </div>
    </div>

    <div class="control-group">
        <h4>场景预设</h4>
        <div class="preset-buttons">
            <button id="preset-sunrise">日出</button>
            <button id="preset-daytime">白天</button>
            <button id="preset-sunset">日落</button>
            <button id="preset-foggy">多雾</button>
            <button id="preset-night">夜晚</button>
        </div>
    </div>
    
    <div class="info-text">
        此示例展示了如何组合使用天空、雾和地形效果,创建逼真的场景。
    </div>
</div>

<script>
    const map = new maplibregl.Map({
        container: 'map',
        style: 'https://api.maptiler.com/maps/streets/style.json?key=get_your_own_OpIi9ZULNHzrESv6T2vL',
        center: [-119.6, 37.5],
        zoom: 7.5,
        pitch: 60,
        bearing: 0
    });

    // 添加导航控件
    map.addControl(new maplibregl.NavigationControl());

    map.on('load', () => {
        // 添加地形源
        map.addSource('terrain', {
            'type': 'raster-dem',
            'url': 'https://api.maptiler.com/tiles/terrain-rgb-v2/tiles.json?key=get_your_own_OpIi9ZULNHzrESv6T2vL',
            'tileSize': 256
        });

        // 添加天空图层
        map.addLayer({
            'id': 'sky',
            'type': 'sky',
            'paint': {
                'sky-type': 'atmosphere',
                'sky-atmosphere-sun': [0.0, 90.0],
                'sky-atmosphere-sun-intensity': 20
            }
        });

        // 设置地形
        map.setTerrain({
            'source': 'terrain',
            'exaggeration': 1.5
        });

        // 设置雾
        map.setFog({
            'color': 'white',
            'horizon-blend': 0.1,
            'range': [2, 10],
            'density': 0.3
        });

        // 获取UI控件
        const toggleSky = document.getElementById('toggle-sky');
        const toggleFog = document.getElementById('toggle-fog');
        const toggleTerrain = document.getElementById('toggle-terrain');
        const fogDensity = document.getElementById('fog-density');
        const fogRangeNear = document.getElementById('fog-range-near');
        const fogRangeFar = document.getElementById('fog-range-far');
        const fogDensityValue = document.getElementById('fog-density-value');
        const fogRangeNearValue = document.getElementById('fog-range-near-value');
        const fogRangeFarValue = document.getElementById('fog-range-far-value');
        
        // 预设按钮
        const presetSunrise = document.getElementById('preset-sunrise');
        const presetDaytime = document.getElementById('preset-daytime');
        const presetSunset = document.getElementById('preset-sunset');
        const presetFoggy = document.getElementById('preset-foggy');
        const presetNight = document.getElementById('preset-night');

        // 更新雾设置的函数
        function updateFog() {
            const density = parseFloat(fogDensity.value);
            const rangeNear = parseFloat(fogRangeNear.value);
            const rangeFar = parseFloat(fogRangeFar.value);
            
            // 更新显示值
            fogDensityValue.textContent = density.toFixed(2);
            fogRangeNearValue.textContent = rangeNear.toFixed(1);
            fogRangeFarValue.textContent = rangeFar.toFixed(1);
            
            // 确保近处距离小于远处距离
            if (rangeNear >= rangeFar) {
                fogRangeFar.value = rangeNear + 1;
                fogRangeFarValue.textContent = (rangeNear + 1).toFixed(1);
            }
            
            map.setFog({
                'color': 'white',
                'horizon-blend': 0.1,
                'range': [rangeNear, rangeFar],
                'density': density
            });
        }

        // 切换显示/隐藏功能
        toggleSky.addEventListener('change', (e) => {
            if (e.target.checked) {
                map.setLayoutProperty('sky', 'visibility', 'visible');
            } else {
                map.setLayoutProperty('sky', 'visibility', 'none');
            }
        });

        toggleFog.addEventListener('change', (e) => {
            if (e.target.checked) {
                map.setFog({
                    'color': 'white',
                    'horizon-blend': 0.1,
                    'range': [parseFloat(fogRangeNear.value), parseFloat(fogRangeFar.value)],
                    'density': parseFloat(fogDensity.value)
                });
            } else {
                map.setFog(null);
            }
        });

        toggleTerrain.addEventListener('change', (e) => {
            if (e.target.checked) {
                map.setTerrain({
                    'source': 'terrain',
                    'exaggeration': 1.5
                });
            } else {
                map.setTerrain(null);
            }
        });

        // 滑块事件
        fogDensity.addEventListener('input', updateFog);
        fogRangeNear.addEventListener('input', updateFog);
        fogRangeFar.addEventListener('input', updateFog);

        // 预设按钮事件
        presetSunrise.addEventListener('click', () => {
            // 日出设置
            map.setPaintProperty('sky', 'sky-atmosphere-sun', [90.0, 15.0]);
            map.setPaintProperty('sky', 'sky-atmosphere-sun-intensity', 5);
            map.setPaintProperty('sky', 'sky-atmosphere-color', '#ffa64d');
            
            fogDensity.value = 0.1;
            fogRangeNear.value = 1;
            fogRangeFar.value = 15;
            updateFog();
            
            map.setFog({
                'color': '#ffd1b3',
                'horizon-blend': 0.2,
                'range': [1, 15],
                'density': 0.1
            });
            
            toggleSky.checked = true;
            toggleFog.checked = true;
            toggleTerrain.checked = true;
            
            map.setLayoutProperty('sky', 'visibility', 'visible');
        });

        presetDaytime.addEventListener('click', () => {
            // 白天设置
            map.setPaintProperty('sky', 'sky-atmosphere-sun', [0.0, 90.0]);
            map.setPaintProperty('sky', 'sky-atmosphere-sun-intensity', 20);
            map.setPaintProperty('sky', 'sky-atmosphere-color', '#7ec0ee');
            
            fogDensity.value = 0.2;
            fogRangeNear.value = 2;
            fogRangeFar.value = 12;
            updateFog();
            
            map.setFog({
                'color': 'white',
                'horizon-blend': 0.1,
                'range': [2, 12],
                'density': 0.2
            });
            
            toggleSky.checked = true;
            toggleFog.checked = true;
            toggleTerrain.checked = true;
            
            map.setLayoutProperty('sky', 'visibility', 'visible');
        });

        presetSunset.addEventListener('click', () => {
            // 日落设置
            map.setPaintProperty('sky', 'sky-atmosphere-sun', [-90.0, 15.0]);
            map.setPaintProperty('sky', 'sky-atmosphere-sun-intensity', 10);
            map.setPaintProperty('sky', 'sky-atmosphere-color', '#ff9933');
            
            fogDensity.value = 0.2;
            fogRangeNear.value = 1.5;
            fogRangeFar.value = 10;
            updateFog();
            
            map.setFog({
                'color': '#ffccb3',
                'horizon-blend': 0.3,
                'range': [1.5, 10],
                'density': 0.2
            });
            
            toggleSky.checked = true;
            toggleFog.checked = true;
            toggleTerrain.checked = true;
            
            map.setLayoutProperty('sky', 'visibility', 'visible');
        });

        presetFoggy.addEventListener('click', () => {
            // 多雾设置
            map.setPaintProperty('sky', 'sky-atmosphere-sun', [0.0, 90.0]);
            map.setPaintProperty('sky', 'sky-atmosphere-sun-intensity', 15);
            
            fogDensity.value = 0.8;
            fogRangeNear.value = 0.5;
            fogRangeFar.value = 4;
            updateFog();
            
            map.setFog({
                'color': '#e6e6e6',
                'horizon-blend': 0.1,
                'range': [0.5, 4],
                'density': 0.8
            });
            
            toggleSky.checked = true;
            toggleFog.checked = true;
            toggleTerrain.checked = true;
            
            map.setLayoutProperty('sky', 'visibility', 'visible');
        });

        presetNight.addEventListener('click', () => {
            // 夜晚设置
            map.setPaintProperty('sky', 'sky-type', 'atmosphere');
            map.setPaintProperty('sky', 'sky-atmosphere-sun', [0.0, -90.0]);
            map.setPaintProperty('sky', 'sky-atmosphere-sun-intensity', 2);
            map.setPaintProperty('sky', 'sky-atmosphere-color', '#000066');
            
            fogDensity.value = 0.3;
            fogRangeNear.value = 1;
            fogRangeFar.value = 6;
            updateFog();
            
            map.setFog({
                'color': '#000033',
                'horizon-blend': 0.2,
                'range': [1, 6],
                'density': 0.3
            });
            
            toggleSky.checked = true;
            toggleFog.checked = true;
            toggleTerrain.checked = true;
            
            map.setLayoutProperty('sky', 'visibility', 'visible');
        });
    });
</script>
</body>
</html>
Prev
显示一个地图
Next
同步多个地图的移动