天地图更改默认加载地图底图

博客介绍了设置加载默认地图类型的方法,需搭配对应地图类型标注,更改截图上四个地方,还列举了多种地图类型及注记代码,强调添加秘钥否则地图不显示,并给出效果图。

注意:要设置加载默认地图类型,要搭配对应的地图类型标注,截图上四个地方都要更改,第一个imgURL是选择默认加载的地图类型,第二是选择地图标注类型。

// vec 矢量底图

// cva 矢量注记

// eva 矢量英文注记

// img 影像底图

// cia 影像注记

// eia 影像英文注记

// ter 地形晕渲

// cta 地形注记

// ibo 全球境界

上代码!!!

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta name="keywords" content="天地图" />
    <title>天地图-地图API-范例-加载两个地图</title>
    <style type="text/css">
        body,
        html {
            width: 100%;
            height: 100%;
            overflow: hidden;
            margin: 0;
            font-family: "微软雅黑";
        }
        
        #map {
            width: 100%
<think>我们正在使用天地图Tianditu)服务,并希望在Web应用中实现地图图层的加载和切功能。根据引用[3]中的示例,我们可以使用SuperMap的iClient for Leaflet库来加载天地图图层,并实现图层切。 主要步骤: 1. 引入必要的库(如Leaflet和SuperMap的iClient-Leaflet)。 2. 创建地图实例。 3. 定义不同的天地图图层(例如矢量底图、影像底图等)。 4. 将其中一个图层设置为默认图层并添加到地图。 5. 实现图层切功能,可以通过按钮点击或其他交互方式来切地图图层。 注意:使用天地图需要申请密钥(tk),并在请求中使用。 下面是一个简化的示例,展示如何加载天地图矢量底图和影像底图,并实现切功能。 首先,在HTML中引入Leaflet和SuperMap iClient-Leaflet库(注意:引用[3]使用的是Classic方式,但这里我们使用Leaflet方式,因为引用[2]提到使用Leaflet插件): 注意:引用[3]中的示例是使用SuperMap Classic,但根据用户需求,我们更倾向于使用Leaflet,因为引用[2]中提到了Leaflet。因此,我们将采用Leaflet的方式。 但是,请注意,引用[3]中使用了`SuperMap.Map`等,这是Classic API。而引用[2]中使用了`@supermap/iclient-leaflet`,这是Leaflet的插件。因此,我们使用Leaflet的方式。 由于我们使用Leaflet,所以先确保引入了Leaflet的CSS和JS,以及SuperMap的iClient-Leaflet。 以下是代码示例: HTML部分: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>天地图图层切</title> <!-- 引入Leaflet CSS --> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" /> <style> #map { height: 100vh; } .layer-switcher { position: absolute; top: 10px; right: 10px; z-index: 1000; background: white; padding: 10px; } </style> </head> <body> <div id="map"></div> <div class="layer-switcher"> <button id="vecLayer">矢量底图</button> <button id="imgLayer">影像底图</button> </div> <!-- 引入Leaflet JS --> <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script> <!-- 引入SuperMap iClient-Leaflet --> <script src="https://iclient.supermap.io/web/libs/iclient-leaflet/9.1.2/iclient-leaflet.js"></script> <script> // 天地图服务地址,需要替成你自己的密钥(tk) const tk = "你的天地图密钥"; // 初始化地图 var map = L.map('map', { center: [29, 113], // 初始中心点 zoom: 10 // 初始缩放级别 }); // 定义图层 // 矢量底图 var vecLayer = L.supermap.tiandituTileLayer({ layerType: 'vec', key: tk }); // 矢量注记 var vecAnnoLayer = L.supermap.tiandituTileLayer({ layerType: 'vec_anno', key: tk }); // 影像底图 var imgLayer = L.supermap.tiandituTileLayer({ layerType: 'img', key: tk }); // 影像注记 var imgAnnoLayer = L.supermap.tiandituTileLayer({ layerType: 'img_anno', key: tk }); // 默认加载矢量底图和矢量注记 var currentBaseLayer = vecLayer; var currentAnnoLayer = vecAnnoLayer; map.addLayer(currentBaseLayer); map.addLayer(currentAnnoLayer); // 图层切函数 function switchLayer(baseLayer, annoLayer) { // 移除当前底图和注记 map.removeLayer(currentBaseLayer); map.removeLayer(currentAnnoLayer); // 添加新的底图和注记 map.addLayer(baseLayer); map.addLayer(annoLayer); // 更新当前图层 currentBaseLayer = baseLayer; currentAnnoLayer = annoLayer; } // 绑定按钮事件 document.getElementById('vecLayer').addEventListener('click', function() { switchLayer(vecLayer, vecAnnoLayer); }); document.getElementById('imgLayer').addEventListener('click', function() { switchLayer(imgLayer, imgAnnoLayer); }); </script> </body> </html> ``` 说明: 1. 我们使用`L.supermap.tiandituTileLayer`来创建天地图图层,其中`layerType`指定图层类型(矢量底图'vec',矢量注记'vec_anno',影像底图'img',影像注记'img_anno')。 2. 注:天地图需要底图和注记两个图层叠加显示,因此我们分别创建底图图层和注记图层。 3. 默认加载矢量底图和矢量注记。 4. 通过两个按钮实现切:点击“矢量底图”按钮切到矢量图层,点击“影像底图”按钮切到影像图层。 注意:请将代码中的`tk`替为你自己在天地图官网申请的密钥。 此示例中,我们使用了SuperMap iClient-Leaflet库中提供的天地图图层接口,这样可以简化调用。如果没有SuperMap库,也可以直接使用Leaflet的TileLayer来加载,但需要自己构造URL。 如果不想使用SuperMap的库,也可以使用纯Leaflet的方式加载天地图: ```javascript // 矢量底图 var vecLayer = L.tileLayer('https://t0.tianditu.gov.cn/vec_w/wmts?tk={tk}&layer=vec&style=default&tilematrixset=w&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}', { tk: tk }); // 矢量注记 var vecAnnoLayer = L.tileLayer('https://t0.tianditu.gov.cn/cva_w/wmts?tk={tk}&layer=cva&style=default&tilematrixset=w&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}', { tk: tk }); ``` 但注意,WMTS服务的URL参数可能有所不同,需要根据天地图提供的WMTS服务文档来调整。 由于我们使用了SuperMap的封装,它已经帮我们处理好了这些参数,所以使用`L.supermap.tiandituTileLayer`更加方便。 以上代码实现了天地图默认加载和切功能。 另外,引用[1]中提到在vue2/nuxt2项目中实现,如果是在Vue项目中,可以将上述逻辑封装成Vue组件。 注意:在Vue项目中,需要确保在mounted生命周期中初始化地图,同时注意DOM元素的加载。 最后,关于引用[1]中提到的“解决切卫星视图报错、渲染加载慢卡顿、地图只显示一半卫星图层等问题”,可能的原因和解决方案: - 报错:可能是密钥无效或URL错误,检查密钥和URL。 - 渲染加载慢卡顿:可以考虑使用地图容器的预加载,或者检查网络。 - 地图只显示一半:可能是地图容器大小变化后没有调用map的invalidateSize方法,可以在切后或窗口变化时调用`map.invalidateSize()`。 在切图层的函数中,如果遇到显示问题,可以在切完成后调用`map.invalidateSize()`。 修改切函数: ```javascript function switchLayer(baseLayer, annoLayer) { map.removeLayer(currentBaseLayer); map.removeLayer(currentAnnoLayer); map.addLayer(baseLayer); map.addLayer(annoLayer); currentBaseLayer = baseLayer; currentAnnoLayer = annoLayer; // 解决地图显示不全的问题 setTimeout(() => { map.invalidateSize(); }, 0); } ``` 以上内容实现了在天地图中设置默认地图并实现地图切功能。</think>在天地图中设置默认地图并实现地图切功能,可以通过以下步骤实现: ### 一、设置默认地图 1. **初始化地图时指定默认图层** 使用天地图的WMTS服务加载矢量图作为默认底图: ```javascript // 创建地图实例 const map = new L.Map('map', { center: [39.92, 116.46], // 默认中心点(北京) zoom: 10 // 默认缩放级别 }); // 加载默认矢量底图(需替your_tianditu_token) const defaultLayer = L.tileLayer('https://t{0-7}.tianditu.gov.cn/vec_w/wmts?tk=YOUR_TIANDITU_TOKEN&', { layer: 'vec', tilematrixSet: 'w', format: 'tiles', maxZoom: 18 }).addTo(map); ``` ### 二、实现图层切功能 1. **准备不同图层源** ```javascript // 矢量图层 const vectorLayer = L.tileLayer('https://t{0-7}.tianditu.gov.cn/vec_w/wmts?tk=YOUR_TOKEN&', { layer: 'vec', tilematrixSet: 'w' }); // 卫星图层 const satelliteLayer = L.tileLayer('https://t{0-7}.tianditu.gov.cn/img_w/wmts?tk=YOUR_TOKEN&', { layer: 'img', tilematrixSet: 'w' }); // 地形图层 const terrainLayer = L.tileLayer('https://t{0-7}.tianditu.gov.cn/ter_w/wmts?tk=YOUR_TOKEN&', { layer: 'ter', tilematrixSet: 'w' }); ``` 2. **创建图层切控件** ```javascript // 方法1:使用Leaflet内置控件 const baseLayers = { "矢量地图": vectorLayer, "卫星影像": satelliteLayer, "地形图": terrainLayer }; L.control.layers(baseLayers).addTo(map); // 方法2:自定义切按钮 document.getElementById('satellite-btn').addEventListener('click', () => { map.removeLayer(vectorLayer); map.addLayer(satelliteLayer); }); ``` ### 三、关键注意事项 1. **解决常见问题**: - **密钥申请**:需在[天地图官网](https://www.tianditu.gov.cn/)申请token替`YOUR_TOKEN` - **跨域问题**:在服务端配置CORS或使用代理 - **图层偏移**:确保所有图层使用相同的`tilematrixSet`参数(推荐`w`) - **渲染卡顿**:使用`{0-7}`域名轮询避免单域名限制 2. **性能优化**: ```javascript // 预加载图层 satelliteLayer.on('load', initComplete); // 单图层切(避免重叠) function switchLayer(newLayer) { map.eachLayer(layer => { if (layer instanceof L.TileLayer) map.removeLayer(layer); }); map.addLayer(newLayer); } ``` ### 四、完整示例(Vue组件) ```vue <template> <div> <div id="map-container"></div> <div class="layer-control"> <button @click="switchLayer('vector')">矢量图</button> <button @click="switchLayer('satellite')">卫星图</button> </div> </div> </template> <script> export default { mounted() { this.initMap(); }, methods: { initMap() { this.map = L.map('map-container').setView([39.92, 116.46], 10); // 初始化默认图层 this.vectorLayer = L.tileLayer( 'https://t{0-7}.tianditu.gov.cn/vec_w/wmts?tk=YOUR_TOKEN&', { tilematrixSet: 'w' } ).addTo(this.map); }, switchLayer(type) { if (type === 'vector' && !this.map.hasLayer(this.vectorLayer)) { this.map.removeLayer(this.satelliteLayer); this.map.addLayer(this.vectorLayer); } else if (type === 'satellite') { if (!this.satelliteLayer) { this.satelliteLayer = L.tileLayer( 'https://t{0-7}.tianditu.gov.cn/img_w/wmts?tk=YOUR_TOKEN&', { tilematrixSet: 'w' } ); } this.map.removeLayer(this.vectorLayer); this.map.addLayer(this.satelliteLayer); } } } } </script> ``` > **重要提示**: > 1. 实际使用需替有效的天地图token > 2. 卫星图层加载较慢时可添加加载动画 > 3. 不同图层使用相同的坐标系和缩放级别可避免视角跳变 > 4. 最新API文档参考[天地图服务接口](https://lbs.tianditu.gov.cn/server/MapService.html)
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值