【问题标题】:Blending mode between konvajs and openlayerskonvajs 和 openlayers 之间的混合模式
【发布时间】:2020-12-20 15:58:29
【问题描述】:

我尝试在 konvajs (https://konvajs.org/) 和 openlayers (https://openlayers.org/) 之间使用混合模式

我有一张用 openlayers 创建的地图,然后我使用 openlayers 的 Overlay (https://openlayers.org/en/latest/examples/overlay.html) 在地图上添加 canvas konvajs。

我试过了:

  1. konvajs 的属性globalCompositeOperation,但它仅适用于 konvajs 中的项目
  2. css mix-blend-mode,但是 konvajs 中的所有项目都卡在相同的模式下,我希望每个项目都有不同的模式。

有什么办法可以做到吗?

这里是我尝试使用上面的 No.1 的示例代码: https://codesandbox.io/s/cool-monad-ow21j?file=/main.js

【问题讨论】:

  • 听起来是一个非常有趣的项目。您能否发布minimal reproduceable example 来说明您遇到的错误?
  • @VanquiishedWombat 感谢您的提醒,我添加了示例代码链接。
  • 我猜 Konva 不会将 openlayers 地图视为 konva 形状。因此,Konva 无法以混合的形式对其进行操作。您能否将 openlayers 地图作为可以传递给 konva 的图像获取?这里还有一个关于在 Konva 中混合图像的问答:stackoverflow.com/questions/46557532/…
  • 感谢您的关注,我试试看

标签: javascript openlayers konvajs


【解决方案1】:

为了帮助研究 OpenLayer 和 Konvajs 画布如何交互,我创建了以下 sn-p。这将绘制一个 Openlayer 地图元素,然后添加一个 Konvajs 画布元素。两者都是绝对定位的,因此它们重叠。我添加了一些具有不同不透明度的简单矩形来说明这种可能性,以防万一这是您真正需要的。

下图显示了元素的 F12 检查器视图。正如我们所见,标签 a 指出 OpenLayers 元素使用了专用画布。同样,标签 b 显示 Konvajs 画布。

结论是这些元素确实是独立的 HTML5 画布元素。因此问题切换到“是否可以在画布上使用混合模式?”。幸运的是,这是asked before

所以,在回答您的问题时,“有什么方法可以实现 [OpenLayer 和 Konvajs 之间的混合]?”答案似乎是肯定的。但是,看看潜在的方法,您似乎可能会失去两个画布层的一些鼠标/触摸功能。

// Create the map element
var map = new ol.Map({
  target: 'map',
  layers: [
    new ol.layer.Tile({
      source: new ol.source.OSM()
    })
  ],
  view: new ol.View({
    center: ol.proj.fromLonLat([-1.1656, 51.0856]),
    zoom: 15
  })
});


// Create the Konva element
var stage = new Konva.Stage({container: 'container1', width: 600, height: 400});
var layer1 = new Konva.Layer();
stage.add(layer1);

var rect = new Konva.Rect({x: 100, y: 25, width: 100, height: 50, fill: 'magenta', stroke: 'black', draggable: true });
layer1.add(rect); 

rect = new Konva.Rect({x: 200, y: 75, width: 100, height: 50, fill: 'magenta', stroke: 'black', draggable: true, opacity: 0.5 });
layer1.add(rect); 

rect = new Konva.Rect({x: 300, y: 125, width: 100, height: 50, fill: 'magenta', stroke: 'black', draggable: true, opacity: 0.25 });
layer1.add(rect); 

stage.draw();
      .map {
        height: 400px;
        width: 100%;
      }
<script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
<script src="https://cdn.rawgit.com/konvajs/konva/1.6.5/konva.min.js"></script>
    <div id="map" class="map"  style="left: 0; top: 0; width: 600px; height: 400px; background-color: transparent; position: absolute;"></div>
    
    <div id='container1' style="left: 0; top: 0; width: 600px; height: 400px; background-color: transparent; position: absolute;"></div>
    

【讨论】:

  • 感谢您的帮助,但您的解决方案是否适用于“屏幕、打火机、差异...”等混合模式?我尝试在您的 sn-p 中添加 globalCompositeOperation,但似乎只有不透明度有效?
  • 对不起,我没有给你一个解决方案 - 更像是解释并发症。所以我不希望 sn-p 能按原样工作。按照我发布到上一个问题的链接,其中有一些可能的前进路线。
  • 感谢您的解释,这对我来说很清楚,我会尝试您提供的链接中的那些方法,但我会尽量不丢失一些鼠标/触摸功能,因为我需要它们在我的项目中
  • 好酷。如果我的回答解释/回答了您的问题,即使它当然是负面结果,请将其标记为正确。谢谢。
  • 我尝试了您提供的链接并得到了答案。主要思想是将canvas' konva中的项目拆分为多个,然后将其与链接中的'Normal'混合模式(混合混合模式)混合。当然它仍然有一些问题,首先它降低了性能,第二个鼠标/触摸事件不能从上画布的 konva 传递到下画布。无论如何,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2018-05-14
  • 2019-11-17
  • 1970-01-01
  • 2017-04-29
  • 2021-06-29
  • 1970-01-01
相关资源
最近更新 更多