openlayer4地图及图层导出图片问题小结

在使用OpenLayers 4时遇到地图导出图片的跨域问题,通过设置图层的crossOrigin属性为'anonymous'来解决。在自定义图层和叠加显示地图时分别设置XYZ和ImageArcGISRest源的crossOrigin属性。导出功能通过监听地图的postcompose事件获取canvas,然后转换为Blob对象进行保存。代码中提供了导出图片的完整流程,包括使用FileReader将Blob转换为DataURL,以及发送异步请求保存图片。

直接使用ol4中的地图导出功能在我们的项目中可能会存在跨域问题,导致地图不能正常的转为二进制。

解决方法:

1 //自定义图层中添加crossOrigin,具体如下:
        var tdtTerLayer = new ol.layer.Tile({
            visible: true,
            source: new ol.source.XYZ({
                crossOrigin: 'anonymous',
                url: tdtter
            })
        });


        var edge = new ol.layer.Image({
            source: new ol.source.ImageArcGISRest({
                crossOrigin: 'anonymous',
                ratio: 1,
                params: {},
                url: jsmap
            })
        });

2//叠加显示

var map = new ol.Map({
            controls: ol.control.defaults().extend([
                new ol.control.ScaleLine({}),
                new ol.control.ZoomSlider({}),
                new ol.control.ZoomToExtent({})]),
            target: 'map',
            layers: [
             tdtTerLayer, edge
           //  openstreemap,contries
            ],
            view: new ol.View({
                maxZoom: 19,
                minZoom: 6,
                projection: epsgWMproj,
                center: ol.proj.transform([120.3351, 31.1918], epsg84proj, epsgWMproj),
                zoom: 8
            })
        });

3//导出函数

       function readBlobAsDataURL(blob, callback) {
            var a = new FileReader();
            a.onload = function (e) {
                callback(e.target.result);
            }
            a.readAsDataURL(blob);
        }




        $("#savemap").click(function () {
            map.once('postcompose', function (event) {
                var canvas = event.context.canvas;
                var SLT_pic = new ArrayBuffer();


                if (navigator.msSaveBlob) {
                    var ttt = canvas.msToBlob();//此处将图片转成二进制
                    


                    readBlobAsDataURL(ttt, function (dataurl)
                    {
                        var name = "testpic.png";
                        post_webservice_async_json({ "oper": "SaveIMG","picname":name,"oge": dataurl });
                    })


                } else {
                    canvas.toBlob(function (blob) {
                        var mmm = blob;
                        alert("Binary pic",mmm);
                    });
                }
            });
            map.renderSync();
        });


        function post_webservice_async_json(paramObj) {
            var returnStr = "";
            var defer = $.Deferred();
            $.ajax({
                type: 'post',
                async: true,
                dataType: 'json',
                url: 'Test.ashx',
                traditional: true,
                data: { paramInfo: JSON.stringify(paramObj) },
                success: function (data) {
                    //alert("保存图层成功");
                    defer.resolve(data);
                }
            })
            return defer.promise();
        }


4//图片保存

 string res;
        string paramInfo = null;
        paramInfo = context.Request.Form["paramInfo"];
        //图片读取
        if (paramInfo != null && paramInfo != "")
        {
            JavaScriptSerializer aa = new JavaScriptSerializer();


            Dictionary<string, string> dic = aa.Deserialize<Dictionary<string, string>>(paramInfo);


            string obj = dic["oge"].Replace(" ", "+").Split(',')[1];


            byte[] array = Convert.FromBase64String(obj);


            string oper = dic["oper"];
            string picname = dic["picname"];

          //图片保存到当前项目文件下
            MemoryStream ms = new MemoryStream(array);

            Image image = new Bitmap(ms);

            image.Save(context.Server.MapPath(@"~2.png"));

        }
       


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值