cesium加载高德、百度、腾讯地图

本文展示了如何使用Cesium.js集成天地图、高德、百度、腾讯等不同地图源,并详细解释了BaiduImageryProvider的实现,包括创建地球视图、设置地形和加载影像层的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

$(function () {
    var basemapo = {
        "天地图影像": {
            url: "http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=313cd4b28ed520472e8b43de00b2de56",
            layers:
            [{
                url: "https://rt3.map.gtimg.com/tile?z={z}&x={x}&y={reverseY}&styleid=3&scene=0"
            }]
        },
        "高德影像": {
            url: "http://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}"
        },
        "高德电子": {
            url: "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}"
        },
        "高德注记": {
            url: "http://webst02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8"
        },
        "百度影像": {
            url: "https://ss1.bdstatic.com/8bo_dTSlR1gBo1vgoIiO_jowehsv/tile/?qt=vtile&x={x}&y={y}&z={z}&styles=pl&udt=20180810&scaler=1&showtext=1"
        },
        "百度电子": {
            url: "https://maponline1.bdimg.com/tile/?qt=vtile&x={x}&y={y}&z={z}&styles=pl&scaler=2&udt=&from=jsapi2_0"
        },
        "百度黑色": {
            url: "http://api{s}.map.bdimg.com/customimage/tile?&x={x}&y={y}&z={z}&scale=1&customid=dark"
        },
        "灰色底图": {
            url: "https://api.mapbox.com/styles/v1/marsgis/cki0a92b123qo1aluk0e5v7sb/tiles/512/{z}/{x}/{y}@2x"
        },
        "百度深蓝色":{
            url: "http://api{s}.map.bdimg.com/customimage/tile?&x={x}&y={y}&z={z}&scale=1&customid=midnight"
        },
        "腾讯影像": {
            url: "https://p2.map.gtimg.com/sateTiles/{z}/{sx}/{sy}/{x}_{reverseY}.jpg?version=244",
        },
        "腾讯电子": {
            url: "https://rt3.map.gtimg.com/tile?z={z}&x={x}&y={reverseY}&styleid=1&version=297"
        },
        "腾讯注记": {
            url: "https://rt3.map.gtimg.com/tile?z={z}&x={x}&y={reverseY}&styleid=2&version=297"
        },
        "腾讯黑色": {
            url: "https://rt3.map.gtimg.com/tile?z={z}&x={x}&y={reverseY}&styleid=4&scene=0"
        },
        "腾讯电子2": {
            url: "https://rt3.map.gtimg.com/tile?z={z}&x={x}&y={reverseY}&styleid=3&scene=0"
        }
    };
    var viewers = []; // 地球视图数组
    Cesium.Ion.defaultAccessToken =
        "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIzMjg1ZGI2NS04MGQ1LTRjYjAtOGRjYi1mYzc3YTQ4MDZiNWMiLCJpZCI6MzYxMzQsImlhdCI6MTYxMjU2ODIyM30.E22DhsNFi4_L2rKXvlX3DCtVBGnLURH_6PBYWrcd95k";
    var jqBox = $("#box");
    for (var k in basemapo) {
        var htmls = [];
        htmls.push("<div style='position:relative;width:50%;height:400px'>");
        htmls.push("<div class='cesiumContainer' style='width:100%;height:400px'></div>");
        htmls.push("<span style='position:absolute; left:0; top: 0;color:white;background: black;'>" + k + "<span>");
        htmls.push("</div>");
        jqBox.append(htmls.join(""))
    }
    var cesiumContainers = $(".cesiumContainer", jqBox);

    Cesium.BaiduImageryProvider = function(options) {
        this._errorEvent = new Cesium.Event();
        this._tileWidth = 256;
        this._tileHeight = 256;
        this._maximumLevel = 18;
        this._minimumLevel = 1;
        let southwestInMeters = new Cesium.Cartesian2(-33554054, -33746824);
        let northeastInMeters = new Cesium.Cartesian2(33554054, 33746824);
        this._tilingScheme = new Cesium.WebMercatorTilingScheme({
            rectangleSouthwestInMeters: southwestInMeters,
            rectangleNortheastInMeters: northeastInMeters
        });
        this._rectangle = this._tilingScheme.rectangle;
        this._resource = Cesium.Resource.createIfNeeded(options.url);
        this._tileDiscardPolicy = undefined;
        this._credit = undefined;
        this._readyPromise = undefined;
    };
     
    Object.defineProperties(Cesium.BaiduImageryProvider.prototype, {
        url: {
            get: function () {
                return this._resource.url;
            }
        },
        proxy: {
            get: function () {
                return this._resource.proxy;
            }
        },
        tileWidth: {
            get: function () {
                if (!this.ready) {
                    throw new Cesium.DeveloperError('tileWidth must not be called before the imagery provider is ready.');
                }
                return this._tileWidth;
            }
        },
     
        tileHeight: {
            get: function () {
                if (!this.ready) {
                    throw new Cesium.DeveloperError('tileHeight must not be called before the imagery provider is ready.');
                }
                return this._tileHeight;
            }
        },
     
        maximumLevel: {
            get: function () {
                if (!this.ready) {
                    throw new Cesium.DeveloperError('maximumLevel must not be called before the imagery provider is ready.');
                }
                return this._maximumLevel;
            }
        },
     
        minimumLevel: {
            get: function () {
                if (!this.ready) {
                    throw new Cesium.DeveloperError('minimumLevel must not be called before the imagery provider is ready.');
                }
                return this._minimumLevel;
            }
        },
     
        tilingScheme: {
            get: function () {
                if (!this.ready) {
                    throw new Cesium.DeveloperError('tilingScheme must not be called before the imagery provider is ready.');
                }
                return this._tilingScheme;
            }
        },
     
        tileDiscardPolicy: {
            get: function () {
                if (!this.ready) {
                    throw new Cesium.DeveloperError('tileDiscardPolicy must not be called before the imagery provider is ready.');
                }
                return this._tileDiscardPolicy;
            }
        },
     
        rectangle: {
            get: function () {
                if (!this.ready) {
                    throw new Cesium.DeveloperError('rectangle must not be called before the imagery provider is ready.');
                }
                return this._rectangle;
            }
        },
     
        errorEvent: {
            get: function () {
                return this._errorEvent;
            }
        },
        ready: {
            get: function () {
                return this._resource;
            }
        },
        readyPromise: {
            get: function () {
                return this._readyPromise;
            }
        },
        credit: {
            get: function () {
                if (!this.ready) {
                    throw new Cesium.DeveloperError('credit must not be called before the imagery provider is ready.');
                }
                return this._credit;
            }
        },
    });
     
    Cesium.BaiduImageryProvider.prototype.requestImage = function (x, y, level, request) {
        let xTileCount = this._tilingScheme.getNumberOfXTilesAtLevel(level);
        let yTileCount = this._tilingScheme.getNumberOfYTilesAtLevel(level);
        let url = this.url
            .replace("{x}", x - xTileCount / 2)
            .replace("{y}", yTileCount / 2 - y - 1)
            .replace("{z}", level)
            .replace("{s}", Math.floor(10 * Math.random()));
        console.log("zxy:" + level + ", " + x + ", " + y + "; " + url);
        return Cesium.ImageryProvider.loadImage(this, url);
    };
    // 绘制地球
    var idx = 0;
    for (var k in basemapo) {
        var viewer = new Cesium.Viewer(cesiumContainers[idx++], // **创建地球视图
            { // **设置地形
                // terrainProvider: Cesium.createWorldTerrain(),
                geocoder: false,
                homeButton: false,
                sceneModePicker: false,
                baseLayerPicker: false,
                navigationHelpButton: false,
                animation: false,
                timeline: false,
                fullscreenButton: false,
                vrButton: false,
                infoBox: false,
                selectionIndicator: false
            });
        viewer.cesiumWidget.creditContainer.style.display = "none"; // 取消商标
        viewer.imageryLayers.get(0).show = false;
        if( k== "百度电子"|| k== "百度影像"|| k== "百度黑色"|| k== "百度深蓝色")
            viewer.imageryLayers.addImageryProvider(new Cesium.BaiduImageryProvider({
                url: basemapo[k].url
        }));
        if (k == "腾讯电子" || k == "腾讯影像") {
            var map= viewer.imageryLayers.addImageryProvider(new Cesium.UrlTemplateImageryProvider({
                url:
                    basemapo[k].url,
                customTags: {
                    sx: function (imageryProvider, x, y, level) {
                        return x >> 4
                    },
                    sy: function (imageryProvider, x, y, level) {
                        return ((1 << level) - y) >> 4
                    }
                }
            }));        }
        else if( k== "天地图影像")
        {
            viewer.imageryLayers.addImageryProvider(new Cesium.WebMapTileServiceImageryProvider({   
            //影像注记
            url: "http://t0.tianditu.com/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg&tk=token值",
            // layer: "tdtCiaLayer",
            // style: "default",
            // format: "image/jpeg",
            // tileMatrixSetID: "GoogleMapsCompatible",
            // show: true
          }));
          viewer.imageryLayers.addImageryProvider(new Cesium.WebMapTileServiceImageryProvider({   
          //影像注记
          url: "http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=token值",
          // layer: "tdtCiaLayer",
          // style: "default",
          // format: "image/jpeg",
          // tileMatrixSetID: "GoogleMapsCompatible",
          // show: true
        }));
        }
        else
        loadImageLayer( basemapo[ k].url);

        if (basemapo[k].layers) {
            for( var i= 0; i< basemapo[k].layers.length; i++)
                loadImageLayer( basemapo[ k].layers[ i].url)
        }

        // 飞入
        viewer.camera.flyTo(
            {
                destination: Cesium.Cartesian3.fromDegrees(120.875746, 31.567942, 1091.471),
            });

        // 函数:加载影像
        function loadImageLayer( url)
        {
            viewer.imageryLayers.addImageryProvider(new Cesium.UrlTemplateImageryProvider({
                url: url
            }));
        }
    }
})

<think>首先,用户的问题是关于在Cesium加载高德影像图层的方法。用户说:“我想在Cesium加载高德影像图层 请问Cesium 加载 高德地图 影像图层 方法”。所以,我需要提供如何在Cesium加载高德地图的影像图层的指导。 从系统级指令中,我有一些引用:[^1], [^2], [^3]。这些引用是关于Cesium加载影像图层的,特别是高德地图。我应该参考这些引用,并在回答中自然地添加引用标识。 引用[^1] 讨论了Cesium中的ImageryLayer、ImageryProvider和ImageryLayerCollection类,并提到加载各种地图服务,包括高德地图。 引用[^2] 是关于cesium加载高德地图的多种形式,提供了URLTemplateImageryProvider的链接。 引用[^3] 给出了一个具体的URL模板用于加载高德地图:`http://webrd02.is.autonavi.com/appmaptilelang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}`。 所以,核心方法是使用Cesium的UrlTemplateImageryProvider来加载高德影像图层。 现在,构建回答结构: 1. **介绍**:简要说明Cesium加载影像图层的基本原理。 2. **步骤**:提供加载高德影像图层的具体步骤和代码示例。 3. **代码示例**:使用JavaScript或TypeScript代码展示如何实现。 4. **注意事项**:提到可能的注意事项,如URL格式、坐标系等。 5. **相关问题**:根据指令,生成相关问题。指令说:“生成相关问题”,所以我需要在回答末尾添加相关问题。 回答结构要清晰,帮助用户逐步解决问题。使用中文回答。 确保数学表达式使用正确格式,但在这个上下文中,可能没有太多数学内容。如果有变量或方程,用$...$格式。 最后,添加引用标识在引用的段落末尾。 步骤: - 解释UrlTemplateImageryProvider。 - 提供高德影像图层的URL模板。 - 展示代码示例。 - 添加相关问题。 相关问题示例:基于主题,生成如“如何加载其他地图服务?”或“高德地图的坐标系是什么?”等。 相关问题: 1. Cesium中如何加载腾讯地图影像图层? 2. 加载高德地图时需要注意哪些坐标系问题? 3. Cesium支持哪些其他地图服务提供商? 类似这样。 现在,草拟回答: --- # Cesium加载高德影像图层的方法 在Cesium中,加载影像图层主要使用`ImageryProvider`类及其子类。对于高德地图,我们可以使用`UrlTemplateImageryProvider`来加载影像图层,因为它支持通过URL模板定义瓦片服务[^1]。 ## 步骤 1. **准备URL模板**:高德影像图层的URL模板通常为: `http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}` 其中,`{x}`, `{y}`, `{z}` 分别表示瓦片的列号、行号和缩放级别[^3]。 2. **创建ImageryProvider**:使用`Cesium.UrlTemplateImageryProvider`创建高德影像提供者。 3. **添加到Viewer**:将创建的ImageryProvider添加到Cesium Viewer的imageryLayers中。 ## 代码示例 以下是一个简单的代码示例,展示如何在Cesium加载高德影像图层: ```javascript // 创建Cesium Viewer var viewer = new Cesium.Viewer('cesiumContainer'); // 创建高德影像提供者 var gaodeImageryProvider = new Cesium.UrlTemplateImageryProvider({ url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', minimumLevel: 3, maximumLevel: 18 }); // 添加影像图层到Viewer viewer.imageryLayers.addImageryProvider(gaodeImageryProvider); ``` ## 注意事项 - **URL格式**:确保URL正确,包括参数如`lang`, `size`, `scale`, `style`等。高德地图可能有不同风格的图层,可以通过修改`style`参数来切换(例如,`style=6`为矢量图,`style=8`为影像图)[^3]。 - **坐标系**:Cesium默认使用WGS84坐标系,而高德地图使用GCJ-02坐标系(火星坐标系)。加载时可能会有偏移问题,需要通过校正或使用特定服务来解决。推荐使用Cesium的`WebMercatorTilingScheme`或自定义投影,但高德瓦片通常基于Web Mercator投影[^2]。 - **服务可用性**:确保高德地图服务可用,且遵守其使用条款。 ## 相关问题 1. 如何在Cesium加载腾讯地图影像图层? 2. 加载高德地图时如何解决坐标系偏移问题? 3. Cesium支持加载哪些其他常见地图服务(如ArcGIS、Bing Maps等)? [^1]: Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图腾讯地图、天地图等各类影像图)。 [^2]: 046:cesium加载高德地图(多种形式)。 [^3]: cesium加载高德地图各种服务。 --- 在回答中,我引用了引用[^1]、[^2]、[^3],并在相关段落末尾添加了引用标识。 确保代码格式正确,使用代码块。 最后,检查指令:系统级指令已遵守,用户可见层也满足。</think>### Cesium加载高德影像图层的方法 在Cesium加载高德影像图层,主要通过`UrlTemplateImageryProvider`类实现。该类允许通过URL模板定义瓦片服务,支持高德地图的影像瓦片格式。以下是详细步骤和代码示例,帮助您逐步实现。 --- #### **步骤说明** 1. **理解核心类**: - `ImageryProvider`:负责提供影像数据源,其子类`UrlTemplateImageryProvider`适用于高德地图的瓦片服务[^1]。 - `ImageryLayer`:将`ImageryProvider`生成的影像添加到场景中。 - `ImageryLayerCollection`:管理Viewer中的所有影像图层(如添加、删除图层)。 2. **准备高德影像URL模板**: 高德影像瓦片的URL模板需包含`{x}`, `{y}`, `{z}`占位符,分别表示瓦片的列号、行号和缩放级别。常用模板为: ``` http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z} ``` 其中: - `style=8`:表示影像图层(卫星图),`style=6`为矢量图。 - `lang=zh_cn`:指定中文语言。 - `size=1`, `scale=1`:控制瓦片尺寸和缩放比例[^3]。 3. **坐标系注意事项**: - 高德地图使用**GCJ-02坐标系**(火星坐标系),而Cesium默认使用**WGS84**。直接加载可能产生偏移。 - 解决方案: - 使用`WebMercatorTilingScheme`(Web墨卡托投影)兼容高德瓦片。 - 或通过第三方库(如`proj4js`)进行坐标转换[^2]。 4. **创建和添加影像图层**: 使用`UrlTemplateImageryProvider`定义高德服务,再通过`viewer.imageryLayers.addImageryProvider()`添加到场景。 --- #### **完整代码示例** ```javascript // 创建Cesium Viewer const viewer = new Cesium.Viewer('cesiumContainer', { baseLayerPicker: false // 禁用默认底图选择器 }); // 配置高德影像提供者 const gaodeImageryProvider = new Cesium.UrlTemplateImageryProvider({ url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', minimumLevel: 3, // 最小缩放级别 maximumLevel: 18, // 最大缩放级别 tilingScheme: new Cesium.WebMercatorTilingScheme(), // 使用Web墨卡托投影解决偏移 credit: '高德地图' // 数据源署名 }); // 添加影像图层到Viewer viewer.imageryLayers.addImageryProvider(gaodeImageryProvider); ``` --- #### **关键注意事项** 1. **URL可用性**: - 高德服务可能更新URL模板,需定期验证。若失效,可参考高德官方API文档调整参数[^3]。 - 示例URL支持缩放级别3-18,超出范围可能导致瓦片缺失。 2. **偏移校正**: - 若仍有偏移,需在代码中添加手动校正: ```javascript // 示例:简单偏移补偿(根据实际误差调整) gaodeImageryProvider.rectangle = Cesium.Rectangle.fromDegrees( 73.5, 3.8, 135.1, 53.6 // 调整中国区域的经纬度范围 ); ``` 3. **服务限制**: - 高德地图对免费调用有限制,高频访问可能触发IP封禁。商业项目建议申请官方API密钥。 4. **备选方案**: - 若需加载其他服务(如腾讯、天地图),只需替换URL模板: - 腾讯影像:`http://rt0.map.gtimg.com/realtimerender?z={z}&x={x}&y={-y}&type=vector` - 天地图影像:`http://t0.tianditu.gov.cn/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&layer=img&tilematrixset=w&format=tiles&tilecol={x}&tilerow={y}&tilematrix={z}`[^1]。 --- ### 相关问题 1. 如何在Cesium加载腾讯地图影像图层? 2. 加载高德地图时如何解决坐标系偏移问题? 3. Cesium支持哪些其他常见地图服务(如ArcGIS、Bing Maps等)? [^1]: Cesium入门之六:Cesium加载影像图层(ArcGIS、Bing、Mapbox、高德地图腾讯地图、天地图等各类影像图)。 [^2]: 046:cesium加载高德地图(多种形式)。 [^3]: cesium加载高德地图各种服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值