我正在尝试使用OpenLayers JavaScript库将大量KML文件加载到地图中。我可以毫无问题地加载所有KML,但现在在尝试从正在生成的OpenLayers.Layer.Vector对象中检索数据时,我遇到了一个问题。
如果我使用console.log输出生成的对象,我可以看到完整的对象,其中所有属性都被充实,但如果我尝试以编程方式访问大多数属性,我将收到一个未定义的错误。这是我的代码:
map = new OpenLayers.Map("mapdiv");
map.addLayer(new OpenLayers.Layer.OSM());
var vectors = new Array();
for(i = 1; i <= 14; i++ ) {
var layer = new OpenLayers.Layer.Vector("KML", {
strategies: [new OpenLayers.Strategy.Fixed()],
protocol: new OpenLayers.Protocol.HTTP({
url: "kml/" + i + ".kml",
format: new OpenLayers.Format.KML
})
});
console.log(layer);
console.log(layer.features[0].attributes.name);
vectors.push(layer);
}
//etc...
所以只用console.log(图层)我就可以看到一切。但是,使用以下行,尽管信息明确存在,但我收到错误。此外,当我尝试通过控制台直接访问相同的信息时,它可以正常工作。
我错过了一些明显的东西吗?
编辑:
这是根对象
Object:
EVENT_TYPES: Array[25]
alwaysInRange: true
div: HTMLDivElement
drawn: true
events: Object
features: Array[1]
id: "OpenLayers.Layer.Vector_39"
inRange: true
map: Object
maxExtent: Object
maxResolution: 1.40625
maxScale: 13517.573318481445
minExtent: null
minResolution: 0.00004291534423828125
minScale: 442943842.5
name: "KML"
numZoomLevels: 16
options: Object
projection: Object
protocol: Object
renderer: Object
resolutions: Array[16]
scales: Array[16]
selectedFeatures: Array[0]
strategies: Array[1]
styleMap: Object
tileSize: Object
units: "degrees"
unrenderedFeatures: Object
__proto__: Object
编辑2:
无法轻松识别字符串,所以这里有一些相关信息:
里面的“功能”:
0: Object
length: 1
__proto__: Array[0]
id: "OpenLayers.Layer.Vector_39"
在“0”内:
attributes: Object
data: Object
geometry: Object
id: "OpenLayers.Feature.Vector_3508"
layer: Object
lonlat: null
renderIntent: "default"
state: null
style: null
inRange: true
在“属性”中:
name: <string, which I can assure you exists>
为了澄清我尝试在我的代码中使用的“layer.features [0] .attributes.name”在我输入控制台时非常正常。
编辑3!
通过控制台直接访问的输出层:
1) layer -> Object
2) layer.features -> Object
3) layer.features[0] -> Object
4) layer.features[0].attributes -> Object
5) layer.features[0].attributes.name -> <the string I'm looking for>
OR
6) layer.features[0].attributes['name'] works the same as above
来自硬编码脚本的输出:
1) layer -> Object
2) layer.features -> []
3) layer.features[0] -> undefined
etc...
答案 0 :(得分:1)
如果你正确地遵循它们的路径,你应该能够看到属性。您的完整表达是layer.features[0].attributes.name
。到目前为止您发布的内容告诉我们layer.features
和layer.features[0]
部分是正确的,但我们必须知道layer.features[0]
中的内容是否有attributes
}属性等。
跳出来的一件事是attributes
是复数,然后你直接访问它上面的一个属性。复数建议它可能是一个数组,所以你可能需要查看一个下标?
对于这些东西,我发现没有什么比调试器好。您可以在layer
对象中使用一个向下钻取并找出其中的确切内容,通常当您这样做时,您甚至可以看到您已扩展到的点的路径。每个主要浏览器都有调试器:
修改:此部分更新的问题很有趣:
2)
layer.features -> []
3)layer.features[0] -> undefined
这表明A)features
是一个空数组,或者B)features
是一个稀疏数组,它没有索引0
。所有JavaScript数组都是稀疏的(它们根本就不是数组),所以你可以尝试:
var name;
for (name in layer.features) {
console.log(name + ": " + layer.features[name]);
}
答案 1 :(得分:0)
您需要研究对象的格式。这还有很长的路要走,但试试这个:
console.log(layer.features);
console.log(layer.features[0]);
console.log(layer.features[0].attributes);
console.log(layer.features[0].attributes.name);
在某个地方,你会收到一个错误,这会告诉你问题在哪里。在我看到您当前的日志后,我猜想attributes
或name
不存在(至少不是您认为的格式)。 (当然,为了这个,使用firebug中的下钻更好/更容易,但上面的代码片段可以帮助你开始。)