[转]Openlayers中图片导出功能实现及可能存在的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013240519/article/details/81330021
openlayers v4.6.5给出的例子

//引用FileSaver.js
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>

//添加导出按钮
<a id="export-png" class="btn btn-default"><i class="fa fa-download"></i> Download PNG</a>


<script>
//单击事件
document.getElementById('export-png').addEventListener('click', function() {
        map.once('postcompose', function(event) {
          //获取map中的canvas,并转换为图片
          var canvas = event.context.canvas;
          if (navigator.msSaveBlob) {
            navigator.msSaveBlob(canvas.msToBlob(), 'map.png');
          } else {
            canvas.toBlob(function(blob) {
              saveAs(blob, 'map.png');
            });
          }
        });
        map.renderSync();
      });
</script>

Layer中默认加载的是

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

当我们换成天地图等其他地图时,如

new ol.layer.Tile({
   source: new ol.source.XYZ({
       url: "http://t1.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}"
         }),
     })

会出现错误 
SecurityError: The operation is insecure.

原因是:canvas导出图片时,涉及到跨域的问题,而osm.js文件中crossOrigins设置为“anonymous” 
 
而xyz.js文件中未设置,因此在添加图层及数据源时,需手动设置。

new ol.layer.Tile({
   source: new ol.source.XYZ({
       //设置crossOrigin
       crossOrigin:'anonymous',
       url: "http://t1.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}"
         }),
     })


注意1:添加多个图层时,只要有一个涉及跨域问题,就会报错,导出图片不成功 
注意2:添加其他数据源,未显示在地图的原因,若原因是跨域导致,也是未设置crossOrigin导致
--------------------- 
作者:高端客户 
来源:CSDN 
原文:https://blog.csdn.net/u013240519/article/details/81330021 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将GeoJSON换为图片并在OpenLayers加载,可以按照以下步骤进行操作: 1. 在Java读取GeoJSON文件并将其换为FeatureCollection对象。可以使用Jackson库来读取和解析GeoJSON文件。 2. 使用Java绘图库(例如Java2D)创建一个图像对象并将FeatureCollection绘制到图像上。您可以使用Feature对象的几何数据来绘制不同的形状。 3. 将图像保存为文件(例如PNG或JPEG格式)。 4. 在OpenLayers创建一个ImageLayer,并将图像文件的URL设置为图层的源。 以下是Java代码的示例: ``` // 读取GeoJSON文件 ObjectMapper objectMapper = new ObjectMapper(); File file = new File("path/to/geojson/file.json"); FeatureCollection featureCollection = objectMapper.readValue(file, FeatureCollection.class); // 创建图像对象 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = image.createGraphics(); // 绘制FeatureCollection for (Feature feature : featureCollection) { Geometry geometry = feature.getGeometry(); // 根据几何类型绘制不同的形状 if (geometry instanceof Point) { Point point = (Point) geometry; g2d.drawOval((int) point.getX(), (int) point.getY(), 10, 10); } else if (geometry instanceof LineString) { LineString lineString = (LineString) geometry; int[] xPoints = new int[lineString.getCoordinates().size()]; int[] yPoints = new int[lineString.getCoordinates().size()]; for (int i = 0; i < lineString.getCoordinates().size(); i++) { xPoints[i] = (int) lineString.getCoordinates().get(i).getX(); yPoints[i] = (int) lineString.getCoordinates().get(i).getY(); } g2d.drawPolyline(xPoints, yPoints, lineString.getCoordinates().size()); } else if (geometry instanceof Polygon) { Polygon polygon = (Polygon) geometry; int[] xPoints = new int[polygon.getExteriorRing().getCoordinates().size()]; int[] yPoints = new int[polygon.getExteriorRing().getCoordinates().size()]; for (int i = 0; i < polygon.getExteriorRing().getCoordinates().size(); i++) { xPoints[i] = (int) polygon.getExteriorRing().getCoordinates().get(i).getX(); yPoints[i] = (int) polygon.getExteriorRing().getCoordinates().get(i).getY(); } g2d.drawPolygon(xPoints, yPoints, polygon.getExteriorRing().getCoordinates().size()); } } // 保存图像到文件 File output = new File("path/to/image/file.png"); ImageIO.write(image, "png", output); // 在OpenLayers创建ImageLayer ImageLayer imageLayer = new ImageLayer(); imageLayer.setSource(new ImageStatic("path/to/image/file.png", null, extent, pixelRatio)); map.addLayer(imageLayer); ``` 请注意,此示例的代码仅用于演示目的,并且可能需要进行修改以适应您的具体情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值