cesium使用天地图

cesium中默认的底图是bingmap。在国内还是天地图靠谱一点。操作如下:

一、创建provider.js

export function getProviderViewModels() {
    const tiandiKey = "****";       //天地图key,官网申请
    const baseUrl = 'http://t{s}.tianditu.com';
    //天地图矢量
    let tiandiVec = new Cesium.UrlTemplateImageryProvider({
        subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
        url: baseUrl + '/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=' + tiandiKey
    });
    //天地图影像
    let tiandiImg = new Cesium.UrlTemplateImageryProvider({
        subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
        url: baseUrl + '/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=' + tiandiKey
    });
    //天地图标注
    let tiandiCva = new Cesium.UrlTemplateImageryProvider({
        subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
        url: baseUrl + '/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=' + tiandiKey
    });

    let tiandiVecModel = new Cesium.ProviderViewModel({
        name: '天地图',
        category: '国内地图资源',
        iconUrl: Cesium.buildModuleUrl('./Widgets/Images/ImageryProviders/openStreetMap.png'),
        tooltip: 'WMTS 地图服务',
        creationFunction: function () {
            return [tiandiVec, tiandiCva];
        }
    });
    let tiandiImgModel = new Cesium.ProviderViewModel({
        name: '天地图影像',
        category: '国内地图资源',
        iconUrl: Cesium.buildModuleUrl('./Widgets/Images/ImageryProviders/esriWorldImagery.png'),
        tooltip: 'WMTS 影像服务',
        creationFunction: function () {
            return [tiandiImg, tiandiCva];
        }
    });

    return [tiandiVecModel, tiandiImgModel]
}


二、使用天地图

情况①:只使用天地图,去掉默认的一系列底图

import { getProviderViewModels } from "./gis/provider.js";
...
let [tiandiVecModel, tiandiImgModel] = getProviderViewModels();
viewer = new Cesium.Viewer("cesiumContainer", {
  imageryProviderViewModels: [tiandiVecModel, tiandiImgModel],
})
...

情况②:在原底图列表中再附加天地图

import { getProviderViewModels } from "./gis/provider.js";
...
let [tiandiVecModel, tiandiImgModel] = getProviderViewModels();
viewer = new Cesium.Viewer("cesiumContainer", {
 // imageryProviderViewModels: [tiandiVecModel, tiandiImgModel],
})
viewer.baseLayerPicker.viewModel.imageryProviderViewModels.unshift(
    tiandiImgModel
);
viewer.baseLayerPicker.viewModel.imageryProviderViewModels.unshift(
    tiandiVecModel
);
...

三、新版天地图api

天地图api有tianditu.com和tianditu.gov.cn两种。目前两种均能使用,官方文档中使用的是tianditu.gov.cn。但注意了!官方文档居然接口有错,官网中url为TILEMATRIX={z}&TILEROW={x}&TILECOL={y}。应该改成TILEMATRIX={z}&TILEROW={y}&TILECOL={x}。使用tianditu.gov.cn如下:
同样创建provider.js

export function getProviderViewModels() {
    const tiandiKey = "****";       //天地图key,官网申请
    const baseUrl = 'http://t{s}.tianditu.gov.cn';
   //天地图
    let tiandiVec = new Cesium.UrlTemplateImageryProvider({
        subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
        url: baseUrl + '/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk='+tiandiKey
    });
    //天地图影像
    let tiandiImg = new Cesium.UrlTemplateImageryProvider({
        subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
        url: baseUrl + '/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk='+tiandiKey
    });
    //天地图标注
    let tiandiCva = new Cesium.UrlTemplateImageryProvider({
        subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
        url: baseUrl + '/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk='+tiandiKey
    });
    //天地图影像标注
    let tiandiCia = new Cesium.UrlTemplateImageryProvider({
        subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
        url: baseUrl + '/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk='+tiandiKey
    });
    return [tiandiVecModel, tiandiImgModel]
}

四、electron接入天地图

天地图有三种key,分别是浏览器端的、安卓端的和服务器端的。但使用时发现,无论哪个端的,在electron打包成pc端app后,地图均返回403。经过我各种尝试后,发现使用nginx代理+浏览器key模拟浏览器情况能解决这个问题。
客户端:将baseUrl(http://t{s}.tianditu.gov.cn)改为(http://127.0.0.1)
服务端nginx反向代理:

      location /vec_w/ {
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
            proxy_set_header referer http://localhost/;    //重点
            proxy_pass http://t0.tianditu.gov.cn;
        }

        location /cva_w/ {
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
            proxy_set_header referer http://localhost/;
            proxy_pass http://t0.tianditu.gov.cn;
        }
        
        location /img_w/ {
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
            proxy_set_header referer http://localhost/;
            proxy_pass http://t0.tianditu.gov.cn;
        }

        location /cia_w/ {
            add_header Access-Control-Allow-Headers X-Requested-With;
            add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
            proxy_set_header referer http://localhost/;
            proxy_pass http://t0.tianditu.gov.cn;
        }

重点是在代理时设置referer,欺骗天地图服务端,让它以为请求是浏览器访问

采用node代理

由于nginx代理需要部署nginx,较为麻烦。本次使用node代理代替nginx。可以做到打包为exe后不再需要其余部署。创建proxy.js

const http = require('http');
const url = require('url');
const httpProxy = require('http-proxy');


    const proxy = httpProxy.createProxyServer();

    //获取天地图host
    function getTianditu() {
        let rand = Math.floor(Math.random() * 8)
        return `t${rand}.tianditu.gov.cn`
    }

    let server = http.createServer(function (req, res) {
        const { pathname } = url.parse(req.url)
        let host = getTianditu()
        if (pathname === '/DataServer') {
            //天地图走代理
            proxy.on('proxyReq', function (proxyReq, req, res, options) {
                proxyReq.setHeader('Host', host);  //重要
                proxyReq.setHeader('referer', 'http://localhost/');  //重要
            });
            proxy.web(req, res, {
                target: 'http://' + host
            });
            //监听代理服务错误
            proxy.on('error', function (err) {
                console.log(err);
            });
        } else {
            res.end();
        }
    });
    server.listen(80, '0.0.0.0');


以上文件在electron.js中调用,即可做到打开exe开启node代理服务(electron.js在electron项目的package.json的main中引入)

//electron.js部分代码
//...
const mainWindow = new BrowserWindow({
        width: 1440,
        height: 900,
        icon: path.join(__dirname, "../dist/****.ico"),
        webPreferences: {
            preload: path.join(__dirname, 'proxy.js'),
            nodeIntegration: true,
            webviewTag:true,
        },
    });
//...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容