/*
* 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;
}
}