cesium加载高层级离线影像地图瓦片(天地图、19级Arcgis)

实际加载效果如图:

1、下载离线地图瓦片方式(多种任选其一,个人倾向于Qgis工具):

方式1、采用第三方下载工具如:91卫图、水经注、全能电子地图下载器、bigemap等等。(这些有的下载层级不够,有的需要付费,结合个人情况选择)

方式2、爬虫技术实现,网上贴的相关代码如:Java为例


import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;public class map{//矢量(行政) - 等经纬度public static String vec_c = "http://{server}.tianditu.gov.cn/vec_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//矢量(行政) - 墨卡托public static String vec_w = "http://{server}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//矢量注记(行政) - 等经纬度public static String cva_c = "http://{server}.tianditu.gov.cn/cva_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//矢量注记(行政) - 墨卡托public static String cva_w = "http://{server}.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//影像 - 等经纬度public static String img_c = "http://{server}.tianditu.gov.cn/img_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//影像 - 墨卡托public static String img_w = "http://{server}.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//影像注记 - 等经纬度public static String cia_c = "http://{server}.tianditu.gov.cn/cia_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//影像注记 - 墨卡托public static String cia_w = "http://{server}.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//地形 - 等经纬度public static String ter_c = "http://{server}.tianditu.gov.cn/ter_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//地形 - 墨卡托public static String ter_w = "http://{server}.tianditu.gov.cn/ter_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//地形注记 - 等经纬度public static String cta_c = "http://{server}.tianditu.gov.cn/cta_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cta&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//地形注记 - 墨卡托public static String cta_w = "http://{server}.tianditu.gov.cn/cta_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cta&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";public static String[] servers = {"t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"};public static void main(String[] args){String basePath = "E:/天地图";//这里放你的天地图开发者秘钥,注意天地图API访问次数限制String tk = "75f0434f240669f4a2df635927XXXXXXX";String[] urlArr = {img_w};//要下载的图层int minZoom = 17;int maxZoom = 18;double startLat = 34.29;//开始纬度(从北到南)double endLat = 33.67;//结束纬度(从北到南)double startLon = 107.99;//开始经度(从西到东)double endLon = 109.14;//结束经度(从西到东)ExecutorService exe = Executors.newFixedThreadPool(6);//等经纬度第一层是1x2,纬度数量是2^0,经度数量是2^1//墨卡托投影第一层是2x2,纬度数量是2^1,经度数量是2^1for(int i=0; i<urlArr.length; i++){String url = urlArr[i].replace("{tk}", tk);System.out.println(url);String layerName = url.split("tianditu.gov.cn/")[1].split("/wmts?")[0];System.out.println(layerName);if(layerName.endsWith("c")){//等经纬度for(int z=minZoom; z<=maxZoom; z++){if(z > 17){//天地图10级以上只有中国区域startLat = startLat > 34.29 ? 34.29 : startLat;//开始纬度(从北到南)endLat = endLat < 33.67 ? 33.67 : endLat;//结束纬度(从北到南)startLon = startLon < 107.99 ? 107.99 : startLon;//开始经度(从西到东)endLon = endLon > 109.14 ? 109.14 : endLon;//结束经度(从西到东)}double deg = 360.0 / Math.pow(2, z) / 256;//一个像素点代表多少度int startX = (int)((startLon + 180) / deg / 256);//减数取整int endX = (int)((endLon + 180) / deg / 256);//加数取整int startY = (int)((90 - startLat) / deg / 256);int endY = (int)((90 - endLat) / deg / 256);for(int y=startY; y<=endY; y++){for(int x=startX; x<=endX; x++){final String newUrl = url.replace("{server}", servers[(int) (Math.random()*servers.length)]).replace("{z}", z+"").replace("{x}", x+"").replace("{y}", y+"");final String filePath = basePath + "/" + layerName + "/" + z + "/" + x + "/" + y + ".png";exe.execute(new Runnable() {@Overridepublic void run() {File file = new File(filePath);if(!file.exists()){if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}boolean loop = true;int count = 0;while(loop && count<5){//下载出错进行重试,最多5次count++;try {InputStream in = getFileInputStream(newUrl);OutputStream out = new BufferedOutputStream(new FileOutputStream(file));byte[] b = new byte[8192];int len = 0;while((len = in.read(b)) > -1){out.write(b, 0, len);out.flush();}out.close();in.close();loop = false;} catch (Exception e) {loop = true;}}if(loop){System.out.println("下载失败:"+newUrl);}}}});}}}}else{//墨卡托/*** earthRadius = 6378137;//地球赤道半径6378137米* aa = earthRadius * (Math.PI - 0);//赤道周长的一半,20037508.3427892* 85.05112877980659 = (Math.atan(Math.exp(aa / earthRadius))-Math.PI/4)*2 * 180 / Math.PI;//墨卡托最大有效纬度*/if(startLat > 85.051128){System.out.println("墨卡托投影起始纬度最大为:85.051128,下载区域将被限定。");startLat = 85.051128;}if(endLat <- 85.051128){System.out.println("墨卡托投影终止纬度最小为:-85.051128,下载区域将被限定。");endLat = -85.051128;}for(int z=minZoom; z<=maxZoom; z++){if(z > 17){//天地图10级以上只有中国区域startLat = startLat > 34.29 ? 34.29 : startLat;//开始纬度(从北到南)endLat = endLat < 33.67 ? 33.67 : endLat;//结束纬度(从北到南)startLon = startLon < 107.99 ? 107.99 : startLon;//开始经度(从西到东)endLon = endLon > 109.14 ? 109.14 : endLon;//结束经度(从西到东)}double deg = 360.0 / Math.pow(2, z) / 256;//一个像素点代表多少度int startX = (int)((startLon + 180) / deg / 256);int endX = (int)((endLon + 180) / deg / 256);/*** 这里是基于等经纬度坐标转墨卡托坐标的公式得到的算法。()* 先算出当前地图级别下纬度方向用该有多少个像素点(一个瓦片是256个点,一共有Math.pow(2, z)个瓦片)* 再算出指定纬度坐标与赤道的距离(北半球为正南半球为负)(这里抵消了带入赤道周长的计算,因为它是一个固定值,把赤道周长定为1就抵消了):Math.log(Math.tan((90 + startLat) * Math.PI / 360)) / (Math.PI / 180)* 就可以得到纬度坐标距赤道有多少个点:(Math.log(Math.tan((90 + startLat) * Math.PI / 360)) / (Math.PI / 180)) / (360/Math.pow(2, z)/256) + 0.5)* 然后就可以计算出其瓦片坐标。*/int startY = (((int)Math.pow(2, z) * 256 / 2) - (int)((Math.log(Math.tan((90 + startLat) * Math.PI / 360)) / (Math.PI / 180)) / (360/Math.pow(2, z)/256) + 0.5)) / 256;int endY = (((int)Math.pow(2, z) * 256 / 2) - (int)((Math.log(Math.tan((90 + endLat) * Math.PI / 360)) / (Math.PI / 180)) / (360/Math.pow(2, z)/256) + 0.5)) / 256;for(int y=startY; y<=endY; y++){//加入判断是等经纬度还是墨卡托for(int x=startX; x<=endX; x++){final String newUrl = url.replace("{server}", servers[(int) (Math.random()*servers.length)]).replace("{z}", z+"").replace("{y}", y+"").replace("{x}", x+"");//System.out.println(newUrl);final String filePath = basePath + "/" + layerName + "/" + z + "/" + y + "/" + x + ".png";exe.execute(new Runnable() {@Overridepublic void run() {File file = new File(filePath);if(!file.exists()){if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}boolean loop = true;int count = 0;while(loop && count<5){//下载出错进行重试,最多5次count++;try {InputStream in = getFileInputStream(newUrl);OutputStream out = new BufferedOutputStream(new FileOutputStream(file));byte[] b = new byte[8192];int len = 0;while((len = in.read(b)) > -1){out.write(b, 0, len);out.flush();}out.close();in.close();loop = false;} catch (Exception e) {loop = true;}}if(loop){System.out.println("下载失败:"+newUrl);}}}});}}}}}exe.shutdown();while (true) {try {Thread.sleep(1000L);//主线程休眠1秒,等待线程池运行结束,同时避免一直死循环造成CPU浪费} catch (InterruptedException e) {}if (exe.isTerminated()) {//线程池所有线程都结束运行break;}}}//获取文件下载流public static InputStream getFileInputStream(String url) throws Exception{InputStream is = null;CloseableHttpClient httpclient = HttpClients.createDefault();HttpGet request = new HttpGet(url);request.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");HttpResponse response = httpclient.execute(request);response.setHeader("Content-Type", "application/octet-stream");int statusCode = response.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {HttpEntity entity = response.getEntity();is = entity.getContent();}return is;}}

这个亲测确实能够下载,但是存在下载的瓦片出现nginx发布后,引用实际cesium贴图位置错乱。应该是生成的XYZ目录存在一些问题。没有细究。

方式3、通过QGIS下载(极力推荐

QGIS下载地址:Download QGIS

操作界面切换到中文界面如下:

自定义下载瓦片区域,如下图第4步,会出现下拉选择列表,自行选择即可

层级可以批处理分层下载结果如下图。

注:根目录是层级Z,下一级目录是X,下下一级目录.png是Y

2、Nginx发布离线瓦片数据

nginx配置nginx.conf

server {listen			9006;server_name		127.0.0.1;# 这里需要写相对路径  绝对路径会报错404root 			../tianmap;autoindex 		on;location / {# 支持跨域add_header Access-Control-Allow-Origin *;add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';}# 不存缓存 每次重新验证add_header Cache-Control "no-cache,must-revalidate";}

发布访问结果如下:

3、cesium工程加载离线影像瓦片

   var MapModel = new Cesium.UrlTemplateImageryProvider({url:"http://127.0.0.1:9006/{z}/{x}/{y}.png",tilingScheme: new Cesium.WebMercatorTilingScheme(),fileExtension: 'png',minimumLevel: 1,maximumLevel: 18});viewer.imageryLayers.addImageryProvider(MapModel);

到此结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot:Web应用开发之登录与退出的实现

Spring Boot 前言实现登录功能配置拦截器 实现退出功能 前言 登录与退出功能作为 Web 应用中的基础且重要的组成部分&#xff0c;直接关系到用户的安全和隐私保护。通过实现登录与退出功能&#xff0c;可以对用户的身份进行验证和授权&#xff0c;确保只有合法的用户才能访问特…

Qwen1.5大语言模型微调实践

在人工智能领域&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的兴起和广泛应用&#xff0c;为自然语言处理&#xff08;NLP&#xff09;带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者&#xff0c;不仅拥有强大的语言生成和理…

vue3【详解】选项式 API 实现逻辑复用

抽离逻辑代码到一个函数函数命名约定为 useXxxx格式 ( React Hooks 也是 )在 setup 中引用 useXxx 函数 演示代码&#xff1a;实时获取鼠标的坐标 逻辑封装 useMousePosition.js // 导入 ref, onMounted, onUnmounted import { ref, onMounted, onUnmounted } from "vue…

锐捷云桌面的安装

按下 <DEL> 键进入 BIOS setup 界面&#xff08;初始密码为 admin &#xff09;。 输入密码之后就进入 BIOS 的 Main 界面 设置服务器 BMC IP 地址。 a 云服务器启动后&#xff0c;在 BIOS 的主页面&#xff0c;把光标移到 [Server Mgmt] 项。 b 选择 [BMC Network C…

游戏前摇后摇Q闪E闪QE闪QA等操作

备注&#xff1a;未经博主允许禁止转载 个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_w…

基于Springboot的社区防疫物资申报系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区防疫物资申报系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

Quartz + SpringBoot 实现分布式定时任务

文章目录 前言一、分布式定时任务解决方案二、Quartz是什么&#xff1f;1.quartz简介2.quartz的优缺点 二、Quartz分布式部署总结 前言 因为应用升级&#xff0c;由之前的单节点微服务应用升级为集群微服务应用&#xff0c;所以之前的定时任务Spring Scheduled不再适用了&…

SV-704LW 无线WIFI网络音柱

SV-704LW 无线WIFI网络音柱(工业级) 一、描述 SV-704LW是深圳锐科达电子有限公司的一款壁挂式WIFI无线网络音柱&#xff0c;通过WIFI无线接入到WIFI覆盖的网络中&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;其采用防水设计&#xff0c;功率可以从30W到6…

如何利用FLUENT计算流体力学方法解决大气与环境领域流动问题

ANSYS FLUENT是目前全球领先的商用CFD 软件&#xff0c;市场占有率达70%左右&#xff0c;是工程师和研究者不可多得的有力工具。由于采用了多种求解方法和多重网格加速收敛技术&#xff0c;因而FLUENT能达到最佳的收敛速度和求解精度。灵活的非结构化网格和基于解的自适应网格技…

从OWASP API Security TOP 10谈API安全

1.前言 应用程序编程接口&#xff08;API&#xff09;是当今应用驱动世界创新的一个基本元素。从银行、零售、运输到物联网、 自动驾驶汽车、智慧城市&#xff0c;API 是现代移动、SaaS 和 web 应用程序的重要组成部分&#xff0c;可以在面向客 户、面向合作伙伴和内部的应用程…

计算机组成原理 — 控制单元的功能

控制单元的功能 控制单元的功能微操作命令分析取指周期间址周期执行周期中断周期 控制单元的功能控制单元的外特性输入信号输出信号 控制信号举例不采用CPU内部总线的方式取指周期间址周期执行周期 采用CPU内部总线的方式取指周期间址周期执行周期 多级时序系统机器周期时钟周期…

反激电源——TL431及光耦反馈电路计算(不涉及环路补偿)

一、TL431及光耦反馈电路 TL431以及光耦电路是反激的副边反馈类型电路中的常见应用。 其反馈工作原理为&#xff1a;当副边的输出电压升高时&#xff0c;TL431的REF点采样电压也会升高&#xff0c;使得TL431的导通量增加&#xff0c;同时光耦内部的发光二极管流过的电流也增大&…

线段树汇总

线段树是一种二叉搜索树&#xff0c;与区间树相似&#xff0c;它将一个区间划分成一些单元区间&#xff0c;每个单元区间对应线段树中的一个叶结点。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数&#xff0c;时间复杂度为O(logN)。而未优化的空间复杂度为2N&a…

SpringCloud系列(4)--SpringCloud微服务工程构建

前言&#xff1a;在上节我们新建了一个SpringCloud父工程&#xff0c;这一节主要是构建微服务工程&#xff0c;通过实现订单模块和支付模块来熟悉微服务的概念和构建过程。 1、在父工程下新建模块 2、选择模块的项目类型为Maven并选择模块要使用的JDK版本 3、填写子模块的名称&…

企业网盘搭建——LNMP

php包链接&#xff1a;https://pan.baidu.com/s/1RElYTQx320pN6452N_7t1Q?pwdp8gs 提取码&#xff1a;p8gs 网盘源码包链接&#xff1a;https://pan.baidu.com/s/1BaYqwruka1P6h5wBBrLiBw?pwdwrzo 提取码&#xff1a;wrzo 目录 一.手动部署 二.自动部署 一.手动部署 …

SQL表连接详解:JOIN与逗号(,)的使用及其性能影响

省流版 在这个详细的解释中&#xff0c;我们将深入探讨SQL中表连接的概念&#xff0c;特别是JOIN和逗号&#xff08;,&#xff09;在连接表时的不同用法及其对查询性能的影响。通过实际示例和背后的逻辑分析&#xff0c;我们将揭示在不同场景下选择哪种连接方式更为合适。 1.…

BioTech - 使用 Amber 工具 松弛(Relaxation) 蛋白质三维结构 (Python)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/137889532 Amber 工具在蛋白质 松弛(Relaxation) 过程中起着重要的作用。在分子动力学模拟中,蛋白质松弛是指模拟过程中蛋白质结构达到一个较为稳定的状态。这个过程通…

社交媒体数据恢复:推特、Twitter

推特&#xff08;Twitter&#xff09;数据恢复&#xff1a;如何找回丢失的内容 随着社交媒体的普及&#xff0c;越来越多的人开始使用推特&#xff08;Twitter&#xff09;来分享生活点滴、发表观点和获取信息。然而&#xff0c;有时候我们会不小心删除了重要的推文&#xff0…

根据 Excel 列生成 SQL

公司有个历史数据刷数据的需求, 开发功能有点浪费, 手工刷数据有点慢, 所以研究了下 excel 直接生成 SQL, 挺好用, 记录一下; 例如这是我们的数据, 要求把创建时间和完成时间刷进数据库中, 工单编号唯一 Excel 公式如下: "UPDATE service_order SET create…

工业控制(ICS)---MMS

MMS 工控领域的TCP协议&#xff0c;有时wireshark会将response包解析为tcp协议&#xff0c;影响做题&#xff0c;如果筛选mms时出现连续request包&#xff0c;考虑wireshark解析错误&#xff0c;将筛选条件删除手动看一下 initiate&#xff08;可以理解为握手&#xff09; i…