2016-09-15 2 views
3

표준 HelloWorld 샘플 응용 프로그램을 기반으로하는 테스트 응용 프로그램에서 다음 geoJson 파일을로드하려고 시도하고 있습니다.세슘 - 범위 오류 : 유효성이 검사 된 geoJson에 잘못된 배열 길이

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.io를 사용하여 유효성을 검사로 나는 혼란 스러워요 : 이것은 다음과 같은 오류 메시지가 발생

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

:

{ 
    "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 
     ] 
     ] 
    ] 
    } 
}]} 

나는 다음과 같은 코드를 사용하여 본을로드하고 및 http://geojsonlint.com

누구든지 제공 할 수 있습니까? 유용한 제안?

감사합니다.

답변

2

여기에 표시 한 오류는 불행히도 Cesium 렌더링 루프 내부에서 잡기 오류가 발생했습니다. 유효하지 않은 객체가 유효하지 않은 경계 영역을 표시 객체의 목록에 도입 할 때마다 작곡됩니다. 불행히도이 객체는 처음에 나쁜 객체가리스트에 추가되었을 때 발생하지 않습니다. Cesium의 렌더링 루프가 잘못된 객체를 포함하여 모든 객체를 렌더링하려고 시도 할 때까지 오류가 발생하지 않습니다. 잘못된 객체는 생성 루틴이 호출 스택에서 사라진 후 오랫동안 발견됩니다. 따라서 오류가 처음 잘못 된 위치를 정확히 찾아 내지 못합니다. 호출 스택의 맨 아래는 렌더링 할 다음 프레임을 묻는 것입니다. 즉, 문제를 소개 한 코드가 이미 완료되어 반환되었음을 의미합니다.

즉, 여기에 표시된 코드는 세슘 1.25에서 작동합니다. 그것은 특정 건물에 노란색 다각형을 보여줍니다. 그러나 여기에 나와있는 변수 이름 중 일부는 나에게 잘못된 것으로 보입니다. 여기에 표시되지 않은 코드의 다른 부분에서 변수 이름을 잘못 사용했을 가능성이 있습니다. 특히 dataSource은 실제 데이터 소스가 아니라 Promise이며 data은 실제 데이터 소스입니다. 그래서, 이름 변경을 제안 :

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

이 코드는 당신이 게시 된 것과 어떤 차이가 없다,하지만 당신은 내 컴퓨터에서 잘 작동을 무엇을 게시. 내가 여기서 한 것은 다른 변수를 다른 곳에서 사용하려고 할 때 문제가되는 경우에 대비하여 변수 이름을 변경하는 것입니다. 이것은 dataSourcePromise을 실제 데이터 소스로 사용할 수 없다는 것을 분명히 밝혀야합니다.

이 리 팩터링을 적용한 후에도 문제점을 발견하지 못하면 여기에 게시하거나 세슘에 렌더링 할 오브젝트를 추가하는 코드를 제거해야합니다. 오류는 어떤 종류의 잘못된 개체가 렌더 루프에 추가되었음을 분명히합니다.

+0

당신은 틀 롭습니다. 나는 범인이다. 제 개발 과정에서 디버깅 프로세스를 단순화하기 위해 다른 데이터 소스로 전환하기로 결정했습니다 (단 하나의 기능 만 사용). 코드가 표시되지 않는 것은 geoJson의 기능을 반복하고 새 데이터 집합에없는 속성 내 잘못이야... :/ –

관련 문제