Subversion Repositories mkgmap

Rev

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

/*
 * Copyright (C) 2006 Steve Ratcliffe
 *
 *  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: Steve Ratcliffe
 * Create date: 16-Dec-2006
 */

package uk.me.parabola.mkgmap.main;

import java.io.File;
import java.io.FileNotFoundException;

import uk.me.parabola.imgfmt.FileExistsException;
import uk.me.parabola.imgfmt.FileNotWritableException;
import uk.me.parabola.imgfmt.FileSystemParam;
import uk.me.parabola.imgfmt.FormatException;
import uk.me.parabola.imgfmt.MapFailedException;
import uk.me.parabola.imgfmt.app.map.Map;
import uk.me.parabola.imgfmt.app.srt.Sort;
import uk.me.parabola.log.Logger;
import uk.me.parabola.mkgmap.CommandArgs;
import uk.me.parabola.mkgmap.build.MapBuilder;
import uk.me.parabola.mkgmap.combiners.OverviewBuilder;
import uk.me.parabola.mkgmap.general.LoadableMapDataSource;
import uk.me.parabola.mkgmap.reader.plugin.MapReader;

/**
 * Main routine for the command line map-making utility.
 *
 * @author Steve Ratcliffe
 */

public class MapMaker implements MapProcessor {
        private static final Logger log = Logger.getLogger(MapMaker.class);
        private Sort sort;
        private final boolean createOverviewFiles;

        public MapMaker(boolean createOverviewFiles) {
                this.createOverviewFiles = createOverviewFiles;
        }

        public String makeMap(CommandArgs args, String filename) {
                try {
                        LoadableMapDataSource src = loadFromFile(args, filename);
                        sort = args.getSort();
                        if (createOverviewFiles){
                                if (src.overviewMapLevels() != null){
                                        makeMap(args, src, OverviewBuilder.OVERVIEW_PREFIX);
                                } else {
                                        String fname = OverviewBuilder.getOverviewImgName(args.getMapname());
                                        File f = new File(fname);
                                        if (f.exists()) {
                                                if (f.isFile() )
                                                        f.delete();
                                                else {
                                                        // TODO: error message ?
                                                }
                                        }
                                }
                        }
                        return makeMap(args, src, "");
                } catch (FormatException e) {
                        System.err.println("Bad file format: " + filename);
                        System.err.println(e.getMessage());
                        return filename;
                } catch (FileNotFoundException e) {
                        System.err.println("Could not open file: " + filename);
                        return filename;
                }
        }

        /**
         * Make a map from the given map data source.
         *
         * @param args User supplied arguments.
         * @param src The data source to load.
         * @param mapNameExt
         * @return The output filename for the map.
         */

        private String makeMap(CommandArgs args, LoadableMapDataSource src, String mapNamePrefix) {

                if (src.getBounds().isEmpty())
                        return null;

                FileSystemParam params = new FileSystemParam();
                params.setBlockSize(args.getBlockSize());
                params.setMapDescription(args.getDescription());
                log.info("Started making", args.getMapname(), "(" + args.getDescription() + ")");
                try {
                        Map map = Map.createMap(mapNamePrefix + args.getMapname(), args.getOutputDir(), params, args.getMapname(), sort);
                        setOptions(map, args);

                        MapBuilder builder = new MapBuilder();
                        builder.config(args.getProperties());
                        if(! OverviewBuilder.OVERVIEW_PREFIX.equals(mapNamePrefix)){
                                if (args.getProperties().containsKey("route") || args.getProperties().containsKey("net"))
                                        builder.setDoRoads(true);
                        }
                        builder.makeMap(map, src);

                        // Collect information on map complete.
                        String outName = map.getFilename();
                        log.info("finished making map", outName, "closing");
                        map.close();
                        return outName;
                } catch (FileExistsException e) {
                        throw new MapFailedException("File exists already", e);
                } catch (FileNotWritableException e) {
                        throw new MapFailedException("Could not create or write to file", e);
                }
        }

        /**
         * Set options from the command line.
         *
         * @param map The map to modify.
         * @param args The command line arguments.
         */

        private void setOptions(Map map, CommandArgs args) {
                map.config(args.getProperties());

                String s = args.getCharset();
                if (s != null)
                        map.setLabelCharset(s, args.isForceUpper());

                Sort sort = args.getSort();
                map.setSort(sort);
        }

        /**
         * Load up from the file.  It is not necessary for the map reader to completely
         * read the whole file in at once, it could pull in map-features as needed.
         *
         * @param args The user supplied parameters.
         * @param name The filename or resource name to be read.
         * @return A LoadableMapDataSource that will be used to construct the map.
         * @throws FileNotFoundException For non existing files.
         * @throws FormatException When the file format is not valid.
         */

        private LoadableMapDataSource loadFromFile(CommandArgs args, String name) throws
                        FileNotFoundException, FormatException
        {
                LoadableMapDataSource src = MapReader.createMapReader(name);
                src.config(args.getProperties());
                log.info("Started loading", name);
                src.load(name);
                log.info("Finished loading", name);
                return src;
        }
}