繁体   English   中英

如何表示OpenLayers 4群集之外的功能?

[英]How to represent a feature outside an OpenLayers 4 cluster?

我正在使用OpenLayers角度依赖 ,实际上,我正在使用v4.1.1并且在当前'我无法将其更新到最新版本。

我有一个带有ol.source.Cluster的地图。 它聚集了我的所有ol.layer.Vector图层,这些图层由图钉功能组成,类似于此示例

我的应用程序中的功能可由用户选择。 此操作突出显示单个指定的要素,并将地图缩放到要素中,以便让用户知道选择了哪一个。 当功能集群化时,我的问题出现了; 我希望该功能可以在群集外部呈现,并且可以在未选中时再次添加到群集中。 这可能很容易吗? 我已经阅读了所涉及的类的文档, ol.source.Clusterol.source.Vector (我知道它们是v4.6.5但我没有找到v4.1.1 )也许我正在跳过某些东西或者也许你知道这样做的方法。

我尝试了两种解决方案,但我不太喜欢:

  • 修改群集的distance属性,将其设置为0.通过这种方式,将禁用群集并单独显示所有要素。 这不是最好的方法,因为用户可以缩小地图,地图上可能有太多的图钉。 即使我处理缩放级别并且在缩放太低时启用了群集功能,所选的图钉也会聚集在一起,并且它不是所需的行为。
  • 使用辅助图层并在那里表示选定的图钉。 该层将在其源上仅包含一个特征,即所选特征,并且一旦取消选择它将被删除。 我不得不承认我还没有实现这个例子,因为它有点复杂(我还要处理这个层沿着集群层的可见性等等)而且我没有太多时间去做POC 。

    更新:我刚刚在集群源选项中设置了geometryFunction ,用于过滤图钉并仅集群那些未选中的图钉。 问题是所选择的一个没有渲染,因此我需要辅助层,以便将要表示的选定特征传递给它:

    let clusterSource = new ol.source.Cluster({
       distance: 40,
       source: vectorSource,
       geometryFunction: (feature) => {
           if (feature.get('selected')) {
               return null;
           }
           return feature.getGeometry() as ol.geom.Point;
       }
    });

总而言之, 有没有办法从群集中删除某个功能并将其与群集一起单独表示?

最后,由于我没有在OpenLayers 4 API中找到任何可以轻松实现目标的内容,因此我实现了辅助层的方法。 就像其余部分一样,我将所有图钉聚类在同一个源下(这些图钉代表不同类型的实体,因此每种类型都可以单独显示/隐藏)。 但是当我选择单个实体时,我会停止通过群集源的geometryFunction对其进行聚类,并在辅助层中将其克隆,在地图中将其显示为单个选定要素(具有特定样式)。

因为当用户修改其可见性时可以排除一组图钉被聚集,通过特定于每种类型的实体的子图层,我为这些子图层中的每一个创建了辅助图层,因此当修改它们的可见性时我修改了其辅助层的可见性以及隐藏/显示单个特征。

为了达到这个目的,我创建了一个继承自ol.layer.Vectorjs类,以扩展其功能,添加我需要的东西。

正如我在遗留代码中所做的那样,这比我在这里解释的目标更复杂,粘贴代码片段作为示例有点复杂,因为我应该删除许多不用的行,也许它不会是完全正确。 所以,如果您有任何具体问题,我可以更好地解释它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM