我在WorldWind项目中,遇到过这样一个问题。加载本地影像时,由于投影转换的问题,有些地理区域存在挺明显的误差情况。具体一个例子就是,我在GoogleEarth中画了一个区域,另存为kml文件,在WorldWind中导入时一些地理标志明显不重合。我为了项目展示时的整齐一致,所以采用在WorldWind中画取路径区域,并导出为kml文件。也许这种方法并不见得多可取,不过也是写出来留作参考,为了以后也许能够用到的地方。
通过分析源代码可以发现,在src->gov.nasa.worldwindx.examples中的LineBuilder.java文件可以在球体上勾画路径并能够把相应点的坐标输出,再结合src->gov.nasa.worldwindx.examples.kml中的ExportKML.java文件,就可以达到我们需要的目的。
一、创建自己的WWJLineBuilder.java文件
package esi.control;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.List;
import gov.nasa.worldwind.WorldWindow;
import gov.nasa.worldwind.avlist.AVListImpl;
import gov.nasa.worldwind.event.PositionEvent;
import gov.nasa.worldwind.event.PositionListener;
import gov.nasa.worldwind.geom.Position;
import gov.nasa.worldwind.layers.RenderableLayer;
import gov.nasa.worldwind.render.Polyline;
public class WWJLineBuilder extends AVListImpl
{
private final WorldWindow wwd;
private boolean armed = false;
private List<Position> positions;
private final RenderableLayer layer;
private final Polyline line;
private boolean active = false;
public WWJLineBuilder(final WorldWindow wwd, RenderableLayer lineLayer, Polyline polyline)
{
this.wwd = wwd;
positions=new ArrayList<Position>();
if (polyline != null)
{
this.line = polyline;
}
else
{
this.line = new Polyline();
this.line.setFollowTerrain(true);
}
this.layer = lineLayer != null ? lineLayer : new RenderableLayer();
this.layer.addRenderable(this.line);
this.wwd.getModel().getLayers().add(this.layer);
this.wwd.getInputHandler().addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent mouseEvent)
{
if (armed && mouseEvent.getButton() == MouseEvent.BUTTON1)
{
if (armed && (mouseEvent.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0)
{
if (!mouseEvent.isControlDown())
{
active = true;
addPosition();
}
}
mouseEvent.consume();
}
}
public void mouseReleased(MouseEvent mouseEvent)
{
if (armed && mouseEvent.getButton() == MouseEvent.BUTTON1)
{
if (positions.size() == 1)
removePosition();
active = false;
mouseEvent.consume();
}
}
public void mouseClicked(MouseEvent mouseEvent)
{