如何在 openlayers 中访问 kml 中的嵌套标签?

How do I access a nested tag in a kml in openlayers?

我正在尝试修改 earthquake cluster map 以显示我自己的一些数据。在使用我的 KML 中的属性设置样式时,我 运行 遇到了问题。这是我的 KML 中的示例地图项:

<Placemark>
    <name>REIERSTAD 2 ORION DW 16-2-7-6</name>
    <ExtendedData><SchemaData schemaUrl="#alberta_wells">
        <SimpleData name="UWI">F2/16-02-007-06W4/0</SimpleData>
        <SimpleData name="KeyList">0074060216F20</SimpleData>
        <SimpleData name="Field">0998</SimpleData>
        <SimpleData name="Pool">0158098</SimpleData>
        <SimpleData name="OSDep">0000000</SimpleData>
        <SimpleData name="LicStatus">Issued</SimpleData>
        <SimpleData name="License">0043029</SimpleData>
        <SimpleData name="LicDate">19720719</SimpleData>
        <SimpleData name="Licensee">0FF30</SimpleData>
        <SimpleData name="FDDate">19720719</SimpleData>
        <SimpleData name="TotalDep">0457.00</SimpleData>
        <SimpleData name="WellStat">0600080000</SimpleData>
        <SimpleData name="StatDate">19720721</SimpleData>
    </SchemaData></ExtendedData>
      <Point><coordinates>-110.707313,49.537234</coordinates></Point>
  </Placemark>

下面是地震集群示例中处理各个特征样式的片段:

function createEarthquakeStyle(feature) {
        // 2012_Earthquakes_Mag5.kml stores the magnitude of each earthquake in a
        // standards-violating <magnitude> tag in each Placemark.  We extract it
        // from the Placemark's name instead.
        var name = feature.get('name');
        var magnitude = parseFloat(name.substr(2));
        var radius = 5 + 20 * (magnitude - 5);

        return new ol.style.Style({
          geometry: feature.getGeometry(),
          image: new ol.style.RegularShape({
            radius1: radius,
            radius2: 3,
            points: 5,
            angle: Math.PI,
            fill: earthquakeFill,
            stroke: earthquakeStroke
          })
        });
      }

我想使用 "TotalDep" 值作为我的半径,替换示例当前使用的值(幅度)。但是,我的 KML 将这个 "TotalDep" 值隐藏在多个标签中。我一直在尝试使用 DOMParser 来提取此值,如下所示:

function createEarthquakeStyle(feature) {
  var extendedData = feature.get('ExtendedData');
  console.log(extendedData)
  xmlDoc = parser.parseFromString(extendedData, "text/xml")
  console.log(xmlDoc)
  var wellDepth
  var nodeList = xmlDoc.getElementsByTagName("SimpleData")
  for (var i = 0; i < nodeList.length; i++) {
    if (nodeList[i].getAttribute("name") == "TotalDep") {
      wellDepth = parseFloat(nodeList[i].nodeValue)
    }
  }
  var radius = wellDepth / 10.0;

  return new ol.style.Style({
    geometry: feature.getGeometry(),
    image: new ol.style.RegularShape({
      radius1: radius,
      radius2: 3,
      points: 5,
      angle: Math.PI,
      fill: earthquakeFill,
      stroke: earthquakeStroke
    })
  });
}

它不起作用,一旦您放大到足以将聚类折叠为单个特征,特征将不会显示。

我看到在原始示例中,“.get("name")”在输入特征上被调用,return是 "name" 标签内的内容。我以为调用“.get("ExtendedData")”会 return "ExtendedData" 标签的内容,但是当我尝试打印它时它似乎 return 什么都没有安慰。甚至在将变量 extendedData 记录到控制台日志之前将其转换为 String "undefined".

我想我想问的是在尝试访问这些值时如何深入到嵌套标签?

好吧,很明显我在某种程度上把它复杂化了,但我对我现在如何让它工作感到困惑。似乎只是调用

var wellDepth = feature.get("TotalDep")

returns 该标签中包含的值:

<SimpleData name="TotalDep">0457.00</SimpleData>

我猜“.get()”函数会同时搜索标签名称和标签属性?还查看嵌套标签?这是这里发生的一些直截了当的巫术......我从非常沮丧到对此印象深刻。

对于可能在编写样式函数时拼命搜索如何从 KML 访问属性的任何人来说,最后一个提示是:尝试调用 feature.getKeys() 并将其记录到控制台。您将获得使用 feature.get() 可以访问的所有可能内容的列表。我就是这么想出来的。