World Wind Java开发之十五

/*Copyright (C) 2001, 2010 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved. */package gov.nasa.worldwindx.examples.kml;import gov.nasa.worldwind.WorldWind;import gov.nasa.worldwind.avlist.AVKey;import gov.nasa.worldwind.awt.WorldWindowGLCanvas;import gov.nasa.worldwind.layers.RenderableLayer;import gov.nasa.worldwind.ogc.kml.KMLAbstractFeature;import gov.nasa.worldwind.ogc.kml.KMLRoot;import gov.nasa.worldwind.ogc.kml.impl.KMLController;import gov.nasa.worldwind.render.Offset;import gov.nasa.worldwind.retrieve.RetrievalService;import gov.nasa.worldwind.util.WWIO;import gov.nasa.worldwind.util.WWUtil;import gov.nasa.worldwind.util.layertree.KMLLayerTreeNode;import gov.nasa.worldwind.util.layertree.KMLNetworkLinkTreeNode;import gov.nasa.worldwind.util.layertree.LayerTree;import gov.nasa.worldwindx.examples.util.BalloonController;import gov.nasa.worldwindx.examples.util.HotSpotController;import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import java.io.File;import java.io.IOException;import java.net.URL;import javax.swing.SwingUtilities;import javax.xml.stream.XMLStreamException;/** * 导入KML或KMZ文件,以图层形式查看,,KML或KMZ文件的内容显示为一个要素树。在要素树上点击KML要素可以查看该要素 * ,在球上点击要素可以弹出要素的描述信息框 */public class SmartScopeKMLViewer{public static class KMLUtil{protected LayerTree layerTree; // 图层树protected RenderableLayer hiddenLayer; // 渲染图层(图层树)protected HotSpotController hotSpotController; // 热点controllerprotected KMLApplicationController kmlAppController; // KMLcontrollerprotected BalloonController balloonController; // BalloonControllerprotected WorldWindowGLCanvas wwd; // wwpublic KMLUtil(WorldWindowGLCanvas worldWindowGLCanvas){this.wwd = worldWindowGLCanvas;// 初始化图层树this.layerTree = new LayerTree(new Offset(20d, 160d, AVKey.PIXELS,AVKey.INSET_PIXELS));// this.layerTree.getModel().refresh(this.wwd.getModel().getLayers());// 图层树渲染图层this.hiddenLayer = new RenderableLayer();this.hiddenLayer.addRenderable(this.layerTree);this.wwd.getModel().getLayers().add(this.hiddenLayer);// 注册图层选择和气球热点选择事件监听this.hotSpotController = new HotSpotController(this.wwd);// 注册kml事件监听this.kmlAppController = new KMLApplicationController(this.wwd);this.balloonController = new BalloonController(this.wwd){@Overrideprotected void addDocumentLayer(KMLRoot document){addKMLLayer(document);}};// 关联kml管理器和balloon管理器this.kmlAppController.setBalloonController(balloonController);// Set up to receive SSLHandshakeExceptions that occur during// resource retrieval.WorldWind.getRetrievalService().setSSLExceptionListener(new RetrievalService.SSLExceptionListener(){public void onException(Throwable e, String path){System.out.println(path);System.out.println(e);}});}/** ** @方法名称: addKMLLayer ; * @方法描述: 添加KML图层: ; * @参数 :@param kmlRoot * @返回类型: void ; * @创建人:刘硕 ; * @创建时间:2015年3月17日 下午7:54:40; * @throws */protected void addKMLLayer(KMLRoot kmlRoot){// Create a KMLController to adapt the KMLRoot to the World WindKMLController kmlController = new KMLController(kmlRoot);// 添加kml图层RenderableLayer layer = new RenderableLayer();layer.setName((String) kmlRoot.getField(AVKey.DISPLAY_NAME));layer.addRenderable(kmlController);this.wwd.getModel().getLayers().add(layer);// 添加kml图层树节点KMLLayerTreeNode layerNode = new KMLLayerTreeNode(layer, kmlRoot);this.layerTree.getModel().addLayer(layerNode);this.layerTree.makeVisible(layerNode.getPath());layerNode.expandOpenContainers(this.layerTree);// Listens to refresh property change events from KML network link// nodes. Upon receiving such an event this// expands any tree paths that represent open KML containers. When a// KML network link refreshes, its tree// node replaces its children with new nodes created from the// refreshed content, then sends a refresh// property change event through the layer tree. By expanding open// containers after a network link refresh,// we ensure that the network link tree view appearance is// consistent with the KML specification.layerNode.addPropertyChangeListener(AVKey.RETRIEVAL_STATE_SUCCESSFUL,new PropertyChangeListener(){public void propertyChange(final PropertyChangeEvent event){if (event.getSource() instanceof KMLNetworkLinkTreeNode){// Manipulate the tree on the EDT.SwingUtilities.invokeLater(new Runnable(){public void run(){((KMLNetworkLinkTreeNode) event.getSource()).expandOpenContainers(layerTree);wwd.redraw();}});}}});}}/** * * @项目名称:worldwind-1.5.0 * @类名称:WorkerThread * @类描述:加载KML文件线程类 * @创建人:刘硕 * @创建时间:2015年3月17日 下午7:58:38 * @修改备注: * @版本: */public static class WorkerThread extends Thread{/** * 待加载kml文件,在构造函数中初始化 */protected Object kmlSource;/** * kmlapp */protected KMLUtil KMLUtil;public WorkerThread(Object kmlSource, KMLUtil KMLUtil){this.kmlSource = kmlSource;this.KMLUtil = KMLUtil;}/** * Loads this worker thread's KML source into a new * <code>{@link gov.nasa.worldwind.ogc.kml.KMLRoot}</code>, then adds * the new <code>KMLRoot</code> to this worker thread's * <code>AppFrame</code>. The <code>KMLRoot</code>'s * <code>AVKey.DISPLAY_NAME</code> field contains a display name created * from either the KML source or the KML root feature name. * <p/> * If loading the KML source fails, this prints the exception and its * stack trace to the standard error stream, but otherwise does nothing. */public void run(){try{KMLRoot kmlRoot = this.parse();// 设置文档的显示名称kmlRoot.setField(AVKey.DISPLAY_NAME,formName(this.kmlSource, kmlRoot));// 启动一个任务进程加载解析的kml文件final KMLRoot finalKMLRoot = kmlRoot;SwingUtilities.invokeLater(new Runnable(){public void run(){KMLUtil.addKMLLayer(finalKMLRoot);}});}catch (Exception e){e.printStackTrace();}}/** ** @方法名称: parse ; * @方法描述: 解析KML文档 ; * @参数 :@return 返回KMLRoot * @参数 :@throws IOException:文档不可读 * @参数 :@throws XMLStreamException :文档解析出现错误 * @返回类型: KMLRoot ; * @创建人:刘硕 ; * @创建时间:2015年3月17日 下午8:02:59; * @throws */protected KMLRoot parse() throws IOException, XMLStreamException{// KMLRoot.createAndParse will attempt to parse the document using a// namespace aware parser, but if that// fails due to a parsing error it will try again using a namespace// unaware parser. Note that this second// step may require the document to be read from the network again// if the kmlSource is a stream.return KMLRoot.createAndParse(this.kmlSource);}}protected static String formName(Object kmlSource, KMLRoot kmlRoot){KMLAbstractFeature rootFeature = kmlRoot.getFeature();if (rootFeature != null && !WWUtil.isEmpty(rootFeature.getName()))return rootFeature.getName();if (kmlSource instanceof File)return ((File) kmlSource).getName();if (kmlSource instanceof URL)return ((URL) kmlSource).getPath();if (kmlSource instanceof String&& WWIO.makeURL((String) kmlSource) != null)return WWIO.makeURL((String) kmlSource).getPath();return "KML Layer";}}

销售世界上第一号的产品–不是汽车,而是自己。

World Wind Java开发之十五

相关文章:

你感兴趣的文章:

标签云: