【SAS Planet 下载地图瓦片-读取】

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 url
            String 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 );

                //获取图片,图片列的索引为8
                byte[] 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>

效果如下

相关推荐
hrrrrb4 分钟前
【Spring Security】Spring Security 密码编辑器
java·hive·spring
豐儀麟阁贵6 分钟前
2.3变量与常量
java·开发语言
摇滚侠1 小时前
Spring Boot 3零基础教程,自动配置机制,笔记07
spring boot·笔记·后端
兮动人1 小时前
Eureka注册中心通用写法和配置
java·云原生·eureka
爱编程的小白L3 小时前
基于springboot志愿服务管理系统设计与实现(附源码)
java·spring boot·后端
聪明的笨猪猪5 小时前
Java Redis “持久化”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
聪明的笨猪猪6 小时前
Java Redis “核心基础”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
奋斗的小monkey8 小时前
Spring Boot 3.x核心特性与性能优化实战
java·spring boot·微服务·性能优化·响应式编程
程序猿DD8 小时前
将 GPU 级性能带到企业级 Java:CUDA 集成实用指南
java·架构