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