Проблемы с обертыванием проекции цезия - PullRequest
1 голос
/ 02 ноября 2019

Я пытаюсь создать маркеры с метками, которые появляются только при определенных уровнях масштабирования в Цезии. При использовании 3D вида все работает как положено. Однако при переключении на 2D (равноугольную) проекцию у меня возникает ряд проблем, связанных с анти-меридианом (180 градусов долготы):

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

Следующие изображения иллюстрируют эти ошибки. Первый показывает уровень увеличения в Цезии с анти-меридианом, едва видимым в кадре. Вторая показывает ту же самую сцену с тем же уровнем масштабирования, смещенную примерно на 4 пикселя влево. Если сцена перемещается достаточно далеко влево, где анти-меридиан находится около левого края экрана, то маркеры справа от анти-меридиана исчезают, а маркеры слева остаются на экране. Оба изображения показывают, как маркеры обрезаны на анти-меридиане, и в обоих случаях ни один из маркеров не должен быть виден. Only markers to the right of the anti-meridian are incorrectly shown None of these markers should be visible

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
        }
    });
}

Кто-нибудь знает способОбойти эти цезиевые ошибки?

...