leaflet加载离线OSM(OpenStreetMap)

本文详细介绍如何使用Leaflet API搭建离线地图服务。包括下载Leaflet和OpenStreetMap地图数据,利用Maperitive工具生成地图瓦片,以及配置HTML和JavaScript代码实现地图展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载: https://www.cnblogs.com/RainyBear/p/6011832.html

leaflet作为广为应用的开源地图操作的API,是非常受欢迎,轻量级的代码让使用者更容易操作。

废话不多说,下面直接给出范例。

首先在这个网站下载leaflet的压缩包,其中包括了其API以及一些范例。https://github.com/Leaflet/Leaflet

下载完之后,自己搭建一个服务器,将这个包文件放在服务器的根目录下面,这时候在浏览器可以访问一下其中的范例。例如,在我的这里测试在浏览器里输入:http://localhost/Leaflet/debug/map/max-bounds.html,我这里使用的是WampSever2.5.网上有很多这样的教程这里做说明。

出现如上图所示的界面证明已经搭建成功。

然后再OpenStreetMap的官网上下载离线地图的数据,官网提供自定义下载的方式,下载下来的数据格式是.osm。http://www.openstreetmap.org/

 

之后要做的就是该离线数据的地图瓦片。地图瓦片的下载可以使用这个下载工具Maperitive(v2.4.1)http://maperitive.net/download/

  

这个软件的使用就不用多说了,导入刚才下载的地图数据之后,在其右下角点击Web map,表示不显示在线地图数据,只显示刚刚加载的离线地图。

在下方使用Command promat。输入generate-tiles minzoom=8 maxzoom=17,数字表示地图的缩放级别可以更换。还可以在map菜单栏的switch to rules中选择地图的样式。比如黑色或者精简地图。下载完成后在其软件的目录下面有个Tiles的文件夹,这里面存放的就是地图的瓦片。

在服务器下面新建一个项目,将这个文件夹放在这个项目中,其html代码如下:

复制代码
<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" type="text/css" href="leaflet/css/leaflet.css" />
        
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        
        <link rel="stylesheet" type="text/css" href="leaflet/css/screen.css" />
        
        <script type="text/javascript" src="leaflet/src/deps.js"></script>
        
        <script type="text/javascript" src="leaflet/src/leaflet-include.js"></script>
        
        <script type="text/javascript" src="leaflet/src/leaflet.js"></script>
        
        <title>leaflet_map</title>
    </head>

    <body>

        <div id="map"></div>
        <script type="text/javascript">
            var osmUrl = 'http://localhost/learnD3/Tiles/{z}/{x}/{y}.png',
                osmAttrib = '&copy; <a href="http://openstreetmap.org/copyright">OpenStreetMap</a> contributors',
                osm = L.tileLayer(osmUrl, {
                    minZoom: 8,
                    maxZoom: 17,
                    attribution: osmAttrib
                });

            var map = L.map('map')
                .setView([31.60,104.71], 11)
                .addLayer(osm);

            L.marker([31.68,104.77]).addTo(map)
                .bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup();

            L.circle([31.728,104.677], 5000, {
                color: 'red',
                fillColor: '#f03',
                fillOpacity: 0.5
            }).addTo(map).bindPopup("I am a circle.");

            var popup = L.popup();

            function onMapClick(e) {
                popup
                    .setLatLng(e.latlng)
                    .setContent("You clicked the map at " + e.latlng.toString())
                    .openOn(map);
            }
            map.on('click', onMapClick);
        </script>

    </body>

</html>
复制代码

此图为项目的目录结构,其中在leaflet文件夹中存放的是其css样式以及js源代码。在下载的leaflet中可以找到。

运行效果如图所示:

至此离线地图就已经加载完成。

### 叶子图 (Leaflet) 和开放街道地图 (OpenStreetMap) 集成时地图无法显示的解决方案 在使用 LeafletOpenStreetMap 进行集成的过程中,如果遇到地图无法正常显示的情况,可能是由于以下几个常见原因引起的: #### 1. **API 密钥缺失** 某些地图提供商可能需要 API 密钥才能访问其瓦片服务。尽管 OpenStreetMap 不强制要求密钥,但如果使用的是第三方托管的服务(如 MapTiler 或 Thunderforest),则需确保已正确配置 API 密钥。 ```javascript var map = L.map('map').setView([51.505, -0.09], 13); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' }).addTo(map); ``` 上述代码片段展示了如何正确初始化一个简单的 Leaflet 地图并加载默认的 OpenStreetMap 瓦片[^4]。 --- #### 2. **跨域资源共享 (CORS) 错误** 如果浏览器控制台提示 CORS 错误,则说明请求的地图瓦片被阻止了。这通常发生在自定义服务器或本地开发环境中。可以通过以下方法解决: - 使用支持 CORS 的瓦片源。 - 如果是本地环境测试,可以启用浏览器的安全策略豁免功能(仅限调试用途)。 --- #### 3. **网络连接问题** 确认设备是否能成功访问 `https://tile.openstreetmap.org`。如果该域名不可达,尝试更换其他可用的瓦片源,例如: ```javascript L.tileLayer('https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png', { maxZoom: 19, attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors © <a href="https://carto.com/attributions">CARTO</a>' }).addTo(map); ``` 以上代码替换了默认的 OSM 瓦片源为 CARTO 提供的支持 Voyager 样式的瓦片[^5]。 --- #### 4. **HTML 容器尺寸设置错误** Leaflet 地图依赖于 HTML 中容器的高度和宽度属性来渲染地图界面。如果没有显式指定高度或宽度,可能导致地图区域为空白状态。 ```html <div id="map" style="width: 100%; height: 500px;"></div> <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script> <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css"/> ``` 确保 CSS 设置中的宽高参数满足实际需求[^4]。 --- #### 5. **JavaScript 初始化顺序不当** 如果 JavaScript 脚本执行过早,在 DOM 元素尚未完全加载之前就试图绑定事件或者绘制地图,也可能引发异常行为。建议将脚本放置在页面底部,或者利用 `DOMContentLoaded` 事件监听机制延迟加载逻辑。 ```javascript document.addEventListener("DOMContentLoaded", function() { var map = L.map('map').setView([51.505, -0.09], 13); }); ``` --- #### 6. **缓存冲突** 有时旧版本的瓦片数据会被客户端缓存下来,进而影响新内容更新后的视觉效果。为此可考虑加入随机查询字符串以规避此类情况发生。 ```javascript L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png?random=' + Math.random(), {...}) ``` --- #### 7. **地理范围超出有效边界** 部分地区的地图瓦片可能存在空白现象,特别是对于偏远地区或是低分辨率下的极端放大倍率场景下。调整初始视图中心点位置及缩放级别有助于缓解这一状况。 ```javascript // 更改初始坐标至中国某城市附近作为例子演示 var map = L.map('map').setView([39.9075, 116.39723], 12); // 北京市经纬度 ``` --- ### 总结 针对 Leaflet 结合 OpenStreetMap 出现的地图不显示问题,应逐一排查上述提到的各种可能性因素,并采取相应的修复措施加以应对。最终目标是要让前端应用能够稳定可靠地呈现交互性强的地图体验给终端用户群体。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值