腾讯地图加载详细说明 —— 以leaflet为例

        如果你喜欢,欢迎转载,转载请注明出处:https://blog.csdn.net/shaxiaozilove/article/details/118685919

        因腾讯地图的瓦片规则与谷歌不一致,导致Leaflet是不能直接调用腾讯地图,腾讯地图与谷歌地图具体的切片差异,可参考腾讯与百度地图瓦片规则分析。若要使用Leaflet加载腾讯地图或其他任何规则不统一的地图做底图,首先需要搞懂具体的切片规则,然后需专门对L.TileLayer写一个扩展来实现实现,主要是重写getTileUrl函数。

        下面以实际代码(代码可直接保存为html文件并在浏览器中访问,可根据需要加载不同类型的地图,示例中默认加载地形图)来说明Leaflet中加载腾讯地图的扩展类实现,以及getTileUrl的逻辑。

<!DOCTYPE html>
<html>
<head>
	<title>加载腾讯地图</title>
	<link rel="stylesheet" href="https://unpkg.com/leaflet@1.4.0/dist/leaflet.css"
	   integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA=="
	   crossorigin=""/>
   	<!-- Make sure you put this AFTER Leaflet's CSS -->
	<script src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js"
	   integrity="sha512-QVftwZFqvtRNi0ZyCtsznlKSWOStnDORoefr1enyq5mVL4tmKB3S/EnC3rRJcxCPavG10IcrVGSmPh6Qw5lwrg=="
	   crossorigin=""></script>
	 <style type="text/css">
	 	html, body { height: 100%; width: 100%; }
	 	#mapid { height: 100%; width: 100%; }
	 </style>
</head>
<body>
	<div id="mapid"></div>
	<script type="text/javascript">
		var map = L.map('mapid').setView([30, 120], 5);
		
		L.TileLayer.WebDogTileLayer = L.TileLayer.extend({
		    getTileUrl: function (tilePoint) {
		        var urlArgs,
		            getUrlArgs = this.options.getUrlArgs;

		        if (getUrlArgs) {
		            var urlArgs = getUrlArgs(tilePoint);
		        } else {
		            urlArgs = {
		                z: tilePoint.z,
		                x: tilePoint.x,
		                y: tilePoint.y,
		            };
		        }

		        return L.Util.template(this._url, L.extend(urlArgs, this.options, {s: this._getSubdomain(tilePoint)}));
		    }
		});

		L.tileLayer.webdogTileLayer = function (url, options) {
		    return new L.TileLayer.WebDogTileLayer(url, options);
		};

		
	    var options = {
	        subdomains: '012',
	        getUrlArgs: function (tilePoint) {
	            return {
	                z: tilePoint.z,
	                x: tilePoint.x,
	                y: Math.pow(2, tilePoint.z) - 1 - tilePoint.y,
	                x16: Math.floor(tilePoint.x / 16.0),
	                y16: Math.floor((Math.pow(2, tilePoint.z) - 1 - tilePoint.y) / 16.0) 
	            };
	        }        
	    };

	    // 矢量底图服务
		// var url = 'http://rt{s}.map.gtimg.com/realtimerender?z={z}&x={x}&y={y}&type=vector&style=0',

		//地形图url
		// http://p{s}.map.gtimg.com/demTiles/{z}/{x16}/{y16}/{x}_{y}.jpg
		// 地形图标注服务(道路及poi)
		// https://rt3.map.gtimg.com/tile?z=12&x=3353&y=2414&type=vector&styleid=3&version=376
		// var url = 'http://rt{s}.map.gtimg.com/tile?z={z}&x={x}&y={y}&type=vector&styleid=3&version=376',

		//卫星图url
		// http://p{s}.map.gtimg.com/sateTiles/{z}/{x16}/{y16}/{x}_{y}.jpg
		// 地形图标注服务(道路及poi)
		// https://rt3.map.gtimg.com/tile?z=12&x=3348&y=2411&styleid=2&version=376
		// var url = 'http://rt{s}.map.gtimg.com/tile?z={z}&x={x}&y={y}&styleid=2&version=376',

	    //加载矢量底图
		// L.tileLayer.webdogTileLayer('http://rt{s}.map.gtimg.com/realtimerender?z={z}&x={x}&y={y}&type=vector&style=0', options).addTo(map);

		//加载地形图
		L.tileLayer.webdogTileLayer('http://p{s}.map.gtimg.com/demTiles/{z}/{x16}/{y16}/{x}_{y}.jpg', options).addTo(map);
		L.tileLayer.webdogTileLayer('http://rt{s}.map.gtimg.com/tile?z={z}&x={x}&y={y}&type=vector&styleid=3&version=376', options).addTo(map);

		// //加载影像图
		// L.tileLayer.webdogTileLayer('http://p{s}.map.gtimg.com/sateTiles/{z}/{x16}/{y16}/{x}_{y}.jpg', options).addTo(map);
		// L.tileLayer.webdogTileLayer('http://rt{s}.map.gtimg.com/tile?z={z}&x={x}&y={y}&styleid=2&version=376', options).addTo(map);

	 </script>
</body>
</html>

具体效果见博文展示封面,可将示例代码中的内容注释(取消注释)查看实际效果。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要实现leaflet加载自定义高德地图后坐标类型为gcj02,你需要进行以下步骤: 1. 在高德开放平台上申请自定义地图服务并获取到对应的key。 2. 在Leaflet中添加高德地图服务的图层,示例代码如下: ``` L.tileLayer('https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}', { attribution: '高德地图', maxZoom: 18 }).addTo(map); ``` 3. 在Leaflet中添加坐标转换插件,这里推荐使用proj4leaflet插件。在使用之前,需要将proj4库引入到项目中。示例代码如下: ``` // 添加proj4库 <script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.6.2/proj4.js"></script> // 定义高德地图的投影坐标系 proj4.defs("EPSG:102100", "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"); // 在Leaflet中添加坐标转换插件 L.Proj.geoJson(data, { 'pointToLayer': function(feature, latlng) { return L.marker(latlng); } }, { 'coordsToLatLng': function(coords) { var point = L.point(coords[0], coords[1]); point = L.Proj.transform(proj4.defs("EPSG:102100"), L.CRS.GCJ02.projection, point); return L.CRS.GCJ02.pointToLatLng(point); } }).addTo(map); ``` 4. 将Leaflet的坐标系设置为GCJ02,示例代码如下: ``` L.CRS.GCJ02 = L.extend({}, L.CRS.EPSG3857, { // 将EPSG3857的投影坐标系转换为GCJ02的投影坐标系 transformation: L.transformation(1 / 128, -1 / 128, -1 / 128, 1 / 128), // 将EPSG3857的地理坐标系转换为GCJ02的地理坐标系 code: 'GCJ02' }); // 将地图的坐标系设置为GCJ02 map.options.crs = L.CRS.GCJ02; ``` 通过以上步骤,你就可以实现leaflet加载自定义高德地图后坐标类型为gcj02了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值