SAS Planet下载地图瓦片请看上一篇 详细介绍了下载方法
【SAS Planet 下载地图瓦片】-CSDN博客
准备工作:
1.提前下载好地图瓦片数据
SAS Planet下载地图瓦片默认存储路径如下
默认存储格式为 .sqlitedb
2.提前准备好 java开发环境和开发工具,新建 一个 spring boot 工程,集成 maven。
在pom.xml 下新增sqlite3驱动包配置,然后更新工程 maven
<!-- sqlite3驱动包 --> <dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.32.3.2</version> </dependency>
读取SAS Planet下载的地图瓦片后台代码如下:
package com.api.controller;import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController;import java.io.BufferedInputStream; import java.io.IOException; import java.sql.*; import java.util.HashMap; import java.util.List; import java.util.Map;@Api(value="读取sqlite文件瓦片",tags={"读取sqlite文件瓦片"}) @CrossOrigin // 允许跨域访问 @RestController public class sqliteTilesController {@GetMapping(value = "/getCacheTiles/{layerName}/{level}/{x}/{y}")public ResponseEntity<byte[]> getCacheTiles(@PathVariable("layerName")String layerName, @PathVariable("level")Integer level, @PathVariable("x")Integer x, @PathVariable("y")Integer y) {ResponseEntity<byte[]> response=null;Statement stmt = null;Connection conn = null;try {//String path="E:\\WJ_Data\\SAS.Planet.Release.200606\\cache_sqlite\\Google_Sat_RU_SD\\"+layerName+"\\z"+level+"\\0\\0\\0.0.sqlitedb";String basePath="E:\\WJ_Data\\SAS.Planet.Release.200606\\cache_sqlite\\";//地图下载(SAS.Planet) 下载的瓦片存储在sqlitedb文件里 路径规则 规则计算// 将十进制数转换为二进制字符串再右移后还原成十进制数Integer shrX1= shrnNumberValue(x,10);//Integer shrY1= shrnNumberValue(y,10);//Integer shrX2= shrnNumberValue(x,8);//Integer shrY2= shrnNumberValue(y,8);//String fullPath=basePath+layerName+"\\z"+level+"\\"+shrX1+"\\"+shrY1+"\\"+shrX2+"."+shrY2+".sqlitedb";//jdbc urlString urlStr="jdbc:sqlite:"+fullPath;conn = DriverManager.getConnection(urlStr);conn.setAutoCommit(false);System.out.println("Opened database successfully");stmt = conn.createStatement();//ResultSet rs = stmt.executeQuery( "SELECT * FROM 't'" );String sqlStr="SELECT * FROM 't' where x="+x+" and y="+y;//"SELECT * FROM 't'ResultSet rs = stmt.executeQuery(sqlStr);while ( rs.next() ) {int tilesX = rs.getInt("x");int tilesY = rs.getInt("y");int v= rs.getInt("v");String c= rs.getString("c");long h= rs.getLong("h");long d= rs.getLong("d");String Str="瓦片信息 level:"+level+", x:"+x+", y="+y;System.out.println( Str );//获取图片,图片列的索引为8byte[] bytes = (byte[] )rs.getObject(8);response= ResponseEntity.ok().contentType(MediaType.parseMediaType("image/jpg")).body(bytes);}rs.close();stmt.close();conn.close();} catch ( Exception e ) {System.err.println( e.getClass().getName() + ": " + e.getMessage() );}System.out.println("Operation done successfully");return response;}//将十进制数转换为二进制字符串再右移后还原成十进制数public int shrnNumberValue(int value,int shr) {// value 十进制数// shr 将一个数在二进制上右位移位数String binary = Integer.toString(value, 2); // 十进制转换为二进制字符串int length= binary.length();if(length>shr){String newBinary=binary.substring(0,binary.length()-shr);int decimal = Integer.parseInt(newBinary, 2); // 二进制字符串解析为十进制数return decimal;}else{return 0;}}}
获取瓦片接口:"http://localhost:2022/getCacheTiles/Google_Sat_RU_SD/{z}/{x}/{y}"
前端页面调用代码如下
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
<title>Custom LERC Layer | Sample | ArcGIS Maps SDK for JavaScript 4.28</title>
<link rel="stylesheet" href="https://js.arcgis.com/4.28/esri/themes/light/main.css" />
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<script>
var dojoConfig = {
paths: {
// see https://github.com/Esri/lerc
lerc: "https://cdn.jsdelivr.net/gh/Esri/lerc@b0650ff915a05b2a045641235323d59b26a40550/OtherLanguages/js/"
}
};
</script>
<script src="https://js.arcgis.com/4.28/"></script>
<script>
require([
"esri/Map",
"esri/views/MapView",
"esri/layers/BaseTileLayer",
"esri/request",
"lerc/LercDecode"
], (Map, MapView, BaseTileLayer, esriRequest, LercDecode) => {
const LercLayer = BaseTileLayer.createSubclass({
properties: {
urlTemplate: null,
minElevation: 0,
maxElevation: 4000
},
// Generates the URL to an image to be requested from the server
getTileUrl: function(level, row, col) {
return this.urlTemplate
.replace("{z}", level)
.replace("{x}", col)
.replace("{y}", row);
},
// fetch tiles visible in the view
fetchTile: function(level, row, col, options) {
const url = this.getTileUrl(level, row, col);
// requested encoded elevation information
// the signal option ensures that obsolete requests are aborted
return esriRequest(url, {
responseType: "array-buffer",
signal: options && options.signal
}).then((response) => {
// create a canvas to draw the processed image
const canvas = document.createElement("canvas");
const context = canvas.getContext("2d");
const width = this.tileInfo.size[0];
const height = this.tileInfo.size[1];
canvas.width = width;
canvas.height = height;
const lerc = LercDecode.decode(response.data, { noDataValue: 0 });
const pixels = lerc.pixels[0];
const stats = lerc.statistics[0];
const min = this.minElevation;
const max = this.maxElevation;
const noDataValue = stats.noDataValue;
const imageData = context.createImageData(width, height);
const data = imageData.data;
const factor = 256 / (max - min);
let value = 0;
let j;
for (let i = 0; i < width * height; i++) {
j = i + Math.floor(i / width);
value = (pixels[j] - min) * factor;
data[i * 4] = value; // r
data[i * 4 + 1] = value; // g
data[i * 4 + 2] = 0; // b
data[i * 4 + 3] = pixels[i] === noDataValue ? 0 : value; // a
}
context.putImageData(imageData, 0, 0);
return canvas;
}
);
}
});
var vUrl="http://localhost:2022/getCacheTiles/Google_Sat_RU_SD/{z}/{x}/{y}";
const lercLayer = new LercLayer({
urlTemplate:vUrl,
title: "Google_Sat_RU_SD"
});
const map = new Map({
basemap: "dark-gray-vector",
layers: [lercLayer]
});
const view = new MapView({
container: "viewDiv",
map: map
zoom: 5
});
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
效果如下