第一个 OpenLayers 地图
OpenLayers 比 Leaflet 重,换来的是投影、服务格式和矢量样式的完整支持。 上手前要先接受一件事:它的坐标默认不是经纬度。
四个核心对象
| 对象 | 职责 |
|---|---|
Map | 地图容器,挂载图层和视图,响应鼠标交互 |
View | 视图状态:中心点、缩放、投影、旋转 |
Layer | 图层:瓦片、矢量、影像,决定画什么 |
Source | 数据源:瓦片地址、要素集合、WMS 参数,决定数据从哪来 |
这四者关系是:Map 里放 Layer,
Layer 里放 Source,Map 的视角由 View 决定。
和 Leaflet 相比,多了一层显式的 Source,换来的是同一个图层类可以接
任意数据源。
投影:最容易绊住人的地方
OpenLayers 默认使用 EPSG:3857(Web 墨卡托),单位是米。
业务数据通常是经纬度(EPSG:4326),所以要转换:
var center = ol.proj.fromLonLat([116.391263, 39.907359]);
var view = new ol.View({
center: center,
zoom: 12
});
忘了这一步的典型现象是:地图飞到几内亚湾或者停在零级缩放的整个世界,
因为 [116, 39] 被当成米制坐标,实际位置几乎贴着原点。
最小可运行代码
<div id="map"></div>
<script src="https://cdn.jsdelivr.net/npm/ol@10.3.1/dist/ol.js"></script>
<script>
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({ source: new ol.source.OSM() })
],
view: new ol.View({
center: ol.proj.fromLonLat([116.391263, 39.907359]),
zoom: 12
})
});
</script>
别忘了引入 ol.css,否则缩放按钮和版权信息会错位。
地图容器同样需要确定高度,和 Leaflet 的要求一致。
和 Leaflet 怎么选
| 需求 | Leaflet | OpenLayers |
|---|---|---|
| 标记点、弹窗、简单交互 | 更轻,够用 | 能实现,但没必要 |
| 多套投影自由切换 | 需要插件 | 内置支持 |
| WMS / WMTS / WFS 服务 | 第三方插件 | 原生支持 |
| 矢量要素的复杂样式 | 较弱 | 样式表达式完整 |
| 打包体积 | 约 42 KB | 明显更大 |
常见问题
地图只显示一半,或者拖动时出现白块
容器尺寸在初始化时还没确定。等布局稳定后再创建 Map,
或者创建之后调用 map.updateSize()。
矢量点位置对,但偏出地图边界
要素坐标没有做投影转换。用 new ol.geom.Point(ol.proj.fromLonLat([lng, lat])),
不要直接塞经纬度。
经纬志(2026)。《第一个 OpenLayers 地图》。https://www.jingweizhi.com/openlayers/tutorial/minimal-scene.html(访问日期 2026-11-03)。