基于SuperMap iObjects Java生成地图瓦片

作者:dongyx

前言

在GIS领域,地图瓦片技术作为GIS领域的关键技术,是提高地图服务性能的关键手段之一。通过预先生成地图的瓦片数据,可以显著提升用户访问地图时的响应速度和体验。SuperMap iObjects for Java作为一款强大的GIS开发组件,为开发人员提供了丰富的地图制图、空间分析和数据处理功能,使得地图瓦片的生成变得更加便捷高效。本文将详细介绍如何使用SuperMap iObjects for Java从零开始生成地图瓦片。

一、地图瓦片的概念与优势

地图瓦片是指包含了一系列比例尺、一定地图范围内的地图瓦片文件。地图瓦片按照金字塔组织结构,为每张瓦片进行唯一的级别、行列号标记。在平移、缩放地图时,浏览器根据金字塔规则,计算出所需的瓦片,从瓦片服务器获取并拼接。
在这里插入图片描述SuperMap提供的瓦片类型包括栅格瓦片和矢量瓦片。

栅格瓦片:

栅格瓦片是一种比较传统的模式,其本质上是将空间数据(栅格数据和矢量数据)分别渲染为不同缩放级别的地图图片,然后将各个级别的图片按照一定规则切分,一定的 “规则”存储到硬盘或数据库中,构成一幅完整的地图。栅格瓦片通常以PNG、JPEG、Webp等图像格式存储。
在这里插入图片描述

特点:

  • 兼容性强:几乎所有的设备和浏览器都能够显示图片,因此兼容性很好。
  • 渲染效率高:瓦片是预先渲染好的,客户端不需要进行复杂的渲染计算,加载速度快。
  • 样式固定:样式在瓦片生成时已经确定,后续无法更改。
  • 数据量较大:相比矢量瓦片,栅格瓦片因为是图片,所以数据量通常更大,尤其在高分辨率或大范围地图的情况下。

矢量瓦片:

以图片为介质的栅格瓦片打开了互联网地图的大门,互联网地图得以迅速普及。但是,随着地图的移动化和应用的逐渐深入,栅格瓦片体积大、生成效率低等缺点愈加明显,已经无法满足应用需求,矢量瓦片应运而生。矢量瓦片是将地图中的矢量图层以瓦片的形式进行切分和存储。
矢量瓦片在存储时,其相对于栅格瓦片体积小,生成效率高,适用于地图中时效性要求较高的地物要素的表达,如POI信息、路线信息等。如在天地图中,POI图层采用矢量瓦片技术,满足数据的实时更新需求。同时,可以实现地图离线,大幅提升了移动端地图的浏览性能,提高了工作的可能性和有效性。
另外,矢量瓦片支持样式修改,不再需要为不同的样式而反复进行制图、渲染、切图、更新服务等过程。如在国土等行业涉及海量数据的应用中,当地图样式发生变化时,矢量瓦片可以直接更改样式,省时省力。

特点:

  • 样式灵活:矢量瓦片的样式在客户端动态应用,可以根据需求调整颜色、线宽、透明度等,甚至可以实现动态地图。
  • 数据量小:MVT格式高效压缩了矢量数据,使得瓦片体积小,易于快速传输。
  • 可交互性强:客户端可以解析矢量瓦片中的几何和属性信息,实现点击、高亮、提示框等交互功能。
  • 客户端渲染:矢量瓦片需要客户端进行渲染,这对客户端的性能有一定要求,但随着现代浏览器和硬件的发展,这通常不是问题。

选择哪种瓦片格式主要取决于应用场景和需求。如果需要高度可定制的地图样式和丰富的用户交互,则MVT矢量瓦片是更好的选择。如果优先考虑兼容性和简化客户端负担,或者没有动态样式和交互的需求,则栅格瓦片可能更加合适。

二、SuperMap iObjects Java从零开始生成地图栅格瓦片

经常有客户会有后台自动化切图的需求,该示例主要是通过一张tif影像从创建工作空间、创建数据源、创建镶嵌数据集,然后进行切图处理,后续也可以通过Java代码通过POST请求发iServer地图服务。

2.1 数据准备

2.1.1 创建工作空间

        //实例化一个WorkspaceWorkspace workspace = new Workspace();//实例化一个工作空间连接参数WorkspaceConnectionInfo workspaceConnectionInfo = new WorkspaceConnectionInfo();//设置工作空间类型workspaceConnectionInfo.setType(WorkspaceType.SMWU);String workspaceName = "t"+System.currentTimeMillis();//设置工作空间名称workspaceConnectionInfo.setName(workspaceName);String workspacePath = workspaceDir.concat(File.separator).concat(workspaceName);//设置工作空间路径workspaceConnectionInfo.setServer(workspacePath);boolean flag = workspace.saveAs(workspaceConnectionInfo);if (flag) {workspace.save();System.out.println("新建工作空间成功!"+ workspace.getConnectionInfo().getServer());} else {System.out.println("新建工作空间失败!"+ workspace.getConnectionInfo().getServer());}

2.1.2 创建数据源

        WorkspaceConnectionInfo wInfo = workspace.getConnectionInfo();String workspaceDir = new File(wInfo.getServer()).getParent();String workspaceName = wInfo.getName();String udbPath = workspaceDir.concat(File.separator).concat(workspaceName);//实例化数据源连接参数DatasourceConnectionInfo dInfo = new DatasourceConnectionInfo();//设置数据源类型dInfo.setEngineType(EngineType.UDBX);//设置数据源文件路径dInfo.setServer(udbPath);String udbName = "u"+System.currentTimeMillis();//设置数据源别名,别名在一个工作空间中是唯一的dInfo.setAlias(udbName);Datasource datasource = workspace.getDatasources().create(dInfo);if (datasource.isOpened()) {System.out.println("datasource.isReadOnly() = " + datasource.isReadOnly());} else {System.out.println("新建Udbx数据源失败!");}

2.1.3 创建镶嵌数据集

        Datasets datasets = datasource.getDatasets();PrjCoordSys prjCoordSys = new PrjCoordSys();prjCoordSys.fromEPSGCode(4326);//获取一个可用的数据集名称String datasetName = datasets.getAvailableDatasetName("mosaic", DatasetType.MOSAIC);//创建镶嵌数据集DatasetMosaic datasetMosaic = datasets.createDatasetMosaic(datasetName, prjCoordSys);String files = "D:\\陕西省土壤数据.tif";//添加影像文件datasetMosaic.addFiles(new String[]{files}, null);//构建概视图datasetMosaic.buildOverview("C:\\Users\\admin\\Desktop\\supermap", 512, 512, 3, false, 0.0);//构建统计信息boolean flag = datasetMosaic.buildStatistics();System.out.println("构建镶嵌数据集统计信息=" + flag);

2.1.4 构建地图

        //构建地图对象com.supermap.mapping.Map map = new com.supermap.mapping.Map(workspace);Layers layers = map.getLayers();//将镶嵌数据集添加到地图中LayerMosaicGroup layerMosaicGroup = layers.addMosaicGroup(datasetMosaic, true);//设置边界图层不可见。 //设置轮廓图层不可见。//标注图层不可见for (int i = 0; i < layerMosaicGroup.getCount(); i++) {if (layerMosaicGroup.get(i).getSubLayerType() != LayerType.SUBLAYER_MOSAIC) {layerMosaicGroup.get(i).setVisible(false);}}//设置图层风格LayerSettingImage layerSettingImage = layerMosaicGroup.getMosaicLayer().getLayerSettingImage();PixelFormat pixelFormat = datasetMosaic.getPixelFormat();if (PixelFormat.BIT16 == pixelFormat || PixelFormat.BIT32 == pixelFormat || PixelFormat.BIT64 == pixelFormat ||PixelFormat.DOUBLE == pixelFormat || PixelFormat.SINGLE == pixelFormat ||PixelFormat.UBIT16 == pixelFormat || PixelFormat.UBIT32 == pixelFormat ||PixelFormat.UNKONOWN == pixelFormat) {ImageStretchOption imageStretchOption = new ImageStretchOption();//设置影像拉伸方式imageStretchOption.setStretchType(ImageStretchType.STANDARDDEVIATION);layerSettingImage.setImageStretchOption(imageStretchOption);}map.viewEntire();Maps maps = workspace.getMaps();maps.add("mosaic", map.toXML());//保存地图maps.setMapXML("mosaic", map.toXML());workspace.save();

2.2 创建地图瓦片

        //构建Map对象com.supermap.mapping.Map map = new com.supermap.mapping.Map(workspace);String mapXML = workspace.getMaps().getMapXML(0);map.fromXML(mapXML);//设置缓存名称String cacheName = "CTH" +System.currentTimeMillis();MapCacheBuilder mapCacheBuilder = new MapCacheBuilder();// 栅格瓦片参数设置mapCacheBuilder.setMap(map);mapCacheBuilder.setBounds(map.getBounds());mapCacheBuilder.setIndexBounds(mapCacheBuilder.getGlobalIndexBounds());mapCacheBuilder.setStorageType(StorageType.Compact);mapCacheBuilder.setOutputFolder("F:\\重点客户数据\\");       mapCacheBuilder.setCacheName(cacheName);// 进度条输出(公共)mapCacheBuilder.addSteppedListener(new SteppedListener() {@Overridepublic void stepped(SteppedEvent steppedEvent) {System.out.println(steppedEvent.getTitle() + ":" + steppedEvent.getMessage() + ":" + steppedEvent.getPercent() + "%");}});boolean build = false;mapCacheBuilder.computeOutputScales();mapCacheBuilder.setIgnoreInvalidDrawing(true);mapCacheBuilder.setTileFormat(TileFormat.JPG_PNG);mapCacheBuilder.setTilingMode(MapTilingMode.GLOBAL);HashMap<Double, String> scalesMaps = mapCacheBuilder.getGlobalLevelScales();Integer minScales = 6;Integer maxScales = 8;// 获取比例尺double[] outputScales = getOutputScales(scalesMaps, minScales, maxScales);HashMap<Double, String>  doubleStringHashMap2 = new HashMap<>();doubleStringHashMap2.put(outputScales[0],"6");doubleStringHashMap2.put(outputScales[1],"7");doubleStringHashMap2.put(outputScales[2],"8");mapCacheBuilder.setOutputScales(outputScales);mapCacheBuilder.setOutputScaleCaptions(doubleStringHashMap2);mapCacheBuilder.resumable(false);// 开始切图(栅格瓦片)build = mapCacheBuilder.build();// 公共if (build) {System.out.println("切图成功"+cacheName);System.out.println(System.currentTimeMillis());} else {System.out.println("切图失败");}// 销毁相关资源mapCacheBuilder.dispose();
  private static double[] getOutputScales(HashMap<Double, String> scalesMaps, Integer minScales, Integer maxScales) {int arraylength = maxScales - minScales + 1;double[] outputScales = new double[arraylength];String[] values = new String[arraylength];for (int i = 0; i < values.length; i++) {values[i] = String.valueOf(minScales + i);}for (int i = 0; i < outputScales.length; i++) {outputScales[i] = getMapKey(scalesMaps, values[i]);}return outputScales;}private static Double getMapKey(HashMap<Double, String> maps, String value) {Double key = 0.0;for (Map.Entry<Double, String> entry : maps.entrySet()) {if (entry.getValue().equals(value)) {key = entry.getKey();}}return key;}

结语

以上就是生成地图瓦片的相关操作步骤,后续将会继续分享如何使用SuperMap iObjects Java进行多任务切图,相比单任务切图,多任务切图大大提升了切图效率,敬请期待!

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

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

相关文章

Docker, Docker-compose部署Sonarqube

参考文档 镜像地址: https://hub.docker.com/_/sonarqube/tags Docker部署文档地址 Installing from Docker | SonarQube Docs Docker-compose文档部署地址&#xff1a; Installing from Docker | SonarQube Docs 部署镜像 2.1 docker部署 # 宿主机执行 $. vi /etc/sysctl.conf…

Unity中Batching优化的GPU实例化(4)

文章目录 前言一、构建需要实例化的额外数据二、在顶点着色器&#xff0c;将实例化 ID 从 appdata 存入 v2f 传给片元着色器三、在片断着色器中访问具体的实例化变量三、使用代码修改Shader材质属性&#xff0c;实现GPU实例化后不同对象颜色不同的效果1、在C#测试脚本生成小板凳…

微前端介绍

目录 微前端概念 微前端特性 场景演示 微前端方案 iframe 方案 qiankun 方案 micro-app 方案 EMP 方案 无界微前端 方案 无界方案 成本低 速度快 原生隔离 功能强大 总结 前言&#xff1a;微前端已经是一个非常成熟的领域了&#xff0c;但开发者不管采用哪个现…

Leetcode—290.单词规律【简单】

2023每日刷题&#xff08;五十一&#xff09; Leetcode—290.单词规律 实现代码 class Solution { public:bool wordPattern(string pattern, string s) {unordered_map<char, string> m1;unordered_map<string, char> m2;stringstream stro(s);string tmp;for(a…

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序

应公司需求&#xff0c;在特定情况下需要修改ip 在开发过程中出现的小插曲 1、第一种情况&#xff1a;重复声明 2、第二种情况&#xff1a; 应官方要求&#xff0c;需要跳转的 tabBar 页面的路径&#xff08;需在 pages.json 的 tabBar 字段定义的页面&#xff09;&#xff0…

ArkTS快速入门

一、概述 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开发者可以…

硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134849296 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

C语言搭建项目-学生管理系统(非链表)

、 目录 搭建offer.h文件 搭建offer.c中的main函数 密码登入系统 搭建my_oferr.c中的接口函数 使用帮助菜单接口函数 增加学生信息接口函数 查询学生信息接口函数 删除学生信息接口函数 保存学生信息接口 打开文件fopen 关闭文件fclose 判断是否保存文件fwrite 退出执行文件…

年度工作总结怎么写?掌握这些年终总结万能公式,让你的报告出彩无比!

光阴似箭&#xff0c;日月如梭&#xff0c;时间总是不疾不徐地向前奔去&#xff0c;转眼就来到了2023年的最后一个月&#xff0c;12月一到&#xff0c;上班族和打工人又要开始忙活工作总结的事情~ 工作总结&#xff0c;不仅是一年工作的回顾&#xff0c;更是未来规划的起点。你…

cuda lib 线程安全的要义

1, 概述 cuda lib 线程安全的几个多线程的情景&#xff1a; 单卡多线程&#xff1b; 多卡多线程-每卡单线程&#xff1b; 多卡多线程-每卡多线程&#xff1b; 需要考虑的问题&#xff1a; 每个 cublasHandle_t 只能有一个stream么&#xff1f; 每个cusolverHandle_t 只能有一…

python3.5安装教程及环境配置,python3.7.2安装与配置

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python3.5安装教程及环境配置&#xff0c;python3.7.2安装与配置&#xff0c;现在让我们一起来看看吧&#xff01; python 从爬虫开始&#xff08;一&#xff09; Python 简介 首先简介一下Python和爬虫的关系与概念&am…

Spring Cloud Alibaba实践 --Sentinel

sentinel简介 Sentinel的官方标题是&#xff1a;分布式系统的流量防卫兵。从名字上来看&#xff0c;很容易就能猜到它是用来作服务稳定性保障的。对于服务稳定性保障组件&#xff0c;如果熟悉Spring Cloud的用户&#xff0c;第一反应应该就是Hystrix。但是比较可惜的是Netflix…

三防平板|手持终端PDA|8寸/10寸工业三防平板电脑主板方案定制

近年来&#xff0c;随着科技的快速发展&#xff0c;三防平板成为了各行各业中不可或缺的工具。三防平板采用IP67级别的防护设计&#xff0c;通过了多项测试标准&#xff0c;如国标和美标&#xff0c;具备防水、防摔、防尘、防撞、防震、防跌落以及防盐雾等多重防护功能。因此&a…

JavaScript 简单理解原型和创建实例时 new 操作符的执行操作

function Person(){// 构造函数// 当函数创建&#xff0c;prototype 属性指向一个原型对象时&#xff0c;在默认情况下&#xff0c;// 这个原型对象将会获得一个 constructor 属性&#xff0c;这个属性是一个指针&#xff0c;指向 prototype 所在的函数对象。 } // 为原型对象添…

HarmonyOS应用开发工具DevEco Studio安装与使用

语雀知识库地址&#xff1a;语雀HarmonyOS知识库 飞书知识库地址&#xff1a;飞书HarmonyOS知识库 知识库内容逐步完善中… 工欲善其事必先利其器&#xff0c;要编写HarmonyOS应用就需要用到官方提供的IDE工具来编写相应的代码。 在鸿蒙开发者官网&#xff0c;其提供了官方的开…

高效的多维空间点索引算法——GeoHash

一、Geohash 算法简介 GeoHash是空间索引的一种方式&#xff0c;其基本原理是将地球理解为一个二维平面&#xff0c;通过把二维的空间经纬度数据编码为一个字符串&#xff0c;可以把平面递归分解成更小的子块&#xff0c;每个子块在一定经纬度范围内拥有相同的编码。以GeoHash方…

springboot 极简案例

安装idea File -> New Project 选择依赖 创建controller文件 输入controller类名 输入代码 运行项目 访问 localhost:8080/hello/boot package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.…

数据库对象介绍与实践:视图、函数、存储过程、触发器和物化视图

文章目录 一、视图&#xff08;View&#xff09;1、概念2、基本操作1&#xff09;创建视图2&#xff09;修改视图3&#xff09;删除视图4&#xff09;使用视图 3、使用场景4、实践 二、函数&#xff08;Function&#xff09;1、概念2、基本操作1&#xff09;创建函数2&#xff…

粤能环保亮相迪拜COP28,智能技术铸就运河城市可持续未来

在全球应对气候变化的重要会议——迪拜COP28大会上&#xff0c;运河城市面临的独特环境挑战引起了广泛关注。随着城市化进程的加快&#xff0c;运河城市在处理固体废物、减少温室气体排放以及维持水资源安全方面面临着严峻考验。智能垃圾分类作为应对这些挑战的有效途径&#x…

一些系统日常运维命令和语句

一、前言 记录一些日常系统运维的命令和语句 二、linux命令与语句 1、linux查看各目录使用磁盘情况 du -h /home home为目录 du -h /home 2.查看内存使用情况 free -h 3、查看进程和CPU使用情况 top top 三、数据库语句 1、统计mysql数据库表数量 SELECT COUNT(*) A…