001 /* 002 * $Id: LongitudeLatitudeCoordinateSystem.java,v 1.11 2012/02/19 17:35:42 davep Exp $ 003 * 004 * This file is part of McIDAS-V 005 * 006 * Copyright 2007-2012 007 * Space Science and Engineering Center (SSEC) 008 * University of Wisconsin - Madison 009 * 1225 W. Dayton Street, Madison, WI 53706, USA 010 * https://www.ssec.wisc.edu/mcidas 011 * 012 * All Rights Reserved 013 * 014 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and 015 * some McIDAS-V source code is based on IDV and VisAD source code. 016 * 017 * McIDAS-V is free software; you can redistribute it and/or modify 018 * it under the terms of the GNU Lesser Public License as published by 019 * the Free Software Foundation; either version 3 of the License, or 020 * (at your option) any later version. 021 * 022 * McIDAS-V is distributed in the hope that it will be useful, 023 * but WITHOUT ANY WARRANTY; without even the implied warranty of 024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 025 * GNU Lesser Public License for more details. 026 * 027 * You should have received a copy of the GNU Lesser Public License 028 * along with this program. If not, see http://www.gnu.org/licenses. 029 */ 030 031 package edu.wisc.ssec.mcidasv.data.hydra; 032 033 import visad.CoordinateSystem; 034 import visad.GridCoordinateSystem; 035 import visad.VisADException; 036 import visad.RealTupleType; 037 import visad.Linear2DSet; 038 import visad.Gridded2DSet; 039 import visad.Linear1DSet; 040 import visad.Unit; 041 import visad.Set; 042 import visad.georef.MapProjection; 043 import java.awt.geom.Rectangle2D; 044 045 046 public class LongitudeLatitudeCoordinateSystem extends CoordinateSystem { 047 //public class LongitudeLatitudeCoordinateSystem extends MapProjection { 048 049 Linear2DSet domainSet; 050 Linear2DSet subSet; 051 Gridded2DSet gset; 052 053 //- assumes incoming GriddedSet is (longitude,latitude) with range (-180,+180) 054 boolean neg180pos180 = true; //false: longitude range (0,+360) 055 056 public LongitudeLatitudeCoordinateSystem(Linear2DSet domainSet, Gridded2DSet gset) throws VisADException { 057 this(domainSet, gset, false); 058 } 059 060 public LongitudeLatitudeCoordinateSystem(Linear2DSet domainSet, Gridded2DSet gset, boolean lonFlag) throws VisADException { 061 super(RealTupleType.SpatialEarth2DTuple, null); 062 this.gset = gset; 063 this.domainSet = domainSet; 064 this.neg180pos180 = lonFlag; 065 int[] lengths = domainSet.getLengths(); 066 int[] gset_lengths = gset.getLengths(); 067 subSet = new Linear2DSet(0.0, gset_lengths[0]-1, lengths[0], 068 0.0, gset_lengths[1]-1, lengths[1]); 069 } 070 071 public float[][] toReference(float[][] values) throws VisADException { 072 float[][] coords = domainSet.valueToGrid(values); 073 coords = subSet.gridToValue(coords); 074 coords = gset.gridToValue(coords); 075 if (!neg180pos180) { // force to longitude range (0,360) 076 for (int t=0; t<coords[0].length; t++) { 077 if (coords[0][t] < 0f) { 078 coords[0][t] += 360f; 079 } 080 } 081 } 082 return coords; 083 } 084 085 public float[][] fromReference(float[][] values) throws VisADException { 086 if (!neg180pos180) { // force to longitude range (0,360) 087 for (int t=0; t<values[0].length; t++) { 088 if (values[0][t] > 180f) { 089 values[0][t] -= 360f; 090 } 091 } 092 } 093 float[][] grid_vals = gset.valueToGrid(values); 094 float[][] coords = subSet.valueToGrid(grid_vals); 095 coords = domainSet.gridToValue(coords); 096 return coords; 097 } 098 099 public double[][] toReference(double[][] values) throws VisADException { 100 float[][] coords = domainSet.valueToGrid(Set.doubleToFloat(values)); 101 coords = subSet.gridToValue(coords); 102 coords = gset.gridToValue(coords); 103 if (!neg180pos180) { // force to longitude range (0,360) 104 for (int t=0; t<coords[0].length; t++) { 105 if (coords[0][t] < 0f) { 106 coords[0][t] += 360f; 107 } 108 } 109 } 110 return Set.floatToDouble(coords); 111 } 112 113 public double[][] fromReference(double[][] values) throws VisADException { 114 if (!neg180pos180) { // force to longitude range (0,360) 115 for (int t=0; t<values[0].length; t++) { 116 if (values[0][t] > 180.0) { 117 values[0][t] -= 360.0; 118 } 119 } 120 } 121 float[][] grid_vals = gset.valueToGrid(Set.doubleToFloat(values)); 122 float[][] coords = subSet.valueToGrid(grid_vals); 123 coords = domainSet.gridToValue(coords); 124 return Set.floatToDouble(coords); 125 } 126 127 public Rectangle2D getDefaultMapArea() { 128 float[] lo = domainSet.getLow(); 129 float[] hi = domainSet.getHi(); 130 return new Rectangle2D.Float(lo[0], lo[1], hi[0] - lo[0], hi[1] - lo[1]); 131 } 132 133 public boolean equals(Object cs) { 134 return (cs instanceof LongitudeLatitudeCoordinateSystem); 135 } 136 }