ArcGIS 不支持吉林一号在线地图服务,有两种方面的原因 🤔
第一,ArcGIS 桌面软件不支持webp图片格式的加载显示,刚好吉林一号瓦片格式就是webp;
第二,ArcGIS 桌面软件不支持瓦片原点坐标为左下角的瓦片地图服务。
#
1-问题描述
#
1.1-ArcGIS不支持webp瓦片
ESRI的产品定义跟苹果刀法精准,现在原生支持webp瓦片已经在ArcGIS Pro的功能建议清单中了。今年8月份,已经是【In Product Plan】状态了,说明已经着手编写代码了,该功能建议由
[xingchenc]
提出。
(https://community.esri.com/t5/user/viewprofilepage/user-id/567991)
Add WMTS (Webp format tile) support for ArcGIS Pro
⇲https://community.esri.com/t5/arcgis-pro-ideas/add-wmts-webp-format-tile-support-for-arcgis-pro/idi-p/1306431
ArcGIS Pro Labels (功能建议状态说明)
⇲https://community.esri.com/t5/arcgis-pro-documents/arcgis-pro-labels/ta-p/1000519
#
1.2-ArcGIS不支持瓦片Y轴翻转
吉林一号在线地图服务的原点坐标不是标准的左上角(谷歌标准),而是左下角(TMS标准),这导致了Y轴方向的瓦片索引需要翻转;对于QGIS软件,可以采用-y的方式解决、奥维地图则用y!的地址格式。
谷歌XYZ:Z表示缩放层级,Z=zoom;XY的原点在左上角,X从左向右,Y从上向下。
TMS:开源产品的标准,Z的定义与谷歌相同;XY的原点在左下角,X从左向右,Y从下向上。
🧐引用自瓦片(Tile)行列号计算方法
⇲https://xcsf.github.io/blog/2020/06/12/%E7%93%A6%E7%89%87Tile%E8%A1%8C%E5%88%97%E5%8F%B7%E8%AE%A1%E7%AE%97%E6%96%B9%E6%B3%95/
#
2-解决思路
#
2.1-webp转png
编写webp图片格式的动态转换程序,实现不同图片格式的动态转换中间代理,将.webp实时转换成jpg/png可以解决ArcGIS桌面软件不兼容的问题。采用api接口的形式,瓦片地图链接改成https://webp2jgg.cc/api?url=https://api.jl1mall.com/getMap/{z}/{x}/{y}。
这样请求的顺序是先下载对应的瓦片,接着由本地程序转换图片格式,返回ArcGIS适配的瓦片格式如PNG。
#
2.2-瓦片Y轴翻转
标准的XYZ瓦片地图服务采用左上角为原点(0,0)的谷歌标准,吉林一号则是从左下角开始索引编号的,这意味着X轴没有改变,只是将Y轴翻转了;那么我们请求吉林一号的z=1,x=0,y=0的时候,应该下载翻转之后的索引编号,设ymax的最大值是2^1 - 1=1,此时请求的y=0,那么翻转的-y=ymax - y=1;此时我们编写一段程序代码将请求改成z=1,x=0,y=1,即可解决瓦片Y轴翻转的问题了。
🌏设谷歌瓦片索引为XYZ,TMS瓦片索引为X-YZ,其中有
·>>> -Y = 2^Z - 1 - Y
#
3-实现步骤
#
3.1-开发环境
+ NVM
nvm 允许您通过命令行快速安装和使用不同版本的 node。
⇲https://nvm.p6p.net/download.html
查看安装版本
nvm -v
下载最新稳定版本的nodejs
nvm install lts
nvm use lts
如果上述命令行执行报错,试着切换至国内镜像
nvm npm_mirror https://npmmirror.com/mirrors/npm/
nvm node_mirror https://npmmirror.com/mirrors/node/
查看安装版本
node -v
#
3.2-程序编写
+ NPM
npm 是nodejs的插件管理程序,首先 npm install 项目引用的插件集,新建空文件夹用于存放项目文件,安装项目所需要的库。
npm install express sharp axios
其中 sharp是图片格式转换的插件、axios是提供api接口的插件。
npm init
最后,新建JavaScript文件,命名为 server.js
我们编写程序有1个流程、4个步骤,首先解决程序的输入形式,ArcGIS 请求XYZ瓦片地图时,会发送 xyz 三个数值参数到服务器中,那么输入的参数就是 z, x, y了;
const { z, x, y } = req.params;
接着,我们需要对瓦片Y轴翻转,即 -y = ymax -y, yamx = 2^z -1
const yInverted = (Math.pow(2, z) - 1) - y;
然后,对获取的瓦片进行图片格式转换,使用 sharp 将 WebP 图像转换为 PNG