package com.revolsys.gis.grid; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MtoRectangularMapGrid extends Nts50000RectangularMapGrid { private static final Pattern NAME_PATTERN = Pattern.compile("^" + MtoConstants.REGEX_MTO + ".*"); public MtoRectangularMapGrid() { this(MtoConstants.WIDTH_QUARTER, MtoConstants.HEIGHT_QUARTER); } protected MtoRectangularMapGrid(final double width, final double height) { super(width, height); setName("MTO"); } @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 number50k = matcher.group(3); final String letter12 = matcher.group(4); final String number100 = matcher.group(5); final String letter4 = matcher.group(6); double latitude = getLatitude(blockName, letter, number50k); latitude += GridUtil.getLetter16Row(letter12.charAt(0)) * MtoConstants.HEIGHT_TWELTH; latitude += GridUtil.getNumberRow100(number100) * MtoConstants.HEIGHT_HUNDRETH; latitude += GridUtil.getLetter4Row(letter4.charAt(0)) * MtoConstants.HEIGHT_QUARTER; return latitude; } else { throw new IllegalArgumentException( mapTileName + " does not start with a valid MTO tile name"); } } private double getLatitude(final String blockName, final String letter, final String number50k) { double latitude = getLatitude(blockName, letter); final int number = Integer.parseInt(number50k); final int numberRow = GridUtil.getNumberRow16(number); latitude += numberRow * NtsConstants.HEIGHT_50000; 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 number50k = matcher.group(3); final String letter12 = matcher.group(4); final String number100 = matcher.group(5); final String letter4 = matcher.group(6); double longitude = getLongitude(blockName, letter, number50k); longitude -= GridUtil.getLetter16Col(letter12.charAt(0)) * MtoConstants.WIDTH_TWELTH; longitude -= GridUtil.getNumberCol100(number100) * MtoConstants.WIDTH_HUNDRETH; longitude -= GridUtil.getLetter4Col(letter4.charAt(0)) * MtoConstants.WIDTH_QUARTER; return longitude; } else { throw new IllegalArgumentException( mapTileName + " does not start with a valid MTO tile name"); } } private double getLongitude(final String blockName, final String letter, final String number50k) { double longitude = getLongitude(blockName, letter); final int number = Integer.parseInt(number50k); final int numberCol = GridUtil.getNumberCol16(number); longitude -= numberCol * NtsConstants.WIDTH_50000; return longitude; } @Override public String getMapTileName(final double x, final double y) { final StringBuilder tileName = new StringBuilder(super.getMapTileName(x, y)); for (int index = tileName.indexOf("/"); index != -1; index = tileName.indexOf("/")) { tileName.delete(index, index + 1); } if (tileName.charAt(0) != '1') { tileName.insert(0, '0'); } if (tileName.length() == 5) { tileName.insert(4, "0"); } tileName .append(GridUtil.getLetter12(x, y, MtoConstants.WIDTH_TWELTH, MtoConstants.HEIGHT_TWELTH)); tileName.append( GridUtil.getNumber100(x, y, MtoConstants.WIDTH_HUNDRETH, MtoConstants.HEIGHT_HUNDRETH)); tileName .append(GridUtil.getLetter4(x, y, MtoConstants.WIDTH_QUARTER, MtoConstants.HEIGHT_QUARTER)); return tileName.toString(); } }