leaflet加载天地图、叠加2000坐标wmts服务


一、自定义坐标

leaflet自带的地理坐标不能加载4490坐标的图层,因此需要自定义坐标。

	//自定义leaflet天地图经纬度坐标
	L.CRS.CustomEPSG4490 = L.extend({}, L.CRS.Earth, {
    	code: 'EPSG:4490',
    	projection: L.Projection.LonLat,
    	transformation: new L.Transformation(1 / 180, 1, -1 / 180, 0.5),
    	scale: function (zoom) {
        	return 256 * Math.pow(2, zoom - 1);
    	}
	});

这里是参考网上的文章:https://codeleading.com/article/97202372217/

这一步我不是很明确,按照leaflet官网,需要使用proj4leaflet插件自定4490坐标,但是我自定义后的坐标用在map里面图层无法显示,用上面的方式定义坐标可以加载。

二、leaflet加载天地图

由于我要叠加的wmts服务是地理坐标,因此天地图服务地址选择地理坐标的服务地址。
地址如下:
http://t0.tianditu.gov.cn/img_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tdtKey}

img_c图层名称 TILEMATRIXSET=c 这两个地方的c代表地理坐标,若需要投影坐标将c换成w
因为这个走了很多弯路,一把辛酸泪......

	//影像地图
    const img_c = L.tileLayer(`http://t0.tianditu.gov.cn/img_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tdtKey}`)
    //注记
    const cia_c = L.tileLayer(`http://t0.tianditu.gov.cn/cia_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tdtKey}`)
    const layers = L.layerGroup([img_c, cia_c])

    let map = L.map('map', {
        center: [24.889157, 102.839443],
        zoom: 6,
        maxZoom: 18,
        minZoom: 0,
        zoomControl: false,
        layers: [layers],
        crs: L.CRS.CustomEPSG4490, //第一步定义的坐标
    })

三、加载2000坐标的wmts

安装插件 leaflet.wmts

	let matrixIds = [];
	for (let i = 0; i < 22; ++i) {
    	matrixIds[i] = {
        	identifier: "" + i,
        	topLeftCorner: new L.LatLng(90, -180),
    	};
	}
	let url = 'http://localhost/gwc/service/wmts'
    let layer = '图层名称'
    let wmtsLayer = new L.TileLayer.WMTS(url,
        {
            layer: layer,
            style: '',
            tilematrixSet: "CGCS2000",
            format: "image/png",
            crs: L.CRS.CustomEPSG4490,
            matrixIds: matrixIds,
        }
    );

我执行到这一步先使用的是官网下载的js文件,需要改源码,否则无法加载我这里的wmts服务。后来在npm官网找到了leaflet.wmts插件,安装后能成功加载(我觉得很玄幻!!!不李姐)
所以推荐使用npm 安装leaflet.wmts插件。

三、完整代码

<template>
    <div id="map"></div>
</template>

<script setup>
import { ref, reactive, onMounted } from 'vue'
import L from "leaflet";
import "leaflet/dist/leaflet.css";
import 'leaflet.wmts'

const tdtKey = "天地图key"

let matrixIds = [];
for (let i = 0; i < 22; ++i) {
    matrixIds[i] = {
        identifier: "" + i,
        topLeftCorner: new L.LatLng(90, -180),
    };
}

//自定义leaflet天地图经纬度坐标
L.CRS.CustomEPSG4490 = L.extend({}, L.CRS.Earth, {
    code: 'EPSG:4490',
    projection: L.Projection.LonLat,
    transformation: new L.Transformation(1 / 180, 1, -1 / 180, 0.5),
    scale: function (zoom) {
        return 256 * Math.pow(2, zoom - 1);
    }
});

const initMap = () => {
    //影像地图
    const img_c = L.tileLayer(`http://t0.tianditu.gov.cn/img_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tdtKey}`)
    //注记
    const cia_c = L.tileLayer(`http://t0.tianditu.gov.cn/cia_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${tdtKey}`)
    const layers = L.layerGroup([img_c, cia_c])

    let map = L.map('map', {
        center: [24.889157, 102.839443],
        zoom: 6,
        maxZoom: 18,
        minZoom: 0,
        zoomControl: false,
        layers: [layers],
        crs: L.CRS.CustomEPSG4490,
    })


   	let url = 'http://localhost/gwc/service/wmts'
    let layer = '图层名称'
    let wmtsLayer = new L.TileLayer.WMTS(url,
        {
            layer: layer,
            style: '',
            tilematrixSet: "CGCS2000",
            format: "image/png",
            crs: L.CRS.CustomEPSG4490,
            matrixIds: matrixIds,
        }
    );
    map.addLayer(wmtsLayer);
}

onMounted(() => {
    initMap();
})

</script>

<style lang='scss' scoped>
html,
body,
#map {
    padding: 0;
    margin: 0;
    height: 100vh;
    width: 100%;
}
</style>

总结

总结就是leaflet的真的好难用,单单是从他官网下载的东西使用起来一步一个坑这一点就无法忍受,当然有可能是我刚接触leaflet使用不熟练,以上仅为个人观点。完结~ 撒花~

参考:
https://www.cnblogs.com/sx001/p/12876014.html
https://codeleading.com/article/97202372217/

### WMS 和 WMTS 的区别及用途 #### 定义与功能 Web Map Service (WMS) 是一种基于请求-响应模式的地图服务协议,允许客户端通过发送特定参数的 HTTP 请求获取动态生成的地图图像。这些图像通常是根据服务器上的原始数据实时渲染而成[^1]。而 Web Map Tile Service (WMTS) 则是一种优化后的地图服务标准,它预先将地图切分为固定大小的小图片(称为瓦片),并按照预定义的比例尺级别存储在服务器上[^3]。 #### 数据传输方式 WMS 使用的是按需生成的方式,每次请求都会重新计算和绘制地图内容,因此可以灵活支持不同的样式、图层叠加以及复杂的查询操作。然而,这种方式可能会带来较高的延迟,尤其是在处理大规模复杂数据集时。相比之下,WMTS 提供了一种静态缓存机制,所有的瓦片都是提前生成好的,在接收到请求后只需简单返回对应的文件即可完成响应,从而显著提高了性能效率。 #### 坐标系统兼容性 两种服务都广泛应用于地理信息系统(GIS),其中 OpenLayers 这样的开源框架能够很好地适配它们,并且还提供了对中国本地化需求的支持比如 GCJ-02 加密算法下的坐标转换等功能[^2]。不过需要注意的是,由于 WMTS 更倾向于固定的显示效果,所以在涉及多源异构空间数据集成或者高级分析应用场合下可能不如传统意义上的 WMS 那样具有优势[^4]。 #### 应用场景对比 对于需要频繁更新的数据可视化项目来说,采用 WMS 可能更为合适因为其灵活性强;而对于那些访问频率较高但变化较少的基础底图展示,则推荐使用 WMTS 来提升用户体验质量同时降低带宽消耗成本。 ```javascript // 示例代码:如何利用 Leaflet 实现加载来自 GeoServer 的 WMS 图层 var wmsLayer = L.tileLayer.wms("http://localhost:8080/geoserver/wms", { layers: 'workspace_name:layer_name', format: 'image/png', transparent: true, version: '1.1.0' }).addTo(map); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值