/* * 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: 09-Dec-2006 */ package uk.me.parabola.imgfmt.app.trergn; import java.io.IOException; import java.io.OutputStream; import uk.me.parabola.imgfmt.app.Coord; import uk.me.parabola.imgfmt.app.ImgFileWriter; import uk.me.parabola.imgfmt.app.lbl.POIRecord; /** * Represents a particular point object on a map. A point has a type (town * restaurant etc) and a location as well as a name. * * A point belongs to a particular subdivision and cannot be interpreted without * it as all details are relative to the subdivision. * * @author Steve Ratcliffe */ public class Point extends MapObject { // Points can link to a POIRecord private POIRecord poi; public Point(Subdivision div) { setSubdiv(div); } /** * Format and write the contents of the object to the given * file. * * @param file A reference to the file that should be written to. */ public void write(ImgFileWriter file) { boolean hasSubtype = false; int type = getType(); byte subtype = 0; if (type > 0xff) { if((type & 0xff) != 0) { hasSubtype = true; subtype = (byte) type; } type >>= 8; } file.put((byte) type); int off = getLabel().getOffset(); if (poi != null) { off = poi.getOffset(); off |= 0x400000; } if (hasSubtype) off |= 0x800000; file.put3(off); file.putChar((char) getDeltaLong()); file.putChar((char) getDeltaLat()); if (hasSubtype) file.put(subtype); } /* * write the point to an OutputStream - only use for outputting * points with extended (3 byte) types. * */ public void write(OutputStream stream) throws IOException { assert hasExtendedType(); int type = getType(); int labelOff = getLabel().getOffset(); byte[] extraBytes = getExtTypeExtraBytes(); if (poi != null) { labelOff = poi.getOffset(); labelOff |= 0x400000; } if(labelOff != 0) type |= 0x20; // has label if(extraBytes != null) type |= 0x80; // has extra bytes stream.write(type >> 8); stream.write(type); int deltaLong = getDeltaLong(); int deltaLat = getDeltaLat(); stream.write(deltaLong); stream.write(deltaLong >> 8); stream.write(deltaLat); stream.write(deltaLat >> 8); if(labelOff != 0) { stream.write(labelOff); stream.write(labelOff >> 8); stream.write(labelOff >> 16); } if(extraBytes != null) stream.write(extraBytes); } public void setPOIRecord(POIRecord poirecord) { this.poi = poirecord; } public POIRecord getPOIRecord() { if (poi == null) return new POIRecord(); return poi; } public Coord getLocation() { int shift = getSubdiv().getShift(); Coord co = new Coord(getSubdiv().getLatitude() + (getDeltaLat() << shift), getSubdiv().getLongitude() + (getDeltaLong() << shift) ); return co; } }