我正在尝试使用 OpenLayers JavaScript 库将多个 KML 文件加载到 map 中。我可以毫无问题地加载所有 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(layer) 我就可以看到一切。但是,对于以下行,尽管信息明确存在,但我收到错误。另外,当我尝试直接通过控制台访问相同的信息时,它工作得很好。
我在这里遗漏了一些明显的东西吗?
编辑:
这是根对象
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...
最佳答案
如果您正确遵循属性的路径,您应该能够看到这些属性。您的完整表达式是layer.features[0].attributes.name
。到目前为止您发布的内容告诉我们 layer.features
和 layer.features[0]
部分是正确的,但我们必须知道 中的内容>layer.features[0]
来了解它是否具有 attributes
属性等
值得注意的一件事是 attributes
是复数,然后您可以直接访问它的属性。复数表明它可能是一个数组,所以也许您需要查看下标?
对于这个东西,我发现没有什么比调试器更好的了。您可以深入了解层对象并准确找出其中的内容,通常当您这样做时,您甚至可以看到到达已扩展点的路径。每个主要浏览器都有调试器:
- Chrome 和 Safari 内置了“开发工具”(在 Chrome 上按 Ctrl+Shift+I 将打开该面板)
- Firefox 具有出色的 Firebug插件
- IE 有免费版 Visual Studio.Net (IE8及以上版本也有一些内置工具)
编辑:更新问题的这部分很有趣:
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]);
}
关于JavaScript 控制台可以看到对象的内容,但我无法访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4072211/