diff --git a/src/main/java/pl/wat/ms4ds/terrain/BigSquare.java b/src/main/java/pl/wat/ms4ds/terrain/BigSquare.java index 43b5a92..bc685a1 100644 --- a/src/main/java/pl/wat/ms4ds/terrain/BigSquare.java +++ b/src/main/java/pl/wat/ms4ds/terrain/BigSquare.java @@ -4,7 +4,7 @@ package pl.wat.ms4ds.terrain; import javafx.scene.image.ImageView; abstract class BigSquare { - abstract Square getKwadrat(int x, int y); + abstract Square getSquare(int x, int y); protected transient String fileName; public int idX = 0; diff --git a/src/main/java/pl/wat/ms4ds/terrain/EmptyBigSquare.java b/src/main/java/pl/wat/ms4ds/terrain/EmptyBigSquare.java index 1a343ab..f3ca5cf 100644 --- a/src/main/java/pl/wat/ms4ds/terrain/EmptyBigSquare.java +++ b/src/main/java/pl/wat/ms4ds/terrain/EmptyBigSquare.java @@ -7,7 +7,7 @@ class EmptyBigSquare extends BigSquare { private EmptyBigSquare() { } - Square getKwadrat(int ssX, int ssY) { + Square getSquare(int ssX, int ssY) { return Square.EMPTY; } } diff --git a/src/main/java/pl/wat/ms4ds/terrain/MapConsts.java b/src/main/java/pl/wat/ms4ds/terrain/MapConsts.java index d8dc70a..599565e 100644 --- a/src/main/java/pl/wat/ms4ds/terrain/MapConsts.java +++ b/src/main/java/pl/wat/ms4ds/terrain/MapConsts.java @@ -12,28 +12,27 @@ public final class MapConsts { private static final Logger LOGGER = LoggerFactory.getLogger(MapConsts.class); /** - * Umowny uklad odniesienia dla lokalizacji geograficznej:
- * Długość geograficzna (wsp. X) przyjmuje wartości: [0, 360) odpowiadające [-180, 180]
- * Szerokość geograficzna (wsp. Y) przyjmuje wartości: [0, 180] odpowadające [-90, 90] + * Długość geograficzna referencyjna początku umownego układu współrzędnych w postaci siatki kwadratów.
+ * Wartości długości geograficznej mapowane są: [-180, 180) -> [0, 360). */ - public static final int X_REF; + public static final int LON_REF; /** - * Umowny uklad odniesienia dla lokalizacji geograficznej:
- * Długość geograficzna (wsp. X) przyjmuje wartości: [0, 360) odpowiadające [-180, 180]
- * Szerokość geograficzna (wsp. Y) przyjmuje wartości: [0, 180] odpowadające [-90, 90] + * Szerokość geograficzna referencyjna początku umownego układu współrzędnych w postaci siatki kwadratów.
+ * Wartości szerokości geograficznej mapowane są: [-90, 90] -> [0, 180]. */ - public static final int Y_REF; - public static final int DX_REF; - public static final int DY_REF; + public static final int LAT_REF; - public static final String KWADRATY_DIR; + public static final int DELTA_LON_REF; + public static final int DELTA_LAT_REF; + + public static final String DATA_DIR; /** * Nazwa pliku z konfiguracja mechanizmu odpowiedzialnego za transfer. Plik * musi znajdowac sie w katalogu glownym aplikacji, ewentualnie musi tu byc * podana sciezka bezwzgledna do niego. */ - private static final String PLIK_Z_USTAWIENIAMI = "teren.properties"; + private static final String PROPERTIES_FILE = "teren.properties"; /** * Dlugosc boku duzego kwadratu na osi OX w liczbie malych kwadratow. @@ -50,15 +49,15 @@ public final class MapConsts { /** * Powierzchnia malego kwadratu w metrach. */ - public static final int POW_MK; + public static final int SS_AREA; /** * Szerokość małego kwadratu w stopniach. */ - public static final double DELTA_X; + public static final double SS_DELTA_LON; /** * Wysokość małego kwadratu w stopniach. */ - public static final double DELTA_Y; + public static final double SS_DELTA_LAT; /** * Liczba duzych kwadratow na stopien geograficzny po osi OX (dlugosc geograficzna). */ @@ -75,7 +74,6 @@ public final class MapConsts { * Wysokość duzych kwadratow w stopniach geograficznych po osi OY (szerokosc geograficzna). */ public static final double BS_DY; - /** * Szerokości geograficzne środków kwadratów. */ @@ -88,7 +86,7 @@ public final class MapConsts { static Properties ustawienia; static { - String propertiesFileName = System.getProperty("user.dir") + "\\" + PLIK_Z_USTAWIENIAMI; + String propertiesFileName = System.getProperty("user.dir") + "\\" + PROPERTIES_FILE; ustawienia = new Properties(); try { @@ -101,13 +99,13 @@ public final class MapConsts { // przesuniecie o 180 stop. // poludnik zerowy ma wartosc 180, zatem wspolrzedne zachodnie (ujemne) zawierają sie w <0, 180) // wspolrzedne wschodnie (nieujemne) zawieraja sie w przedziale <180, 360) - X_REF = Integer.parseInt(ustawienia.getProperty("x_ref")) + 180; + LON_REF = Integer.parseInt(ustawienia.getProperty("x_ref")) + 180; // przesuniecie o 90 stop. // rownik ma wartosc 90, zatem wspolrzedne poludniowe (ujemne) zawierają sie w <0, 90) // wspolrzedne polnocne (nieujemne) zawieraja sie w przedziale <90, 180> - Y_REF = Integer.parseInt(ustawienia.getProperty("y_ref")) + 90; - DX_REF = Integer.parseInt(ustawienia.getProperty("dx_ref")); - DY_REF = Integer.parseInt(ustawienia.getProperty("dy_ref")); + LAT_REF = Integer.parseInt(ustawienia.getProperty("y_ref")) + 90; + DELTA_LON_REF = Integer.parseInt(ustawienia.getProperty("dx_ref")); + DELTA_LAT_REF = Integer.parseInt(ustawienia.getProperty("dy_ref")); String val = ustawienia.getProperty("dl_mk"); switch (val) { case "20": @@ -126,50 +124,50 @@ public final class MapConsts { SS_SIZE = 200; break; } - POW_MK = SS_SIZE * SS_SIZE; + SS_AREA = SS_SIZE * SS_SIZE; if (SS_SIZE == 20) { SS_PER_BS_X = 83 * 10; SS_PER_BS_Y = 93 * 10; - DELTA_X = 1.0 / (double) (BS_PER_DEG_X * SS_PER_BS_X); - DELTA_Y = 1.0 / (double) (BS_PER_DEG_Y * SS_PER_BS_Y); - KWADRATY_DIR = ustawienia.getProperty("kwadraty_dir") + "20m/"; + SS_DELTA_LON = 1.0 / (double) (BS_PER_DEG_X * SS_PER_BS_X); + SS_DELTA_LAT = 1.0 / (double) (BS_PER_DEG_Y * SS_PER_BS_Y); + DATA_DIR = ustawienia.getProperty("kwadraty_dir") + "20m/"; } else if (SS_SIZE == 25) { SS_PER_BS_X = 83 * 8; SS_PER_BS_Y = 93 * 8; - DELTA_X = 1.0 / (double) (BS_PER_DEG_X * SS_PER_BS_X); - DELTA_Y = 1.0 / (double) (BS_PER_DEG_Y * SS_PER_BS_Y); - KWADRATY_DIR = ustawienia.getProperty("kwadraty_dir") + "25m/"; + SS_DELTA_LON = 1.0 / (double) (BS_PER_DEG_X * SS_PER_BS_X); + SS_DELTA_LAT = 1.0 / (double) (BS_PER_DEG_Y * SS_PER_BS_Y); + DATA_DIR = ustawienia.getProperty("kwadraty_dir") + "25m/"; } else if (SS_SIZE == 50) { SS_PER_BS_X = 83 * 4; SS_PER_BS_Y = 93 * 4; - DELTA_X = 1.0 / (double) (BS_PER_DEG_X * SS_PER_BS_X); - DELTA_Y = 1.0 / (double) (BS_PER_DEG_Y * SS_PER_BS_Y); - KWADRATY_DIR = ustawienia.getProperty("kwadraty_dir") + "50m/"; + SS_DELTA_LON = 1.0 / (double) (BS_PER_DEG_X * SS_PER_BS_X); + SS_DELTA_LAT = 1.0 / (double) (BS_PER_DEG_Y * SS_PER_BS_Y); + DATA_DIR = ustawienia.getProperty("kwadraty_dir") + "50m/"; } else if (SS_SIZE == 100) { SS_PER_BS_X = 83 * 2; SS_PER_BS_Y = 93 * 2; - DELTA_X = 1.0 / (double) (BS_PER_DEG_X * SS_PER_BS_X); - DELTA_Y = 1.0 / (double) (BS_PER_DEG_Y * SS_PER_BS_Y); - KWADRATY_DIR = ustawienia.getProperty("kwadraty_dir") + "100m/"; + SS_DELTA_LON = 1.0 / (double) (BS_PER_DEG_X * SS_PER_BS_X); + SS_DELTA_LAT = 1.0 / (double) (BS_PER_DEG_Y * SS_PER_BS_Y); + DATA_DIR = ustawienia.getProperty("kwadraty_dir") + "100m/"; } else { // domyslnie dlugosc kwadratu 200m SS_PER_BS_X = 83; SS_PER_BS_Y = 93; - DELTA_X = 1.0 / (double) (BS_PER_DEG_X * SS_PER_BS_X); - DELTA_Y = 1.0 / (double) (BS_PER_DEG_Y * SS_PER_BS_Y); - KWADRATY_DIR = ustawienia.getProperty("kwadraty_dir") + "200m/"; + SS_DELTA_LON = 1.0 / (double) (BS_PER_DEG_X * SS_PER_BS_X); + SS_DELTA_LAT = 1.0 / (double) (BS_PER_DEG_Y * SS_PER_BS_Y); + DATA_DIR = ustawienia.getProperty("kwadraty_dir") + "200m/"; } BS_DX = 1.0 / (double) BS_PER_DEG_X; BS_DY = 1.0 / (double) BS_PER_DEG_Y; - LONS = new double[DX_REF * BS_PER_DEG_X * SS_PER_BS_X]; + LONS = new double[DELTA_LON_REF * BS_PER_DEG_X * SS_PER_BS_X]; for (int i = 0; i < LONS.length; i++) { - LONS[i] = X_REF + DELTA_X * (i + 0.5); + LONS[i] = LON_REF + SS_DELTA_LON * (i + 0.5); } - LATS = new double[DY_REF * BS_PER_DEG_Y * SS_PER_BS_Y]; + LATS = new double[DELTA_LAT_REF * BS_PER_DEG_Y * SS_PER_BS_Y]; for (int i = 0; i < LATS.length; i++) { - LATS[i] = Y_REF + DELTA_Y * (i + 0.5); + LATS[i] = LAT_REF + SS_DELTA_LAT * (i + 0.5); } - LOGGER.debug("Wczytane ustawienia:\n \tLON_REF={}, LAT_REF={}, DX_REF={}, DY_REF{}, SQUARE_SIZE={}, GRID_SIZE={}x{}, DATA_DIR={}", X_REF, Y_REF, DX_REF, DY_REF, SS_SIZE, LONS.length, LATS.length, KWADRATY_DIR); + LOGGER.debug("Wczytane ustawienia:\n \tLON_REF={}, LAT_REF={}, DX_REF={}, DY_REF{}, SQUARE_SIZE={}, GRID_SIZE={}x{}, DATA_DIR={}", LON_REF, LAT_REF, DELTA_LON_REF, DELTA_LAT_REF, SS_SIZE, LONS.length, LATS.length, DATA_DIR); } /** @@ -191,7 +189,7 @@ public final class MapConsts { * @return */ public static int getX_REF() { - return X_REF; + return LON_REF; } /** @@ -200,7 +198,7 @@ public final class MapConsts { * @return */ public static int getY_REF() { - return Y_REF; + return LAT_REF; } /** @@ -209,7 +207,7 @@ public final class MapConsts { * @return */ public static int getDX_REF() { - return DX_REF; + return DELTA_LON_REF; } /** @@ -218,25 +216,25 @@ public final class MapConsts { * @return */ public static int getDY_REF() { - return DY_REF; + return DELTA_LAT_REF; } /** * Dlugosci bokow malego kwadratu w milisekundach geograficznych po osi OX (dlugosc geograficzna). */ - public static final double SS_DX_MS = DELTA_X * DEG_MS; + public static final double SS_DX_MS = SS_DELTA_LON * DEG_MS; /** * Dlugosci bokow malego kwadratu w milisekundach geograficznych po osi OY (szerokosc geograficzna). */ - public static final double SS_DY_MS = DELTA_Y * DEG_MS; + public static final double SS_DY_MS = SS_DELTA_LAT * DEG_MS; // wspolrzedne dolnego lewego rogu mapy w ms // wspolrzedne geograficzne w milisekundach zawieraja sie w zakresie: // 0 <= x < 360 dlugosc geograficzna // 0 <= y <= 180 szerokosc geograficzna - public static final int X_REF_MS = X_REF * DEG_MS; - public static final int Y_REF_MS = Y_REF * DEG_MS; - public static final int DX_REF_MS = DEG_MS * DX_REF; // szerokosc pola walki w stopniach - public static final int DY_REF_MS = DEG_MS * DY_REF; // wysokosc polwa walki w stopniach + public static final int X_REF_MS = LON_REF * DEG_MS; + public static final int Y_REF_MS = LAT_REF * DEG_MS; + public static final int DX_REF_MS = DEG_MS * DELTA_LON_REF; // szerokosc pola walki w stopniach + public static final int DY_REF_MS = DEG_MS * DELTA_LAT_REF; // wysokosc polwa walki w stopniach public static final int BS_DX_MS = (int) (BS_DX * DEG_MS); public static final int BS_DY_MS = (int) (BS_DY * DEG_MS); diff --git a/src/main/java/pl/wat/ms4ds/terrain/RightBigSquare.java b/src/main/java/pl/wat/ms4ds/terrain/RightBigSquare.java index acacaae..70acdaf 100644 --- a/src/main/java/pl/wat/ms4ds/terrain/RightBigSquare.java +++ b/src/main/java/pl/wat/ms4ds/terrain/RightBigSquare.java @@ -2,7 +2,7 @@ package pl.wat.ms4ds.terrain; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import pl.wat.ms4ds.terrain.konwersja.CoordUtils; +import pl.wat.ms4ds.terrain.nmt.NMTDataReader; import java.io.*; @@ -12,42 +12,11 @@ public class RightBigSquare extends BigSquare { private Square[][] squares; - Square getKwadrat(int ssX, int ssY) { + Square getSquare(int ssX, int ssY) { return squares[ssX][ssY]; } - static final int NORTH = 0; - static final int NORTH_EAST = 1; - static final int EAST = 2; - static final int SOUTH_EAST = 3; - static final int SOUTH = 4; - static final int SOUTH_WEST = 5; - static final int WEST = 6; - static final int NORTH_WEST = 7; - static final byte NORTH_CODE = 1; - static final byte NORTH_EAST_CODE = 2; - static final byte EAST_CODE = 4; - static final byte SOUTH_EAST_CODE = 8; - static final byte SOUTH_CODE = 16; - static final byte SOUTH_WEST_CODE = 32; - static final byte WEST_CODE = 64; - static final byte NORTH_WEST_CODE = -128; - - public void saveToFile(String dir) throws IOException { - // Utworzenie katalogów, gdyby nie istniały. - File directory = new File(dir); - directory.mkdirs(); - String path = dir + fileName + ".bin"; - Square.RawData ss = new Square.RawData(); - ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path)); - for (int x = 0; x < squares.length; x++) { - for (int y = 0; y < squares[0].length; y++) { - ss.read(squares[x][y]); - ss.write(out); - } - } - out.close(); - logger.debug("Zapisano nowy plik mapy: {}.", path); + public RightBigSquare() { } /** @@ -61,7 +30,7 @@ public class RightBigSquare extends BigSquare { if (newDir != null) { fn = newDir + fileName + ".bin"; } else { - fn = MapConsts.KWADRATY_DIR + fileName + ".bin"; + fn = MapConsts.DATA_DIR + fileName + ".bin"; } BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fn)); byte[] buf = new byte[9 * 256]; @@ -83,199 +52,43 @@ public class RightBigSquare extends BigSquare { logger.debug("Zapisano plik mapy: {}", fn); } - /** - * Funkcja generuje nowy plik z danymi na podstawie danych z pliku referencyjnego (kwadraty o rozm. 100m). - *
Nowy plik moze byc z danymi w innej skali (kwadraty o rozmiarach: 100m lub 50m). - * - * @param dir katalog docelowy dla nowego pliku - * @param dlmk rozmiar kwadratow generownych danych - * @throws IOException generowany wyjątek - */ - public void saveNewFileWithNewScale20m(String dir, int dlmk) throws IOException { - if (MapConsts.SS_SIZE != 100) { - // operacja tylko dla danych terenowych o kwadratach 200m + void readFromFile(String dir) throws IOException { + if (fileName == null) { return; } - final int m = 5; - String s = "20m/"; - StringBuilder sb = new StringBuilder(100); - sb.append(dir); - sb.append(s); - // Utworzenie katalogów, gdyby nie istniały. - File directory = new File(sb.toString()); - directory.mkdirs(); - sb.append(fileName); - sb.append(".bin"); - ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(sb.toString())); - - Square.RawData[][][][] ss_all = new Square.RawData[MapConsts.SS_PER_BS_X][MapConsts.SS_PER_BS_Y][][]; - for (int x = 0; x < MapConsts.SS_PER_BS_X; x++) { - for (int y = 0; y < MapConsts.SS_PER_BS_Y; y++) { - Square.RawData[][] ss = new Square.RawData[m][m]; - for (int i = 0; i < m; i++) { - for (int j = 0; j < m; j++) { - ss[i][j] = new Square.RawData(); - } - } - ss_all[x][y] = ss; - // jest odcinek drogi na tym kierunku - if (squares[x][y].jestDroga[NORTH]) { - ss[2][2].majorRoads |= NORTH_CODE; - ss[2][3].majorRoads |= NORTH_CODE | SOUTH_CODE; - ss[2][4].majorRoads |= NORTH_CODE | SOUTH_CODE; - } - if (squares[x][y].jestDroga[NORTH_EAST]) { - ss[2][2].majorRoads |= NORTH_EAST_CODE; - ss[3][3].majorRoads |= NORTH_EAST_CODE | SOUTH_WEST_CODE; - ss[4][4].majorRoads |= NORTH_EAST_CODE | SOUTH_WEST_CODE; - } - if (squares[x][y].jestDroga[EAST]) { - ss[2][2].majorRoads |= EAST_CODE; - ss[3][2].majorRoads |= EAST_CODE | WEST_CODE; - ss[4][2].majorRoads |= EAST_CODE | WEST_CODE; - } - if (squares[x][y].jestDroga[SOUTH_EAST]) { - ss[2][2].majorRoads |= SOUTH_EAST_CODE; - ss[3][1].majorRoads |= SOUTH_EAST_CODE | NORTH_WEST_CODE; - ss[4][0].majorRoads |= SOUTH_EAST_CODE | NORTH_WEST_CODE; - } - if (squares[x][y].jestDroga[SOUTH]) { - ss[2][2].majorRoads |= SOUTH_CODE; - ss[2][1].majorRoads |= SOUTH_CODE | NORTH_CODE; - ss[2][0].majorRoads |= SOUTH_CODE | NORTH_CODE; - } - if (squares[x][y].jestDroga[SOUTH_WEST]) { - ss[2][2].majorRoads |= SOUTH_WEST_CODE; - ss[1][1].majorRoads |= SOUTH_WEST_CODE | NORTH_EAST_CODE; - ss[0][0].majorRoads |= SOUTH_WEST_CODE | NORTH_EAST_CODE; - } - if (squares[x][y].jestDroga[WEST]) { - ss[2][2].majorRoads |= WEST_CODE; - ss[1][2].majorRoads |= WEST_CODE | EAST_CODE; - ss[0][2].majorRoads |= WEST_CODE | EAST_CODE; - } - if (squares[x][y].jestDroga[NORTH_WEST]) { - ss[2][2].majorRoads |= NORTH_WEST_CODE; - ss[1][3].majorRoads |= NORTH_WEST_CODE | SOUTH_EAST_CODE; - ss[0][4].majorRoads |= NORTH_WEST_CODE | SOUTH_EAST_CODE; - } - - // jest odcinek rzeki na tym kierunku - if (squares[x][y].jestPrzeszkodaWodna[NORTH]) { - ss[2][2].rivers |= NORTH_CODE; - ss[2][3].rivers |= NORTH_CODE | SOUTH_CODE; - ss[2][4].rivers |= NORTH_CODE | SOUTH_CODE; - } - if (squares[x][y].jestPrzeszkodaWodna[NORTH_EAST]) { - ss[2][2].rivers |= NORTH_EAST_CODE; - ss[3][3].rivers |= NORTH_EAST_CODE | SOUTH_WEST_CODE; - ss[4][4].rivers |= NORTH_EAST_CODE | SOUTH_WEST_CODE; - } - if (squares[x][y].jestPrzeszkodaWodna[EAST]) { - ss[2][2].rivers |= EAST_CODE; - ss[3][2].rivers |= EAST_CODE | WEST_CODE; - ss[4][2].rivers |= EAST_CODE | WEST_CODE; - } - if (squares[x][y].jestPrzeszkodaWodna[SOUTH_EAST]) { - ss[2][2].rivers |= SOUTH_EAST_CODE; - ss[3][1].rivers |= SOUTH_EAST_CODE | NORTH_WEST_CODE; - ss[4][0].rivers |= SOUTH_EAST_CODE | NORTH_WEST_CODE; - } - if (squares[x][y].jestPrzeszkodaWodna[SOUTH]) { - ss[2][2].rivers |= SOUTH_CODE; - ss[2][1].rivers |= SOUTH_CODE | NORTH_CODE; - ss[2][0].rivers |= SOUTH_CODE | NORTH_CODE; - } - if (squares[x][y].jestPrzeszkodaWodna[SOUTH_WEST]) { - ss[2][2].rivers |= SOUTH_WEST_CODE; - ss[1][1].rivers |= SOUTH_WEST_CODE | NORTH_EAST_CODE; - ss[0][0].rivers |= SOUTH_WEST_CODE | NORTH_EAST_CODE; - } - if (squares[x][y].jestPrzeszkodaWodna[WEST]) { - ss[2][2].rivers |= WEST_CODE; - ss[1][2].rivers |= WEST_CODE | EAST_CODE; - ss[0][2].rivers |= WEST_CODE | EAST_CODE; - } - if (squares[x][y].jestPrzeszkodaWodna[NORTH_WEST]) { - ss[2][2].rivers |= NORTH_WEST_CODE; - ss[1][3].rivers |= NORTH_WEST_CODE | SOUTH_EAST_CODE; - ss[0][4].rivers |= NORTH_WEST_CODE | SOUTH_EAST_CODE; - } - - // jest odcinek rowu na tym kierunku - if (squares[x][y].jestRow[NORTH]) { - ss[2][2].drains |= NORTH_CODE; - ss[2][3].drains |= NORTH_CODE | SOUTH_CODE; - ss[2][4].drains |= NORTH_CODE | SOUTH_CODE; - } - if (squares[x][y].jestRow[NORTH_EAST]) { - ss[2][2].drains |= NORTH_EAST_CODE; - ss[3][3].drains |= NORTH_EAST_CODE | SOUTH_WEST_CODE; - ss[4][4].drains |= NORTH_EAST_CODE | SOUTH_WEST_CODE; - } - if (squares[x][y].jestRow[EAST]) { - ss[2][2].drains |= EAST_CODE; - ss[3][2].drains |= EAST_CODE | WEST_CODE; - ss[4][2].drains |= EAST_CODE | WEST_CODE; - } - if (squares[x][y].jestRow[SOUTH_EAST]) { - ss[2][2].drains |= SOUTH_EAST_CODE; - ss[3][1].drains |= SOUTH_EAST_CODE | NORTH_WEST_CODE; - ss[4][0].drains |= SOUTH_EAST_CODE | NORTH_WEST_CODE; - } - if (squares[x][y].jestRow[SOUTH]) { - ss[2][2].drains |= SOUTH_CODE; - ss[2][1].drains |= SOUTH_CODE | NORTH_CODE; - ss[2][0].drains |= SOUTH_CODE | NORTH_CODE; - } - if (squares[x][y].jestRow[SOUTH_WEST]) { - ss[2][2].drains |= SOUTH_WEST_CODE; - ss[1][1].drains |= SOUTH_WEST_CODE | NORTH_EAST_CODE; - ss[0][0].drains |= SOUTH_WEST_CODE | NORTH_EAST_CODE; - } - if (squares[x][y].jestRow[WEST]) { - ss[2][2].drains |= WEST_CODE; - ss[1][2].drains |= WEST_CODE | EAST_CODE; - ss[0][2].drains |= WEST_CODE | EAST_CODE; - } - if (squares[x][y].jestRow[NORTH_WEST]) { - ss[2][2].drains |= NORTH_WEST_CODE; - ss[1][3].drains |= NORTH_WEST_CODE | SOUTH_EAST_CODE; - ss[0][4].drains |= NORTH_WEST_CODE | SOUTH_EAST_CODE; - } - - for (int i = 0; i < m; i++) { - for (int j = 0; j < m; j++) { - int hex = 0; - if (squares[x][y].stopienZalesienia > 0) { - hex = TerrainType.FOREST.ID; - } else if (squares[x][y].stopienZawodnienia > 0) { - hex = TerrainType.WATER.ID; - } else if (squares[x][y].stopienZabudowy > 0) { - hex = TerrainType.BUILDINGS.ID; - } else if (squares[x][y].stopienZabagnienia > 0) { - hex = TerrainType.SWAMP.ID; - } - ss[i][j].terrainType = (byte) hex; - // Konwersja [m] -> [0.25m] - ss[i][j].elevation = (short) (squares[x][y].wysokoscSrednia * 4); - } - } - } - } - for (int x = 0; x < MapConsts.SS_PER_BS_X; x++) { - for (int i = 0; i < m; i++) { + try { + String fullPath = dir + fileName + ".bin"; + BufferedInputStream in = new BufferedInputStream(new FileInputStream(fullPath), 2 * 8192); + byte[] buffer = new byte[9 * 512]; + int offset = 0; + int count = in.read(buffer); + squares = new Square[MapConsts.SS_PER_BS_X][MapConsts.SS_PER_BS_Y]; + for (int x = 0; x < MapConsts.SS_PER_BS_X; x++) { for (int y = 0; y < MapConsts.SS_PER_BS_Y; y++) { - for (int j = 0; j < m; j++) { - ss_all[x][y][i][j].write(out); + Square kw = new Square(x, y); + if (offset >= count) { + count = in.read(buffer); + offset = 0; } + offset = kw.readFromBuffer(buffer, offset); +// if (kw.elevation < NMTDataReader.H_MIN) { +// logger.warn("Elevation: {}, fn= {} ", kw.elevation, fileName); +// } +// if (kw.elevation > NMTDataReader.H_MAX) { +// logger.warn("Elevation: {}, fn= {} ", kw.elevation, fileName); +// } + squares[x][y] = kw; } } + in.close(); + logger.debug("Doczytano plik mapy: " + fullPath); + } catch (IOException e) { + squares = null; + throw e; } - out.close(); - logger.debug("Zapisano nowy plik mapy: " + sb + " dla rozmiaru MK= " + dlmk); } + /** * Generuje nowe, wyzerowane kwadraty w danej skali w nowym formacie. * @@ -283,60 +96,7 @@ public class RightBigSquare extends BigSquare { * @param dlmk * @throws IOException */ - public void saveNewFileWithNewFormatWithElevetion(String dir, int dlmk) throws IOException { - if (MapConsts.SS_SIZE != 100) { - // operacja tylko dla danych terenowych o kwadratach 200m - return; - } - int m; - String s = ""; - if (dlmk == 100) { - m = 1; - s = "100m/"; - } else if (dlmk == 50) { - m = 2; - s = "50m/"; - } else if (dlmk == 25) { - m = 4; - s = "25m/"; - } else if (dlmk == 20) { - m = 5; - s = "20m/"; - } else { - return; - } - StringBuilder sb = new StringBuilder(100); - sb.append(dir); - sb.append(s); - // Utworzenie katalogów, gdyby nie istniały. - File directory = new File(sb.toString()); - directory.mkdirs(); - sb.append(fileName); - Square.RawData ss = new Square.RawData(); - ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(sb.toString())); - for (int x = 0; x < MapConsts.SS_PER_BS_X; x++) { - for (int y = 0; y < MapConsts.SS_PER_BS_Y; y++) { - // Konwersja [m] -> [0.25m] - ss.elevation = (short) (squares[x][y].wysokoscSrednia * 4); - for (int i = 0; i < m; i++) { - for (int j = 0; j < m; j++) { - ss.write(out); - } - } - } - } - out.close(); - logger.debug("Zapisano nowy plik mapy: {} dla rozmiaru MK= {}", sb, dlmk); - } - - /** - * Generuje nowe, wyzerowane kwadraty w danej skali w nowym formacie. - * - * @param dir - * @param dlmk - * @throws IOException - */ - public void writeToFileOldToNewFormatWithElevetion(String dir, int dlmk) throws IOException { + public void writeToFile_ElevationOnly(String dir, int dlmk) throws IOException { if (MapConsts.SS_SIZE != 100) { // operacja tylko dla danych terenowych o kwadratach 200m return; @@ -365,22 +125,22 @@ public class RightBigSquare extends BigSquare { File directory = new File(sb.toString()); directory.mkdirs(); sb.append(fileName + ".bin"); - Square.RawData ss = new Square.RawData(); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(sb.toString())); byte[] buf = new byte[9 * 256]; int offset = 0; for (int x = 0; x < squares.length; x++) { - for (int y = 0; y < squares[0].length; y++) { - Square square = squares[x][y]; - square.elevation = square.wysokoscSrednia; - if (square.elevation > 2660) { - logger.warn("Elevation: {}, fn= {} ", square.elevation, fileName); - } - for (int i = 0; i < m * m; i++) { - offset = square.writeToBuffer(buf, offset); - if (offset >= buf.length) { - out.write(buf); - offset = 0; + for (int i = 0; i < m; i++) { + for (int y = 0; y < squares[0].length; y++) { + Square square = squares[x][y]; + if (square.elevation > NMTDataReader.H_MAX) { + logger.warn("Elevation: {}, fn= {}", square.elevation, fileName); + } + for (int j = 0; j < m; j++) { + offset = square.writeToBufferElevationOnly(buf, offset); + if (offset >= buf.length) { + out.write(buf); + offset = 0; + } } } } @@ -392,7 +152,7 @@ public class RightBigSquare extends BigSquare { logger.debug("Zapisano plik mapy: {}", fileName); } - public void saveFileFromNewToOldFormat(String dir) throws IOException { + public void writeToFile_OldFormat(String dir) throws IOException { StringBuilder sb = new StringBuilder(100); sb.append(dir); // Utworzenie katalogów, gdyby nie istniały. @@ -402,17 +162,15 @@ public class RightBigSquare extends BigSquare { if (fileName.indexOf('.') < 0) { sb.append(".bin"); } - Square.RawData ss = new Square.RawData(); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(sb.toString())); for (int x = 0; x < squares.length; x++) { for (int y = 0; y < squares[0].length; y++) { - float f; - int hex = 0; + Square square = squares[x][y]; int hex_s = 0; int hex_w = 0; int hex_b = 0; int hex_f = 0; - switch (squares[x][y].terrainType) { + switch (square.terrainType) { // case 0, 1, 4: // hex = 0; // break; @@ -434,14 +192,15 @@ public class RightBigSquare extends BigSquare { out.writeByte(hex_w); out.writeByte(hex_b); out.writeByte(hex_s); - int elevation = (int) squares[x][y].elevation; + int elevation = (int) square.elevation; out.writeInt(elevation); - out.writeInt(squares[x][y].roznicaWzniesien); + // Różnica wzniesień. + out.writeInt(0); int bit_1; - hex = 0; + int hex = 0; bit_1 = 1; - byte[] roads = squares[x][y].roads; - for (int i = 0; i < roads.length; i++) { + byte[] roads = square.roads; + for (int i = 0; i < 8; i++) { // jest odcinek drogi na tym kierunku if (roads[i] > 0) { hex |= bit_1; @@ -451,8 +210,8 @@ public class RightBigSquare extends BigSquare { out.writeByte(hex); hex = 0; bit_1 = 1; - byte[] watercourses = squares[x][y].watercourses; - for (int i = 0; i < watercourses.length; i++) { + byte[] watercourses = square.watercourses; + for (int i = 0; i < 8; i++) { // jest odcinek przeszkody wodnej na tym kierunku if (watercourses[i] > 1) { hex |= bit_1; @@ -462,7 +221,7 @@ public class RightBigSquare extends BigSquare { out.writeByte(hex); hex = 0; bit_1 = 1; - for (int i = 0; i < watercourses.length; i++) { + for (int i = 0; i < 8; i++) { // jest odcinek rowu na tym kierunku if (watercourses[i] == 1) { hex |= bit_1; @@ -476,322 +235,94 @@ public class RightBigSquare extends BigSquare { logger.debug("Zapisano nowy plik mapy: {}", sb); } - void readFromFileNew(String dir) throws IOException { + /** + * Konstruktor ladujacy duzy kwadrat z pliku binarnego w starym formacie. + * + * @param dir opcjonalny katalog z danymi + * + */ + void readFromFile_OldFormat(String dir) throws IOException { if (fileName == null) { return; } - try { - String fullPath = dir + fileName + ".bin"; - BufferedInputStream in = new BufferedInputStream(new FileInputStream(fullPath), 2 * 8192); - byte[] buffer = new byte[9 * 512]; - int offset = 0; - int count = in.read(buffer); - squares = new Square[MapConsts.SS_PER_BS_X][MapConsts.SS_PER_BS_Y]; - for (int x = 0; x < MapConsts.SS_PER_BS_X; x++) { - for (int y = 0; y < MapConsts.SS_PER_BS_Y; y++) { - Square kw = new Square(x, y); - if (offset >= count) { - count = in.read(buffer); - offset = 0; - } - offset = kw.readFromBuffer(buffer, offset); - if (kw.elevation < -3) { - logger.warn("Elevation: {}, fn= {} ", kw.elevation, fileName); - } - if (kw.elevation > 2660) { - logger.warn("Elevation: {}, fn= {} ", kw.elevation, fileName); - } - squares[x][y] = kw; - } - } - in.close(); - logger.debug("Doczytano plik mapy: " + fullPath); - } catch (IOException e) { - squares = null; - throw e; - } - } - - void readFromFile(String dir) throws IOException { - try { - String fullPath = dir + fileName + ".bin"; - Square.RawData ss = new Square.RawData(); -// DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(fullPath))); - ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(fullPath))); - squares = new Square[MapConsts.SS_PER_BS_X][MapConsts.SS_PER_BS_Y]; - for (int x = 0; x < MapConsts.SS_PER_BS_X; x++) { - for (int y = 0; y < MapConsts.SS_PER_BS_Y; y++) { - ss.read(in); - Square kw = new Square(x, y, ss); - squares[x][y] = kw; - if (kw.elevation > 2660) { - logger.warn("Elevation: {}, fn={} ", kw.elevation, fileName); - } - if (kw.elevation < -3) { - logger.warn("Elevation: {}, fn= {} ", kw.elevation, fileName); - } - } - } - in.close(); - logger.debug("Doczytano plik mapy: " + fullPath); - } catch (IOException e) { - squares = null; - throw e; - } - } - - /** - * Funkcja generuje nowy plik z danymi na podstawie danych z pliku referencyjnego (kwadraty o rozm. 200m). - *
Nowy plik moze byc z danymi w innej skali (kwadraty o rozmiarach: 100m lub 50m) i/lub innym formacie (binarny, tekstowy). - * - * @param dir katalog docelowy dla nowego pliku - * @param dlmk rozmiar kwadratow generownych danych - * @throws IOException generowany wyjątek - */ - public void saveNewFileWithNewScale_old_format(String dir, int dlmk, - boolean zalesienie, boolean zawodnienie, boolean zabudowa, boolean zabagnienie, - boolean wysokosc, boolean roznicaWzniesien, boolean drogi, - boolean rzeki, boolean rowy) throws IOException { - if (MapConsts.SS_SIZE != 200) { - // operacja tylko dla danych terenowych o kwadratach 200m - return; - } - int m = 1; - String s = ""; - if (dlmk == 200) { - m = 1; - s = "200m/"; - } else if (dlmk == 100) { - m = 2; - s = "100m/"; - } else if (dlmk == 50) { - m = 4; - s = "50m/"; - } else if (dlmk == 25) { - m = 8; - s = "25m/"; - } else { - return; - } StringBuilder sb = new StringBuilder(100); - sb.append(dir); - sb.append(s); - // Utworzenie katalogów, gdyby nie istniały. - File directory = new File(sb.toString()); - directory.mkdirs(); - sb.append(fileName); - sb.append(".bin"); - ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(sb.toString())); - for (int x = 0; x < MapConsts.SS_PER_BS_X; x++) { - for (int y = 0; y < MapConsts.SS_PER_BS_Y; y++) { - for (int k = 0; k < m * m; k++) { - float f; - int hex = 0; - if (zalesienie) { - f = squares[x][y].stopienZalesienia * 100.0f; - hex = (int) f; - hex = (hex > 100) ? 100 : hex; - hex = (hex < 0) ? 0 : hex; - } - out.writeByte(hex); - hex = 0; - if (zawodnienie) { - f = squares[x][y].stopienZawodnienia * 100.0f; - hex = (int) f; - hex = (hex > 100) ? 100 : hex; - hex = (hex < 0) ? 0 : hex; - } - out.writeByte(hex); - hex = 0; - if (zabudowa) { - f = squares[x][y].stopienZabudowy * 100.0f; - hex = (int) f; - hex = (hex > 100) ? 100 : hex; - hex = (hex < 0) ? 0 : hex; - } - out.writeByte(hex); - hex = 0; - if (zabagnienie) { - f = squares[x][y].stopienZabagnienia * 100.0f; - hex = (int) f; - hex = (hex > 100) ? 100 : hex; - hex = (hex < 0) ? 0 : hex; - } - out.writeByte(hex); - if (wysokosc) { - out.writeInt(squares[x][y].wysokoscSrednia); - } else { - out.writeInt(0); - } - if (roznicaWzniesien) { - out.writeInt(squares[x][y].roznicaWzniesien); - } else { - out.writeInt(0); - } - int bit_1; - hex = 0; - if (drogi) { - bit_1 = 1; - for (int i = 0; i < squares[x][y].jestDroga.length; i++) { - // jest odcinek drogi na tym kierunku - if (squares[x][y].jestDroga[i]) { - hex |= bit_1; - } - bit_1 <<= 1; - } - } - out.writeByte(hex); - hex = 0; - if (rzeki) { - bit_1 = 1; - for (int i = 0; i < squares[x][y].jestPrzeszkodaWodna.length; i++) { - // jest odcinek przeszkody wodnej na tym kierunku - if (squares[x][y].jestPrzeszkodaWodna[i]) { - hex |= bit_1; - } - bit_1 <<= 1; - } - } - out.writeByte(hex); - hex = 0; - if (rowy) { - bit_1 = 1; - for (int i = 0; i < squares[x][y].jestRow.length; i++) { - // jest odcinek rowu na tym kierunku - if (squares[x][y].jestRow[i]) { - hex |= bit_1; - } - bit_1 <<= 1; - } - } - out.writeByte(hex); - } - } + if (dir == null) { + sb.append(MapConsts.DATA_DIR); + } else { + sb.append(dir); } - out.close(); - logger.debug("Zapisano nowy plik mapy: " + sb.toString() + " dla rozmiaru MK= " + dlmk); - } - - - public RightBigSquare() { - } - - /** - * konstruktor ladujacy duzy kwadrat z pliku binarnego w starym formacie - * - * @param fname nazwa pliku z danymi - */ - RightBigSquare(String fname, String dir) throws IOException { + sb.append(fileName).append(".bin"); try { - File f = new File(fname); - fileName = f.getName(); - fileName = fileName.substring(0, fileName.lastIndexOf('.')); - StringBuilder sb = new StringBuilder(100); - if (dir == null) { - sb.append(MapConsts.KWADRATY_DIR); - } else { - sb.append(dir); - } - sb.append(fileName + ".bin"); ObjectInputStream in = new ObjectInputStream(new FileInputStream(sb.toString())); squares = new Square[MapConsts.SS_PER_BS_X][MapConsts.SS_PER_BS_Y]; for (int x = 0; x < MapConsts.SS_PER_BS_X; x++) { for (int y = 0; y < MapConsts.SS_PER_BS_Y; y++) { Square kw = new Square(x, y); squares[x][y] = kw; + kw.terrainType = (short) TerrainType.BARE_GROUND.ID; int hex = in.readByte(); - kw.stopienZalesienia = (float) hex * (1.0f / 100.f); - hex = in.readByte(); - kw.stopienZawodnienia = (float) hex * (1.0f / 100.f); - hex = in.readByte(); - kw.stopienZabudowy = (float) hex * (1.0f / 100.f); - hex = in.readByte(); - kw.stopienZabagnienia = (float) hex * (1.0f / 100.f); - kw.wysokoscSrednia = in.readInt(); - if (kw.wysokoscSrednia < -3) { - logger.warn("Elevation: {}, fn= {} ", kw.wysokoscSrednia, fileName); + if (hex > 30) { + kw.terrainType = (short) TerrainType.FOREST.ID; } - if (kw.wysokoscSrednia > 2660) { - logger.warn("Elevation: {}, fn= {} ", kw.wysokoscSrednia, fileName); + hex = in.readByte(); + if (hex > 30) { + kw.terrainType = (short) TerrainType.WATER.ID; + } + hex = in.readByte(); + if (hex > 30) { + kw.terrainType = (short) TerrainType.BUILDINGS.ID; + } + hex = in.readByte(); + if (hex > 30) { + kw.terrainType = (short) TerrainType.SWAMP.ID; + } + kw.elevation = in.readInt(); + if (kw.elevation < NMTDataReader.H_MIN) { + logger.warn("Elevation: {}, fn= {}", kw.elevation, fileName); + } + if (kw.elevation > NMTDataReader.H_MAX) { + logger.warn("Elevation: {}, fn= {}", kw.elevation, fileName); } kw.roznicaWzniesien = in.readInt(); int bit_1 = 1; hex = in.readByte(); - if (kw.jestDroga == null) { - kw.jestDroga = new boolean[8]; - } - for (int i = 0; i < kw.jestDroga.length; i++) { + for (int i = 0; i < 8; i++) { // jest odcinek rowu na tym kierunku if ((hex & bit_1) != 0) { - kw.jestDroga[i] = true; + kw.roads[i] = 2; } bit_1 <<= 1; } bit_1 = 1; hex = in.readByte(); - if (kw.jestPrzeszkodaWodna == null) { - kw.jestPrzeszkodaWodna = new boolean[8]; - } - for (int i = 0; i < kw.jestPrzeszkodaWodna.length; i++) { - // jest odcinek rowu na tym kierunku + for (int i = 0; i < 8; i++) { + // jest odcinek rzeki na tym kierunku if ((hex & bit_1) != 0) { - kw.jestPrzeszkodaWodna[i] = true; + kw.watercourses[i] = 3; } bit_1 <<= 1; } bit_1 = 1; hex = in.readByte(); - if (kw.jestRow == null) { - kw.jestRow = new boolean[8]; - } - for (int i = 0; i < kw.jestRow.length; i++) { + for (int i = 0; i < 8; i++) { // jest odcinek rowu na tym kierunku if ((hex & bit_1) != 0) { - kw.jestRow[i] = true; + kw.watercourses[i] = 1; } bit_1 <<= 1; } } } in.close(); - logger.debug("Doczytano plik mapy: " + sb.toString()); + logger.debug("Doczytano plik mapy: {}", sb); } catch (IOException e) { squares = null; throw e; } } - void resetSquares(boolean zalesienie, boolean zawodnienie, boolean zabudowa, boolean zabagnienie, - boolean wysokosc, boolean roznicaWzniesien, boolean drogi, boolean rzeki, boolean rowy) { - for (int x = 0; x < MapConsts.SS_PER_BS_X; x++) { - for (int y = 0; y < MapConsts.SS_PER_BS_Y; y++) { - squares[x][y].stopienZalesienia = (zalesienie) ? 0 : squares[x][y].stopienZalesienia; - squares[x][y].stopienZawodnienia = (zawodnienie) ? 0 : squares[x][y].stopienZawodnienia; - squares[x][y].stopienZabudowy = (zabudowa) ? 0 : squares[x][y].stopienZabudowy; - squares[x][y].stopienZabagnienia = (zabagnienie) ? 0 : squares[x][y].stopienZabagnienia; - squares[x][y].wysokoscSrednia = (wysokosc) ? 0 : squares[x][y].wysokoscSrednia; - squares[x][y].roznicaWzniesien = (roznicaWzniesien) ? 0 : squares[x][y].roznicaWzniesien; - if (drogi) { - for (int i = 0; i < squares[x][y].jestDroga.length; i++) { - squares[x][y].jestDroga[i] = false; - } - } - if (rzeki) { - for (int i = 0; i < squares[x][y].jestPrzeszkodaWodna.length; i++) { - squares[x][y].jestPrzeszkodaWodna[i] = false; - } - } - if (rowy) { - for (int i = 0; i < squares[x][y].jestRow.length; i++) { - squares[x][y].jestRow[i] = false; - } - } - } - } - } - @Override public String toString() { - return "RightBigSquare{" + this.fileName + '}'; + return "RightBigSquare{" + fileName + '}'; } } \ No newline at end of file diff --git a/src/main/java/pl/wat/ms4ds/terrain/Square.java b/src/main/java/pl/wat/ms4ds/terrain/Square.java index ba0d33f..a4da211 100644 --- a/src/main/java/pl/wat/ms4ds/terrain/Square.java +++ b/src/main/java/pl/wat/ms4ds/terrain/Square.java @@ -1,10 +1,7 @@ package pl.wat.ms4ds.terrain; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; +import pl.wat.ms4ds.terrain.nmt.NMTDataReader; public class Square { @@ -49,170 +46,6 @@ public class Square { public int roznicaWzniesien; public int wysokoscSrednia; - /// ///////////////////////////////////// - - public static class RawData { - /** - * The height above the level of the sea. Unit of measure [0.25m]. - */ - short elevation; - /** - * Terrain type.
Possible values: - * 0 - BARE_GROUND - * 1 - GRASS - * 2 - SWAMP - * 3 - WATER - * 4 - SCRUB, BUSHES - * 5 - BUILDINGS - * 6 - FOREST - */ - byte terrainType; - - /** - * Small road in a given direction. Each bit corresponds to a given direction. - */ - byte smallRoads; - - /** - * Minor road in a given direction. Each bit corresponds to a given direction. - */ - byte minorRoads; - - /** - * Major road in a given direction. Each bit corresponds to a given direction. - */ - byte majorRoads; - - /** - * The existence of a drain in a given direction. Each bit corresponds to a given direction. - */ - byte drains; - - /** - * The existence of a stream in a given direction. Each bit corresponds to a given direction. - */ - byte streams; - - /** - * The existence of a river in a given direction. Each bit corresponds to a given direction. - */ - byte rivers; - - public void reset() { - elevation = 0; - terrainType = 0; - smallRoads = 0; - minorRoads = 0; - majorRoads = 0; - drains = 0; - streams = 0; - rivers = 0; - } - - public void write(ObjectOutputStream out) throws IOException { - out.writeShort(elevation); - out.writeByte(terrainType); - out.writeByte(smallRoads); - out.writeByte(minorRoads); - out.writeByte(majorRoads); - out.writeByte(drains); - out.writeByte(streams); - out.writeByte(rivers); - } - - public void read(ObjectInputStream in) throws IOException { - elevation = in.readShort(); - terrainType = in.readByte(); - smallRoads = in.readByte(); - minorRoads = in.readByte(); - majorRoads = in.readByte(); - drains = in.readByte(); - streams = in.readByte(); - rivers = in.readByte(); - } - - public RawData(short elevation, byte terrainType) { - this.elevation = elevation; - this.terrainType = terrainType; - } - - public RawData() { - } - - public RawData(Square kw) { - terrainType = (byte) kw.terrainType; - // Konwersja na decymetry. - elevation = (short) (kw.elevation * 4); - byte bit = 1; - for (int i = 0; i < kw.watercourses.length; i++) { - switch (kw.watercourses[i]) { - case 1: - drains |= bit; - break; - case 2: - streams |= bit; - break; - case 3: - rivers |= bit; - break; - default: - break; - } - switch (kw.roads[i]) { - case 1: - smallRoads |= bit; - break; - case 2: - minorRoads |= bit; - break; - case 3: - majorRoads |= bit; - break; - default: - break; - } - bit <<= 1; - } - } - - public void read(Square kw) { - terrainType = (byte) kw.terrainType; - // Konwersja na decymetry. - elevation = (short) (kw.elevation * 4); - byte bit = 1; - for (int i = 0; i < kw.watercourses.length; i++) { - switch (kw.watercourses[i]) { - case 1: - drains |= bit; - break; - case 2: - streams |= bit; - break; - case 3: - rivers |= bit; - break; - default: - break; - } - switch (kw.roads[i]) { - case 1: - smallRoads |= bit; - break; - case 2: - minorRoads |= bit; - break; - case 3: - majorRoads |= bit; - break; - default: - break; - } - bit <<= 1; - } - } - - } - public static final Square EMPTY = new Square(-1, -1); public Square() { @@ -226,28 +59,49 @@ public class Square { watercourses = new byte[8]; } - public Square(int x, int y, RawData rawData) { + public Square(int x, int y, short elevation, byte terrainType, byte majorRoads, byte minorRoads, byte smallRoads, byte rivers, byte streams, byte drains) { this.x = x; this.y = y; roads = new byte[8]; watercourses = new byte[8]; // Konwersja na metry a[0.25m] -> b[m] - elevation = (float) (rawData.elevation) / 4; - terrainType = rawData.terrainType; + this.elevation = (float) (elevation) / 4; + this.terrainType = terrainType; int bit = 1; for (int i = 0; i < 8; i++) { - int b1 = ((rawData.majorRoads & bit) > 0) ? 3 : 0; - int b2 = ((rawData.minorRoads & bit) > 0) ? 2 : 0; - int b3 = ((rawData.smallRoads & bit) > 0) ? 1 : 0; + int b1 = ((majorRoads & bit) > 0) ? 3 : 0; + int b2 = ((minorRoads & bit) > 0) ? 2 : 0; + int b3 = ((smallRoads & bit) > 0) ? 1 : 0; roads[i] = (byte) (b1 + b2 + b3); - b1 = ((rawData.rivers & bit) > 0) ? 3 : 0; - b2 = ((rawData.streams & bit) > 0) ? 2 : 0; - b3 = ((rawData.drains & bit) > 0) ? 1 : 0; + b1 = ((rivers & bit) > 0) ? 3 : 0; + b2 = ((streams & bit) > 0) ? 2 : 0; + b3 = ((drains & bit) > 0) ? 1 : 0; watercourses[i] = (byte) (b1 + b2 + b3); bit <<= 1; } } + public int writeToBufferElevationOnly(byte[] buffer, int offset) { + // Konwersja [m] -> [0.25m]. + int elev = (short) (elevation * 4); + byte b1 = (byte) (elev & 0xFF); + elev >>= 8; + byte b0 = (byte) (elev & 0xFF); + if (b0 == -1 && b1 == -4) { + System.out.println("a"); + } + buffer[offset] = b0; + buffer[offset + 1] = b1; + buffer[offset + 2] = 0; + buffer[offset + 3] = 0; + buffer[offset + 4] = 0; + buffer[offset + 5] = 0; + buffer[offset + 6] = 0; + buffer[offset + 7] = 0; + buffer[offset + 8] = 0; + return offset + 9; + } + public int writeToBuffer(byte[] buffer, int offset) { // Konwersja [m] -> [0.25m]. int elev = (short) (elevation * 4); @@ -307,11 +161,16 @@ public class Square { public int readFromBuffer(byte[] buffer, int offset) { int elev = buffer[offset] & 0xFF; - elev = (elev << 8) + (buffer[offset + 1] & 0xFF); +// elev = (elev << 8) + (buffer[offset + 1] & 0xFF); + elev = (elev << 8) | (buffer[offset + 1] & 0xFF); + // Rzutowanie "elev" na short zachowuje znak liczby. short v = (short) elev; - // Konwersja na metry a[0.25m] -> b[m] elevation = (float) (v) / 4; - if (elevation > 2660) { + + // Konwersja na metry a[0.25m] -> b[m] +// elevation = (float) ((short) elev) / 4; + + if (elevation > NMTDataReader.H_MAX) { System.out.println("h=" + elevation); } terrainType = buffer[offset + 2]; @@ -337,28 +196,9 @@ public class Square { return offset + 9; } - void read(RawData rawData) { - // Konwersja na metry a[0.25m] -> b[m] - elevation = (float) (rawData.elevation) / 4; - terrainType = rawData.terrainType; - int bit = 1; - for (int i = 0; i < 8; i++) { - int b1 = ((rawData.majorRoads & bit) > 0) ? 3 : 0; - int b2 = ((rawData.minorRoads & bit) > 0) ? 2 : 0; - int b3 = ((rawData.smallRoads & bit) > 0) ? 1 : 0; - roads[i] = (byte) (b1 + b2 + b3); - b1 = ((rawData.rivers & bit) > 0) ? 3 : 0; - b2 = ((rawData.streams & bit) > 0) ? 2 : 0; - b3 = ((rawData.drains & bit) > 0) ? 1 : 0; - watercourses[i] = (byte) (b1 + b2 + b3); - bit <<= 1; - } - } - public final int x; public final int y; - @Override public final boolean equals(Object o) { if (!(o instanceof Square SQUARE)) return false; @@ -374,6 +214,7 @@ public class Square { return result; } + @Override public String toString() { StringBuilder linia = new StringBuilder(100); linia.append("["); diff --git a/src/main/java/pl/wat/ms4ds/terrain/Teren.java b/src/main/java/pl/wat/ms4ds/terrain/Teren.java index 01535e5..38d3e69 100644 --- a/src/main/java/pl/wat/ms4ds/terrain/Teren.java +++ b/src/main/java/pl/wat/ms4ds/terrain/Teren.java @@ -1,6 +1,7 @@ package pl.wat.ms4ds.terrain; import java.io.*; +import java.util.HashSet; import java.util.Set; import java.util.concurrent.locks.ReentrantLock; @@ -88,14 +89,14 @@ public class Teren { } private static String getFileName(int bsX, int bsY) { - int x_stop = MapConsts.X_REF + bsX / MapConsts.BS_PER_DEG_X - 180; + int x_stop = MapConsts.LON_REF + bsX / MapConsts.BS_PER_DEG_X - 180; char cLon = (x_stop < 0) ? 'W' : 'E'; if (x_stop < 0) { x_stop = -x_stop; } int dx = bsX % MapConsts.BS_PER_DEG_X; char cx = LITERALS.charAt(dx); - int y_stop = MapConsts.Y_REF + bsY / MapConsts.BS_PER_DEG_Y - 90; + int y_stop = MapConsts.LAT_REF + bsY / MapConsts.BS_PER_DEG_Y - 90; char cLat = (y_stop < 0) ? 'S' : 'N'; if (y_stop < 0) { y_stop = -y_stop; @@ -123,12 +124,15 @@ public class Teren { return sb.toString(); } - private static BigSquare loadAreaOld(int bsX, int bsY) { - String fName = getFileName(bsX, bsY) + ".bin"; + private static BigSquare loadAreaOldFormat(int bsX, int bsY) { + String fName = getFileName(bsX, bsY); try { - return new RightBigSquare(fName, null); + RightBigSquare bs = new RightBigSquare(); + bs.fileName = fName; + bs.readFromFile_OldFormat(MapConsts.DATA_DIR); + return bs; } catch (IOException e) { - LOGGER.warn("Brak pliku mapy: {}{}{}", MapConsts.KWADRATY_DIR, fName, ".bin"); + LOGGER.warn("Brak pliku mapy: {}{}{}", MapConsts.DATA_DIR, fName, ".bin"); return EmptyBigSquare.EMPTY_BIG_SQUARE; } } @@ -138,10 +142,10 @@ public class Teren { try { RightBigSquare bs = new RightBigSquare(); bs.fileName = fName; - bs.readFromFile(MapConsts.KWADRATY_DIR); + bs.readFromFile(MapConsts.DATA_DIR); return bs; } catch (IOException e) { - LOGGER.warn("Brak pliku mapy: {}{}{}", MapConsts.KWADRATY_DIR, fName, ".bin"); + LOGGER.warn("Brak pliku mapy: {}{}{}", MapConsts.DATA_DIR, fName, ".bin"); return EmptyBigSquare.EMPTY_BIG_SQUARE; } } @@ -151,13 +155,13 @@ public class Teren { public static Square getKwadratPUWG(double northing, double easting) { Coord.Geo geoCoord = new Coord.Geo(); Coord.convertPUWG1992ToWGS84(northing, easting, geoCoord); - return getKwadrat(geoCoord.lat, geoCoord.lon); + return getSquare(geoCoord.lat, geoCoord.lon); } - public static Square getKwadrat(double lat, double lon) { + public static Square getSquare(double lat, double lon) { int idX = Coord.zamienDlugoscGeoNaIdKwadratuX(lon); int idY = Coord.zamienSzerokoscGeoNaIdKwadratuY(lat); - return getKwadrat(idX, idY); + return getSquare(idX, idY); } /** @@ -167,7 +171,7 @@ public class Teren { * @param y współrzędna pionowa (indeks wiersza) * @return obiekt reprezentujący charakterystyki fragmentu terenu */ - public static Square getKwadrat(int x, int y) { + public static Square getSquare(int x, int y) { if (x < 0 || y < 0) { return EMPTY; } @@ -175,7 +179,7 @@ public class Teren { int bsX = x / MapConsts.SS_PER_BS_X; // wspolrzędna y dużego kwadratu int bsY = y / MapConsts.SS_PER_BS_Y; - if (bsX < 0 || bsX >= BIG_X_MAX || bsY < 0 || bsY >= BIG_Y_MAX) { + if (bsX >= BIG_X_MAX || bsY >= BIG_Y_MAX) { return EMPTY; } // wspolrzędna x małego kwadratu w ramach dużego kwadratu @@ -188,7 +192,7 @@ public class Teren { bigSquares[bsX][bsY] = loadArea(bsX, bsY); } } - return bigSquares[bsX][bsY].getKwadrat(ssX, ssY); + return bigSquares[bsX][bsY].getSquare(ssX, ssY); } private static Coord.Grid[] history = new Coord.Grid[MapConsts.MAX_BIG_SQUARES_IN_MEMORY]; @@ -395,22 +399,26 @@ public class Teren { // Teren.normalizujDanePokrycia(); String newDir = "D:/work/kwadraty_nmt/temp/25/"; - String dir1 = "D:/work/nowe/25m/"; + String dir1 = "D:/work/terrain/"; String inDir = "D:/work/kwadraty_nmt/withElevation/25m/"; String dir2 = "C:/Workspace/_data/swdt/ms4ds/teren/kwadraty/100m/"; + Set