添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

作者:Neshoir

​ 众所周知超图的iObjects Java组件是面向GIS应用系统开发者的组件式GIS开发平台,具有强大的地理数据管理、编辑、地图显示、分析等功能,适宜快速开发大型GIS应用系统。超图的iDesktop X、iServer产品里的核心GIS功能也都是基于组件SDK开发实现。本文将重点介绍如何基于iObjects Java组件,以XYZ瓦片标准把工作空间里的地图生成瓦片,发布实时动态地图服务,前端openlayer或mapbox均可对接该地图服务进行地图显示。

一. 技术要点

​ 基于iObjects Java组件开发,采用SpringBoot实现动态地图服务。

  • XYZ标准
  • 地图生成对瓦片
  • WebP
  • 异步多线程
二. 实现步骤
1. 根据XYZ标准生成瓦片范围

​ XYZ标准是金字塔模型,前端根据层级、行列号请求瓦片,其参考坐标系是像素坐标系。故而需要根据层级和行列号换算出瓦片对应的地图坐标系范围。我们以3857坐标系和4326坐标系说明:

  • 3857坐标系对应瓦片范围

        public static Geometry xyz2prj3857(int z, int x, int y) {
            double n = Math.pow(2, z);
            double lon_min = (x / n) * 40075016.0 - 20037508.0;
            double lat_min = 20037508.0 - (((y + 1) / n) * 40075016.0);
            double lon_max = ((x + 1) / n) * 40075016.0 - 20037508.0;
            double lat_max = 20037508.0 - ((y / n) * 40075016.0);
            Rectangle2D rectangle2D = new Rectangle2D(lon_min, lat_min, lon_max, lat_max);
            GeoRectangle rectangle = new GeoRectangle(rectangle2D, 0.0);
            return rectangle;
    
  • 4326坐标系对应瓦片范围

        public static Geometry xyz2prj4326(int z, int x, int y) {
            double n = Math.pow(2, z);
            double lon_min = (x / n) * 360.0 - 180.0;
            double lat_min = 90.0 - (((y + 1) / n) * 360.0);
            double lon_max = ((x + 1) / n) * 360.0 - 180.0;
            double lat_max = 90.0 - ((y / n) * 360.0);
            Rectangle2D rectangle2D = new Rectangle2D(lon_min, lat_min, lon_max, lat_max);
            GeoRectangle rectangle = new GeoRectangle(rectangle2D, 0.0);
            return rectangle;
    

    需要注意:由于瓦片尺寸是正方形,对于3857坐标系的全球范围就是一个正方形,所以计算瓦片范围很方便。但对于4326坐标系的全球范围是一个长方形,所以需要拉伸Y轴,将其变为正方形,方可计算出正确的瓦片范围,故而纬度范围就变为-270到90。

2. 地图生成瓦片对象