【问题标题】:How do I access a nested tag in a kml in openlayers?如何在 openlayers 中访问 kml 中的嵌套标签?
【发布时间】:2016-02-07 01:21:32
【问题描述】:

我正在尝试修改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>

这里是地震集群示例中的 sn-p,它处理单个特征的样式:

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")”会返回“ExtendedData”标签的内容,但是当我尝试将它打印到控制台时它似乎没有返回任何内容。甚至在将变量 extendedData 转换为 String 之前将其记录到控制台日志“未定义”。

我想我要问的是,当您尝试访问这些值时,如何深入了解嵌套标签?

【问题讨论】:

    标签: javascript kml openlayers-3 domparser


    【解决方案1】:

    好吧,显然我不知何故过于复杂了,但我对我现在如何让它工作感到困惑。似乎只是调用

    var wellDepth = feature.get("TotalDep")
    

    返回此标签中包含的值:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2018-12-27
      相关资源
      最近更新 更多