Openlayers 3 无法获取要素坐标,因此我可以获取其最近的要素

Openlayers 3 无法获取要素坐标,因此我可以获取其最近的要素,openlayers-3,Openlayers 3,我在Openlayers 3.9.0中有一个向量层。Geoserver从PostGIS获取数据,我用ol.source.Vector抓取图层 返回数据的GeoJSON格式为 {"type":"FeatureCollection","totalFeatures":422,"features": [{"type":"Feature","id":"myLayer.709","geometry":{"type":"Point","coordinates": [2391735.8907621,46

我在Openlayers 3.9.0中有一个向量层。Geoserver从PostGIS获取数据,我用
ol.source.Vector
抓取图层

返回数据的GeoJSON格式为

    {"type":"FeatureCollection","totalFeatures":422,"features":
[{"type":"Feature","id":"myLayer.709","geometry":{"type":"Point","coordinates":
[2391735.8907621,4695330.8039257005]},"geometry_name":"myLayer_geom","properties"
:{"myLayer_name":"Hello"....next feature
所以我通过它的ID得到第一个特征,并根据它的坐标找到它最近的特征。这是我的密码

var bb = (sourceVector.getFeatureById('myLayer.709')).getCoordinates()
var aa = getClosestFeatureToCoordinate(bb);
console.log(aa);
我获取
无法读取null的属性“getCoordinates”
错误

为什么呢?我错过了什么

此外,的API意味着id必须是一个数字,但在我的例子中是一个字符串(
myLayer.709
)。另一方面,可以获取字符串作为ID,并且可以在数据读取期间设置ID

编辑

这是全部代码(层切换器模块)

更新

在控制台中,如果我点击
map.getLayers()
我会得到向量层和包含所有特性的
idIndex\uz
数组(也是709)。但是在我的代码中,如果我执行
var cc=sourceVector.getFeatures();控制台日志(cc)我得到了
[]
,只有两个空括号。这是否意味着在我尝试通过ID获取一个功能之前,没有加载这些功能

更新2 如果我移除

var bb=sourceVector.getFeatureById('mylayer.709').getGeometry().getCoordinates();
var aa = sourceVector.getClosestFeatureToCoordinate(bb);
console.log(aa); 
并将其放入读取特性的响应函数中,在wfs请求之后,它就可以工作了

.done(      
function(response) {
var geojsonFormat = new ol.format.GeoJSON({});
sourceVector.addFeatures(geojsonFormat.readFeatures(response,{dataProjection :projection,featureProjection : projection}));

    //-------------add the following

    var bb=sourceVector.getFeatureById('mylayer.709').getGeometry().getCoordinates();
    var aa = sourceVector.getClosestFeatureToCoordinate(bb);
    console.log(aa); 
                        })
这是否意味着这是我唯一的选择?为什么我不能设置矢量图层、获取要素、设置地图和访问要素?在一个真实的场景中,在所有加载完成后,用户选择一个随机的特征并靠近它。不可能知道id。在阅读功能时玩这些功能既不实用也没有意义。有什么想法吗

谢谢

应该是:

var bb = (sourceVector.getFeatureById('myLayer.709'))
    .getGeometry().getCoordinates();
var aa = sourceVector.getClosestFeatureToCoordinate(bb);
console.log(aa);
ol.Feature#id
始终()作为字符串处理

更新-

阅读json功能时,请告诉OL3:

var features = new ol.format.GeoJSON().readFeatures(geojsonObject, {
    dataProjection: 'EPSG:3857',
    featureProjection: 'EPSG:3857'
});

是的,Jonatas Walker是对的,我必须等待Ajax完成加载向量层上的所有功能,然后才能使用这些功能

因此,为了知道Ajax何时完成,我保留了与OP中相同的代码,但我添加了

       function(response) {
                    var geojsonFormat = new ol.format.GeoJSON({});
                    sourceVector.addFeatures(geojsonFormat.readFeatures(response,{dataProjection : projection,featureProjection : projection}));
                    ww();//<---added this to the existing response function
                })
用这个

 function ww(){
    var rr = sourceVector.getFeatureById('mylayer.709').getGeometry().getCoordinates();
    var hh = sourceVector.getClosestFeatureToCoordinate(rr);
    console.log("The name of the closest feature is : "+hh.get("mylayer_name"));
    }
但是,
mylayer.709
是一个要点。因此,如果地图也有直线和多边形,用户可以单击任何特征,而您不是在寻找固定的特征(您事先不知道id)

只需在ww函数之后添加这个

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

 select.on('select', function(e) {//on every select (=click)

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

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

   //use that center (=point) to get the name of the closest feature
   console.log((sourceVector.getClosestFeatureToCoordinate(oo)).get("mylayer_name")) ;
 });
编辑

我道歉。结果发现有一个bug。在这种情况下

如果我单击多边形,我会得到最近特征的名称,但是如果我单击点,我会得到该点的名称,因此如果我单击“testpoint9”,我会得到“testpoint9”,但我应该得到“8”或“u”或“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 of closest : "+sourceVector.getClosestFeatureToCoordinate(oo).get('mylayer_name'));

但还是一样的错误。有什么建议吗?谢谢你的宝贵意见。但是现在我得到了
uncaughttypeerror:无法读取null的属性“getGeometry”
error。似乎我无法正确获取该功能,但我知道它在那里,我在地图上看到它,在我的
wfs
请求中没有错误。我看不出问题所在。有什么建议吗?感谢在我的加载程序中我已经
.done(函数(响应){var geojsonFormat=new ol.format.GeoJSON({});sourceVector.addFeatures(geojsonFormat.readFeatures(响应,{dataProjection:projection,featureProjection:projection});}
var projection=ol.proj.get('EPSG:3857');
。我在控制台中看到所有层,它们都已正确加载。如果我删除引号并像
var bb=sourceVector.getFeatureById(myLayer.709).getGeometry().getCoordinates();
我在参数列表后得到
未捕获的语法错误:缺失)
引用该行。并且没有在地图上渲染的图层。很抱歉再次询问您,但我看不出错误。谢谢,我不会删除引号,但我仍然得到
未捕获的TypeError:cannotreadproperty'getGeometry'为null
。仍在寻找解决方案。创建一个小提琴!!或者用我的叉子。很高兴看到你的成功。@JonatasWalker嘿,我刚发现一个bug,我想你也应该检查一下。
 var select = new ol.interaction.Select();//simple click interaction
 map.addInteraction(select);//add it to the map

 select.on('select', function(e) {//on every select (=click)

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

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

   //use that center (=point) to get the name of the closest feature
   console.log((sourceVector.getClosestFeatureToCoordinate(oo)).get("mylayer_name")) ;
 });
    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 of closest : "+sourceVector.getClosestFeatureToCoordinate(oo).get('mylayer_name'));