Subversion Repositories mkgmap

Rev

Rev 3408 | 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: 12-Dec-2006
 */

package uk.me.parabola.imgfmt.app.trergn;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import uk.me.parabola.imgfmt.app.ImgFileWriter;
import uk.me.parabola.imgfmt.app.Label;

/**
 * An object that appears in a map.  One of point, polyline, polygon or indexed
 * point.
 *
 * All objects appear in a subdivision and are relative to it.  You cannot
 * know where the object is or its size without knowing the subdivision it
 * is in.
 *
 * @author Steve Ratcliffe
 */

public abstract class MapObject {

        // All lines are in a division and many aspects of it are with respect to
        // the division.
        private Subdivision subdiv;

        // The label(s) for this object
        private Label label;
        private List<Label> refLabels;

        // The type of road etc.
        private int type;

        // These long and lat values are relative to the subdivision center.
        // Must be shifted depending on the zoom level.
        private int deltaLong;
        private int deltaLat;

        private ExtTypeAttributes extTypeAttributes;

        // The number of this point within its subdivision.  Set on read only.
        private int number;

        /**
         * Write this object to the given file.
         *
         * @param file The file to write to. It is usually the RGN file.
         */

        public abstract void write(ImgFileWriter file);

        public abstract void write(OutputStream stream) throws IOException;

        int getDeltaLat() {
                return deltaLat;
        }

        protected int getDeltaLong() {
                return deltaLong;
        }

        public void setLabel(Label label) {
                this.label = label;
        }

        public void addRefLabel(Label refLabel) {
                if(refLabels == null)
                        refLabels = new ArrayList<Label>();
                refLabels.add(refLabel);
        }

        public int getType() {
                return type;
        }

        public void setType(int type) {
                this.type = type;
        }

        public boolean hasExtendedType() {
                return hasExtendedType(type);
        }

        public static boolean hasExtendedType(int type) {
                return type >= 0x010000;
        }

        /**
         * Set an ordinary unshifted latitude.  It will be calculated
         * relative to the subdivision.
         *
         * @param lat The original latitude.
         */

        public void setLatitude(int lat) {
                Subdivision div = getSubdiv();

                int diff = div.roundLatToLocalShifted(lat);

                setDeltaLat(diff);
        }

        /**
         * Set an ordinary unshifted longitude.  It will be calculated
         * relative to the subdivision.
         *
         * @param lon The original longitude.
         */

        public void setLongitude(int lon) {
                Subdivision div = getSubdiv();

                int diff = div.roundLonToLocalShifted(lon);

                setDeltaLong(diff);
        }
       
        // directly setting shouldn't be done, unless reading from a file
        protected void setDeltaLat(int deltaLat) {
                assert deltaLat >= -0x8000 && deltaLat <= 0x7fff : "deltaLat = " + deltaLat;
                this.deltaLat = deltaLat;
        }

        // directly setting shouldn't be done, unless reading from a file
        protected void setDeltaLong(int deltaLong) {
                assert deltaLong >= -0x8000 && deltaLong <= 0x7fff : "deltaLong = " + deltaLong;
                this.deltaLong = deltaLong;
        }

        public Subdivision getSubdiv() {
                return subdiv;
        }

        protected void setSubdiv(Subdivision subdiv) {
                this.subdiv = subdiv;
        }

        public Label getLabel() {
                return label;
        }

        public List<Label> getRefLabels() {
                return refLabels;
        }

        protected byte[] getExtTypeExtraBytes() {
                return (extTypeAttributes != null)? extTypeAttributes.getExtTypeExtraBytes(this) : null;
        }

        public void setExtTypeAttributes(ExtTypeAttributes eta) {
                extTypeAttributes = eta;
        }

        public String toString() {
                return "Type=" + type + ", l=" + label;
        }

        public int getNumber() {
                return number;
        }

        public void setNumber(int number) {
                this.number = number;
        }
}