OpenLayers3关于Map Export的Canvas跨域

一 Canvas跨域现象

地图导出是地图中常用的功能,并且OpenLayers3中也提供了两个地图导出的例子:
http://openlayers.org/en/latest/examples/export-map.html http://openlayers.org/en/latest/examples/export-pdf.html。
看到这两个例子我们都很兴奋,直接copy过来不就实现导出地图了吗?so easy,妈妈再也不用担心我导出不了地图图片啦!
但当我们抄好代码执行时,现实就是这么赤裸裸的打脸:
我的代码如下:

 

 //街道图Layer.streetLayer=new ol.layer.Tile({source: new ol.source.XYZ({url: 'http://www.google.cn/maps/vt?pb=!1m5!1m4!1i{z}!2i{x}!3i{y}!4i256!2m3!1e0!2sm!3i342009817!3m9!2szh-CN!3sCN!5e18!12m1!1e47!12m3!1e37!2m1!1ssmartmaps!4e0&token=32965'})});

例子的图层代码如下:

 

 layer=new ol.layer.Tile({ source: new ol.source.OSM() });

没多写一行代码的飘逸,抄过来直接运行,报错如下:

 

跨域错误.png

二 问题排查

检查案例源码发现和我抄袭的代码几乎一模一样,唯一区别是我使用的是谷歌底图,例子使用的是osm的source。

 

 new ol.layer.Tile({ source: new ol.source.OSM() }),

为了一看究竟,我们查看osm的source源码如下:

osm souce源码

 

恍然大悟,原来只需要添加这 crossOrigin:'anonymous'就可以了。

于是改写重置自己的谷歌图层代码如下:

 

//街道图
Layer.streetLayer=new ol.layer.Tile({    source: new ol.source.XYZ({        crossOrigin: 'anonymous',        url: 'http://www.google.cn/maps/vt?pb=!1m5!1m4!1i{z}!2i{x}!3i{y}!4i256!2m3!1e0!2sm!3i342009817!3m9!2szh-CN!3sCN!5e18!12m1!1e47!12m3!1e37!2m1!1ssmartmaps!4e0&token=32965'    })
});

这下打印正常了。

三 加载自己的wms底图还是跨域错误

我们上面通过对谷歌地图加crossOrigin: 'anonymous'实现了地图输出了,解决canvas跨域问题了,但一般我们地图是底图+业务底图(如wms)的,这时候打印发现还是报错。

 

Layer.streetLayer=new ol.layer.Tile({source: new ol.source.XYZ({crossOrigin: 'anonymous',url: 'http://www.google.cn/maps/vt?pb=!1m5!1m4!1i{z}!2i{x}!3i{y}!4i256!2m3!1e0!2sm!3i342009817!3m9!2szh-CN!3sCN!5e18!12m1!1e47!12m3!1e37!2m1!1ssmartmaps!4e0&token=32965'})});
Layer.wmsship = new ol.layer.Tile({source: new ol.source.TileWMS({url: geoserverhost+'/gwc/service/wms',params: {'FORMAT': 'image/png','VERSION': '1.1.1',tiled: true,STYLES: '',LAYERS: 'ships:ta_pos_latest'}})});

这个例子我们使用了谷歌底图叠加自己的wms/gwc等瓦片图,发现export还是报跨域错误,理所当让的,我给Layer.wmsship设置crossOrigin: 'anonymous',以为就可以了,但不幸的是仍然报跨域错误,一点没反应。

四 设置服务器cors彻底解决

我们发现,谷歌,osm设置crossOrigin就可以,我们自己wms设置的crossOrigin还是不行。问题出在哪里咧?查阅资料可知,osm,google的服务器一定设置了cors,所以客户端设置crossOrigin才会起作用,而我们自己的wms或者瓦片所在的服务器没有设置cors,所以客户端设置或者不设置crossOrigin,都是无效的。也就是说,只有自己的服务器设置了cors,crossOrigin才会起到作用。
我们地图是geoserver发布的wms或者gwc,对geoserver设置cors,参考之前的博客:http://blog.csdn.net/freeland1/article/details/41204485 ,根据第三节的cors设置下自己的服务器。

服务器设置完毕后,代码改为如下

 

Layer.streetLayer=new ol.layer.Tile({visible: true,source: new ol.source.XYZ({crossOrigin: 'anonymous',url: 'http://www.google.cn/maps/vt?pb=!1m5!1m4!1i{z}!2i{x}!3i{y}!4i256!2m3!1e0!2sm!3i342009817!3m9!2szh-CN!3sCN!5e18!12m1!1e47!12m3!1e37!2m1!1ssmartmaps!4e0&token=32965'})});
Layer.wmsship = new ol.layer.Tile({source: new ol.source.TileWMS({crossOrigin: 'anonymous',url: geoserverhost+'/gwc/service/wms',params: {'FORMAT': 'image/png','VERSION': '1.1.1',tiled: true,STYLES: '',LAYERS: 'ships:ta_pos_latest'}})});

地图输出终于不报错了,perfect!



作者:遥想公瑾当年
链接:https://www.jianshu.com/p/4beb4057f7be
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 连接 postgresql 数据库...

接上一篇,这里使用 sequelize 来连接 postgresql 数据库 1、安装 sequelize,数据库驱动 pg yarn add sequelize sequelize-typescript pg reflect-metadata 2、新建配置文件夹 conf 及 配置文件 db.conf.ts /*** name: 数据库配置* param : undefined* r…

SmartGit使用教程

说明 官网的客户端是命令行形式的,有兴趣可以去了解下。这里针对图形界面的smartgit做一个使用说明。 软件下载和安装 下载地址[2016.12.16测试可以] 按需选择,如果不知道自己电脑是什么系统的,那我没话说了https://www.syntevo.com/smartgit/ 安装 …

jquery 下拉框 select2 运用 笔记

1,添加select2 样式 参考&#xff08;https://select2.org/ &#xff09; 2,Html: <select id"txtType" name"Type" class"form-control select2" multiple"multiple"> </select> 3,jquery section scripts{ $(documen…

获取浏览器屏幕高度(js,jq) - 进击的小牛牛 - 博客园

javascript IE中&#xff1a; document.body.clientWidth > BODY对象宽度 document.body.clientHeight > BODY对象高度 document.documentElement.clientWidth > 可见区域宽度 document.documentElement.clientHeight > 可见区域高度 FireFox中&#xff1a; docum…

第一个爬虫和测试

Python测试函数的方法之一是用&#xff1a;try……except def gameover(a,b):if a>10 and b>10 and abs(a-b)2:return Trueif (a>11 and b<11) or (a<11 and b>11):return Truereturn False try:agameover(10,11)print(a) except:print("Error") g…

JS组件系列——Bootstrap 树控件使用经验分享 - 懒得安分 - 博客园

前言&#xff1a;很多时候我们在项目中需要用到树&#xff0c;有些树仅仅是展示层级关系&#xff0c;有些树是为了展示和编辑层级关系&#xff0c;还有些树是为了选中项然后其他地方调用选中项。不管怎么样&#xff0c;树控件都是很多项目里面不可或缺的组件之一。今天&#xf…

蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)

Description 如下面第一个图的九宫格中&#xff0c;放着 1~8 的数字卡片&#xff0c;还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动&#xff0c;可以形成第二个图所示的局面。我们把第一个图的局面记为&#xff1a;12345678.把第二个图的局面…

DIV或者DIV里面的图片水平与垂直居中的方法 - 站住,别跑 - 博客园

DIV或者DIV里面的图片水平与垂直居中的方法 <div class“box”><img /> </div> 水平居中的常用方式&#xff1a; text-align:center ——这可以实现子元素字体&#xff0c;图片的水平居中。 margin:0 auto —— 这是针对块元素的水平居中方法 垂直居中的常…

设置图片元素上下垂直居中的7种css样式_赵一鸣博客

设置图片元素上下垂直居中的7种css样式 阅读(9548) 2018-07-15 14:13:34 图片、文字左右居中很简单&#xff0c;只需要以下代码&#xff1a; 1 text-align:center; 文字上下居中也很简单&#xff0c;假设外部div元素的高度是100px&#xff0c;那么&#xff1a; 1 line-heig…

day36 Pyhton 网络编程03

一.内容回顾 socket通常也称作"套接字"&#xff0c;用于描述IP地址和端口&#xff0c;是一个通信链的句柄&#xff0c;应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix&#xff0c;而Unix/Linux基本哲学之一就是“一切皆文件”…

推荐21个顶级的Vue UI库! – TalkingData‘s Blog

推荐21个顶级的Vue UI库&#xff01; 最近&#xff0c;随着“星球大战”&#xff08;指 GitHub 的 Star 数量大比拼&#xff09;的爆发&#xff0c;Vue.js 在 GitHub 上的 Star 数超过了 React。虽然 NPM 的下载量仍然落后于 React&#xff0c;但 Vue.js 的受欢迎程度似乎在持续…

2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)...

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/903/B 题意&#xff1a; 给你 q,n,p,求 q1q2...qn 的和 模 p。 思路&#xff1a;一开始不会做&#xff0c;后面查了下发现有个等比数列求和的快速幂公式&#xff0c;附上链接https://www.cnblogs.com/yuiffy/p/380917…

nodejs服务后台持续运行

forever.jpeg 我用本地mac连接阿里云服务器&#xff0c;启动nodejs服务&#xff0c;客户端掉线&#xff0c;服务也会终止。如何在客户端掉线的情况下&#xff0c;node服务正常运行&#xff1f; forever介绍 forever是一个nodejs守护进程&#xff0c;完全由命令行操控。forev…

Node.js+Koa开发微信公众号个人笔记(一)准备工作 - ZhangCui - 博客园

本人也是在学习过程中&#xff0c;所以文章只作为学习笔记&#xff0c;如果能帮到你&#xff0c;那就更好啦~当然也难免会有错误&#xff0c;请不吝指出~ 一、准备工作 1、本人学习教程&#xff1a;慕课网Scott老师的《Node.js七天搞定微信公众号》 &#xff0c;但是有点小贵…

【vue-router①】router-link跳转页面传递参数 - 进击的前端之路(偶尔爬坑java小路) - SegmentFault 思否

在vue项目中&#xff0c;往往会遇到这样的情况&#xff0c;就是要实现在一个循环列表中&#xff0c;点击其中一条跳转到下个页面&#xff0c;然后将这一条的相关数据带到下个页面中显示&#xff0c;这是个循环列表&#xff0c;无论点哪一条都是跳到相同的页面&#xff0c;只是填…

Jmeter-【JSON Extractor】-响应结果中三级key取值

一、请求返回样式 二、取第三个option 三、查看结果 转载于:https://www.cnblogs.com/Nancy-Lee/p/10938758.html

手摸手,带你用vue撸后台 系列一(基础篇) - 掘金

完整项目地址&#xff1a;vue-element-admin 系列文章&#xff1a; 手摸手&#xff0c;带你用 vue 撸后台 系列一&#xff08;基础篇&#xff09;手摸手&#xff0c;带你用 vue 撸后台 系列二(登录权限篇)手摸手&#xff0c;带你用 vue 撸后台 系列三 (实战篇)手摸手&#xf…

webpack+vue+mui学习心得

引入mui 1.不需要npm安装; 直接从官方下载丢进来 2.那就是全局引用了; 没错,就是index.html里直接引入,当然也可以main.js引入,随意啦! so easy 3.找到webpack.base.conf.js,在module与plugins之间插入以下代码: 4.这样就可以在项目里面直接用了.然就是mui与vue-router及点…

【ARTS】01_04_左耳听风-20181203~1209

ARTS&#xff1a; Algrothm: leetcode算法题目Review: 阅读并且点评一篇英文技术文章Tip/Techni: 学习一个技术技巧Share: 分享一篇有观点和思考的技术文章Algorithm Single Number https://leetcode.com/problems/single-number/ 1&#xff09;problem Given a non-empty arra…

vue项目(webpack+mintui),使用hbuilder打包app - 小小人儿大大梦想 - 博客园

一、配置config/index.js 本人没有配置index.js文件&#xff0c;就开始进行了打包&#xff0c;结果最终效果是页面空白&#xff0c;解决了空白&#xff0c;接着底部图标&#xff08;我是用的阿里巴巴图片&#xff09;资源找不到。所以配置这步比较重要。 &#xff08;1&#…