4.文件数据源-本地文件

来源:互联网 发布:移动运营商数据分析 编辑:程序博客网 时间:2024/06/07 02:14

World Wind Java 可以加载本地的文件,也可以加载网络的文件资源,只要是以文件提供的统称文件数据源。

Shape文件

Shape文件实际是一组文件,包含图元文件(.shp)、属性文件(.dbf)、索引文件(.shx)和投影文件(.prj)。

在2.0及之前的版本,World Wind Java首先使用ShapefileLoader类完成对Shape文件的读取和加载,在通过createLayerFromSource方法创建RenderableLayer,最后将创建的Layer加载Layers上。
代码如下:

package wwjTest;import gov.nasa.worldwind.layers.Layer;import gov.nasa.worldwindx.examples.util.ShapefileLoader;public class wwjShape extends wwjBasics {    protected Layer shapeLayer;    public boolean AddShapeData(String filePath, String layerName,double maxActiveAltitude,double minActiveAltitude){        boolean rtnResult = false;        try{            ShapefileLoader SFL = new ShapefileLoader();            this.shapeLayer = SFL.createLayerFromSource(filePath);            shapeLayer.setName(layerName);            shapeLayer.setMaxActiveAltitude(maxActiveAltitude);            shapeLayer.setMinActiveAltitude(minActiveAltitude);            this.worldWindowGLCanvas.getModel().getLayers().add(shapeLayer);            rtnResult = true;        }        catch(Exception ex){            System.out.println(ex.getMessage());        }        return rtnResult;    }    public wwjShape(){        //增加Shape数据        AddShapeData("shp/world_adm0.shp","国界",33500000,0);        this.layerPanel.update(this.worldWindowGLCanvas);    }    public static void main(String[] args) {        String strTitle = "显示Shape文件";        wwjShape wwjRun = new wwjShape();        wwjRun.setTitle(strTitle);    }}

运行结果如下:

这里写图片描述

在2.1版本ShapefileLoader已经被弃用。shapefile不包含颜色和其他可视属性的标准定义。尽管有些shapefile包含每个记录的键值属性中的颜色信息,ShapefileLoader并没有试图解释信息。取而代之的是,由ShapefileLoader创建的世界风渲染对象被赋予了一种随机的颜色。调用者可以通过定义ShapefileLoader的子类来替换或扩展该行为,并覆盖以下内容方法nextPolygonAttributes();这是SDK对弃用原因所做的解释。
新代码如下:

package wwjTest;import gov.nasa.worldwind.formats.shapefile.ShapefileLayerFactory;import gov.nasa.worldwind.layers.Layer;public class wwjShape extends wwjBasics{    private static final long serialVersionUID = 1L;    protected Layer shapeLayer;    public boolean AddShapeData(String filePath, String layerName,double maxActiveAltitude,double minActiveAltitude){        boolean rtnResult = false;        try{            ShapefileLayerFactory factory = new ShapefileLayerFactory();            this.shapeLayer = (Layer) factory.createFromShapefileSource(filePath);            this.shapeLayer.setName(layerName);            this.shapeLayer.setMaxActiveAltitude(maxActiveAltitude);            this.shapeLayer.setMinActiveAltitude(minActiveAltitude);            this.worldWindowGLCanvas.getModel().getLayers().add(shapeLayer);            rtnResult = true;        }        catch(Exception ex){            System.out.println(ex.getMessage());        }        return rtnResult;    }    public wwjShape(){        //增加Shape数据        AddShapeData("shp/world_adm0.shp","国界",33500000,0);        this.layerPanel.update(this.worldWindowGLCanvas);    }    public static void main(String[] args) {        String strTitle = "显示Shape文件";        wwjOldShape wwjRun = new wwjOldShape();        wwjRun.setTitle(strTitle);    }}

结果和旧代码效果一样,就不重复传图了。


KML文件

World Wind Java使用RenderableLayer图层类表现KML数据,一个RenderableLayer图层可以对应多个KML文件。World Wind Java首先利用kmlRoot类完成对KML文件的读取和加载,在通过KMLController类的Renderable接口将KML中的地理信息位置加载到Layer中,最后将创建的Layer加在Layers上。

代码如下:

package wwjTest;import gov.nasa.worldwind.layers.RenderableLayer;import gov.nasa.worldwind.ogc.kml.KMLRoot;import gov.nasa.worldwind.ogc.kml.impl.KMLController;public class wwjKML extends wwjBasics{    private static final long serialVersionUID = 1L;    protected KMLController kmlController;    protected RenderableLayer renderableLayer;    public boolean AddKMLData(String filePath,String title){        boolean rtnResult = false;        try{            KMLRoot kmlRoot = KMLRoot.create(filePath);            kmlRoot.parse();            this.kmlController = new KMLController(kmlRoot);            this.renderableLayer = new RenderableLayer();            this.renderableLayer.addRenderable(kmlController);            this.renderableLayer.setName(title);            this.worldWindowGLCanvas.getModel().getLayers().add(this.renderableLayer);            rtnResult = true;        }        catch(Exception ex){            System.out.println(ex.getMessage());        }        return rtnResult;    }    public wwjKML(){        //增加KML数据        AddKMLData("kml/GoogleTutorialExample01.kml","Simple placemark");        this.layerPanel.update(this.worldWindowGLCanvas);    }    public static void main(String[] args) {        String strTitle = "显示kml文件";        wwjKML wwjRun = new wwjKML();        wwjRun.setTitle(strTitle);    }}

运行结果如下:

这里写图片描述


GPS轨迹文件

GPS轨迹文件有很多种,其中开放性最强的、应用最广泛的就是GPX文件。 World Wind Java使用MarkerLayer图层类表现GPX数据,一个MarkerLayer可以对应多个GPX文件,World Wind Java首先试用GpxReader类完成对GPX文件的读取和加载,在通过getTrackPositionIterator()将读入的数据转换为Position序列,然后定义统一或单独的BasicMarkerAttributes,最后将地理位置和显示属性合并成Marker的数组,当这个数组加载到MarkerLayer上时就可以看见轨迹了。

代码如下

package wwjTest;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;import javax.xml.parsers.ParserConfigurationException;import org.xml.sax.SAXException;import gov.nasa.worldwind.formats.gpx.GpxReader;import gov.nasa.worldwind.geom.Position;import gov.nasa.worldwind.layers.MarkerLayer;import gov.nasa.worldwind.render.Material;import gov.nasa.worldwind.render.markers.BasicMarker;import gov.nasa.worldwind.render.markers.BasicMarkerAttributes;import gov.nasa.worldwind.render.markers.BasicMarkerShape;import gov.nasa.worldwind.render.markers.Marker;public class wwjGPS extends wwjBasics{    private static final long serialVersionUID = 1L;    protected MarkerLayer markerLayer;    public boolean AddGPSData(String filePath, String layerName){        boolean rtnResult = false;        try{            GpxReader reader = new GpxReader();            reader.readFile(filePath);            Iterator<Position> positions = reader.getTrackPositionIterator();            BasicMarkerAttributes attrs = new BasicMarkerAttributes(Material.WHITE,BasicMarkerShape.SPHERE,1d);            ArrayList<Marker> markers = new ArrayList<Marker>();            while(positions.hasNext()){                markers.add(new BasicMarker(positions.next(),attrs));            }            markerLayer = new MarkerLayer(markers);            markerLayer.setOverrideMarkerElevation(true);            markerLayer.setElevation(0);            markerLayer.setName(layerName);            markerLayer.setEnablePickSizeReturn(true);            this.worldWindowGLCanvas.getModel().getLayers().add(markerLayer);            rtnResult = true;        }        catch (ParserConfigurationException e)        {            e.printStackTrace();        }        catch (SAXException e)        {            e.printStackTrace();        }        catch (IOException e)        {            e.printStackTrace();        }        return rtnResult;    }    public wwjGPS(){        AddGPSData("gps/tuolumne.gpx","GPS轨迹");        this.layerPanel.update(this.worldWindowGLCanvas);    }    public static void main(String[] args) {        String strTitle = "显示GPS轨迹";        wwjGPS wwjRun = new wwjGPS();        wwjRun.setTitle(strTitle);    }}

结果如下

这里写图片描述

原创粉丝点击