La versión Java de WorldWind carga archivos shp y logra efectos tridimensionales

Anteriormente introduje la carga de la capa de servicio WMS en la versión Java de WorldWind. Si quieres aprender, puedes leer el artículo anterior . WorldWind es una pantalla que implementa efectos tridimensionales. Por supuesto, cargar modelos tridimensionales es indispensable. Revisé el código fuente de WorldWind y descubrí que WorldWind admite la carga de modelos tridimensionales en formato KMZ. Esto es más preciso. Si necesita cargar un modelo en formato KMZ, puede dejar un mensaje a continuación y el código para cargar el formato KMZ se enviará más tarde. Hoy grabaré la carga de archivos de formas para lograr efectos tridimensionales. Debido al modelo, es relativamente tosco.
Primero, observe el efecto después de la carga:
Insertar descripción de la imagen aquí

1.archivo de forma

El archivo de forma aquí es un archivo vectorial con altura, que se puede generar usando ArcMap. Como se muestra a continuación:
Insertar descripción de la imagen aquí
Este es un archivo de forma de un aeropuerto. La tabla de atributos del archivo tiene una columna que indica la altura de cada píxel. Como se muestra abajo.
Insertar descripción de la imagen aquí
Puedes ver que la tabla de atributos contiene mucha información, solo mira la lista "hhh", que representa la elevación de cada píxel. Este valor es la clave para formar un efecto tridimensional. Una vez que tenga este archivo listo, puede comenzar a codificar.

2. Escribir código

Pega el código directamente:

/*
* 加载带有高度的shape文件,并将高度进行拉伸,形成三维效果
* 2021年11月24日14:14:17
* */
public class ModelLayer {
    private static RenderableLayer layer;                  //三维模型的渲染图层

    //加载三维模型的方法
    public static void init3DModel(WorldWindowGLCanvas wwd, String filePath){
        Shapefile shapefile = new Shapefile(filePath);
        layer = new RenderableLayer();
        layer.setName("model");                           //图层命名为“model”,这个可以自定义
        layer.setPickEnabled(true);

        try {
            while (shapefile.hasNext()) {
                ShapefileRecord record = shapefile.nextRecord();
                layer.addRenderable(makeShape(record));
            }
            wwd.getModel().getLayers().add(layer);
        } finally {
            shapefile.close();
        }
    }

    private static ExtrudedPolygon makeShape(ShapefileRecord record) {
        String IMAGE_PATH = "images/ic_wall.jpg";          //这个是贴图纹理的路径
        Double height = null;                              //每个像素的高度值

        /*
         * 这里需要注意一下,获取到的高度值必须大于0,当有小于等于0的高度值时,
         * 需要将高度值设为0.1即可。且所有值不能忽略,否则会报错
         * */
        Object o = record.getAttributes().getValue("hhh"); //hhh为shape文件中表示高度的字段值。也就是在第一步中提到的表示高程的字段。                                                  
        if (o != null) {
            Double h = Double.parseDouble(o.toString());
            if (h<=0){                                     //如果有小于等于0的值,设为0.1,只要大于0即可。
                h=0.1;
            }
            height=h*20;                                   //将高度值拉高20倍,否则原始的高度值,三维效果不明显
        }

        // 顶部属性
        ShapeAttributes capAttrs = new BasicShapeAttributes();
        capAttrs.setOutlineMaterial(Material.GRAY);
        capAttrs.setInteriorMaterial(Material.LIGHT_GRAY);

        // 边属性
        ShapeAttributes sideAttributes = new BasicShapeAttributes();
        sideAttributes.setInteriorMaterial(Material.LIGHT_GRAY);
        sideAttributes.setOutlineMaterial(Material.DARK_GRAY);
        sideAttributes.setImageSource(IMAGE_PATH);

        // 创建拉伸多边形
        VecBuffer vb = record.getPointBuffer(0);
        gov.nasa.worldwind.render.airspaces.Polygon pgonAirspace = new Polygon(vb.getLocations());                                     //根据点串构建多边形

        //纹理
        ArrayList<String> textures = new ArrayList<String>();
        for (int i = 0; i < pgonAirspace.getLocations().size()-1; i++) {
            textures.add(IMAGE_PATH);
        }

        //给多边形添加上高度和纹理。
        ExtrudedPolygon polygon = new ExtrudedPolygon(pgonAirspace.getLocations(), height, textures);                 //有纹理
        //ExtrudedPolygon polygon = new ExtrudedPolygon(pgonAirspace.getLocations(), height, null);                       //纹理设为null,即可设为无纹理。

        polygon.setCapAttributes(capAttrs);
        polygon.setSideAttributes(sideAttributes);
        polygon.setAltitudeMode(WorldWind.CLAMP_TO_GROUND);
        return polygon;
    }

    /*
    * 移除指定名字的三维模型
    * */
    public static void removeModel(WorldWindowGLCanvas wwd,String name){
        if (wwd.getModel().getLayers().getLayerByName(name)!=null){
            wwd.getModel().getLayers().remove(wwd.getModel().getLayers().getLayerByName(name));
            wwd.redrawNow();
        }
    }
}

Este es el código, ¿no es muy simple? Cuando lo uses, llámalo directamente. Hay dos parámetros, uno es la bola tridimensional y el otro es la ruta del archivo de forma.

Supongo que te gusta

Origin blog.csdn.net/nanjumufeng/article/details/121513804
Recomendado
Clasificación