Openlayers 尝试群集多重几何体要素时发生断言错误

Openlayers 尝试群集多重几何体要素时发生断言错误,openlayers,Openlayers,我有一个非常大的KML文件(8MB | 8300+功能),我需要一种离线加载的方法。经过一些研究,我喜欢使用OpenLayers的聚类方法,但它只适用于点: 层源对矢量数据进行聚类。使用点几何图形开箱即用。对于其他几何图形类型,或者如果不是所有几何图形都应考虑进行聚类,则可以定义自定义geometryFunction 如果我尝试对多边形使用该方法,则不会显示任何结果。因此,我尝试在缩小时“变换”点中的特征,并将这些特征显示为点簇,然后在缩放足够近时恢复为原始几何体。我找到了一些我依靠的。但现在我

我有一个非常大的KML文件(8MB | 8300+功能),我需要一种离线加载的方法。经过一些研究,我喜欢使用OpenLayers的聚类方法,但它只适用于点:

层源对矢量数据进行聚类。使用点几何图形开箱即用。对于其他几何图形类型,或者如果不是所有几何图形都应考虑进行聚类,则可以定义自定义geometryFunction

如果我尝试对多边形使用该方法,则不会显示任何结果。因此,我尝试在缩小时“变换”点中的特征,并将这些特征显示为点簇,然后在缩放足够近时恢复为原始几何体。我找到了一些我依靠的。但现在我得到了一个错误,在应用该方法而不转换为点时,我以前没有收到这个错误:

AssertionError {
    code: 10, 
    name: "AssertionError", 
    message: "Assertion failed. See https://openlayers.org/en/v5.3.3/doc/errors/#10 for details."
}
:

默认geometryFunction只能处理ol/geom/点几何图形

我发现收到这个错误很奇怪,因为在我提到的问题链接中,OP执行相同的过程,并且没有收到任何错误


加载层功能

//创建图层和源
设newVectorSource=newVectorSource({})
设newVectorLayer=新VectorLayer({
资料来源:新集群({
距离:50,
来源:newVectorSource,
}),
名称:图层['layer_id'],
可见:假
});
//读取文件并添加到地图
this.file.readAsText(路径,文件名)。然后(layer_file=>{
let format=new KML({});
newVectorSource.addFeatures(format.readFeatures(layer_文件{
功能投影:“EPSG:3857”,
数据预测:“EPSG:4326”
}));
this.map.addLayer(newVectorLayer);
for(设i=newVectorSource.getFeatures().length-1;i>=0;i--){
/*创建样式功能,使多边形的行为类似于点,
所以我们可以像集群一样展示它们
*/
让笔划=新笔划({
颜色:“橙色”,
宽度:3
});
让填充=新填充({
颜色:“rgba(255、165、0、0.1)”
})
//创建几何体函数
让zoomInStyle=新样式({
中风:中风,
填充:填充,
几何:(特征)=>{
让originalFeature=newVectorSource.getFeatures()[i];
返回originalFeature.getGeometry();
}
});
让zoomOutStyle=新样式({
中风:中风,
填充:填充,
几何:(特征)=>{
让type=feature.getGeometry().getType();
如果(类型==‘多边形’){
返回feature.getGeometry().getInteriorPoint();
}else if(类型==='LineString'){
//还尝试了feature.getClosestPoint();
返回getCenter(feature.getGeometry().getExtent());
}
}                                   
});
让featureStyleFunction=(功能,分辨率)=>{
如果(分辨率>10){
返回zoomOutStyle;
}否则{
返回zoomInStyle;
}                                   
};
//将新样式设置为特征
newVectorSource.getFeatures()[i].setStyle(featureStyleFunction);
}
});

编辑缓存样式

let styleCache={};
设newVectorLayerCluster=newVectorLayer({
资料来源:新集群({
距离:100,
来源:newVectorSource,
geometryFunction:(功能)=>{
让resolution=this.map.getView().getResolution();
如果(分辨率>10){
让type=feature.getGeometry().getType();
如果(类型==‘多边形’){
返回feature.getGeometry().getInteriorPoint();
}else if(类型==='LineString'){
返回feature.getGeometry().getCoordinateAt(0.5);
}
}
}
}),
样式:(特征)=>{
让size=feature.get('features').length;
let style=styleCache[size];
如果(!样式){
样式=新样式({
图片:新圆环样式({
半径:10,
笔划:新笔划({
颜色:“#fff”,
}),
填充:新填充({
颜色:“#3399CC”,
}),
}),
文本:新文本({
text:size.toString(),
填充:新填充({
颜色:“#fff”,
}),
})
});
styleCache[size]=样式;
}
回归风格;
},
名称:图层['layer_id'],
可见:假
});

文档和链接问题所指的geometryFunction是群集源代码中的一个选项

source: new Cluster({
    distance: 50,
    source: newVectorSource,
    geometryFunction: function(feature) {
        let type = feature.getGeometry().getType();
        if (type === 'Polygon') {
            return feature.getGeometry().getInteriorPoint();
        } else if (type === 'LineString') {
            return feature.getGeometry().getCoordinateAt(0.5);
        }
    },
}),

线串的中点(标签点)可能比扩展数据块中心更方便

谢谢,这解决了断言问题,但几何图形将转换为点,而与缩放级别无关。如果我尝试将前面提到的
featureStyleFunction
实现到
VectorLayer
,缩放方案会起作用,并且我可以在
分辨率
>10后看到几何体,但点和簇会在缩小时消失。如果能够保持特征的原始样式,而不定义新的样式(笔划和填充),那就太好了。我试图创建一个函数来获取
feature.getStyleFunction()(feature,resolution)
,但没有成功。我更新了问题。簇源仅适用于点几何体,因此您将需要两个层,一个是直接用于线串和多边形的newVectorSource,另一个是簇层