Openlayers Map.ForEachLayerPixel回调函数具有空rgba数组

Openlayers Map.ForEachLayerPixel回调函数具有空rgba数组,openlayers,Openlayers,使用其中一个示例中的一些代码,每当我在特定层的不透明部分上悬停时,我都会尝试更改指针表示 映射。在“pointermove”上,函数EVT{ 如果evt正在拖动{ 回来 } var pixel=map.getEventPixelevt.originalEvent; var hit=map.forEachLayerAtPixelpixel,functionlayer,rgba{ 返回rgba[3]==0; }, { 'layerFilter':函数层{返回层==aisLayer;} }; map.

使用其中一个示例中的一些代码,每当我在特定层的不透明部分上悬停时,我都会尝试更改指针表示

映射。在“pointermove”上,函数EVT{ 如果evt正在拖动{ 回来 } var pixel=map.getEventPixelevt.originalEvent; var hit=map.forEachLayerAtPixelpixel,functionlayer,rgba{ 返回rgba[3]==0; }, { 'layerFilter':函数层{返回层==aisLayer;} }; map.getTargetElement.style.cursor=点击“指针”:; }; 不幸的是,Map.forEachLayerAtPixel的回调函数中的rgba变量为空。 根据文档,第二个参数应该是一个包含rgba值的数组,如果层不支持它,则为null

对我来说,它不是空的,但没有rgba值。它只是一个空的Uint8array

以下是我正在使用的图层,由geoserver实例生成:

var aisLayer=新瓷砖层{ 资料来源:新TileWMS{ //网址:'http://192.168.8.157:8600/geoserver/gwc/service/wms', 网址:'http://192.168.8.157:8600/geoserver/ais/wms', 参数:{ “层”:“ais:shipinfosview”, “版本”:“2.0.0”, ‘SRS’:‘EPSG:900913’, “CQL_过滤器”:“时间>2020-05-17T18:10:00” }, 服务器类型:“地理服务器”, 预测:‘EPSG:900913’, } }; 知道这里怎么了吗


谢谢

正如Mike指出的,必须指定crossOrigin以允许像素操作。 这实际上是在文件中提到的

然而,仅仅为我正在使用的层更改这个是不够的

因为我使用的是多个层,Openlayers似乎将这些层合并为一个层。 其中一层没有交叉原点参数,我仍然得到一个空数组

为了避免这种情况并解决我的问题,Openlayer不必将所有层合并到一个画布中。 我做了一个粗略的猜测,并将aisLayer的className参数更改为非默认值。事实上,创建了一个没有默认名称的新画布

如果您有任何疑问,我很高兴能澄清这种行为的方式和原因

以下是一个可行的解决方案:

让aisLayer=新的TileLayer{ 类名:“ais层”, 资料来源:新TileWMS{ //网址:'http://192.168.8.157:8600/geoserver/gwc/service/wms', 网址:'http://192.168.8.157:8600/geoserver/ais/wms', 参数:{ “层”:“ais:shipinfosview”, “版本”:“2.0.0”, ‘SRS’:‘EPSG:900913’, “CQL_过滤器”:“时间>2020-05-17T18:10:00” }, 服务器类型:“地理服务器”, 预测:‘EPSG:900913’, 交叉源:“匿名”, } }; 常量源=新矢量源{ 格式:新GeoJSON, url:“./data/countries.json”, }; 常数层=新矢量层{ 资料来源:资料来源, }; 常量映射=新映射{ 目标:“映射容器”, 图层:[ 新瓦工{ 来源:新XYZ来源{ 网址:'http://tile.stamen.com/terrain/{z} /{x}/{y}.jpg' } }, 层 艾斯勒, ], 视图:新视图{ 中心:fromlonat[0,0], 缩放:2 } }; 映射。在“pointermove”上,函数EVT{ 如果evt正在拖动{ 回来 } 让pixel=map.getEventPixelevt.originalEvent; let hit=map.foreachlayer像素,函数层,rgba{ 返回rgba[4]!=0; }, { “layerFilter”:functionlayer{ 返回layer.ol\u uid==aisLayer.ol\u uid; } }; map.getTargetElement.style.cursor=点击“指针”:; };
正如Mike指出的,必须指定crossOrigin以允许像素操作。 这实际上是在文件中提到的

然而,仅仅为我正在使用的层更改这个是不够的

因为我使用的是多个层,Openlayers似乎将这些层合并为一个层。 其中一层没有交叉原点参数,我仍然得到一个空数组

为了避免这种情况并解决我的问题,Openlayer不必将所有层合并到一个画布中。 我做了一个粗略的猜测,并将aisLayer的className参数更改为非默认值。事实上,创建了一个没有默认名称的新画布

如果您有任何疑问,我很高兴能澄清这种行为的方式和原因

以下是一个可行的解决方案:

让aisLayer=新的TileLayer{ 类名:“ais层”, 资料来源:新TileWMS{ //网址:'http://192.168.8.157:8600/geoserver/gwc/service/wms', 网址:'http://192.168.8.157:8600/geoserver/ais/wms', 参数:{ “层”:“ais:shipinfosview”, “版本”:“2.0.0”, ‘SRS’:‘EPSG:900913’, “CQL_过滤器”:“t” ime>2020-05-17T18:10:00' }, 服务器类型:“地理服务器”, 预测:‘EPSG:900913’, 交叉源:“匿名”, } }; 常量源=新矢量源{ 格式:新GeoJSON, url:“./data/countries.json”, }; 常数层=新矢量层{ 资料来源:资料来源, }; 常量映射=新映射{ 目标:“映射容器”, 图层:[ 新瓦工{ 来源:新XYZ来源{ 网址:'http://tile.stamen.com/terrain/{z} /{x}/{y}.jpg' } }, 层 艾斯勒, ], 视图:新视图{ 中心:fromlonat[0,0], 缩放:2 } }; 映射。在“pointermove”上,函数EVT{ 如果evt正在拖动{ 回来 } 让pixel=map.getEventPixelevt.originalEvent; let hit=map.foreachlayer像素,函数层,rgba{ 返回rgba[4]!=0; }, { “layerFilter”:functionlayer{ 返回layer.ol\u uid==aisLayer.ol\u uid; } }; map.getTargetElement.style.cursor=点击“指针”:; };
如果画布被污染,ForEachLayerPixel将无法工作。您必须在源中指定crossOrigin选项,并且必须对服务器进行设置以允许该选项。如果画布受到污染,ForEachLayerTaxel将无法工作。您必须在源中指定crossOrigin选项,并且服务器必须设置为允许该选项。