首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过放大OpenLayers简化GML矢量层?

如何通过放大OpenLayers简化GML矢量层?
EN

Stack Overflow用户
提问于 2014-07-02 16:18:04
回答 1查看 1.2K关注 0票数 1

我在火狐上有一个性能问题,在OpenLayers中有一个相当大的GML向量层(加拿大宽)。我的网站是JavaScript/PHP。该层的创建方式如下:

代码语言:javascript
复制
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,并给出了在何处添加这一行以选择呈现的解决方案:

代码语言:javascript
复制
OpenLayers.Layer.Vector.prototype.renderers = ["SVG2", "VML", "Canvas"];

它可以帮助拖拽时的拖拽,但当我放手的时候,它的负载持续3-5秒(所以它落后了一个又一个,而不是一直落后,但它仍然落后了很多)。

另一个回答是,要么简化向量,要么用GeoServers处理OpenLayers外部的tiles。

如果可能的话,我想简化我的向量,但是我不知道如何正确地实现OpenLayers所拥有的简化方法。你知道如何简化我的图层吗?

我的代码(map.addLayer.)在一个函数中,我添加了所有的向量映射。其他人并不落后,因为他们要简单得多。有简单的方法吗?我是否必须在我的特性中循环以简化每个特性?如果是,在实际将其加载到地图上之前,我如何转换我的功能(这样它就不会滞后)?

如果我可以根据缩放级别简化地图,那就太完美了。因此,如果它离我很远(如果我看到了整个加拿大),我希望这个层更简单,如果我放大(因为我会在屏幕上有更少的向量,并且在某个时候它完全停止滞后)。

非常感谢大家。我希望我的问题很清楚。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-02 18:43:17

在OpenLayers中有一个基于Douglas算法的简化函数,您可以在OpenLayer.Geometry.Linestring.js中看到源代码,这里有一个非常好的动画例子。 --公差决定了简化的程度--您将不得不为您的用例进行实验。

这方面的问题是,您仍然必须加载整个GML文件,我怀疑这可能是大多数滞后的地方(而不是实际呈现它)。但是,如果您使用OpenLayers.Format.GML或使用固定策略加载它一次,就像您所做的那样,简化它,然后只显示新的简化版本,那么当您使用pan时不会出现这样的滞后。由于您仍然有原来的加载,这应该是一个简单的事情,切换版本,具有较高或较低的容忍度,因为你放大或缩小。请注意,简化工作在线字符串上,而不是多边形上,但是您可以通过从构成多边形的点数组构造线串来解决这个问题。

代码语言:javascript
复制
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,然后提供光栅表示。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24536210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档