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迁移指南

优化MapLibre性能: 大型GeoJSON数据集的技巧

性能是为用户提供流畅响应体验的关键方面;本指南重点介绍改善MapLibre性能的技术,特别是处理GeoJSON格式的大型数据集时;我们将策略分为两个关键领域:

  1. 加载数据
  2. 可视化数据

加载数据

减小文件大小

处理大型GeoJSON数据集时,提高加载性能最有效的方法之一是减少数据的大小;您可以使用Turf等包或Reduce GeoJSON和Mapshaper等网络工具实现以下方法;

移除未使用的属性

GeoJSON文件通常包含许多对地图功能不必要的属性;通过消除任何未使用或冗余的属性,可以显著减少文件大小,从而缩短加载时间;

减少坐标精度

GeoJSON坐标通常默认为极高精度,通常有15-17位小数,这已达到原子尺度;对于大多数实际应用,您可以将坐标精度降低到约6位小数,大约相当于1厘米左右的比例;这可以减小文件大小而不影响可用性;

简化几何形状

如果您的GeoJSON包含几何形状(不仅仅是点),请考虑使用各种算法来简化几何形状;像Mapshaper这样的工具提供了用户友好的界面来完成此任务;

压缩

通过移除不必要的空白来压缩GeoJSON数据可以进一步减小文件大小,有助于更快的数据传输;

数据压缩

另一种方法是压缩GeoJSON数据并将压缩文件发送到用户的浏览器;虽然这在处理和文件大小之间引入了轻微的权衡,但考虑到现代JavaScript的效率,这通常是可以接受的;

数据分块

如果您的GeoJSON数据集在减小大小后仍然相当大,请考虑将其拆分为更小的、可管理的块;即使只有2或3个也是有益的;这些拆分的数据集可以使用addSource()和addLayer()正常添加到地图中;

当数据集的不同部分具有不同属性时,这种技术特别有用;例如,如果地图开始时缩放到某个地理区域,该地理区域内的数据可以作为一个块,其余部分可以作为另一个块;类似地,如果数据集的一部分有实时更新,而其余部分基本静态,那么将这两部分放入单独的块可能是有意义的;

数据分块在桌面浏览器上比移动浏览器产生更大的影响;

数据流式传输

实施数据流式传输技术可以进一步提高加载性能;与一次加载整个数据集不同,数据流式传输允许您在用户与地图交互时加载较小的部分;这种方法最小化了初始加载时间并提供了更响应的体验;数据流式传输的模板可以在"实时更新功能"示例中找到;

将GeoJSON存储在URL

为了提高MapLibre中的性能,建议从数据URL加载GeoJSON数据,而不是直接嵌入到JavaScript代码中;这种做法有助于减少客户端的内存开销;

矢量切片

考虑将GeoJSON数据转换为矢量切片,这些切片专为高效渲染而设计;有关如何添加矢量切片源的示例可用;

服务器端切片

对于更大的数据集,您可以使用Martin等工具在服务器端将数据库转换为切片;然后可以直接向用户显示这些切片;Martin演示显示它能轻松处理13GB的数据库;然而,这种方法比其他方法需要更多的设置;

可视化数据

一旦数据加载完成,为确保流畅的用户体验,优化地图上的数据可视化方式至关重要;

聚类

一种简单的方法是可视化更少的点;如果我们使用GeoJSON源(而不是矢量切片),我们可以使用"聚类"将附近的点分组在一起;这种方法减少了地图上显示的要素数量,提高了渲染性能并保持了地图的可读性;

为此,当我们添加数据时,我们可以调整聚类选项;例如:

map.addSource('earthquakes', {
    type: 'geojson',
    data: 'https://maplibre.org/maplibre-gl-js/docs/assets/earthquakes.geojson',
    cluster: true,
    clusterMaxZoom: 14, // 聚类点的最大缩放级别
    clusterRadius: 50 // 聚类点时每个聚类的半径(默认为50)
});

您可以在这里查看完整示例: 创建和样式化聚类;

允许重叠

默认情况下,Maplibre会计算点、文本或图标等要素是否重叠;当有大量要素时,这可能会计算密集;更改重叠模式使所有点都显示且不检查重叠可以显著减少这种情况;

简化样式

复杂精细的地图样式在处理大型数据集时会减慢渲染速度;通过减少图层、符号和复杂功能的数量来简化地图样式,并在适当的地方使用更简单的符号;

缩放级别

优化缩放级别确保地图高效加载并在不同缩放级别显示适当的细节,有助于更流畅的用户体验;

最大缩放级别

为了提高平移和缩放期间的地图性能,在GeoJSON源上设置maxZoom选项为低于默认值22的值;对于大多数点源,maxZoom值为12在精度和速度之间取得了良好的平衡;

最小缩放级别

调整引用GeoJSON源的图层的minZoom属性为大于0的值;此设置防止地图尝试在低缩放级别加载和渲染瓦片,这通常是不必要的,因为没有足够的屏幕像素来显示大型数据集的每个要素;通过调整minZoom属性,您将实现更快的地图加载和改善的渲染性能;

您可以同时实现这两者,如下所示:

let map = new maplibregl.Map({
  container: 'map',
  maxZoom: 12,
  minZoom: 5
});
Next
Leaflet迁移指南