Я пытаюсь интегрировать Cesium 1.11 с существующим сервером, отправляющим GeoJSON. Я могу успешно загрузить данные в представление из первого сообщения, однако последующие вызовы load() не обновляют отображение.
Я упростил задачу до следующей, также доступной в виде скрипки.
- Я ожидаю, что второй вызов загрузки обновит дисплей, чтобы переместить маркер в Нью-Йорк, однако он останется в Лондоне.
- Окно функций по-прежнему показывает свойство «foo» как 123, я ожидаю, что 456.
Код
var viewer = new Cesium.Viewer('cesiumContainer');
var source = new Cesium.GeoJsonDataSource("name123");
viewer.dataSources.add(source);
source.load({
type: "FeatureCollection",
crs: {
type: "name",
properties: {
name: "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
features: [{
type: "Feature",
properties: {
foo: 123,
},
geometry: {
type: "Point",
coordinates: [0.1275, 51.5072] // London
},
id: "123"
}]
});
// workaround, but has side effect of destroying feature window
// source.entities.removeAll();
// sometime later...
source.load({
type: "FeatureCollection",
crs: {
type: "name",
properties: {
name: "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
features: [{
type: "Feature",
properties: {
foo: 456,
},
geometry: {
type: "Point",
coordinates: [-75.1890, 42.3482] // New York
},
id: "123"
}]
});
Что я пробовал
«принудительно» обновить, вызвав
source.entities.removeAll()
, однако это имеет побочный эффект закрытия окна функции, если оно открыто во время обновления. Я получаю сообщения каждую секунду, поэтому это нежелательно.Да, я знаю о проприетарной системе CZML, однако я хотел бы придерживаться GeoJSON для этой относительно простой системы.
Обновление: дальнейшая отладка. Проблема видимо в конструктивной особенности...
- Вспомогательный метод load() в GeoJsonDataSource вызывает
that._entityCollection.removeAll()
. Это находится между suspendEvents() и возобновитьEvents(), поэтому не приводит к закрытию окна функции. - После возобновления событий () события «изменения» запускаются, даже если сущности были фактически воссозданы
- Существующий BillboardVisualizer, созданный Cesium.Viewer, хранит кэшированные экземпляры объектов, которые он использовал при первом рендеринге.
- BillboardVisualizer.update() продолжает считывать первую позицию из «устаревших» экземпляров объекта, поэтому обновление не отображается.