我在火狐上有一个性能问题,在OpenLayers中有一个相当大的GML向量层(加拿大宽)。我的网站是JavaScript/PHP。该层的创建方式如下:
map.addLayer(new OpenLayers.Layer.Vector(openlayers_gml_layer_canada_bv, {
strategies: [ new OpenLayers.Strategy.Fixed()],
protocol: new OpenLayers.Protocol.HTTP({
url: "./images/GML/BV - Canada.gml",
format: gml_format
}),
styleMap: RegionsStyles,
visibility: false
}));我检查了everywhere,并给出了在何处添加这一行以选择呈现的解决方案:
OpenLayers.Layer.Vector.prototype.renderers = ["SVG2", "VML", "Canvas"];它可以帮助拖拽时的拖拽,但当我放手的时候,它的负载持续3-5秒(所以它落后了一个又一个,而不是一直落后,但它仍然落后了很多)。
另一个回答是,要么简化向量,要么用GeoServers处理OpenLayers外部的tiles。
如果可能的话,我想简化我的向量,但是我不知道如何正确地实现OpenLayers所拥有的简化方法。你知道如何简化我的图层吗?
我的代码(map.addLayer.)在一个函数中,我添加了所有的向量映射。其他人并不落后,因为他们要简单得多。有简单的方法吗?我是否必须在我的特性中循环以简化每个特性?如果是,在实际将其加载到地图上之前,我如何转换我的功能(这样它就不会滞后)?
如果我可以根据缩放级别简化地图,那就太完美了。因此,如果它离我很远(如果我看到了整个加拿大),我希望这个层更简单,如果我放大(因为我会在屏幕上有更少的向量,并且在某个时候它完全停止滞后)。
非常感谢大家。我希望我的问题很清楚。
发布于 2014-07-02 18:43:17
在OpenLayers中有一个基于Douglas算法的简化函数,您可以在OpenLayer.Geometry.Linestring.js中看到源代码,这里有一个非常好的动画例子。 --公差决定了简化的程度--您将不得不为您的用例进行实验。
这方面的问题是,您仍然必须加载整个GML文件,我怀疑这可能是大多数滞后的地方(而不是实际呈现它)。但是,如果您使用OpenLayers.Format.GML或使用固定策略加载它一次,就像您所做的那样,简化它,然后只显示新的简化版本,那么当您使用pan时不会出现这样的滞后。由于您仍然有原来的加载,这应该是一个简单的事情,切换版本,具有较高或较低的容忍度,因为你放大或缩小。请注意,简化工作在线字符串上,而不是多边形上,但是您可以通过从构成多边形的点数组构造线串来解决这个问题。
var GML= <some gml file>;
//convert gml to OpenLayers.Feature.Vector
var reader=new OpenLayers.Format.GML();
var feat=reader.read(polygon);
//get initial points from feature's geometry and set target points (eg, 2000 here).
var num_points=feat.geometry.components[0].components.length;
var target_points=2000;
//set simplification tolerance to one meter initially
var tolerance=1;
//convert feature's geometry to linestring
var linestring=new OpenLayers.Geometry.LineString(feat.geometry.components[0].components);
var simplified_linestring;
//simplify linestring until target points reached
while(target_points<num_points){
simplified_linestring=linestring.simplify(tolerance);
num_points=simplified_linestring.components.length;
tolerance+=1;
}
//create new geometry from simplified linestring
var geom=new OpenLayers.Geometry.Polygon(new OpenLayers.Geometry.LinearRing(simplified_linestring.components));如果GML中有许多多边形,则必须执行一个循环,上限为feature.geometry.components.lengh。
另一种选择是使用Postgis这样的方法为您简化,这样您就不会在有线上传输那么多数据了。但是,如果在一定的缩放级别上你真的想要完整的多边形,这不会有什么帮助。
我不太确定Geoserver在这种情况下会有什么帮助,因为它更多地用于以各种栅格和矢量格式传输数据,除非您讨论的是将GML呈现为WMS,然后提供光栅表示。
https://stackoverflow.com/questions/24536210
复制相似问题