CompassLayer не отображается в WorldWind

У меня есть WorldWindow с разными RenderableLayer на нем. Я хотел бы добавить CompassLayer во время выполнения.

try {

    String compassPath = "images" + File.separator + "CompassRoseWhite.png";
    String compassImg  = new ClassPathResource(compassPath).getURL().toString();
    compass            = new CompassLayer(compassImg);
    worldWindow.getModel().getLayers().add(compass);

} catch (IOException e) { e.printStackTrace(); }

К сожалению, я не вижу компаса нигде на экране. Я пытался:

  • установка положения компаса вручную с помощью compass.setLocationCenter(...)
  • добавление другого типа слоя (IconLayer с UserFacingIcon), и это сработало нормально, указывая на то, что это не внутренняя проблема с тем, как я добавляю слои или что-то в этом роде.
  • регистрация текущих слоев, чтобы убедиться, что они были добавлены, используя:

    logger.debug("Cur layers = " + worldWindow.getModel().getLayers().toString());

Я вернулся:

Слои Cur = Stars, Atmosphere, Bing Imagery VASCustom, Scale bar, Compass, View Controls, Renderable, Renderable, Renderable, Renderable, Compass,

Как я могу эффективно устранить проблему с невидимым компасом? Спасибо!

Обновлять

Я упростил свой код, чтобы использовать существующий compassLayer, и определил, что проблема заключается в том, что я использую setLocationCenter, т. е.

compass = (CompassLayer) worldWindow.getModel().getLayers().getLayerByName("Compass");

// this works ...           
// compass.setPosition(AVKey.SOUTHEAST);
// compass.setLocationOffset(new Vec4(0, 20));

// this does not work ...  
compass.setLocationCenter(worldWindow.getView().getCenterPoint());

// this part works fine
String compassPath = "images" + File.separator + "CompassRoseWhite.png";
String compassImg  = new ClassPathResource(compassPath).getURL().toString();
compass.setIconFilePath(compassImg);
compass.setEnabled(true);

Так что мне нужно определить, что именно не так с логикой setLocationCenter.


person Max von Hippel    schedule 03.03.2020    source источник


Ответы (1)


В моем коде было две основные проблемы.

  1. У меня уже был compassLayer, и я должен был использовать его вместо создания нового, т.е.

    compass = (CompassLayer) worldWindow.getModel().getLayers().getLayerByName("Compass");

  2. Когда вы используете computePointFromPosition(), вы возвращаете абсолютные декартовы координаты. Затем вам нужно преобразовать их в координаты пикселей, используя View.project(). Наконец, вам нужно компенсировать текущий View. то есть,

Vec4 vecOwnship = worldWindow.getModel()
                             .getGlobe()
                             .computePointFromPosition(ownshipPosition);
Vec4 vecScreen  = worldWindow.getView().project(vecOwnship);
Rectangle viewPort = worldWindow.getView().getViewport();
compass.setLocationCenter(new Vec4(viewPort.x + vecScreen.x, viewPort.y + vecScreen.y, 0));

Исправление этих проблем решило проблему, и теперь появляется компас.

person Max von Hippel    schedule 03.03.2020
comment
Частичный кредит этот источник для моего решения. - person Max von Hippel; 04.03.2020