【问题标题】:GeoXML3 accessing KML attribute datasGeoXML3 访问 KML 属性数据
【发布时间】:2017-02-28 18:24:00
【问题描述】:

我的 KML 文件格式如下:

<Placemark>
<Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
<ExtendedData><SchemaData schemaUrl="#seb">
    <SimpleData name="PR0">CORS</SimpleData>
    <SimpleData name="PR1">BRB</SimpleData>
    <SimpleData name="PR2">F15</SimpleData>
</SchemaData></ExtendedData>
  <MultiGeometry><Polygon><altitudeMode>clampToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>clampToGround</altitudeMode><coordinates>71.0035714700001,38.4757616580001 71.0567352510001,38.398144523 71.1035044220001,38.422803406000138.4764993150001 71.0035714700001,38.4757616580001</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry>

我希望能够从 kml 访问扩展数据字段,我将使用这些字段进一步处理和索引多边形以供以后使用和搜索。

正如这篇文章所述,可以从 placemark.vars.val 访问变量,但由于 vars 未定义,我无法获取。

Load kml extendeddata into variable with Geoxml3

【问题讨论】:

    标签: javascript xml kml geoxml3


    【解决方案1】:

    目前geoxml3的kmz分支以KML Reference中定义的格式处理ExtendedData

    如果您将 KML 修改为该格式(&lt;Data&gt; 而不是 &lt;SimpleData&gt;&lt;value&gt; 值周围的标签),它将按原样工作。

    <Placemark>
      <Style>
        <LineStyle><color>ff0000ff</color><width>2</width></LineStyle>
        <PolyStyle><fill>0</fill></PolyStyle>
        <BalloonStyle>
          <text>
          <![CDATA[$[name]<br>PR0: $[PR0]<br>PR1: $[PR1]<br>PR2: $[PR2]]]>
          </text>
        </BalloonStyle>
      </Style>
      <ExtendedData>
      <SchemaData schemaUrl="#seb">
        <Data name="PR0">
          <value>CORS</value>
        </Data>
        <Data name="PR1">
          <value>BRB</value>
        </Data>
        <Data name="PR2">
          <value>F15</value>
        </Data></SchemaData>
      </ExtendedData>
      <MultiGeometry>
        <Polygon>
          <altitudeMode>clampToGround</altitudeMode>
          <outerBoundaryIs><LinearRing>
            <altitudeMode>clampToGround</altitudeMode>
            <coordinates>71.0035714700001,38.4757616580001 71.0567352510001,38.398144523 71.1035044220001,38.422803406000138.4764993150001 71.0035714700001,38.4757616580001
            </coordinates>
          </LinearRing></outerBoundaryIs>
        </Polygon>
      </MultiGeometry>
    </Placemark>
    

    proof of concept fiddle

    另一个选项是修改geoxml3 以支持您的格式中的&lt;SimpleData&gt; 标签(它是开源的)。

    代码 sn-p:

    var geocoder;
    var map;
    
    function initialize() {
      var map = new google.maps.Map(
        document.getElementById("map_canvas"), {
          center: new google.maps.LatLng(37.4419, -122.1419),
          zoom: 13,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        });
      var geoXml = new geoXML3.parser({
        map: map,
        singleInfoWindow: true
      });
      geoXml.parseKmlString(kmlStr);
    }
    google.maps.event.addDomListener(window, "load", initialize);
    var kmlStr = '<Placemark><Style><LineStyle><color>ff0000ff</color><width>2</width></LineStyle><PolyStyle><fill>0</fill></PolyStyle><BalloonStyle><text><![CDATA[$[name]<br>PR0: $[PR0]<br>PR1: $[PR1]<br>PR2: $[PR2]]]></text></BalloonStyle></Style><ExtendedData><SchemaData schemaUrl="#seb"><Data name="PR0"><value>CORS</value></Data><Data name="PR1"><value>BRB</value></Data><Data name="PR2"><value>F15</value></Data></SchemaData></ExtendedData><MultiGeometry><Polygon><altitudeMode>clampToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>clampToGround</altitudeMode><coordinates>71.0035714700001,38.4757616580001 71.0567352510001,38.398144523 71.1035044220001,38.422803406000138.4764993150001 71.0035714700001,38.4757616580001</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry></Placemark>';
    html,
    body,
    #map_canvas {
      height: 100%;
      width: 100%;
      margin: 0px;
      padding: 0px
    }
    <script src="https://maps.googleapis.com/maps/api/js"></script>
    <script src="https://cdn.rawgit.com/geocodezip/geoxml3/master/kmz/geoxml3.js"></script>
    <div id="map_canvas"></div>

    【讨论】:

      【解决方案2】:

      回复 geocodezip 回复上面...

      您的方法可行,但问题是经常生成 kml。由于&lt;SimpleData&gt; 标记的内容包含预期格式为&lt;Data&gt;&lt;value&gt;&lt;/value&gt;&lt;/Data&gt; 的文本值,因此进行您提到的更改可能有点困难。

      最好的方法是创建一个 php 或任何解析 kml 并进行更改的程序。我决定编辑 GeoXML3.js 解析器以在第 639 行查找 SimpleData 而不是 Data 标记

      var dataNodes = getElementsByTagName(extDataNodes[0], 'Data');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-26
        • 2014-03-02
        • 2013-02-09
        • 1970-01-01
        • 1970-01-01
        • 2014-02-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多