首页 > 其他分享 >leaflet | GridLayer扩展土层

leaflet | GridLayer扩展土层

时间:2023-10-12 17:11:39浏览次数:34  
标签:ctx leaflet var coords tile 土层 GridLayer size

一、createtile方法

1、同步使用

要创建自定义层,请扩展GridLayer并实现createTile()方法,该方法将通过一个带有x、y和z(缩放级别)坐标的点对象来绘制瓦片。

代码示例:

var CanvasLayer = L.GridLayer.extend({
    createTile: function(coords){
        // create a <canvas> element for drawing
        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
        // setup tile width and height according to the options
        var size = this.getTileSize();
        tile.width = size.x;
        tile.height = size.y;
        // get a canvas context and draw something on it using coords.x, coords.y and coords.z
        var ctx = tile.getContext('2d');
        // return the tile so it can be rendered on screen
        return tile;
    }
});

2、异步使用

Tile创建也可以是异步的,这在使用第三方绘图库时很有用。绘制完成后,可以将其传递给done()回调。

代码示例:

var CanvasLayer = L.GridLayer.extend({
    createTile: function(coords, done){
        var error;
        // create a <canvas> element for drawing
        var tile = L.DomUtil.create('canvas', 'leaflet-tile');
        // setup tile width and height according to the options
        var size = this.getTileSize();
        tile.width = size.x;
        tile.height = size.y;
        // draw something asynchronously and pass the tile to the done() callback
        setTimeout(function() {
            done(error, tile);
        }, 1000);
        return tile;
    }
});

二、Demo

主要实现经纬度的展示

<!DOCTYPE html>
<html>  
<head>
    <title>GridLayer</title>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
    <style>
        body {
            padding: 0;
            margin: 0;
        }
        html, body, #map {
            height: 100%;
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="map"></div>
 
    <script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
 
    <script>
        var map = new L.Map('map', { center: [39.92,116.46], zoom: 10 ,CRS:L.CRS.EPSG4326});
 
        var tiles = new L.GridLayer();
        tiles.createTile = function (coords) {
            var tile = L.DomUtil.create('canvas', 'leaflet-tile');
            var ctx = tile.getContext('2d');
            var size = this.getTileSize()
            tile.width = size.x
            tile.height = size.y
            // 将切片号乘以切片分辨率,默认为256pixel,得到切片左上角的绝对像素坐标
            var nwPoint = coords.scaleBy(size)
            // 根据绝对像素坐标,以及缩放层级,反投影得到其经纬度
            var nw = map.unproject(nwPoint, coords.z)
            //从该切片左上角开始画,画一个切片大小的无填充矩形
            ctx.strokeRect(nwPoint.x, nwPoint.y,size.x,size.y)
            ctx.fillStyle = 'black';
            //x,y,z显示
            ctx.fillText('x: ' + coords.x + ', y: ' + coords.y + ', zoom: ' + coords.z, 50, 60);
            //经纬度坐标
            ctx.fillText('lat: ' + nw.lat + ', lon: ' + nw.lng, 50, 80);
            //线的颜色
            ctx.strokeStyle = 'black';
            //这是canvans的方法
            ctx.beginPath();
            ctx.moveTo(0, 0);
            ctx.lineTo(size.x - 1, 0);
            ctx.lineTo(size.x - 1, size.y - 1);
            ctx.lineTo(0, size.y - 1);
            ctx.closePath();
            ctx.stroke();
            return tile;
        }
 
        L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
            attribution: 'Map data &copy; <a href="http://www.osm.org">OpenStreetMap</a>'
        }).addTo(map)
 
        tiles.addTo(map)
    </script>
</body>
</html>

转载自here

标签:ctx,leaflet,var,coords,tile,土层,GridLayer,size
From: https://www.cnblogs.com/echohye/p/17759955.html

相关文章

  • @supermap/iclient-leaflet使用tiledMapLayer报错
    使用leaflet加载超图的时候有时候超图无法加载有时候报如下错误因为手上有好几个项目都在使用leaflet但是同样都使用@supermap/iclient-leaflet(版本11.1.0-a)加载超图,有的项目可行,有的不可行最后打开项目根目录下node_modules里查看@supermap文件夹里的iclient-leafl......
  • leaflet.js气象风场图制作
    Demo示例<!--https://github.com/onaci/leaflet-velocity--><!DOCTYPEhtml><html><head><title>LeafletVelocityDemo</title><metacharset="utf-8"/></head><body><div......
  • 003-Leaflet-各地图切换
    一、代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="......
  • vue3 +leaflet + 天地图
    vue3使用leafletnpminstallleaflet-D如果使用了tsnpmi--save-dev@types/leaflet//使用了ts需要下载声明类型//更具需要获取不通过类型的urlfunctiongetUrl(type:string){interfaceMyObject{[key:string]:Array<string>;}letobj:MyObject=......
  • 002-Leaflet-图层切换
    一、代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="......
  • 001-Leaflet-地图初始化
    一、代码1<!DOCTYPEhtml>2<htmllang="en">34<head>5<metacharset="UTF-8">6<metahttp-equiv="X-UA-Compatible"content="IE=edge">7<metaname="viewport......
  • leaflet插件leaflet-graticule经度标签格式化问题
    https://github.com/turban/Leaflet.Graticuleimport"leaflet-graticule";L.graticule().addTo(map);解决办法:import"leaflet-graticule";L.LatLngGraticule.prototype.__format_lng_origin=L.LatLngGraticule.prototype.__format_lng;L.LatLngGra......
  • leaflet.openPopup() 方法传入参数是个模板字符串,如何将其改为使用vue的模板实现,可以
    注:这个问题是我使用cursor得到的回答。问:leaflet.openPopup()方法传入参数是个模板字符串,如何将其改为使用vue的模板实现,可以支持数据双向绑定为了将 this.map.openPopup() 方法中的字符串模板替换为支持双向数据绑定的 Vue 模板,您可以使用 Vue.extend() 方法创建一个新......
  • leaflet 自用库
    1 <linkrel="stylesheet"href="/js/leaflet.min.css"/> <scriptsrc="/js/leaflet.min.js"></script> <linkrel="stylesheet"href="/js/leaflet.pm.css"/> <scriptsrc="/j......
  • vue+leaflet示例:克里金插值渲染显示(附源码下载)
    demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。运行工具:vscode或者其他工具。配置方式:下载demo源码,vscode打开,然后顺序执行以下命令:(1)下载demo环境依赖包命令:npmi(2)启动demo命令:npmrundev(3)打包demo命令:npmrunbuild:release示例效果......