package com.revolsys.gis.grid;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Bcgs20000RectangularMapGrid extends Nts250000RectangularMapGrid {
private static final Pattern FIND_NAME_PATTERN = Pattern
.compile(".*(" + BcgsConstants.REGEX_20000 + ").*");
public static final Bcgs20000RectangularMapGrid INSTANCE = new Bcgs20000RectangularMapGrid();
private static final Pattern NAME_PATTERN = Pattern
.compile("^" + BcgsConstants.REGEX_20000 + ".*");
public static String getTileName(final String mapTileName) {
final Matcher matcher = FIND_NAME_PATTERN.matcher(mapTileName);
if (matcher.find()) {
return matcher.group(0).replaceAll("\\.", "").toLowerCase();
} else {
return mapTileName;
}
}
public Bcgs20000RectangularMapGrid() {
this(BcgsConstants.WIDTH_20000, BcgsConstants.HEIGHT_20000);
}
protected Bcgs20000RectangularMapGrid(final double width, final double height) {
super(width, height);
setPrecisionScale(10);
setName("BCGS 1:20 000");
}
@Override
public String getFormattedMapTileName(final String name) {
String tileName = getTileName(name);
final int length = tileName.length();
tileName = tileName.substring(0, length - 3).toUpperCase() + "."
+ tileName.substring(length - 3);
return tileName;
}
@Override
public double getLatitude(final String mapTileName) {
final Matcher matcher = NAME_PATTERN.matcher(mapTileName);
if (matcher.matches()) {
final String blockName = matcher.group(1);
final String letter = matcher.group(2);
final String numberString = matcher.group(3);
final double latitude = getLatitude(blockName, letter, numberString);
return latitude;
} else {
throw new IllegalArgumentException(
mapTileName + " does not start with a valid BCGS 1:20,000 tile name");
}
}
protected double getLatitude(final String blockName, final String letter,
final String numberString) {
double latitude = getLatitude(blockName, letter);
final int number = Integer.parseInt(numberString);
final int numberRow = GridUtil.getNumberRow100(number);
latitude += numberRow * BcgsConstants.HEIGHT_20000;
return latitude;
}
@Override
public double getLongitude(final String mapTileName) {
final Matcher matcher = NAME_PATTERN.matcher(mapTileName);
if (matcher.matches()) {
final String blockName = matcher.group(1);
final String letter = matcher.group(2);
final String numberString = matcher.group(3);
final double longitude = getLongitude(blockName, letter, numberString);
return longitude;
} else {
throw new IllegalArgumentException(
mapTileName + " does not start with a valid BCGS 1:20,000 tile name");
}
}
protected double getLongitude(final String blockName, final String letter,
final String numberString) {
double longitude = getLongitude(blockName, letter);
final int number = Integer.parseInt(numberString);
final int numberCol = GridUtil.getNumberCol100(number);
longitude -= numberCol * BcgsConstants.WIDTH_20000;
return longitude;
}
public String getMapsheetWithPath(final String mapsheet) {
final String mapTileName = getTileName(mapsheet);
final int block = getBlock(mapTileName);
final char letter = getLetter(mapTileName);
final StringBuilder path = new StringBuilder();
path.append(block);
path.append('/');
path.append(letter);
path.append('/');
path.append(mapTileName);
return path.toString();
}
@Override
public String getMapTileName(final double x, final double y) {
final String letterBlock = super.getMapTileName(x, y);
final double xSheet = (x + 180) * 5;
final int col = (int)((Math.ceil(xSheet - 0.000000000001) - 1) % 10);
final double ySheet = (y + 90) * 10;
final int row = (int)Math.floor(ySheet + 0.000000000001) % 10;
return letterBlock + GridUtil.getNumber100(row, col);
}
}