如何在开放图层中访问 kml 中的嵌套标签

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

本文关键字:访问 kml 嵌套 标签 图层      更新时间:2023-09-26

我正在尝试修改地震集群图以显示我自己的一些数据。 我在使用 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"(",该功能返回"name"标签内的内容。 我以为调用".get("扩展数据"("会返回"扩展数据"标签的内容,但是当我尝试将其打印到控制台时,它似乎没有返回任何内容。 甚至在将变量 extendedData 转换为字符串之前将其记录到控制台日志"未定义"。

我想我要问的是,在尝试访问这些值时,如何向下钻取到嵌套标签?

好吧,显然我已经以某种方式过度复杂化了,但我对我现在如何让它工作感到困惑。 似乎只是打电话

var wellDepth = feature.get("TotalDep")

返回此标记中包含的值:

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

我想".get(("函数会搜索标签名称和标签属性吗?并且还查看嵌套标签?这是一些直接的魔法在这里发生...我从极度沮丧到对此印象深刻。

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