Subversion Repositories mkgmap

Rev

Rev 1650 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2009 Christian Gawron
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 *
 *  This program 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 General Public License for more details.
 *
 *
 * Author: Christian Gawron
 * Create date: 03-Jul-2009
 */

package uk.me.parabola.mkgmap.reader.dem.optional;

import java.awt.*;
import java.awt.image.Raster;
import java.awt.image.renderable.ParameterBlock;
import java.io.IOException;
import java.io.Writer;

import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import javax.media.jai.RenderedOp;

import uk.me.parabola.imgfmt.ExitException;
import uk.me.parabola.mkgmap.reader.dem.DEM;

import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.TIFFDecodeParam;

public abstract class GeoTiffDEM extends DEM
{
    Raster raster;
    String fileName;
    int minLat, minLon, maxLat, maxLon;
    PlanarImage image;

    void initData()
    {
       
        try {
            SeekableStream s = new FileSeekableStream(fileName);
            ParameterBlock pb = new ParameterBlock();
            pb.add(s);
           
            TIFFDecodeParam param = new TIFFDecodeParam();
            pb.add(param);
           
            RenderedOp op = JAI.create("tiff", pb);
            image = op.createInstance();
            System.out.printf("Image: %d %d %d %d\n", image.getWidth(), image.getHeight(),
                              image.getNumXTiles(), image.getNumYTiles());
        }
        catch (Exception e) {
            throw new ExitException("Failed to open/process " + fileName, e);
        }
    }

    protected static class CGIAR extends GeoTiffDEM
    {
        public CGIAR(String dataPath, double minLat, double minLon, double maxLat, double maxLon)
        {
            this.lat = ((int) (minLat/5))*5;
            this.lon = ((int) (minLon/5))*5;
            if (maxLat > lat+5 || maxLon > lon+5)
                throw new ExitException("Area too large (must not span more than one CGIAR GeoTIFF)");
           
            int tileX = (180 + lon) / 5 + 1;
                int tileY = (60 - lat) / 5;
            this.fileName = String.format("%s/srtm_%02d_%02d.tif", dataPath, tileX, tileY);
            System.out.printf("CGIAR GeoTIFF: %s\n", fileName);
            N = 6000;
            M = 6000;
            res = 5.0/M;
           
            initData();
        }
       
        public void serializeCopyRight(Writer out) throws IOException
        {
            out.write("  <copyright>\n");
            out.write("  Contour lines generated from improved SRTM data by CIAT-CSI (see http://srtm.csi.cgiar.org)\n");
            out.write("  </copyright>\n");
        }
       
        protected void read(int minLon, int minLat, int maxLon, int maxLat)
        {
            this.minLon = minLon;
            this.minLat = minLat;
            this.maxLon = maxLon;
            this.maxLat = maxLat;
            raster = image.getData(new Rectangle(minLon, 6000-maxLat-1, maxLon-minLon+1, maxLat-minLat+1));
            System.out.printf("read: %d %d %d %d\n", minLon, 6000-maxLat-1, maxLon-minLon+1, maxLat-minLat+1);
        }

        public double ele(int x, int y)
        {
                int elevation = raster.getPixel(x, 6000-y-1, (int[])null)[0];
                return elevation+delta;
        }
    }
   
    protected static class ASTER extends GeoTiffDEM
    {
       
        public ASTER(String dataPath, double minLat, double minLon, double maxLat, double maxLon)
        {
            this.lat = (int) minLat;
            this.lon = (int) minLon;
            if (maxLat > lat+1 || maxLon > lon+1)
                throw new ExitException("Area too large (must not span more than one ASTER GeoTIFF)");
           
            String northSouth = lat < 0 ? "S" : "N";
            String eastWest = lon > 0 ? "E" : "W";
            fileName = String.format("%s/ASTGTM_%s%02d%s%03d_dem.tif", dataPath,
                                     northSouth, lat < 0 ? -lat : lat,
                                     eastWest, lon < 0 ? -lon : lon);
           
            System.out.printf("ASTER GeoTIFF: %s\n", fileName);
            N = 3600;
            M = 3600;
            res = 1.0/M;
            initData();
        }
       
        public void serializeCopyRight(Writer out) throws IOException
        {
            out.write("  <copyright>\n");
            out.write("  Contour lines generated from DGM data by ASTER (see https://wist.echo.nasa.gov/~wist/api/imswelcome)\n");
            out.write("  </copyright>\n");
        }
       
        protected void read(int minLon, int minLat, int maxLon, int maxLat)
        {
            this.minLon = minLon;
            this.minLat = minLat;
            this.maxLon = maxLon;
            this.maxLat = maxLat;
            raster = image.getData(new Rectangle(minLon, 3601-maxLat-1, maxLon-minLon+1, maxLat-minLat+1));
            System.out.printf("read: %d %d %d %d\n", minLon, 3601-maxLat-1, maxLon-minLon+1, maxLat-minLat+1);
        }

        public double ele(int x, int y)
        {
                int elevation = raster.getPixel(x, 3601-y-1, (int[])null)[0];
                return elevation+delta;
        }
    }

}