在Cesium中解析实体

时间:2018-06-14 04:29:35

标签: kml cesium

我在KML中有大约7k-8k个地标。我必须通过导入KML文件来解析cesium中的每个地标。我尝试解析dplyr数组,但由于并非所有实体都是地标,我找不到解析Cesium中所有地标实体的其他方法。

我想知道以下内容:

  1. 如何将实体分组到layer_name = 'dense_2' intermediate_layer_model = Model(inputs=model.input,outputs=model.get_layer(layer_name).output) intermediate_output_A = intermediate_layer_model.predict(data)
  2. 是否有其他方法可以访问导入KML文件时创建的所有地标实体?
  3. 我试图解析EntityCollection.values数组,发现只有在未指定数量的实体后才会出现地标。

1 个答案:

答案 0 :(得分:1)

当Cesium KmlDataSource加载KML源时,它会使KML功能的结构变得扁平化,以便容器(文档和文件夹)和地标按照它们出现的顺序作为数组添加到实体集合中。源KML。除根级容器之外的所有容器都填充在数组中。

以下是将KML源加载到Cesium并迭代实体的示例。

var url = "mykml.kml"; // source KML file path or URL
viewer.dataSources
    .add(Cesium.KmlDataSource.load(url))
    .then(
            function (kmlData) {
                parseElements(kmlData.entities)                
            }
        );

    function parseElements(entities) {      
        var e;
        var pointCount = 0;
        var values = entities.values;
        console.dir(values); // debug the array
        for (var i = 0; i < values.length; i++) {
            e = values[i];
            if (Cesium.defined(e.position)) {
                // Placemark with Point geometry
                pointCount++;
            }
            else if (Cesium.defined(e.polyline)) {
                // Placemark with LineString geometry               
            }
            else if (Cesium.defined(e.polygon)) {
                // Placemark with Polygon geometry
            }
            // check for other conditions
        }
        console.log(pointCount); // dump # of point placemarks
        viewer.flyTo(entities);     
    }

如果源KML有ExtendedData,那么您可以通过实体的kml属性访问此扩展数据,该属性是KmlFeatureData对象。

示例:

<Placemark>
   ...
   <ExtendedData>
      <Data name="holeNumber">
        <value>1</value>
      </Data>
      <Data name="holeYardage">
        <value>234</value>
      </Data>
      <Data name="holePar">
        <value>4</value>
      </Data>
  </ExtendedData>
</Placemark>

如果var&#34; e&#34;是从上面的KML创建的实体,然后下面的代码段将输出value=234

  var data = e.kml.extendedData;
  if (Cesium.defined(data)) {
    console.log("value=", data.holeYardage.value);      
 }