Я пытаюсь создать маркеры с метками, которые появляются только при определенных уровнях масштабирования в Цезии. При использовании 3D вида все работает как положено. Однако при переключении на 2D (равноугольную) проекцию у меня возникает ряд проблем, связанных с анти-меридианом (180 градусов долготы):
- Маркеры обрезаются, когда они охватывают анти-меридиан. -meridian.
- Когда анти-меридиан виден на экране, расстояниеDisplayCondition демонстрирует странное поведение в зависимости от того, падает ли точка на «большую» сторону (часть к одной стороне анти-меридиана, которая занимает более50% ширины) или «малая» сторона (часть на одну сторону анти-меридиана, занимающая менее 50% ширины). В обоих случаях кажется, что вычисление расстояния, выполняемое CESIUM, не выполняется правильно, когда анти-меридиан видим.
- Маленький: маркеры на этой стороне видны задолго до того, как они станут видны на «большой» стороне.
- Большой: маркеры на этой стороне видны немного раньше, чем они должны отображаться. Шаги для воспроизведения: увеличьте часть карты, где анти-меридиан НЕ виден. Как только вы увидите маркеры, уменьшите один шаг. Теперь перемещайте карту до тех пор, пока анти-меридиан не станет видимым и займет около 10% пространства экрана. Внезапно появятся маркеры на «большой» стороне.
Следующие изображения иллюстрируют эти ошибки. Первый показывает уровень увеличения в Цезии с анти-меридианом, едва видимым в кадре. Вторая показывает ту же самую сцену с тем же уровнем масштабирования, смещенную примерно на 4 пикселя влево. Если сцена перемещается достаточно далеко влево, где анти-меридиан находится около левого края экрана, то маркеры справа от анти-меридиана исчезают, а маркеры слева остаются на экране. Оба изображения показывают, как маркеры обрезаны на анти-меридиане, и в обоих случаях ни один из маркеров не должен быть виден.

JavaScript, необходимый для воспроизведения этого в Сандкасле:
var viewer = new Cesium.Viewer('cesiumContainer', {timeline : false, animation : false});
for (var i = 0; i < 1000; ++i) {
viewer.entities.add({
position: Cesium.Cartesian3.fromRadians(
Math.random() * 2 * Math.PI, Math.asin(2 * Math.random() - 1)),
point : {
color: Cesium.Color.RED,
pixelSize: 36,
distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 10000000)
},
label: {
text: '222',
font: '16px Monospace',
eyeOffset: new Cesium.Cartesian3(0, 0, -100),
style: Cesium.LabelStyle.FILL_AND_OUTLINE
}
});
}
Кто-нибудь знает способОбойти эти цезиевые ошибки?