Subversion Repositories mkgmap

Rev

Rev 1870 | 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: 23-Sep-2007
 */

package uk.me.parabola.tdbfmt;

import java.io.IOException;

import uk.me.parabola.imgfmt.app.Area;
import uk.me.parabola.io.FileBlock;
import uk.me.parabola.io.StructuredInputStream;
import uk.me.parabola.io.StructuredOutputStream;

/**
 * The overview map provides a low-detail image for the detailed maps.  It
 * allows you to see what areas the detail maps cover so they can be selected
 * in programs such as QLandkarte and Garmin's MapSource.
 *
 * In addition to a low detail map, the overview map contains a number of type
 * 0x4a polygons.  These definition areas a labeled after and correspond to
 * the detail map img files.
 *
 * The detail maps contain a background polygon (type 0x4b) that matches the
 * definition area in the overview map.
 *
 * @author Steve Ratcliffe
 */

public class OverviewMapBlock extends FileBlock {
        public static final int BLOCK_ID = 0x42;


        private int mapNumber;
        private int parentMapNumber;

        private String description;

        private int maxLat;
        private int maxLong;
        private int minLat;
        private int minLong;

        public OverviewMapBlock() {
                super(BLOCK_ID);
                description = "overview map";
        }

        protected OverviewMapBlock(int blockId) {
                super(blockId);
        }

        public OverviewMapBlock(StructuredInputStream ds) throws IOException {
                super(BLOCK_ID);

                mapNumber = ds.read4();
                parentMapNumber = ds.read4();

                maxLat = ds.read4();
                maxLong = ds.read4();
                minLat = ds.read4();
                minLong = ds.read4();

                description = ds.readString();
        }

        public void writeBody(StructuredOutputStream os) throws IOException {
                os.write4(mapNumber);
                os.write4(parentMapNumber);
                os.write4(maxLat);
                os.write4(maxLong);
                os.write4(minLat);
                os.write4(minLong);
                os.writeString(description);
        }

        public String toString() {
                return "Overview: "
                                + mapNumber
                                + ", parent="
                                + parentMapNumber
                                + " covers "
                                + '(' + toDegrees(minLat) + ',' + toDegrees(minLong) + ')'
                                + '(' + toDegrees(maxLat) + ',' + toDegrees(maxLong) + ')'
                                + " : "
                                + description
                                ;
        }

        private double toDegrees(int tdbunits) {
                return (double) tdbunits * 360 / Math.pow(2, 32);
        }

        public void setArea(Area bounds) {
                minLat = bounds.getMinLat() << 8;
                minLong = bounds.getMinLong() << 8;
                maxLat = bounds.getMaxLat() << 8;
                maxLong = bounds.getMaxLong() << 8;
        }

        public void setDescription(String description) {
                this.description = description;
        }

        public void setMapName(String mapName) {
                try {
                        this.mapNumber = Integer.parseInt(mapName);
                } catch (NumberFormatException e) {
                        this.mapNumber = 0;
                }
        }

        public void setParentMapNumber(int parentMapNumber) {
                this.parentMapNumber = parentMapNumber;
        }
}