NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Hi Bill, I got it to work, I added accidently a layer with no content and deleted the one with content. I really need the > > eastMap.setRange(-1.0, 1.0); > > northMap.setRange(-1.0, 1.0); > > heightMap.setRange(-1.0, 1.0); > > to get the original coordinates in my Java3D shape. Never mind it is working now. The implementation is in the attached file. I still have one problem. I can load only on ascii .dhm file with the format east.north.height but trying to load a second dem from another file results in a VisAd TupleType Exception What can cause this error? Thanks Desiree > > So the range of all is 1000.0. The surface will look very flat. I had only 6 points in my test example. In reality it is a dgm with 13000 vertices with heights between 400 and 800m , which does not look very flat :-). > > Cheers, > Bill > >
// ------------------------------------------------------------------- // GridLayer3D.java // // Copyright (c) 2001 by IPF // ------------------------------------------------------------------- package gis.services.gis3D.content; import gis.services.gis3D.*; import java.util.Enumeration; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.math.*; import gis.gisterm.*; import gis.gisterm.map.*; import gis.gisterm.management.*; import gis.shared.shapefile.*; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.geometry.*; import com.sun.j3d.utils.behaviors.mouse.MouseRotate; import visad.*; import visad.java3d.*; import java.rmi.RemoteException; /** * GridLayer3D * This class provides administration methods for threedimensional grid * layers. * The Layer3D class is extended from BranchGroup * * @version [Mon May 28 15:22:18 2001]hilbring * @author Desiree Hilbring */ public class GridLayer3D extends FeatureLayer3D implements DisplayListener{ float[] east; float[] north; float[] height; DefaultRendererJ3D renderer; public DisplayListener listener; float ulx,uly,lrx,lry,lz,uz,conNorth,conEast; GIS3DView gis3dView; Transposition transposition; WorldVolume wv; private RealType eastValues,northValues; private RealType heightValues; private RealTupleType domain_tuple; private FunctionType func_en_h; private Set domain_set; private FlatField vals_ff; private DataReferenceImpl data_ref; private DisplayImpl display; private ScalarMap eastMap, northMap, heightMap; int nCols,nRows; double eastMin,eastMax,northMin,northMax; /** * Constructor * * This constructor is used from subclasses of GridLayer3D. * They specify the gis3dView in which the components have to be added and * they need to set east, north and height values through set methods in * this class. * * @param gis3dView */ public GridLayer3D(GIS3DView gis3dView) { super(); this.gis3dView = gis3dView; transposition = new Transposition(); wv = new WorldVolume(); } /** * Constructor * * Constructs a GridLayer3D from east, north and height values and * displays it in the specified gis3dView. * * @param eastValues float Array with east values. * @param northValues float Array with north values. * @param heightValues float Array with height values. * @param gis3dView in which layer is to be displayed. */ //public GridLayer3D(float[] east, float[] north, float[] height,GIS3DView gis3dView) { public GridLayer3D(DGMReader dgmReader, GIS3DView gis3dView) { super(); this.listener = this; this.east = dgmReader.getEastArray(); this.north = dgmReader.getNorthArray(); this.height = dgmReader.getHeightArray(); this.nCols = dgmReader.getNCols(); this.nRows = dgmReader.getNRows(); this.eastMin = dgmReader.getEastMin(); this.eastMax = dgmReader.getEastMax(); this.northMin = dgmReader.getNorthMin(); this.northMax = dgmReader.getNorthMax(); this.gis3dView = gis3dView; transposition = new Transposition(); wv = new WorldVolume(); for (int i=0;i<east.length;i++) { System.out.println(east[i]); System.out.println(north[i]); System.out.println(height[i]); } } /** * This method throws an event, when 3D-Objects are ready. * * @see displayChanged(). */ public void makeSurface() { // Change [Mon May 28 15:23:29 2001]hilbring: try { eastValues = new RealType("eastValues"); northValues = new RealType("northValues"); domain_tuple = new RealTupleType(northValues,eastValues); heightValues = new RealType("heightValues"); // Create a FunctionType (domain_tuple -> range_tuple); func_en_h = new FunctionType(domain_tuple, heightValues); //int NCOLS = 2; //int NROWS = 3; //domain_set = new Linear2DSet(domain_tuple,5379000,5380000,NROWS,3532000, 3533000, NCOLS); System.out.println("nCols "+nCols); System.out.println("nRows "+nRows); System.out.println(northMin+" "+northMax+" "+eastMin+" "+eastMax); domain_set = new Linear2DSet(domain_tuple,northMin,northMax,nRows,eastMin, eastMax, nCols); System.out.println("hallo"); // Get the Set samples to facilitate the calculations float[][] set_samples = domain_set.getSamples( true ); // We create another array, with the same number of elements of // altitude and temperature, but organized as // float[2][ number_of_samples ] //float[][] flat_samples = new float[1][NCOLS * NROWS]; float[][] flat_samples = new float[1][nCols * nRows]; // ...and then we fill our 'flat' array with the generated values // by looping over NCOLS and NROWS // specifiy height for(int c = 0; c < nCols; c++){ for(int r = 0; r < nRows; r++){ flat_samples[0][c*nRows+r] = height[c*nRows+r]; //System.out.println("height "+height[c*nRows+r]); } } // Create a FlatField // Use FlatField(FunctionType type, Set domain_set) vals_ff = new FlatField( func_en_h, domain_set); // ...and put the values above into it // Note the argument false, meaning that the array won't be copied vals_ff.setSamples( flat_samples , false ); System.out.println("hallo2"); // Create Display and its maps // A 2D display display = new DisplayImplJ3D("display1"); // Create the ScalarMaps: latitude to XAxis, longitude to YAxis and // altitude to RGB and temperature to IsoContour // Use ScalarMap(ScalarType scalar, DisplayRealType display_scalar) eastMap = new ScalarMap( eastValues, Display.YAxis ); northMap = new ScalarMap( northValues, Display.XAxis ); heightMap = new ScalarMap(heightValues,Display.ZAxis); // Change [Wed May 30 12:18:36 2001]hilbring: eastMap.setRange(-1.0, 1.0); northMap.setRange(-1.0, 1.0); heightMap.setRange(-1.0, 1.0); //heightMap.setRange(0, 10000); // Change [Wed May 30 12:18:41 2001]hilbring: // Add maps to display display.addMap( eastMap ); display.addMap( northMap ); display.addMap( heightMap ); System.out.println("hallo3"); // Create a data reference and set the FlatField as our data data_ref = new DataReferenceImpl("data_ref"); data_ref.setData( vals_ff ); renderer = new DefaultRendererJ3D(); // Add reference to display display.addReferences(renderer,data_ref); //display.addReference( data_ref ); display.addDisplayListener(listener); // Create application window and add display to window /* JFrame jframe = new JFrame("VisAD Fenster"); jframe.getContentPane().add(display.getComponent()); // Set window size and make it visible jframe.setSize(300, 300); jframe.setVisible(true); */ // Change [Mon May 28 15:23:31 2001]hilbring: } catch (VisADException ve) { System.out.println("VisAd TupleType Exception"); } catch (RemoteException re) { System.out.println("RemoteExcpetion"); } /* RealType x = RealType.getRealType("x"); RealType y = RealType.getRealType("y"); RealType height = RealType.getRealType("height"); try { RealTupleType xy = new RealTupleType(x, y); FunctionType terrain_type = new FunctionType(xy, height); Gridded2DSet set = new Gridded2DSet(xy,new float[][] {eastValues,northValues},eastValues.length*2); FlatField terrain = new FlatField(terrain_type, set); terrain.setSamples(new float[][] {heightValues}); float[] eastValuesIntpol = new float[eastValues.length+1]; float[] northValuesIntpol = new float[northValues.length+1]; for (int i=0;i<northValues.length;i++) { eastValuesIntpol[i]=eastValues[i]; northValuesIntpol[i]=northValues[i]; //System.out.println("eastValue"+eastValues[i]); //System.out.println("northValue"+northValues[i]); } display = new DisplayImplJ3D("display1"); ScalarMap hoxmap = new ScalarMap(x, Display.XAxis); ScalarMap reymap = new ScalarMap(y, Display.YAxis); ScalarMap heightmap = new ScalarMap(height, Display.ZAxis); display.addMap(hoxmap); display.addMap(reymap); display.addMap(heightmap); hoxmap.setRange(-1.0, 1.0); reymap.setRange(-1.0, 1.0); heightmap.setRange(-1.0, 1.0); DataReferenceImpl data_ref = new DataReferenceImpl("data_ref"); data_ref.setData( terrain ); renderer = new DefaultRendererJ3D(); display.addReferences(renderer,data_ref); display.addDisplayListener(listener); } catch (VisADException ve) { System.out.println("VisAd TupleType Exception"); } catch (RemoteException re) { System.out.println("RemoteExcpetion"); } */ } /** * Set east values * * @param eastValues */ public void setEastValues(float[] eastValues) { this.east = east; } /** * set north values * * @param northValues */ public void setNorthValues(float[] northValues) { this.north = north; } /** * set height values * * @param heightValues */ public void setHeightValues(float[] heightValues) { this.height = height; } /** * Get the Shape3D object from the delaunay triangulation, change * the Geometry to satisfy the needs of the GISterm 3D-Service * and display it. * * @param DisplayEvent e */ public void displayChanged(DisplayEvent e) { System.out.println("in displayChanged"); if (e.getId() == DisplayEvent.TRANSFORM_DONE) { //System.out.println("transform done"); // Branch from VisAD with Shape3D BranchGroup branchGroup = renderer.getBranch(); //System.out.println("branchGroup "+branchGroup); if (branchGroup != null) { System.out.println("get branch"); branchGroup.detach(); Enumeration enum = branchGroup.getAllChildren(); while(enum.hasMoreElements()) { int[] vert = null; Object o = enum.nextElement(); System.out.println("Object "+o); if (o instanceof BranchGroup) { System.out.println("BG "+(BranchGroup) o); BranchGroup bg = (BranchGroup) o; Enumeration enum2 = bg.getAllChildren(); while (enum2.hasMoreElements()) { Object o2 = enum2.nextElement(); if (o2 instanceof Shape3D) { Shape3D shape3d = (Shape3D) o2; Geometry geom = shape3d.getGeometry(); if (geom instanceof TriangleStripArray) { System.out.println("TriangleStripArray"); TriangleStripArray tri = (TriangleStripArray) geom; //System.out.println("numstrips tri"+tri.getNumStrips()); //vert = new int[1]; vert = new int[tri.getNumStrips()]; tri.getStripVertexCounts(vert); } if (geom instanceof GeometryStripArray) { System.out.println("GeometryStripArray"); GeometryStripArray tri = (GeometryStripArray) geom; //System.out.println("numstrips geo"+tri.getNumStrips()); //vert = new int[1]; vert = new int[tri.getNumStrips()]; tri.getStripVertexCounts(vert); // Change the represenation of the axes towards // 3D-Service GeometryArray geomarr = (GeometryArray) geom; // hier anzahl erhoehe summe aller verts! //Point3d[] point3d = new Point3d[vert[0]]; //Point3d[] point3d = new Point3d[4]; //Point3d[] point3d = new Point3d[nRows*nCols]; Point3d[] point3d = new Point3d[geomarr.getVertexCount()]; System.out.println("vc "+geomarr.getVertexCount()); System.out.println("l "+point3d.length); for (int i=0;i<point3d.length;i++) { point3d[i]= new Point3d(); } geomarr.getCoordinates(0,point3d); for (int i=0;i<point3d.length;i++) { System.out.println(point3d[i]); } point3d = transposition.java3DToWorld(point3d); wv = transposition.calculateWorldVolumeFromJava3D(point3d); geomarr.setCoordinates(0,point3d); for (int i=0;i<point3d.length;i++) { System.out.println(point3d[i]); } System.out.println("wv "+wv.toString()); } Shape3D terrain = new Shape3D(); Appearance app = shape3d.getAppearance(); terrain.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE); terrain.setCapability(Shape3D.ALLOW_APPEARANCE_READ); app.setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_READ); app.setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_WRITE); app.setCapability(Appearance.ALLOW_MATERIAL_READ); app.setCapability(Appearance.ALLOW_MATERIAL_WRITE); app.setCapability(Appearance.ALLOW_COLORING_ATTRIBUTES_READ); app.setCapability(Appearance.ALLOW_COLORING_ATTRIBUTES_WRITE); app.setTransparencyAttributes(new TransparencyAttributes()); PolygonAttributes pa = app.getPolygonAttributes(); //pa.setPolygonMode(PolygonAttributes.POLYGON_LINE); geom.setCapability(Geometry.ALLOW_INTERSECT); terrain.setGeometry(geom); terrain.setAppearance(app); this.setBBox(wv); this.addShape(terrain); //this.addShape(shape3d); this.setUniformColor(this.getLegendLayer().getTree().getGraphicsContext().getForegroundColor()); gis3dView.addLayer(this); } } } if (o instanceof Shape3D) { System.out.println("Shape "+(Shape3D) o); Shape3D shape3d = (Shape3D) o; Geometry geom = shape3d.getGeometry(); // Count number of points in shape3d if (geom instanceof TriangleStripArray) { //System.out.println("TriangleStripArray"); TriangleStripArray tri = (TriangleStripArray) geom; //System.out.println("numstrips tri"+tri.getNumStrips()); vert = new int[1]; tri.getStripVertexCounts(vert); } if (geom instanceof GeometryStripArray) { //System.out.println("GeometryStripArray"); GeometryStripArray tri = (GeometryStripArray) geom; //System.out.println("numstrips geo"+tri.getNumStrips()); vert = new int[1]; tri.getStripVertexCounts(vert); // Change the represenation of the axes towards // 3D-Service GeometryArray geomarr = (GeometryArray) geom; Point3d[] point3d = new Point3d[vert[0]]; for (int i=0;i<point3d.length;i++) { point3d[i]= new Point3d(); } geomarr.getCoordinates(0,point3d); // Change [Wed Mar 28 16:04:57 2001]hilbring: point3d = transposition.java3DToWorld(point3d); wv = transposition.calculateWorldVolumeFromJava3D(point3d); geomarr.setCoordinates(0,point3d); //System.out.println("T%%%%%%%%%%%%%%%%%%%%%%ulx "+ulx+"lrx "+lrx+"lry "+lry+"uly "+uly+"lz "+lz+"uz "+uz); // Change [Wed Mar 28 16:04:59 2001]hilbring: ende } // Fuer NullpointerExceptionsuche, hoffentlich // eliminiert //if (!(geom instanceof GeometryStripArray)) { // System.out.println("hier fehler"+geom); //} Shape3D terrain = new Shape3D(); Appearance app = shape3d.getAppearance(); terrain.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE); terrain.setCapability(Shape3D.ALLOW_APPEARANCE_READ); app.setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_READ); app.setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_WRITE); app.setCapability(Appearance.ALLOW_MATERIAL_READ); app.setCapability(Appearance.ALLOW_MATERIAL_WRITE); app.setCapability(Appearance.ALLOW_COLORING_ATTRIBUTES_READ); app.setCapability(Appearance.ALLOW_COLORING_ATTRIBUTES_WRITE); app.setTransparencyAttributes(new TransparencyAttributes()); PolygonAttributes pa = app.getPolygonAttributes(); //pa.setPolygonMode(PolygonAttributes.POLYGON_LINE); geom.setCapability(Geometry.ALLOW_INTERSECT); terrain.setGeometry(geom); terrain.setAppearance(app); this.setBBox(wv); this.addShape(terrain); this.setUniformColor(this.getLegendLayer().getTree().getGraphicsContext().getForegroundColor()); gis3dView.addLayer(this); } } } } } }
visad
archives: