CompassLayer 未出现在 WorldWind 中
CompassLayer not showing up in 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 layers = 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
逻辑到底出了什么问题。
我的代码有两个主要问题。
我已经有一个 compassLayer
并且应该使用它而不是制作一个新的,即
compass = (CompassLayer) worldWindow.getModel().getLayers().getLayerByName("Compass");
当您使用 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));
解决这些问题解决了问题,现在罗盘出现了。
我有一个 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 layers = 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
逻辑到底出了什么问题。
我的代码有两个主要问题。
我已经有一个
compassLayer
并且应该使用它而不是制作一个新的,即compass = (CompassLayer) worldWindow.getModel().getLayers().getLayerByName("Compass");
当您使用
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));
解决这些问题解决了问题,现在罗盘出现了。