百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Cesium影像纠偏:高德地图加载与坐标系纠偏技巧

bigegpt 2025-01-17 11:02 14 浏览

Cesium中UrlTemplateImageryProvider的扩展

前言

在Cesium中,
UrlTemplateImageryProvider
是一个用于加载网络上的图像服务的类。它可以用来加载WMTS(Web Map Tile Service)或TMS(Tile Map Service)等瓦片服务,也可以用来加载一般的图片URL。

使用UrlTemplateImageryProvider的示例代码

// 创建一个UrlTemplateImageryProvider实例,用于加载在线的地图服务
var provider = new Cesium.UrlTemplateImageryProvider({
    // 图片的URL模板,其中{z},{x},{y}会被相应的瓦片级别、列和行索引替换
    url: 'https://your.tile.service/tiles/{z}/{x}/{y}.png', 
    // 瓦片服务的范围和分辨率设置
    tilingScheme: new Cesium.WebMercatorTilingScheme(),
    // 瓦片服务的最小和最大级别
    minimumLevel: 0,
    maximumLevel: 18,
    // 用于缓存的瓦片名称的前缀
    credit: new Cesium.Credit('Your Tile Service provider '),
    // 用于处理网络请求的可选对象
    proxy: new Cesium.DefaultProxy('/your/proxy/server')
});
// 将创建的provider添加到Cesium的Viewer中
viewer.imagery.addImageryProvider(provider);

在这个例子中,我们创建了一个
UrlTemplateImageryProvider
的实例,并指定了用于获取瓦片的URL模板。tilingScheme属性定义了瓦片方案,minimumLevelmaximumLevel定义了瓦片的最小和最大级别。credit属性用于表示提供数据的组织或个人。如果服务器需要跨域访问,则可以使用proxy属性来设置代理服务器。

最后,我们将这个提供者添加到Cesium的Viewer中,这样就可以在Cesium的三维地图中看到我们加载的在线地图服务了。

高德地图

前文了解到,
UrlTemplateImageryProvider
通过制定url的format模板,方便用户实现自己的Provider,比如国内的高德,百度,腾讯等影像服务,url都是一个固定的规范。例如引入高德地图的代码如下:

var provider = new Cesium.UrlTemplateImageryProvider({
    url: 'https://webst02.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',
    tilingScheme: new Cesium.WebMercatorTilingScheme(),
    minimumLevel: 4,
    maximumLevel: 18,
});
viewer.imagery.addImageryProvider(provider);

但是高德地图采用中国国家测绘局制订的地理信息系统的坐标系GCJ02,即火星坐标系,它是在WGS84坐标系的基础上进行一次加密。因此Cesium在加载高德地图服务底图时,会存在偏差和纠偏的问题。

WebMercatorTilingScheme类,是Cesium自带的EPSG:3857切片方案,因为高德的加密偏移问题,需要基于该类进行扩展,自定义高德纠偏切片方案。

import CoordTransform from '@src/assets/calculate/CoordTransform'

class AmapMercatorTilingScheme extends Cesium.WebMercatorTilingScheme {
    constructor(options) {
        super(options)
        let projection = new Cesium.WebMercatorProjection()
        this._projection.project = function(cartographic, result) {
            result = CoordTransform.WGS84ToGCJ02(
                Cesium.Math.toDegrees(cartographic.longitude),
                Cesium.Math.toDegrees(cartographic.latitude)
            )
            result = projection.project(
                new Cesium.Cartographic(
                    Cesium.Math.toRadians(result[0]),
                    Cesium.Math.toRadians(result[1])
                )
            )
            return new Cesium.Cartesian2(result.x, result.y)
        }
        this._projection.unproject = function(cartesian, result) {
            let cartographic = projection.unproject(cartesian)
            result = CoordTransform.GCJ02ToWGS84(
                Cesium.Math.toDegrees(cartographic.longitude),
                Cesium.Math.toDegrees(cartographic.latitude)
            )
            return new Cesium.Cartographic(
                Cesium.Math.toRadians(result[0]),
                Cesium.Math.toRadians(result[1])
            )
        }
    }
}

export default AmapMercatorTilingScheme

其中CoordTransform类是WGS84与GCJ02的互相转换计算类,此方法原理不再解释,网上都有文章解释。

至此,将扩展类AmapMercatorTilingScheme引用到tilingScheme属性中,就可实现高德地图加载过程中的自动纠偏。

自定义影像

根据上文的高德地图的纠偏方式,可以举一反三出,当我们自己部署局部影像地图时,若出现了偏差,都可以在WebMercatorTilingScheme类的扩展下,手动设置纠偏的坐标计算函数,再赋予给tilingScheme属性。

import CoordTransform from '@src/assets/calculate/CoordTransform'

class CustomMercatorTilingScheme extends Cesium.WebMercatorTilingScheme {
    constructor(options) {
        super(options)
        let projection = new Cesium.WebMercatorProjection()
        this._projection.project = function(cartographic, result) {
            // LinearTransform为自定义的线性纠偏坐标的函数
            result = CoordTransform.linearTransform(
                Cesium.Math.toDegrees(cartographic.longitude),
                Cesium.Math.toDegrees(cartographic.latitude),
                options.fromPoint,
                options.toPoint
            )
            result = projection.project(
                new Cesium.Cartographic(
                    Cesium.Math.toRadians(result[0]),
                    Cesium.Math.toRadians(result[1])
                )
            )
            return new Cesium.Cartesian2(result.x, result.y)
        }
        this._projection.unproject = function(cartesian, result) {
            let cartographic = projection.unproject(cartesian)
            // LinearTransform为自定义的反线性纠偏坐标的函数
            result = CoordTransform.linearTransformReverse(
                Cesium.Math.toDegrees(cartographic.longitude),
                Cesium.Math.toDegrees(cartographic.latitude),
                options.fromPoint,
                options.toPoint
            )
            return new Cesium.Cartographic(
                Cesium.Math.toRadians(result[0]),
                Cesium.Math.toRadians(result[1])
            )
        }
    }
}

export default CustomMercatorTilingScheme

WebMercatorTilingScheme的扩展类赋予给tilingScheme属性,代码如下:

import CustomMercatorTilingScheme from './CustomMercatorTilingScheme'

class CustomImageryProvider extends Cesium.UrlTemplateImageryProvider {
    constructor(options = {}) {
        if (options.schemeOptions) {
            options['tilingScheme'] = new CustomMercatorTilingScheme(options.schemeOptions)
        }
        super(options)
    }
}
export default CustomImageryProvider

// 最后,在Viewer中创建一个实例Provider对象并添加。
const imageryProvider = new Cesium.CustomImageryProvider({
    url: mapUrl,
    minimumLevel: minLevel,
    maximumLevel: maxLevel,
    schemeOptions: {
        toPoint: { lng: 108.17547739, lat: 22.60060366 },
        fromPoint: { lng: 108.17554578, lat: 22.60056109 }
    }
});
let layer = viewer.imageryLayers.addImageryProvider(imageryProvider);

结果示例

纠偏前

纠偏后

– 欢迎点赞、关注、转发、收藏【我码玄黄】,各大平台同名。

相关推荐

10w qps缓存数据库——Redis(redis缓存调优)

一、Redis数据库介绍:Redis:非关系型缓存数据库nosql:非关系型数据库没有表,没有表与表之间的关系,更不存在外键存储数据的形式为key:values的形式c语言写的服务(监听端口),用来存...

Redis系列专题4--Redis配置参数详解

本文基于windowsX64,3.2.100版本讲解,不同版本默认配置参数不同在Redis中,Redis的根目录中有一个配置文件(redis.conf,windows下为redis.windows....

开源一夏 | 23 张图,4500 字从入门到精通解释 Redis

redis是目前出场率最高的NoSQL数据库,同时也是一个开源的数据结构存储系统,在缓存、数据库、消息处理等场景使用的非常多,本文瑞哥就带着大家用一篇文章入门这个强大的开源数据库——Redis。...

redis的简单与集群搭建(redis建立集群)

Redis是什么?是开源免费用c语言编写的单线程高性能的(key-value形式)内存数据库,基于内存运行并支持持久化的nosql数据库作用主要用来做缓存,单不仅仅是做缓存,比如:redis的计数器生...

推荐几个好用Redis图形化客户端工具

RedisPlushttps://gitee.com/MaxBill/RedisPlusRedisPlus是为Redis可视化管理开发的一款开源免费的桌面客户端软件,支持Windows、Linux...

关于Redis在windows上运行及fork函数问题

Redis在将数据库进行持久化操作时,需要fork一个进程,但是windows并不支持fork,导致在持久化操作期间,Redis必须阻塞所有的客户端直至持久化操作完成。微软的一些工程师花费时间在解决在...

你必须懂的Redis十大应用场景(redis常见应用场景)

Redis作为一款高性能的键值存储数据库,在互联网业务中有着广泛的应用。今天,我们就来详细盘点一下Redis的十大常用业务场景,并附上Golang的示例代码和简图,帮助大家更好地理解和应用Redis。...

极简Redis配置(redis的配置)

一、概述Redis的配置文件位于Redis安装目录下,文件名为redis.conf(Windows名为redis.windows.conf,linux下的是redis.conf)你可以通过C...

什么是redis,怎么启动及如何压测

从今天起咱们一起来学习一下关于“redis监控与调优”的内容。一、Redis介绍Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。...

一款全新Redis UI可视化管理工具,支持WebUI和桌面——P3X Redis UI

介绍P3XRedisUI这是一个非常实用的RedisGUI,提供响应式WebUI访问或作为桌面应用程序使用,桌面端是跨平台的,而且完美支持中文界面。Githubhttps://github....

windows系统的服务器快速部署java项目环境地址

1、mysql:https://dev.mysql.com/downloads/mysql/(msi安装包)2、redis:https://github.com/tporadowski/redis/r...

window11 下 redis 下载与安装(windows安装redis客户端)

#热爱编程是一种怎样的体验#window11下redis下载与安装1)各个版本redis下载(windows)https://github.com/MicrosoftArchive/r...

一款轻量级的Redis客户端工具,贼好用!

使用命令行来操作Redis是一件非常麻烦的事情,我们一般会选用客户端工具来操作Redis。今天给大家分享一款好用的Redis客户端工具TinyRDM,它的界面清新又优雅,希望对大家有所帮助!简介Ti...

一个.NET开发且功能强大的Windows远程控制系统

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍SiMayRemoteMonitorOS是一个基于Windows的远程控制系统,完...

Redis客户端工具详解(4款主流工具)

大家好,我是mikechen。Redis是大型架构的基石,也是大厂最爱考察内容,今天就给大家重点详解4款Redis工具@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集...