Openlayers 2. z轴和select控件
Openlayers 2. z-axis and select control
我有几个矢量图层,一个是多边形,一个是直线。我们需要向附加到多边形的线层添加线(数据库程序需要多边形 ID,这些 ID 存储在多边形的属性中)
所以我在 lineLayer 上有一个 drawFeature 控件,在 polygonLayer 上有一个 selectFeature(它在悬停时存储 ID,而不仅仅是选择)。它实际上工作得很好,除了 linelayer 的 z 轴在添加时较低,所以它显示了在多边形下绘制的新线。宁愿让线显示在多边形上。我知道这是因为当 selectFeature 控件处于活动状态时,它会将多边形图层的 z-index 设置为高于 lineLayer。
我使用 lineLayer.setZIndex(800) 或其他方式手动将 linelayer 的 z-index 设置为高于多边形层,这肯定会使新线绘制在多边形上,但是 selectFeature 事件不会触发。
我已经考虑了几种解决方案,包括将 drawFeature 添加到我的多边形层,然后在完成后将特征移动到线层,但它仍在多边形下渲染,我什至在 "temporary" 样式上玩过 graphicZIndex多边形图层上的样式图。无济于事(我确实在多边形层上将 renderOptions zindexing 设置为 true)
我可能从错误的角度处理了这个问题,所以我愿意接受建议。如果矢量图层上有类似 getFeatureByPosition(position) 的函数,我可以在 sketchStarted 和 sketchEnded 事件上获取位置并查询它,但到目前为止我找不到类似的东西。
我现在不在我的开发箱中,以免有人想知道为什么没有代码。想 post 从工作中做到这一点,但基础网络在显示登录页面时遇到问题(我认为是由于 ssl)
所以我的解决方案需要一些东西。首先我需要从 OL 2.10 升级到最新的 2.13.1。这主要是由于需要添加到 2.11(我认为或者可能是 2.12)的新事件,该事件是 "featureover",可以在地图级别捕获,因此会在所有图层上触发,所以我不是与 select 的 Z-Index 战斗。我从多边形图层中删除了 select 控件,因为它不需要。
var featureOverHandler = function(event){
if (event.feature.layer.id == polygonLayer.id) {
selectedPolygonId = event.feature.attributes.POLYGON_ID;
console.log("Selected Polygon Id: " + selectedPolygonId);
map.events.unregister('featureover',map,featureOverHandler);
map.events.register('featureout',map,featureOutHandler);
}
};
var featureOutHandler = function (event) {
if (event.feature.layer.id == polygonLayer.id) {
selectedPolygonId = 0;
console.log("Cleared Selected Polygon ID ");
map.events.unregister('featureout', map, featureOutHandler);
map.events.register('featureover', map, featureOverHandler);
}
};
这些将捕获当前悬停的多边形。但后来我添加了事件来捕捉线条的开始和结束位置。从 2.11 开始,他们改变了 "sketchstarted" 事件的工作方式,您不能再使用它来捕获添加第一个点时指针位于哪个多边形上。我在矢量图层上使用了点回调。
var vDrawOptions = {
callbacks: {
"point": function (p) {
if (p.parent.components.length == 2) {
console.log("First Point added");
startingPolygonId = selectedPolygonId;
}
}
}
}
vectorAddControl = new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Path,vDrawOptions);
但是,"skecthcomplete" 仍可用于捕获终点(以及多边形)
function vSketchComplete(evt) {
endingPolygonId = selectedPolygonId;
};
vectorLayer.events.register('sketchcomplete', vectorLayer, vSketchComplete);
希望这对处于类似情况的其他人有所帮助。
我有几个矢量图层,一个是多边形,一个是直线。我们需要向附加到多边形的线层添加线(数据库程序需要多边形 ID,这些 ID 存储在多边形的属性中)
所以我在 lineLayer 上有一个 drawFeature 控件,在 polygonLayer 上有一个 selectFeature(它在悬停时存储 ID,而不仅仅是选择)。它实际上工作得很好,除了 linelayer 的 z 轴在添加时较低,所以它显示了在多边形下绘制的新线。宁愿让线显示在多边形上。我知道这是因为当 selectFeature 控件处于活动状态时,它会将多边形图层的 z-index 设置为高于 lineLayer。 我使用 lineLayer.setZIndex(800) 或其他方式手动将 linelayer 的 z-index 设置为高于多边形层,这肯定会使新线绘制在多边形上,但是 selectFeature 事件不会触发。 我已经考虑了几种解决方案,包括将 drawFeature 添加到我的多边形层,然后在完成后将特征移动到线层,但它仍在多边形下渲染,我什至在 "temporary" 样式上玩过 graphicZIndex多边形图层上的样式图。无济于事(我确实在多边形层上将 renderOptions zindexing 设置为 true)
我可能从错误的角度处理了这个问题,所以我愿意接受建议。如果矢量图层上有类似 getFeatureByPosition(position) 的函数,我可以在 sketchStarted 和 sketchEnded 事件上获取位置并查询它,但到目前为止我找不到类似的东西。
我现在不在我的开发箱中,以免有人想知道为什么没有代码。想 post 从工作中做到这一点,但基础网络在显示登录页面时遇到问题(我认为是由于 ssl)
所以我的解决方案需要一些东西。首先我需要从 OL 2.10 升级到最新的 2.13.1。这主要是由于需要添加到 2.11(我认为或者可能是 2.12)的新事件,该事件是 "featureover",可以在地图级别捕获,因此会在所有图层上触发,所以我不是与 select 的 Z-Index 战斗。我从多边形图层中删除了 select 控件,因为它不需要。
var featureOverHandler = function(event){
if (event.feature.layer.id == polygonLayer.id) {
selectedPolygonId = event.feature.attributes.POLYGON_ID;
console.log("Selected Polygon Id: " + selectedPolygonId);
map.events.unregister('featureover',map,featureOverHandler);
map.events.register('featureout',map,featureOutHandler);
}
};
var featureOutHandler = function (event) {
if (event.feature.layer.id == polygonLayer.id) {
selectedPolygonId = 0;
console.log("Cleared Selected Polygon ID ");
map.events.unregister('featureout', map, featureOutHandler);
map.events.register('featureover', map, featureOverHandler);
}
};
这些将捕获当前悬停的多边形。但后来我添加了事件来捕捉线条的开始和结束位置。从 2.11 开始,他们改变了 "sketchstarted" 事件的工作方式,您不能再使用它来捕获添加第一个点时指针位于哪个多边形上。我在矢量图层上使用了点回调。
var vDrawOptions = {
callbacks: {
"point": function (p) {
if (p.parent.components.length == 2) {
console.log("First Point added");
startingPolygonId = selectedPolygonId;
}
}
}
}
vectorAddControl = new OpenLayers.Control.DrawFeature(vectorLayer, OpenLayers.Handler.Path,vDrawOptions);
但是,"skecthcomplete" 仍可用于捕获终点(以及多边形)
function vSketchComplete(evt) {
endingPolygonId = selectedPolygonId;
};
vectorLayer.events.register('sketchcomplete', vectorLayer, vSketchComplete);
希望这对处于类似情况的其他人有所帮助。