2016-09-15 29 views
3

我試圖在基於標準HelloWorld示例應用程序的測試應用程序中加載以下geoJson文件。Cesium - 範圍錯誤:驗證的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

任何人都可以提供一些有用的建議?

謝謝!

回答

2

不幸的是你在這裏顯示的錯誤是來自Cesium渲染循環內部的catch-all錯誤。無論何時,一個無效的對象在可見對象列表中引入一個無效的邊界球體,它都會隨時出現。可悲的是,當不良對象首次添加到列表中時,不會引發此錯誤。錯誤不會被拋出,直到Cesium的渲染循環嘗試渲染所有對象,幷包含一個壞對象。壞對象在創建例程從調用堆棧中消失很長時間後才被發現,因此錯誤不會指出事情最先出錯的地方。調用堆棧的底部只是要求下一幀渲染,這意味着引入問題的代碼已經完成並返回。

也就是說,你在這裏展示的代碼在Cesium 1.25中對我很有用。它顯示了特定建築物上的黃色多邊形。但是,這裏的一些變量名稱對我來說看起來是錯誤的,這表明您可能在代碼的其他部分中錯誤地使用了它們,而這些未在此處顯示。特別是,dataSource確實是一個Promise,而不是一個真正的DataSource,並且data是真正的dataSource。所以,我建議重命名:

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

此代碼是不是從你張貼的內容不同,但你張貼工作正常我的機器上。我在這裏做的是重命名一些變量,以防你試圖在其他地方使用它們,造成問題。這應該有希望表明您不能使用dataSourcePromise作爲實際的數據源。

如果您在應用此重新分解後未找到問題,則可能需要在此處發佈或刪除您添加的將在Cesium中呈現的對象的任何其他代碼。該錯誤清楚地表明某種無效對象已被添加到渲染循環中。

+0

你是對的。我是這裏的罪魁禍首。 在我的開發中,我決定切換到另一個數據源以簡化我的調試過程(只有一個功能),而我的代碼沒有顯示的是我正在循環geoJson的功能並執行一些基於新數據集中不存在的屬性。我的錯... :/ –