All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgrasstools.gears.modules.r.tmsgenerator.Mapurl2MbtilesConverter Maven / Gradle / Ivy

The newest version!
/*
 * This file is part of JGrasstools (http://www.jgrasstools.org)
 * (C) HydroloGIS - www.hydrologis.com 
 * 
 * JGrasstools is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see .
 */
package org.jgrasstools.gears.modules.r.tmsgenerator;

import static java.lang.Math.max;
import static java.lang.Math.min;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSHYDRO_AUTHORCONTACTS;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSHYDRO_AUTHORNAMES;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSHYDRO_DRAFT;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSHYDRO_LICENSE;
import static org.jgrasstools.gears.i18n.GearsMessages.OMSTMSGENERATOR_LABEL;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.imageio.ImageIO;

import oms3.annotations.Author;
import oms3.annotations.Description;
import oms3.annotations.Execute;
import oms3.annotations.In;
import oms3.annotations.Keywords;
import oms3.annotations.Label;
import oms3.annotations.License;
import oms3.annotations.Name;
import oms3.annotations.Status;
import oms3.annotations.UI;

import org.jgrasstools.gears.libs.exceptions.ModelsIllegalargumentException;
import org.jgrasstools.gears.libs.modules.JGTConstants;
import org.jgrasstools.gears.libs.modules.JGTModel;
import org.jgrasstools.gears.utils.files.FileUtilities;
import org.jgrasstools.gears.utils.time.EggClock;

@Description("Feeds a jgrasstools mapurl enabled TMS folder into a new mbtiles database.")
@Author(name = OMSHYDRO_AUTHORNAMES, contact = OMSHYDRO_AUTHORCONTACTS)
@Keywords("tms, mbtiles")
@Label(OMSTMSGENERATOR_LABEL)
@Name("mapurl2mbtiles")
@Status(OMSHYDRO_DRAFT)
@License(OMSHYDRO_LICENSE)
public class Mapurl2MbtilesConverter extends JGTModel {

    @Description("TMS folder mapurl file.")
    @UI(JGTConstants.FILEIN_UI_HINT)
    @In
    public String inFile = null;

    private MBTilesHelper mbtilesHelper;

    private String format;

    private volatile int imageIndex = 0;
    private volatile double n = Double.NEGATIVE_INFINITY;
    private volatile double e = Double.NEGATIVE_INFINITY;
    private volatile double s = Double.POSITIVE_INFINITY;
    private volatile double w = Double.POSITIVE_INFINITY;

    @Execute
    public void process() throws Exception {
        checkNull(inFile);

        File mapurlFile = new File(inFile);

        HashMap metadataMap = FileUtilities.readFileToHashMap(inFile, "=", false);
        String url = metadataMap.get("url");
        if (url == null) {
            throw new ModelsIllegalargumentException("The supplied file doesn't seem to be a valid jgrasstools mapurl file.",
                    this, pm);
        }
        if (url.endsWith("jpg")) {
            format = "jpg";
        } else {
            format = "png";
        }

        File dbFile = FileUtilities.substituteExtention(mapurlFile, "mbtiles");
        String tilesetName = FileUtilities.getNameWithoutExtention(mapurlFile);
        File folderFile = new File(mapurlFile.getParentFile(), tilesetName);

        mbtilesHelper = new MBTilesHelper();
        mbtilesHelper.open(dbFile);
        mbtilesHelper.createTables(false);

        File[] zFolders = folderFile.listFiles();
        List xFolder = new ArrayList();
        for( File zFolder : zFolders ) {
            File[] xFiles = zFolder.listFiles();
            for( File xFile : xFiles ) {
                if (xFile.isDirectory()) {
                    xFolder.add(xFile);
                }
            }
        }

        final GlobalMercator mercator = new GlobalMercator();

        int minZ = 1000;
        int maxZ = -1000;

        EggClock clock = new EggClock("Time check: ", " sec");
        clock.startAndPrint(System.out);

        for( File xFile : xFolder ) {
            String zStr = xFile.getParentFile().getName();
            final int z = Integer.parseInt(zStr);
            minZ = min(minZ, z);
            maxZ = max(maxZ, z);

            String xStr = xFile.getName();
            final int x = Integer.parseInt(xStr);

            final File[] yFiles = xFile.listFiles(new FilenameFilter(){
                public boolean accept( File arg0, String name ) {
                    boolean endsWithPng = name.endsWith("png");
                    boolean endsWithJpg = name.endsWith("jpg");
                    if (endsWithPng || endsWithJpg) {
                        return true;
                    }
                    return false;
                }
            });

            for( File yFile : yFiles ) {
                String yStr = FileUtilities.getNameWithoutExtention(yFile);
                int y = Integer.parseInt(yStr);

                double[] wsen = mercator.TileLatLonBounds(x, y, z);
                n = max(n, wsen[3]);
                e = max(e, wsen[2]);
                s = max(s, wsen[1]);
                w = max(w, wsen[0]);

                try {
                    BufferedImage image = ImageIO.read(yFile);
                    mbtilesHelper.addTile(x, y, z, image, format);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }

                if (imageIndex % 1000 == 0) {
                    pm.message("Images inserted in db: " + imageIndex);
                    clock.printTimePassedInSeconds(System.out);
                }
                imageIndex++;
            }
        }

        mbtilesHelper.fillMetadata((float) n, (float) s, (float) w, (float) e, "tilesetName", format, minZ, maxZ);
        mbtilesHelper.createIndexes();
        mbtilesHelper.close();
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy