Цезий - диапазон ошибка: недопустимая длина массива на проверенных формате


Я пытаюсь загрузить следующий файл geoJson в тестовое приложение, основанное на стандартном образце приложения HelloWorld.

{
  "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.io и http://geojsonlint.com

Может ли кто - нибудь предложить несколько полезных предложений?

Спасибо!

1 3

1 ответ:

Ошибка, которую вы показали здесь, к сожалению, является своего рода общей ошибкой внутри цикла визуализации цезия. Это тот, который появляется всякий раз, когда недопустимый объект вводит недопустимую ограничивающую сферу в список видимых объектов. К сожалению, эта ошибка не возникает, когда плохой объект впервые добавляется в список. Ошибка не возникает до тех пор, пока цикл рендеринга Cesium не попытается отрисовать все объекты, включая плохой объект. Плохой объект обнаруживается задолго до его создания подпрограммы исчезли из стека вызовов, и поэтому ошибка не указывает, где все сначала пошло не так. Нижняя часть стека вызовов просто запрашивает следующий кадр для визуализации, то есть код, который ввел проблему, уже завершен и возвращен.

Тем не менее, код, который вы показали здесь, действительно работает для меня в цезии 1.25. Он показывает желтый многоугольник на конкретном здании. Но, некоторые из имен переменных здесь выглядят неправильно для меня, предполагая, что вы можете неправильно использовать их в других части вашего кода, которые вы не показали здесь. В частности, dataSource - это действительно обещание, а не реальный источник данных, а data - это реальный источник данных. Итак, я предлагаю переименовать:
var dataSourcePromise = Cesium.GeoJsonDataSource.load('../data/kirkwood.json').then(
  function(dataSource) {
    viewer.dataSources.add(dataSource);
    viewer.zoomTo(dataSource);
  }
);
Этот код ничем не отличается от того, что вы опубликовали, но то, что вы опубликовали, отлично работает на моей машине. То, что я сделал здесь, это переименовать некоторые переменные на случай, если вы пытались использовать их в другом месте, создавая проблемы. Надеюсь, это должно прояснить, что вы не можете использовать dataSourcePromise в качестве фактического Источник данных.

Если вы не нашли проблему после применения этого повторного факторинга, вам может потребоваться либо опубликовать здесь, либо удалить любой дополнительный код, который у вас есть, добавляя объекты, которые будут отображаться в Cesium. Ошибка дает понять, что в цикл визуализации был добавлен какой-то недопустимый объект.