diff --git a/src/main/java/pl/wat/ms4ds/terrain/Coord.java b/src/main/java/pl/wat/ms4ds/terrain/Coord.java index d7fc2f9..d74e83a 100644 --- a/src/main/java/pl/wat/ms4ds/terrain/Coord.java +++ b/src/main/java/pl/wat/ms4ds/terrain/Coord.java @@ -68,6 +68,10 @@ public class Coord { } } + /** + * Klasa reprezentująca współrzędne/położenie w siatce kwadratów terenu. + * + */ public static class Grid { /** @@ -103,8 +107,8 @@ public class Coord { '}'; } - private static final double ODWROT_SS_DX_MS = 1.0 / MapConsts.SS_DX_MS; - private static final double ODWROT_SS_DY_MS = 1.0 / MapConsts.SS_DY_MS; + private static final double ODWROT_SS_DX_MS = 1.0 / MapConsts.SS_DELTA_LON_MS; + private static final double ODWROT_SS_DY_MS = 1.0 / MapConsts.SS_DELTA_LAT_MS; public static double distance(Grid a, Grid b) { int dx = a.x - b.x; @@ -213,7 +217,7 @@ public class Coord { * @param idX współrzęna x GridCoord * @return długość geograficzna */ - public static float zamienIdKwadratuXNaDlugoscGeo(int idX) { + public static float convertGridXToLon(int idX) { long xms = zamienIdKwadratuXNaWspXms(idX); double lon = (double) xms / (double) MapConsts.DEG_MS - 180; return (float) lon; @@ -225,7 +229,7 @@ public class Coord { * @param idY współrzęna y GridCoord * @return szerokość geograficzna */ - public static float zamienIdKwadratuYNaSzerokoscGeo(int idY) { + public static float covertGridYToLat(int idY) { long yms = zamienIdKwadratuYNaWspYms(idY); double lat = (double) yms / (double) MapConsts.DEG_MS - 90; return (float) lat; @@ -238,7 +242,7 @@ public class Coord { public static long zamienIdKwadratuXNaWspXms(int idKwX) { // indeksowanie kwadratow pola walki zaczyna sie od (0, 0) // przesuniecie wspolrzednych do srodka kwadratu - long xms = MapConsts.X_REF_MS + (long) ((idKwX + 0.5) * MapConsts.SS_DX_MS); + long xms = MapConsts.X_REF_MS + (long) ((idKwX + 0.5) * MapConsts.SS_DELTA_LON_MS); xms %= MapConsts.ANGLE_360_MS; return xms; } @@ -250,32 +254,60 @@ public class Coord { public static long zamienIdKwadratuYNaWspYms(int idKwY) { // indeksowanie kwadratow pola walki zaczyna sie od (0, 0) // przesuniecie wspolrzednych do srodka kwadratu - long yms = MapConsts.Y_REF_MS + (long) ((idKwY + 0.5) * MapConsts.SS_DY_MS); + long yms = MapConsts.Y_REF_MS + (long) ((idKwY + 0.5) * MapConsts.SS_DELTA_LAT_MS); return yms; } /** - * Zamienia długość geograficzną na współrzędna x GridCoord. + * Zamienia długość geograficzną na współrzędna x Coord.Grid. * * @param lon długość geograficzna * @return współrzędna x klasy GridCoord */ - public static int zamienDlugoscGeoNaIdKwadratuX(double lon) { + public static int convertLonTOGridX(double lon) { double xms_f = (lon + 180) * MapConsts.DEG_MS; return zamienWspXmsNaIdKwadratuX((long) xms_f); } /** - * Zamienia szerokość geograficzną na współrzędna y GridCoord. + * Zamienia szerokość geograficzną na współrzędna y Coord.Grid. * * @param lat szerokość geograficzna * @return współrzędna y klasy GridCoord */ - public static int zamienSzerokoscGeoNaIdKwadratuY(double lat) { + public static int convertLatToGridY(double lat) { double yms_f = (lat + 90) * MapConsts.DEG_MS; return zamienWspYmsNaIdKwadratuY((long) yms_f); } + public static final double INVERT_SS_DELTA_LON = 1 / MapConsts.SS_DELTA_LON; + public static final double INVERT_SS_DELTA_LAT = 1 / MapConsts.SS_DELTA_LAT; + + private static final double REF_LON_OFFSET = 180 - MapConsts.REF_LON; + private static final double REF_LAT_OFFSET = 90 - MapConsts.REF_LAT; + + /** + * Zamienia długość geograficzną w systemie WGS-84 na współrzędna x klasy {@link Grid}. + * + * @param lon długość geograficzna + * @return współrzędna x klasy GridCoord + */ + public static int convertLonToGridX2(double lon) { + double xx = (lon + REF_LON_OFFSET) * INVERT_SS_DELTA_LON; + return (int) xx; + } + + /** + * Zamienia szerokość geograficzną w systemie WGS-84 na współrzędna y klasy {@link Grid}. + * + * @param lat szerokość geograficzna + * @return współrzędna y klasy GridCoord + */ + public static int convertLatToGridY2(double lat) { + double yy = (lat + REF_LAT_OFFSET) * INVERT_SS_DELTA_LAT; + return (int) yy; + } + /** * Funkcja zamienia dlugosc geog. xms w milisekundach na IdKwadrat.x. * @@ -286,7 +318,7 @@ public class Coord { // wspolrzedne geograficzne w milisekundach zawieraja sie w zakresie: // 0 <= x < 360 dlugosc geograficzna // 0 <= y <= 180 szerokosc geograficzna - if ((xms < 0) || (xms >= 360 * MapConsts.DEG_MS)) { + if (xms >= MapConsts.ANGLE_360_MS) { // poza zakresem return -1; } @@ -304,7 +336,7 @@ public class Coord { // return -1; // } // indeksowanie kwadratow pola walki zaczyna sie od (0, 0) - double xx = (x - MapConsts.X_REF_MS) * ODWROT_SS_DX_MS; + double xx = (x - MapConsts.X_REF_MS) * INVERT_SS_DELTA_LON_MS; // x = (x - MapConsts.X_REF_MS) / MapConsts.SS_DX_MS; return (int) xx; } @@ -324,13 +356,13 @@ public class Coord { return -1; } // indeksowanie kwadratow pola walki zaczyna sie od (0, 0) - double yy = (yms - MapConsts.Y_REF_MS) * ODWROT_SS_DY_MS; + double yy = (yms - MapConsts.Y_REF_MS) * INVERT_SS_DELTA_LAT_MS; // long y = (yms - MapConsts.Y_REF_MS) / MapConsts.SS_DY_MS; return (int) yy; } - private static final double ODWROT_SS_DX_MS = 1.0 / MapConsts.SS_DX_MS; - private static final double ODWROT_SS_DY_MS = 1.0 / MapConsts.SS_DY_MS; + private static final double INVERT_SS_DELTA_LON_MS = 1.0 / MapConsts.SS_DELTA_LON_MS; + private static final double INVERT_SS_DELTA_LAT_MS = 1.0 / MapConsts.SS_DELTA_LAT_MS; /** * Funkcja służy do konwersji współrzednych elipsoidalnych WGS84 (lat/lon) na płaskie X-northing, Y-easting diff --git a/src/main/java/pl/wat/ms4ds/terrain/MapConsts.java b/src/main/java/pl/wat/ms4ds/terrain/MapConsts.java index ba59c8d..68d93e7 100644 --- a/src/main/java/pl/wat/ms4ds/terrain/MapConsts.java +++ b/src/main/java/pl/wat/ms4ds/terrain/MapConsts.java @@ -15,12 +15,12 @@ public final class MapConsts { * 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 LON_REF; + public static final int REF_LON; /** * 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 LAT_REF;
+ public static final int REF_LAT;
public static final int DELTA_LON_REF;
public static final int DELTA_LAT_REF;
@@ -99,15 +99,15 @@ 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)
- LON_REF = Integer.parseInt(properties.getProperty("x_ref")) + 180;
+ REF_LON = Integer.parseInt(properties.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>
- LAT_REF = Integer.parseInt(properties.getProperty("y_ref")) + 90;
+ REF_LAT = Integer.parseInt(properties.getProperty("y_ref")) + 90;
DELTA_LON_REF = Integer.parseInt(properties.getProperty("dx_ref"));
DELTA_LAT_REF = Integer.parseInt(properties.getProperty("dy_ref"));
- double BS_X_NUM=DELTA_LON_REF/BS_PER_DEG_X;
- double BS_Y_NUM=DELTA_LAT_REF/BS_PER_DEG_Y;
+ double BS_X_NUM = DELTA_LON_REF / BS_PER_DEG_X;
+ double BS_Y_NUM = DELTA_LAT_REF / BS_PER_DEG_Y;
String val = properties.getProperty("dl_mk");
switch (val) {
case "20":
@@ -163,13 +163,13 @@ public final class MapConsts {
BS_DELTA_LAT = 1.0 / (double) BS_PER_DEG_Y;
SS_LONS = new double[DELTA_LON_REF * BS_PER_DEG_X * SS_PER_BS_X];
for (int i = 0; i < SS_LONS.length; i++) {
- SS_LONS[i] = LON_REF + SS_DELTA_LON * (i + 0.5);
+ SS_LONS[i] = REF_LON + SS_DELTA_LON * (i + 0.5);
}
SS_LATS = new double[DELTA_LAT_REF * BS_PER_DEG_Y * SS_PER_BS_Y];
for (int i = 0; i < SS_LATS.length; i++) {
- SS_LATS[i] = LAT_REF + SS_DELTA_LAT * (i + 0.5);
+ SS_LATS[i] = REF_LAT + 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={}", LON_REF, LAT_REF, DELTA_LON_REF, DELTA_LAT_REF, SS_SIZE, SS_LONS.length, SS_LATS.length, DATA_DIR);
+ LOGGER.debug("Wczytane ustawienia:\n \tLON_REF={}, LAT_REF={}, DX_REF={}, DY_REF{}, SQUARE_SIZE={}, GRID_SIZE={}x{}, DATA_DIR={}", REF_LON, REF_LAT, DELTA_LON_REF, DELTA_LAT_REF, SS_SIZE, SS_LONS.length, SS_LATS.length, DATA_DIR);
}
/**
@@ -179,7 +179,7 @@ public final class MapConsts {
/**
* Liczba milisekund na 360 stopni.
*/
- public static final long ANGLE_360_MS = 3600000 * 360;
+ public static final long ANGLE_360_MS = DEG_MS * 360;
/**
* Wielkosc cache'u pola walki (liczba duzych kwadratow trzymanych w RAM).
*/
@@ -191,7 +191,7 @@ public final class MapConsts {
* @return
*/
public static int getX_REF() {
- return LON_REF;
+ return REF_LON;
}
/**
@@ -200,7 +200,7 @@ public final class MapConsts {
* @return
*/
public static int getY_REF() {
- return LAT_REF;
+ return REF_LAT;
}
/**
@@ -224,17 +224,17 @@ public final class MapConsts {
/**
* Dlugosci bokow malego kwadratu w milisekundach geograficznych po osi OX (dlugosc geograficzna).
*/
- public static final double SS_DX_MS = SS_DELTA_LON * DEG_MS;
+ public static final double SS_DELTA_LON_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 = SS_DELTA_LAT * DEG_MS;
+ public static final double SS_DELTA_LAT_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 = LON_REF * DEG_MS;
- public static final int Y_REF_MS = LAT_REF * DEG_MS;
+ public static final int X_REF_MS = REF_LON * DEG_MS;
+ public static final int Y_REF_MS = REF_LAT * 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
diff --git a/src/main/java/pl/wat/ms4ds/terrain/Teren.java b/src/main/java/pl/wat/ms4ds/terrain/Teren.java
index f6e6123..cda8bcf 100644
--- a/src/main/java/pl/wat/ms4ds/terrain/Teren.java
+++ b/src/main/java/pl/wat/ms4ds/terrain/Teren.java
@@ -81,22 +81,22 @@ public class Teren {
* @return Nazwa zwracanego pliku z danymi (null - gdy niepoprawne współrzędne).
*/
public static String getFileName(double lat, double lon) {
- int idX = Coord.zamienDlugoscGeoNaIdKwadratuX(lon);
- int idY = Coord.zamienSzerokoscGeoNaIdKwadratuY(lat);
+ int idX = Coord.convertLonTOGridX(lon);
+ int idY = Coord.convertLatToGridY(lat);
int bigX = idX / MapConsts.SS_PER_BS_X;
int bigY = idY / MapConsts.SS_PER_BS_Y;
return getFileName(bigX, bigY);
}
private static String getFileName(int bsX, int bsY) {
- int x_stop = MapConsts.LON_REF + bsX / MapConsts.BS_PER_DEG_X - 180;
+ int x_stop = MapConsts.REF_LON + 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.LAT_REF + bsY / MapConsts.BS_PER_DEG_Y - 90;
+ int y_stop = MapConsts.REF_LAT + bsY / MapConsts.BS_PER_DEG_Y - 90;
char cLat = (y_stop < 0) ? 'S' : 'N';
if (y_stop < 0) {
y_stop = -y_stop;
@@ -159,8 +159,8 @@ public class Teren {
}
public static Square getSquare(double lat, double lon) {
- int idX = Coord.zamienDlugoscGeoNaIdKwadratuX(lon);
- int idY = Coord.zamienSzerokoscGeoNaIdKwadratuY(lat);
+ int idX = Coord.convertLonTOGridX(lon);
+ int idY = Coord.convertLatToGridY(lat);
return getSquare(idX, idY);
}
diff --git a/src/main/java/pl/wat/ms4ds/terrain/nmt/NMTDataReader.java b/src/main/java/pl/wat/ms4ds/terrain/nmt/NMTDataReader.java
index 2df92c4..ab98156 100644
--- a/src/main/java/pl/wat/ms4ds/terrain/nmt/NMTDataReader.java
+++ b/src/main/java/pl/wat/ms4ds/terrain/nmt/NMTDataReader.java
@@ -6,9 +6,7 @@ import pl.wat.ms4ds.terrain.*;
import java.io.*;
import java.util.*;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import java.util.concurrent.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@@ -18,15 +16,29 @@ public class NMTDataReader {
static void main(String[] args) {
- String[] splitted = "b a, e, l.d u, n g".split("\\s+|,\\s*|\\.\\s*");
-// File dir = new File(System.getProperty("user.home") + "/nmt/gugik_SkorowidzNMT2018.gml");
- // Dzieli na podstringi biorąc jako znak podziału spację i jej wielokrotność
- String[] splitted2 = "b a e l.d u n g".split("[ ]+");
+ /*
+ * Generowanie danych terenowych odbywa się na podstawie plików z danymi NMT w dwóch formatach:
+ * ASC (siatka/tabela wysokość) TXT (współrzędne geo, wysokość). Pliki są spakowane.
+ * Pliki znajdują się w lokalizacji określonej przez "inDir" w katalogach (odpowiadających skorowidzom).
+ * W katalogu "idDir" znajdują się pliki textowe z listą nazw plików w podkatalogach skorowidzowych.
+ * Dane wysokościowe z plików NMT przetwarzane są współbieżnie przez executora.
+ * W ramach tego etapu/wątku:
+ * 1. pliki są rozpakowywane do katalogu roboczego "workDir",
+ * 2. po czym następuje ich odczyt i zapamiętanie danych szczegółowych w obiektach
+ * NMTData (suma wysokości, licznik, granice kwadratu terenu we współrzędnych PUWG1992),
+ * 3. obiekty NMTData (odpowiadające kwadratom terenu) są cachowane w hashmapie
+ * indywidualnie w ramach wątku executora.
+ * 4. po zakończeniu odczytu plik jest usuwany,
+ * 5. następnie dane zagregowane (średnie wysokości) są zapisywane do kwadratów terenu
+ * (zapis w kwadratach jest synchronizowany).
+ *
+ * Wątki są synchronizowane po tym etapie w celu zrzucenia zaktualizowanych danych na dysk.
+ *
+ */
-// String fn_list = "D:/work/nmt/m-33_files.txt";
String inDir = "D:/work/nmt/";
String workDir = "D:/work/temp/";
- String outDir = "D:/work/kwadraty_nmt/withElevation/25m/";
+ String outDir = "D:/work/kwadraty_nmt/withElevation/50m/";
ArrayList