铯 - 范围错误:验证的geoJson上的数组长度无效

时间:2016-09-15 15:24:43

标签: geojson cesium

我正在尝试基于标准的HelloWorld示例应用在测试应用中加载以下geoJson文件。

{
  "type": "FeatureCollection",
  "generator": "overpass-turbo",
  "copyright": "The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.",
  "timestamp": "2016-09-12T19:22:48Z",
  "features": [
{
  "type": "Feature",
  "id": "way/442106309",
  "properties": {
    "@id": "way/442106309",
    "addr:city": "Ottawa",
    "addr:housenumber": "999",
    "addr:postcode": "H8G8F9",
    "addr:street": "My Road",
    "building": "apartments",
    "building:levels": "3",
    "levels": "3"
  },
  "geometry": {
    "type": "Polygon",
    "coordinates": [
      [
        [
          -75.7337391,
          45.3783003
        ],
        [
          -75.7335222,
          45.378383
        ],
        [
          -75.7335439,
          45.3784096
        ],
        [
          -75.733525,
          45.3784206
        ],
        [
          -75.7335406,
          45.3784375
        ],
        [
          -75.7335003,
          45.378453
        ],
        [
          -75.7335867,
          45.378543
        ],
        [
          -75.7338474,
          45.3784262
        ],
        [
          -75.7337391,
          45.3783003
        ]
      ]
    ]
  }
}]}

我使用以下代码加载它:

var dataSource = Cesium.GeoJsonDataSource.load('../data/kirkwood.json').then(function(data)  {
  viewer.dataSources.add(data);
  viewer.zoomTo(data);
}

这会导致以下错误消息:

An error occurred while rendering. Rendering has stopped.
RangeError: Invalid array length
RangeError: Invalid array length
at updateFrustums (http://127.0.0.1:8081/Build/CesiumUnminified/Cesium.js:155215:36)
at createPotentiallyVisibleSet (http://127.0.0.1:8081/Build/CesiumUnminified/Cesium.js:155389:13)
at executeCommandsInViewport (http://127.0.0.1:8081/Build/CesiumUnminified/Cesium.js:155943:9)
at updateAndExecuteCommands (http://127.0.0.1:8081/Build/CesiumUnminified/Cesium.js:155841:17)
at render (http://127.0.0.1:8081/Build/CesiumUnminified/Cesium.js:156177:9)
at Scene.render (http://127.0.0.1:8081/Build/CesiumUnminified/Cesium.js:156215:13)
at CesiumWidget.render (http://127.0.0.1:8081/Build/CesiumUnminified/Cesium.js:164962:25)
at render (http://127.0.0.1:8081/Build/CesiumUnminified/Cesium.js:164364:32)

我很困惑,因为geoJson使用http://geojson.iohttp://geojsonlint.com

验证得很好

有人可以提供一些有用的建议吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

不幸的是,您在此处显示的错误是来自Cesium渲染循环内部的全部错误。它是一个随时出现无效对象将无效边界球引入可见对象列表的人。遗憾的是,当坏对象首次添加到列表时,不会抛出此错误。在Cesium的渲染循环尝试渲染所有对象(包括坏对象)之前,不会抛出该错误。坏对象在其创建例程从调用堆栈中消失后很久就被发现,因此错误并不能确定事情首先出错的地方。调用堆栈的底部只是要求渲染下一帧,这意味着引入问题的代码已经完成并返回。

那就是说,你在这里展示的代码在Cesium 1.25中对我有用。它在特定建筑物上显示黄色多边形。但是,这里的一些变量名称对我来说是错误的,这表明您可能在代码的其他部分中错误地使用它们,而这些部分并未在此处显示。特别是,data实际上是一个Promise,而不是一个真正的DataSource,而var dataSourcePromise = Cesium.GeoJsonDataSource.load('../data/kirkwood.json').then( function(dataSource) { viewer.dataSources.add(dataSource); viewer.zoomTo(dataSource); } ); 是真正的dataSource。所以,我建议重命名:

dataSourcePromise

此代码与您发布的内容没有任何不同,但您发布的内容在我的计算机上运行正常。我在这里做的是重命名一些变量,以防你试图在别处使用它们,造成问题。这应该有助于明确表示您不能将{{1}}用作实际的数据源。

如果您在应用此重新分解后仍未发现问题,则可能需要在此处发布或删除您要添加的要在Cesium中呈现的对象的任何其他代码。该错误清楚地表明某种无效对象已被添加到渲染循环中。