本节摘要:Web 地图开发靠框架。本节讲 OpenLayers、Leaflet、Mapbox GL JS 等主流二维框架——选对框架做 Web 地图。
阅读完本节,你应当能够:
| 框架 | 特点 | 适合 |
|---|---|---|
| OpenLayers | 功能全,支持 OGC 全套,体积大 | 企业级、复杂 GIS |
| Leaflet | 轻量简单,插件多,易上手 | 轻量应用、快速开发 |
| Mapbox GL JS | 矢量瓦片、WebGL 渲染、样式强 | 现代化、高交互、矢量瓦片 |

import Map from 'ol/Map'; import View from 'ol/View'; import TileLayer from 'ol/layer/Tile'; import OSM from 'ol/source/OSM'; const map = new Map({ target: 'map', layers: [new TileLayer({ source: new OSM() })], view: new View({ center: [116.4, 39.9], zoom: 10, projection: 'EPSG:4326' }) });
OpenLayers 功能全,支持各种 OGC 服务和投影,适合复杂 GIS 应用。
const map = L.map('map').setView([39.9, 116.4], 10); L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
Leaflet 简单轻量,几行代码出地图,插件多,适合轻量应用。
const map = new mapboxgl.Map({ container: 'map', style: 'mapbox://styles/mapbox/streets-v11', center: [116.4, 39.9], zoom: 10 });
Mapbox GL 用矢量瓦片,WebGL 渲染,样式动态可控,体验流畅。
// OpenLayers 加载 GeoJSON import VectorLayer from 'ol/layer/Vector'; import VectorSource from 'ol/source/Vector'; import GeoJSON from 'ol/format/GeoJSON'; const vectorLayer = new VectorLayer({ source: new VectorSource({ url: 'data.geojson', format: new GeoJSON() }) });
⚠️ 常见坑:用 Leaflet 做复杂 GIS 分析——Leaflet 轻量但功能少,复杂分析要 OpenLayers。按需求选框架。
💡 关键直觉:OpenLayers 功能全适合复杂 GIS,Leaflet 轻量易上手,Mapbox GL 矢量瓦片现代体验。按复杂度、体验、成本选。
三个框架虽然 API 不同,底层心智模型一致,学透一个再学另一个很快:
写代码时的排查思路也因此固定:图层不显示,先看 Source 有没有数据,再看 Layer 是否加进 Map,最后看 View 的视野是否覆盖数据范围。
一个常见需求:切换底图(影像/街道)并叠加业务标记。OpenLayers 写法:
import TileLayer from 'ol/layer/Tile'; import XYZ from 'ol/source/XYZ'; import VectorLayer from 'ol/layer/Vector'; import VectorSource from 'ol/source/Vector'; import Feature from 'ol/Feature'; import Point from 'ol/geom/Point'; // 两个底图图层,默认只显示第一个 const streetLayer = new TileLayer({ source: new XYZ({ url: '/tiles/street/{z}/{x}/{y}.png' }) }); const imageLayer = new TileLayer({ source: new XYZ({ url: '/tiles/image/{z}/{x}/{y}.png' }), visible: false }); map.addLayer(streetLayer); map.addLayer(imageLayer); // 切换底图 function switchBasemap(name) { streetLayer.setVisible(name === 'street'); imageLayer.setVisible(name === 'image'); } // 加一个业务标记 const marker = new Feature({ geometry: new Point([116.4, 39.9]) }); const vectorLayer = new VectorLayer({ source: new VectorSource({ features: [marker] }) }); map.addLayer(vectorLayer);
二维框架和三微框架的边界经常被问。判断标准很简单:你的数据是否有"垂直信息"要表达。只要平面展示、叠加、属性查询,二维框架足够,不要为了炫技上三维。数据里有高程、建筑高度、倾斜摄影模型,或者用户要看立体空间关系,再引入三维。第 4.2 节会专门展开三维方案。
假设你要给水务公司做一个巡检地图,需求是:加载巡检点位、按状态着色、点选查看详情、手机端也要用。按需求拆解:点位量级几百个,交互是点选和状态过滤,需要手机适配。结论是 Leaflet 或 OpenLayers 都行,优先选 Leaflet 加快开发;如果后续要叠加管网拓扑分析、离线编辑,再评估 OpenLayers 或 ArcGIS Runtime。选型不是一步定终身,先满足当前需求、留好扩展余地即可。
一个"按区县统计地块数量"的小功能,能串起本章所有概念:
做完这个小功能,你会自然理解"框架只是外壳,数据服务和质量才是关键"。这也是本章反复强调的:选型看需求,实现靠数据,体验靠细节。把每个环节的代码都亲手敲一遍,比停留在阅读层面更能建立完整的开发手感。
下一节讲三维 Web GIS。