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.
Kjell- Kjell Roang wrote:
I fully agree. I would try to use VisAd as much as possible, and the conversation with you has given me hints how to use another projection package inside VisAd. I must then find a way to put GRIB data into VisAd and get images and data out of VisAd.
I've attached a copy of a version of ProjectionCoordinateSystem from our IDV package that shows how we adapt our Projection class (ucar.unidata.geoloc.Projection) to a VisADCoordinateSystem. This is an older version (we've made mods for other reasons that are not applicable here), but should give you a guide for how to convert a GeoTools Projection to a VisADCoordinateSystem. Don ************************************************************* Don Murray UCAR Unidata Program dmurray@xxxxxxxxxxxxxxxx P.O. Box 3000 (303) 497-8628 Boulder, CO 80307 http://www.unidata.ucar.edu/staff/donm *************************************************************
// $Id: ProjectionCoordinateSystem.java,v 1.5 2001/11/06 17:18:44 dmurray Exp $ /* * Copyright 1997-2000 Unidata Program Center/University Corporation for * Atmospheric Research, P.O. Box 3000, Boulder, CO 80307, * support@xxxxxxxxxxxxxxxx. * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package ucar.visad; import ucar.unidata.geoloc.*; import visad.*; import visad.georef.MapProjection; /** * Adapts a ucar.unidata.Projection into a VisAD MapProjection CoordinateSystem. * Transforms between world coordinates (x,y) in km and lat/lon in degrees. * Reference is lat/lon (RealTupleType.LatitudeLongitudeTuple) * * @see ucar.unidata.geoloc.Projection * @see visad.georef.MapProjection * @author Stuart Wier * @author Don Murray * @version $Revision: 1.5 $ $Date: 2001/11/06 17:18:44 $ */ public class ProjectionCoordinateSystem extends MapProjection { private Projection projection; private ProjectionPointImpl workP = new ProjectionPointImpl(); private LatLonPointImpl workL = new LatLonPointImpl(); /** * Constructs an instance from the supplied Projection. The * reference coordinate system is RealTupleType.LatitudeLongitudeTuple; * the incoming units are assumed to be km (1000 m). */ public ProjectionCoordinateSystem (Projection projection) throws VisADException { super(RealTupleType.LatitudeLongitudeTuple, new Unit[] {CommonUnit.meter.scale(1000.0), CommonUnit.meter.scale(1000.0)}); this.projection = projection; } /** * Get a reasonable bounding box in this coordinate system. MapProjections * are typically specific to an area of the world; there's no bounding * box that works for all projections so each subclass must implement * this method. * * @return the default MapArea of the Projection */ public java.awt.geom.Rectangle2D getDefaultMapArea() { return projection.getDefaultMapArea(); } /** * Get the Projection used for the transformations. * @return projection */ public Projection getProjection() { return projection; } /** * Convert world coordinates to lat/lon. Input coords are in km. * @param world world projection coordinates (x = world[0][i]) * @return corresponding lat/lon values (lat = latlon[0][i]) * @throws VisADException world coordinate array length != 2 */ public double[][] toReference(double[][] world) throws VisADException { if ( world == null || world.length != 2) throw new VisADException( "ProjectionCoordinateSystem.toReference: " + "null world array or wrong dimension "); double[][] latlon = new double[2][world[0].length]; LatLonPoint llPoint; for (int i = 0; i < latlon[0].length; i++) { workP.setLocation(world[0][i], world[1][i]); llPoint = projection.projToLatLon(workP); latlon[getLatitudeIndex()][i] = llPoint.getLatitude(); latlon[getLongitudeIndex()][i] = llPoint.getLongitude(); } return latlon; } /** * Convert lat/lon coordinates to world (projection) coords. * @param lat/lon values (lat = latlon[0][i]) * @return world projection coordinates (x = world[0][i]) * @throws VisADException latlon coordinate array length != 2 */ public double[][] fromReference(double[][] latlon) throws VisADException { if ( latlon == null || latlon.length != 2) throw new VisADException( "ProjectionCoordinateSystem.toReference: " + "null latlon array or wrong dimension "); double[][] world = new double[2][latlon[0].length]; ProjectionPoint projPoint; for (int i = 0; i < latlon[0].length; i++) { workL.setLatitude(latlon[getLatitudeIndex()][i]); workL.setLongitude(latlon[getLongitudeIndex()][i]); projPoint = projection.latLonToProj(workL); world[0][i] = projPoint.getX(); world[1][i] = projPoint.getY(); } return world; } /** * Check for equality of CoordinateSystem objects * @param obj other object in question * @return true if the object in question is a ProjectionCoordinateSystem * and it's Projection is equal the this object's Projection */ public boolean equals (Object obj) { if (!(obj instanceof ProjectionCoordinateSystem)) return false; ProjectionCoordinateSystem that = (ProjectionCoordinateSystem) obj; return that.projection.equals(projection); } } // end ProjectionCoordinateSystem class
visad
archives: