Subversion Repositories mkgmap

Rev

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

/*
 * Copyright (C) 2007 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: 25-Sep-2007
 */

package uk.me.parabola.mkgmap.reader;

import java.util.ArrayList;
import java.util.List;

import uk.me.parabola.imgfmt.app.Area;
import uk.me.parabola.imgfmt.app.Coord;
import uk.me.parabola.imgfmt.app.trergn.Overview;
import uk.me.parabola.mkgmap.general.LoadableMapDataSource;
import uk.me.parabola.mkgmap.general.MapDataSource;
import uk.me.parabola.mkgmap.general.MapDetails;
import uk.me.parabola.mkgmap.general.MapLine;
import uk.me.parabola.mkgmap.general.MapPoint;
import uk.me.parabola.mkgmap.general.MapShape;
import uk.me.parabola.imgfmt.app.net.RoadNetwork;
import uk.me.parabola.mkgmap.reader.dem.DEM;
import uk.me.parabola.util.Configurable;
import uk.me.parabola.util.EnhancedProperties;

/**
 * A convenient base class for all map data that is based on the MapDetails
 * class (which is all of them so far).
 *
 * @author Steve Ratcliffe
 */

public abstract class MapperBasedMapDataSource implements MapDataSource, Configurable {
        protected final MapDetails mapper = new MapDetails();
        private EnhancedProperties configProps;
        private boolean driveOnLeft;

        /**
         * Get the area that this map covers. Delegates to the map collector.
         *
         * @return The area the map covers.
         */

        public Area getBounds() {
                return mapper.getBounds();
        }

        /**
         * Get the list of lines that need to be rendered to the map. Delegates to
         * the map collector.
         *
         * @return A list of {@link MapLine} objects.
         */

        public List<MapLine> getLines() {
                return mapper.getLines();
        }

        public List<MapShape> getShapes() {
                return mapper.getShapes();
        }

        public RoadNetwork getRoadNetwork() {
                return mapper.getRoadNetwork();
        }

        /**
         * Get a list of every feature that is used in the map.  As features are
         * created a list is kept of each separate feature that is used.  This
         * goes into the .img file and is important for points and polygons although
         * it doesn't seem to matter if lines are represented or not on my Legend Cx
         * anyway.
         *
         * @return A list of all the types of point, polygon and polyline that are
         * used in the map.
         */

        public List<Overview> getOverviews() {
                return mapper.getOverviews();
        }

        public List<MapPoint> getPoints() {
                return mapper.getPoints();
        }

        public void config(EnhancedProperties props) {
                configProps = props;
                mapper.config(props);
        }

        protected EnhancedProperties getConfig() {
                return configProps;
        }

        public MapDetails getMapper() {
                return mapper;
        }

        /**
         * We add the background polygons if the map is not transparent.
         */

        protected void addBackground() {
                addBackground(false);
        }

        protected void addBackground(boolean mapHasPolygon4B) {
                if (!mapHasPolygon4B && !getConfig().getProperty("transparent", false)) {

                        MapShape background = new MapShape();
                        background.setPoints(mapper.getBounds().toCoords());
                        background.setType(0x4b); // background type
                        background.setMinResolution(0); // On all levels

                        mapper.addShape(background);
                }
                if (getConfig().getProperty("contours", false)) {                  
                    DEM.createContours((LoadableMapDataSource) this, getConfig());
                }
        }

        public void addBoundaryLine(Area area, int type, String name) {
                List<Coord> coords = new ArrayList<Coord>();
                coords.add(new Coord(area.getMinLat(), area.getMinLong()));
                coords.add(new Coord(area.getMinLat(), area.getMaxLong()));
                coords.add(new Coord(area.getMaxLat(), area.getMaxLong()));
                coords.add(new Coord(area.getMaxLat(), area.getMinLong()));
                coords.add(new Coord(area.getMinLat() + 1, area.getMinLong()));
                MapLine boundary = new MapLine();
                boundary.setType(type);
                if(name != null)
                        boundary.setName(name);
                boundary.setMinResolution(0); // On all levels
                boundary.setPoints(coords);
                mapper.addLine(boundary);
        }
       
        /**
         * @return true/false if source contains info about driving side, else null
         */

        public Boolean getDriveOnLeft(){
                return driveOnLeft;
        }
       
        protected void setDriveOnLeft(boolean b) {
                driveOnLeft = b;
        }

}