如何将图片切割成瓦片图?
目标:知道图片经纬度的前提下,将一张图片切割成瓦片图,并以地图底图的格式生成及保存。
技术:leaflet.js+nw.js
下载地址:https://download.csdn.net/download/striveye/11010965
总结:该方法用于单独快速将图片切割成瓦片图,并生成地图格式的图片,可用于leaflet地图、mapbox地图等。
PS:项目必须依赖leaflet.js,nw.js用于快速生成及保存瓦片图(不是必须依赖项,可自行编写保存图片的方法代替)
(目标图片)
(结果图片)
项目文件:
代码实现:
<body style="overflow:scroll">
<div style="background-color: black;text-align:center;overflow:auto;">
<canvas id="canvas1" style="border:1px solid blue;">Your browser dosen't support canvas.</canvas>
</div>
<script type="text/javascript" src="./leaflet.js"></script>
<script type="text/javascript">
var fs = require('fs');
var path = require('path');
//参数设置:
//lat1-lng1:右上角经纬度,lat2-lng2:左下角经纬度
//z0:最小级别,z1:最大级别
var cfg = {
lat1: 32.2871,
lng1: 106.6113,
lat2: 18.0623,
lng2: 117.2460,
z0: 0,
z1: 8
}
var IMG_H = 'data:image/png;base64,';
console.log('start')
var spath = "./SouceData/";
var files = fs.readdirSync(spath);
var idx = 0, cnt = files.length;
next();
function next(){
if (idx < cnt){
var imagefile = spath + files[idx];
console.log(((idx+1)+'/'+cnt)+' : '+imagefile)
SplitImageToMap(cfg, imagefile, function(){
idx++;
next();
});
} else {
console.log('end');
}
}
function SplitImageToMap(cfg, imagefile, callback) {
var c1 = document.getElementById('canvas1');
var ctx1 = c1.getContext('2d');
var img = new Image();
var c2 = document.createElement('canvas')
var ctx2 = c2.getContext('2d');
var name = imagefile.substr(imagefile.lastIndexOf('/')+1);
var listname = name.split('.')[0].split('_');
img.src = imagefile;
img.onload = function () {
var size = 256;//瓦片图的尺寸
for (var z = cfg.z0; z <= cfg.z0 + (cfg.z1 - cfg.z0); z++) {
var point1 = L.CRS.EPSG3857.latLngToPoint(L.latLng(cfg.lat1, cfg.lng1), z);
var point2 = L.CRS.EPSG3857.latLngToPoint(L.latLng(cfg.lat2, cfg.lng2), z);
var x1 = parseInt(point1.x / size);
var y1 = parseInt(point1.y / size);
var x2 = parseInt(point2.x / size);
var y2 = parseInt(point2.y / size);
var cw = size * (x2 - x1 + 1), ch = size * (y2 - y1 + 1);
c1.width = cw;
c1.height = ch;
ctx1.drawImage(img, point1.x % size, point1.y % size, point2.x - point1.x, point2.y - point1.y);
var xNum = parseInt(cw / size), yNum = parseInt(ch / size);//计算x,y方向有多少个瓦片
for (var y = 0; y < yNum; y++) {
for (var x = 0; x < xNum; x++) {
var targetImageData = ctx1.getImageData(x * size, y * size, size, size);
c2.width = size;
c2.height = size;
ctx2.putImageData(targetImageData, 0, 0, 0, 0, size, size);
var filepath = 'TodoData/' + listname + '/' + z + '/' + (y + y1);
mkdirsSync(filepath);
var filename = filepath + '/' + z + '_' + (y + y1) + '_' + (x + x1) + '.png';
fs.writeFileSync(filename, c2.toDataURL('image/png').substr(IMG_H.length), 'base64');
}
}
}
if (callback && typeof callback == 'function') callback();
}
img.onerror = function(){
if (callback && typeof callback == 'function') callback();
}
}
// 递归创建目录 同步方法
function mkdirsSync(dirname) {
if (fs.existsSync(dirname)) {
return true;
} else {
if (mkdirsSync(path.dirname(dirname))) {
fs.mkdirSync(dirname);
return true;
}
}
}
</script>
</body>
运行操作:
把demo文件夹拉扯到nw.exe运行即可
demo\SouceData:源图片
demo\TodoData:瓦片图
运行效果:
转载自:https://blog.csdn.net/STRIVEYe/article/details/88388072