package com.revolsys.gis.grid; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Nts50000RectangularMapGrid extends Nts250000RectangularMapGrid { private static final Pattern NAME_PATTERN = Pattern .compile("^" + NtsConstants.REGEX_50000 + ".*"); public Nts50000RectangularMapGrid() { this(NtsConstants.WIDTH_50000, NtsConstants.HEIGHT_50000); } protected Nts50000RectangularMapGrid(final double width, final double height) { super(width, height); setName("NTS 1:50 000"); } public String getCellNumber(final String tileName) { final int index = tileName.indexOf('/'); final String cellNumber = tileName.substring(index + 1); if (cellNumber.length() == 1) { return "0" + cellNumber; } else { return cellNumber; } } @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 double latitude = getLatitude(blockName, letter, number50k); return latitude; } else { throw new IllegalArgumentException( mapTileName + " does not start with a valid NTS 1:50,000 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 double longitude = getLongitude(blockName, letter, number50k); return longitude; } else { throw new IllegalArgumentException( mapTileName + " does not start with a valid NTS 1:50,000 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 String letterBlock = super.getMapTileName(x, y); final double yInSheet = Math.abs(92 + y) % NtsConstants.HEIGHT_250000; final int row = (int)Math.floor(yInSheet / NtsConstants.HEIGHT_50000) % 4; final double xInSheet = NtsConstants.WIDTH_250000 - Math.abs(184 + x) % NtsConstants.WIDTH_250000; final int col = (int)Math.floor(xInSheet / NtsConstants.WIDTH_50000) % 4; return letterBlock + "/" + GridUtil.getNumber16(row, col); } }