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