package com.revolsys.gis.grid;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Nts25000RectangularMapGrid extends Nts50000RectangularMapGrid {
private static final Pattern NAME_PATTERN = Pattern
.compile("^" + NtsConstants.REGEX_25000 + ".*");
public Nts25000RectangularMapGrid() {
super(NtsConstants.WIDTH_25000, NtsConstants.HEIGHT_25000);
setName("NTS 1:25 000");
}
@Override
public double getLatitude(final String mapTileName) {
final Matcher matcher = NAME_PATTERN.matcher(mapTileName);
if (matcher.matches()) {
final String name = matcher.group(1);
final int block = Integer.parseInt(name);
double latitude = getLatitude(block);
final String letter250k = matcher.group(2);
final int letter16Row = GridUtil.getLetter16Row(letter250k.charAt(0));
latitude += letter16Row * NtsConstants.HEIGHT_250000;
final int number = Integer.parseInt(matcher.group(3));
final int numberRow = GridUtil.getNumberRow16(number);
latitude += numberRow * NtsConstants.HEIGHT_50000;
final String letter8 = matcher.group(4);
final int letter8Row = GridUtil.getLetter8Row(letter8.charAt(0));
latitude += letter8Row * NtsConstants.HEIGHT_25000;
return latitude;
} else {
throw new IllegalArgumentException(
mapTileName + " does not start with a valid NTS 1:125,000 tile name");
}
}
@Override
public double getLongitude(final String mapTileName) {
final Matcher matcher = NAME_PATTERN.matcher(mapTileName);
if (matcher.matches()) {
final String name = matcher.group(1);
final int block = Integer.parseInt(name);
double longitude = getLongitude(block);
final String letter16 = matcher.group(2);
final int letter16Col = GridUtil.getLetter16Col(letter16.charAt(0));
longitude -= letter16Col * NtsConstants.WIDTH_250000;
final int number = Integer.parseInt(matcher.group(3));
final int numberCol = GridUtil.getNumberCol16(number);
longitude -= numberCol * NtsConstants.WIDTH_50000;
final String letter8 = matcher.group(4);
final int letter8Col = GridUtil.getLetter8Col(letter8.charAt(0));
longitude -= letter8Col * NtsConstants.WIDTH_25000;
return longitude;
} else {
throw new IllegalArgumentException(
mapTileName + " does not start with a valid NTS 1:125,000 tile name");
}
}
@Override
public String getMapTileName(final double x, final double y) {
final String letterBlock = super.getMapTileName(x, y);
final double yInSheet = Math.abs(92 + y) % NtsConstants.HEIGHT_50000;
final int row = (int)Math.floor(yInSheet / NtsConstants.HEIGHT_25000);
final double xInSheet = NtsConstants.WIDTH_50000 - Math.abs(184 + x) % NtsConstants.WIDTH_50000;
final int col = (int)Math.floor(xInSheet / NtsConstants.WIDTH_25000) % 4;
return letterBlock + GridUtil.getLetter8(row, col);
}
}