getClosestFeatureToCoordinate不适用于Points

时间:2015-10-27 14:31:34

标签: openlayers-3

我做了一个函数来获得单击的特征。我使用Openlayers 3.9.0和getClosestFeatureToCoordinate方法。

var select = new ol.interaction.Select();//simple click interaction
 map.addInteraction(select);//add it to the map

 select.on('select', function(e) {

   //get the extent of the first selected feature 
    var aa = e.selected[0].getGeometry().getExtent();

   //in case of line or polygon get the center of that extent 
    var oo = ol.extent.getCenter(aa);

   //use it to get the name of the closest feature
   console.log((sourceVector.getClosestFeatureToCoordinate(oo)).get("mylayer_name")) ;
 });

但是在以下情况下

enter image description here

如果我点击“你”多边形(自下而上)我会得到“你”,而不是说“e” 如果我点击任何一点我得到它的名字,而不是最近的特征名称。我点击“testpoint9”,我得到“testpoint9”而不是“u”或“e”。我点击“h”然后我得到“h”而不是“p”或“k”。

所以可能与点有关,所以我将select.on事件函数更改为

select.on('select', function(e) {
    var closestType = e.selected[0].getGeometry().getType();
    var oo;
    if (closestType === 'Point'){
        oo = e.selected[0].getGeometry().getCoordinates();
    }
    else{
        var aa = e.selected[0].getGeometry().getExtent();
        oo = ol.extent.getCenter(aa);
    }

    console.log("---------------------------------------------------");
    console.log("Name: "+sourceVector.getClosestFeatureToCoordinate(oo).get('mylayer_name'));
})

仍然没有。那么,我如何解决这个问题呢?

由于

1 个答案:

答案 0 :(得分:0)

当您点击" u" polygon - 到它的距离是0。 当你点击某些东西时 - 那东西总是最接近(对自己)。 您可以在那里做的是从图层中删除单击的元素,运行算法(没有单击点)并将点放回图层。 如果你担心这个点可能会长时间不可见(但它不应该),那么在算法时将它放在另一个层中。

    select.on('select', function(e) {
        var clicked = e.selected[0];
        sourceVector.removeFeature(clicked);
        var closest = sourceVector.getClosestFeatureToCoordinate(e.coordinate);
        sourceVector.addFeature(clicked);
        var closestType = closest.getType();
        if (closestType === 'Point'){
            oo = e.selected[0].getGeometry().getCoordinates();
        }
        else{
            var aa = e.selected[0].getGeometry().getExtent();
            oo = ol.extent.getCenter(aa);
        }
    })