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