第一个问题的答案是。您正在使用具有非常普通配置的OL。您可以使用一些技巧来提高性能,我将在后面介绍。
问题2的答案可能是(特别是在牢度方面)。您可以在该站点上搜索替代列表(现在想到的是Leaflet)。
问题3的答案:首先进行测量:
我编辑了该应用程序的本地副本,以便在Vector图层的选项列表中显式指定渲染器。在测试过程中,我将省略Canvas渲染器,然后将页面实验重新加载到另一页面:
var pts = new OpenLayers.Layer.Vector("Points", {renderers: ["Canvas", "SVG", "VML"]});
我在重绘函数中添加了一个计时器,以便打印出花费了多少绘图时间:
function redraw() {
var start = (new Date).getTime();
[...]
var diff = (new Date).getTime() - start;
console.log("redraw completed in "+diff+"ms");
之后,我尝试在OSX SL上的Chrome 17和Firefox 8.0.1上运行几次,并绘制了1000和5000个功能。令我惊讶的是,SVG渲染器平均比Canvas渲染器快20%!(注意:在Windows js上,时间不如在OSX中精确,因此结果可能不太一致)。
这个和你所说的
问题是地图互动
,恕我直言,告诉我们热点是在特征的Vector处理中。在开发我的应用程序时,我最近对其进行了研究,并决定对其进行子类化,然后将其删除所有对简单点没有用的复杂代码。诚然,我变得非常疯狂,甚至删除了对OpenLayers.Geometry.Point的依赖,我的版本现在可以在具有x,y属性的简单js对象上使用。
您的选择按收益/成本的先后顺序排列:
第一种选择是通过在向量层上配置策略选项来过滤服务器端的可见点,如下所示:
strategies: [new OpenLayers.Strategy.Refresh({force:true}), new OpenLayers.Strategy.BBOX({ratio:2, resFactor: 3})],
这样,当您放大绘制在客户端的功能部件的数量时,将仅限于在那个范围内可见的功能部件,而不是全部。
第二种选择是,您可以考虑编写自定义的Vector / Renderer。自定义,剥离下来的一个例子,更快的实现可我github上页这里。虽然不适合所有用途,但应该足以使我大致了解所建议的内容。
当用户完全缩小时,第三种选择是实现某种功能的服务器端群集,以便将闭合点合并为一个,从而再次减少绘制的功能。