Compare commits

...

11 Commits

72 changed files with 3925 additions and 4820 deletions

2
.gitignore vendored
View File

@@ -112,3 +112,5 @@ http-client.private.env.json
hs_err_pid*
replay_pid*
# Pliki binarne, generowane.
*.bin

2
.idea/compiler.xml generated
View File

@@ -6,7 +6,7 @@
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="teren-funkcje" />
<module name="terrain-utilities" />
</profile>
</annotationProcessing>
</component>

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/terrain-utilities.iml" filepath="$PROJECT_DIR$/.idea/terrain-utilities.iml" />
</modules>
</component>
</project>

View File

@@ -2,7 +2,7 @@
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
<pattern>%-30(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{32} - %msg%n</pattern>
<pattern>%-20(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{1} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
@@ -10,11 +10,12 @@
<append>true</append>
<encoder>
<!-- <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>-->
<pattern>%-30(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{32} - %msg%n</pattern>
<!-- <pattern>%-30(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{0} - %msg%n</pattern>-->
<pattern>%-20(%d{HH:mm:ss.SSS} [%thread]) %-5level :: %msg%n</pattern>
</encoder>
</appender>
<logger name="pl.wat.ms4ds.terenfunkcje" level="trace">
<logger name="pl.wat.ms4ds.terrain" level="trace">
<appender-ref ref="FILE"/>
</logger>

26
pom.xml
View File

@@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>ms4ds</groupId>
<artifactId>teren-funkcje</artifactId>
<artifactId>teren-utils</artifactId>
<version>1.0-SNAPSHOT</version>
<repositories>
@@ -18,6 +18,7 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<javafx.version>25.0.1</javafx.version>
</properties>
<build>
@@ -96,7 +97,7 @@
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>pl.wat.ms4ds.terenfunkcje.nmt.NMTDataProvider</mainClass>
<mainClass>pl.wat.ms4ds.terrain.nmt.NMTDataProvider</mainClass>
</manifest>
<manifestEntries>
<Class-Path>teren-funkcje-1.0.2-SNAPSHOT.jar</Class-Path>
@@ -179,5 +180,24 @@
<artifactId>shapefilereader</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>${javafx.version}</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-swing</artifactId>
<version>${javafx.version}</version>
</dependency> </dependencies>
</project>

View File

@@ -1,35 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
import java.util.ArrayList;
public class Arkusz {
ArrayList<WezelDrogowy> wezly = new ArrayList<>();
// arkusz mapy zawiera luki rozlacznie (jeden luk moze nalezec tylko do jednego arkusza)
ArrayList<LukDrogowy> luki = new ArrayList<>();
// liczba arkuszy mapy
static int lx = 0;
static int ly = 0;
/**
* Funkcja porownuje wspolrzedne leksykograficznie.
* @param x1
* @param y1
* @param x2
* @param y2
* @return
*/
static boolean mniejszeWspolrzedne(int x1, int y1, int x2, int y2) {
if (x1 < x2) {
return true;
}
if (x1 > x2) {
return false;
}
if (y1 < y2) {
return true;
}
return false;
}
}

View File

@@ -1,12 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
abstract class BigSquare {
abstract Kwadrat getKwadrat(int Id_X, int Id_Y);
protected transient String fileName;
public int xRefMs = 0;
public int yRefMs = 0;
public transient int liczbaZmian = 0;
// TODO zamienic na 100
static final int LICZBA_ZMIAN_DO_ZAPISU = 100000;
}

View File

@@ -1,9 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
/**
*
*/
public class GeoCoord {
public double lat;
public double lon;
}

View File

@@ -1,689 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
//import pl.wat.wcy.exception.IdKwadratuException;
import pl.wat.ms4ds.common.EGeoDirection;
public class GridCoord {
public int x;
public int y;
/**
* Konstruktor klasy na bazie współrzędnych geograficznych.
*
* @param lon długość geograficzna
* @param lat szerokość geograficzna
*/
public GridCoord(double lon, double lat) {
double xms_f = (lon + 180) * MapConsts.DEG_MS;
long xms = (long) xms_f;
x = zamienWspXmsNaIdKwadratuX(xms);
double yms_f = (lat + 90) * MapConsts.DEG_MS;
long yms = (long) yms_f;
y = zamienWspYmsNaIdKwadratuY(yms);
}
/**
* Funkcja zamienia dlugosc geog. xms w milisekundach na IdKwadrat.x.
*
* @param xms długość geograficzna (lon) w milisekundach
* @return współrzędna GridCoord.x
*/
public static int zamienWspXmsNaIdKwadratuX(long xms) {
// 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)) {
// poza zakresem
return -1;
}
long x = xms;
if (x < MapConsts.X_REF_MS) {
// // poza zakresem
long dx = x + MapConsts.ANGLE_360_MS - MapConsts.X_REF_MS;
if (dx > MapConsts.DX_REF_MS) {
return -1;
}
x += MapConsts.ANGLE_360_MS;
}
// if (x > MapConsts.X_REF_MS + MapConsts.DX_REF_MS) {
// // poza zakresem
// return -1;
// }
// indeksowanie kwadratow pola walki zaczyna sie od (0, 0)
double xx = (x - MapConsts.X_REF_MS) * ODWROT_SS_DX_MS;
// x = (x - MapConsts.X_REF_MS) / MapConsts.SS_DX_MS;
return (int) xx;
}
/**
* Funkcja zamienia szerokosc geog. yms w milisekundach na IdKwadrat.y.
*
* @param yms szerokosc geograficzna (lat) w milisekundach
* @return współrzędna GridCoord.y
*/
public static int zamienWspYmsNaIdKwadratuY(long yms) {
// wspolrzedne geograficzne w milisekundach zawieraja sie w zakresie:
// 0 <= x < 360 dlugosc geograficzna
// 0 <= y <= 180 szerokosc geograficzna
// if ((yms < MapConsts.Y_REF_MS) || (yms > MapConsts.Y_REF_MS + MapConsts.DY_REF_MS)) {
// // poza zakresem
// return -1;
// }
if (yms < MapConsts.Y_REF_MS) {
// poza zakresem
return -1;
}
// indeksowanie kwadratow pola walki zaczyna sie od (0, 0)
double yy = (yms - MapConsts.Y_REF_MS) * ODWROT_SS_DY_MS;
// long y = (yms - MapConsts.Y_REF_MS) / MapConsts.SS_DY_MS;
return (int) yy;
}
/**
* Zamienia długość geograficzną na współrzędna x GridCoord.
*
* @param lon długość geograficzna
* @return współrzędna x klasy GridCoord
*/
public static int zamienDlugoscGeoNaIdKwadratuX(double lon) {
double xms_f = (lon + 180) * MapConsts.DEG_MS;
return zamienWspXmsNaIdKwadratuX((long) xms_f);
}
/**
* Zamienia szerokość geograficzną na współrzędna y GridCoord.
*
* @param lat szerokość geograficzna
* @return współrzędna y klasy GridCoord
*/
public static int zamienSzerokoscGeoNaIdKwadratuY(double lat) {
double yms_f = (lat + 90) * MapConsts.DEG_MS;
return zamienWspYmsNaIdKwadratuY((long) yms_f);
}
public GridCoord kwadratSasiedni(EGeoDirection kier) {
GridCoord idKwSasiedni = new GridCoord();
switch (kier) {
case NORTH:
idKwSasiedni.x = x;
idKwSasiedni.y = y + 1;
break;
case NORTHEAST:
idKwSasiedni.x = x + 1;
idKwSasiedni.y = y + 1;
break;
case EAST:
idKwSasiedni.x = x + 1;
idKwSasiedni.y = y;
break;
case SOUTHEAST:
idKwSasiedni.x = x + 1;
idKwSasiedni.y = y - 1;
break;
case SOUTH:
idKwSasiedni.x = x;
idKwSasiedni.y = y - 1;
break;
case SOUTHWEST:
idKwSasiedni.x = x - 1;
idKwSasiedni.y = y - 1;
break;
case WEST:
idKwSasiedni.x = x - 1;
idKwSasiedni.y = y;
break;
case NORTHWEST:
idKwSasiedni.x = x - 1;
idKwSasiedni.y = y + 1;
break;
default:
}
return idKwSasiedni;
}
public void kwadratSasiedni(GridCoord idKwSasiedni, EGeoDirection kier) {
switch (kier) {
case NORTH:
idKwSasiedni.x = x;
idKwSasiedni.y = y + 1;
break;
case NORTHEAST:
idKwSasiedni.x = x + 1;
idKwSasiedni.y = y + 1;
break;
case EAST:
idKwSasiedni.x = x + 1;
idKwSasiedni.y = y;
break;
case SOUTHEAST:
idKwSasiedni.x = x + 1;
idKwSasiedni.y = y - 1;
break;
case SOUTH:
idKwSasiedni.x = x;
idKwSasiedni.y = y - 1;
break;
case SOUTHWEST:
idKwSasiedni.x = x - 1;
idKwSasiedni.y = y - 1;
break;
case WEST:
idKwSasiedni.x = x - 1;
idKwSasiedni.y = y;
break;
case NORTHWEST:
idKwSasiedni.x = x - 1;
idKwSasiedni.y = y + 1;
break;
default:
}
}
public GridCoord[] dajSasiadow() {
GridCoord[] sasiedzi = new GridCoord[8];
sasiedzi[0] = new GridCoord(x, y + 1);
sasiedzi[1] = new GridCoord(x + 1, y + 1);
sasiedzi[2] = new GridCoord(x + 1, y);
sasiedzi[3] = new GridCoord(x + 1, y - 1);
sasiedzi[4] = new GridCoord(x, y - 1);
sasiedzi[5] = new GridCoord(x - 1, y - 1);
sasiedzi[6] = new GridCoord(x - 1, y);
sasiedzi[7] = new GridCoord(x - 1, y + 1);
return sasiedzi;
}
public static GridCoord[] dajSasiadow(int x, int y) {
GridCoord[] sasiedzi = new GridCoord[8];
sasiedzi[0] = new GridCoord(x, y + 1);
sasiedzi[1] = new GridCoord(x + 1, y + 1);
sasiedzi[2] = new GridCoord(x + 1, y);
sasiedzi[3] = new GridCoord(x + 1, y - 1);
sasiedzi[4] = new GridCoord(x, y - 1);
sasiedzi[5] = new GridCoord(x - 1, y - 1);
sasiedzi[6] = new GridCoord(x - 1, y);
sasiedzi[7] = new GridCoord(x - 1, y + 1);
return sasiedzi;
}
public static GridCoord[] dajSasiadow(GridCoord centralny) {
GridCoord[] sasiedzi = new GridCoord[8];
sasiedzi[0] = new GridCoord(centralny.x, centralny.y + 1);
sasiedzi[1] = new GridCoord(centralny.x + 1, centralny.y + 1);
sasiedzi[2] = new GridCoord(centralny.x + 1, centralny.y);
sasiedzi[3] = new GridCoord(centralny.x + 1, centralny.y - 1);
sasiedzi[4] = new GridCoord(centralny.x, centralny.y - 1);
sasiedzi[5] = new GridCoord(centralny.x - 1, centralny.y - 1);
sasiedzi[6] = new GridCoord(centralny.x - 1, centralny.y);
sasiedzi[7] = new GridCoord(centralny.x - 1, centralny.y + 1);
return sasiedzi;
}
public GridCoord[] dajOtoczenie() {
GridCoord[] sasiedzi = new GridCoord[9];
sasiedzi[0] = new GridCoord(x, y);
sasiedzi[1] = new GridCoord(x, y + 1);
sasiedzi[2] = new GridCoord(x + 1, y + 1);
sasiedzi[3] = new GridCoord(x + 1, y);
sasiedzi[4] = new GridCoord(x + 1, y - 1);
sasiedzi[5] = new GridCoord(x, y - 1);
sasiedzi[6] = new GridCoord(x - 1, y - 1);
sasiedzi[7] = new GridCoord(x - 1, y);
sasiedzi[8] = new GridCoord(x - 1, y + 1);
return sasiedzi;
}
public static GridCoord[] dajOtoczenie(int x, int y) {
GridCoord[] sasiedzi = new GridCoord[9];
sasiedzi[0] = new GridCoord(x, y);
sasiedzi[1] = new GridCoord(x, y + 1);
sasiedzi[2] = new GridCoord(x + 1, y + 1);
sasiedzi[3] = new GridCoord(x + 1, y);
sasiedzi[4] = new GridCoord(x + 1, y - 1);
sasiedzi[5] = new GridCoord(x, y - 1);
sasiedzi[6] = new GridCoord(x - 1, y - 1);
sasiedzi[7] = new GridCoord(x - 1, y);
sasiedzi[8] = new GridCoord(x - 1, y + 1);
return sasiedzi;
}
public static GridCoord[] dajOtoczenie(GridCoord centralny) {
GridCoord[] sasiedzi = new GridCoord[8];
sasiedzi[0] = new GridCoord(centralny.x, centralny.y);
sasiedzi[1] = new GridCoord(centralny.x, centralny.y + 1);
sasiedzi[2] = new GridCoord(centralny.x + 1, centralny.y + 1);
sasiedzi[3] = new GridCoord(centralny.x + 1, centralny.y);
sasiedzi[4] = new GridCoord(centralny.x + 1, centralny.y - 1);
sasiedzi[5] = new GridCoord(centralny.x, centralny.y - 1);
sasiedzi[6] = new GridCoord(centralny.x - 1, centralny.y - 1);
sasiedzi[7] = new GridCoord(centralny.x - 1, centralny.y);
sasiedzi[8] = new GridCoord(centralny.x - 1, centralny.y + 1);
return sasiedzi;
}
public boolean rowne(int x, int y) {
return this.x == x && this.y == y;
}
public String toString() {
StringBuilder sb = new StringBuilder("(x= ");
sb.append(x);
sb.append(", y= ");
sb.append(y);
sb.append(')');
// String s = "(x= " + Integer.toString(x) + ", y= " + Integer.toString(y) + ")";
return sb.toString();
}
/**
* Zamienia współrzęną GridCoord.x na długość geograficzną środka małego kwadratu
*
* @param idX współrzęna x GridCoord
* @return długość geograficzna
*/
public static float zamienIdKwadratuXNaDlugoscGeo(int idX) {
long xms = zamienIdKwadratuXNaWspXms(idX);
double lon = (double) xms / (double) MapConsts.DEG_MS - 180;
return (float) lon;
}
/**
* Zamienia współrzęną GridCoord.y na szerokość geograficzną środka małego kwadratu
*
* @param idY współrzęna y GridCoord
* @return szerokość geograficzna
*/
public static float zamienIdKwadratuYNaSzerokoscGeo(int idY) {
long yms = zamienIdKwadratuYNaWspYms(idY);
double lat = (double) yms / (double) MapConsts.DEG_MS - 90;
return (float) lat;
}
/**
* Zamienia współrzęną GridCoord.x na długość geograficzną lewego dolnego rogu małego kwadratu
*
* @param idX współrzęna x GridCoord
* @return długość geograficzna
*/
public static float zamienIdKwadratuXNaDlugoscGeoLD(int idX) {
long xms = zamienIdKwadratuXNaWspXmsLD(idX);
double lon = (double) xms / (double) MapConsts.DEG_MS - 180;
return (float) lon;
}
/**
* Zamienia współrzęną GridCoord.y na szerokość geograficzną środka małego kwadratu
*
* @param idY współrzęna y GridCoord
* @return szerokość geograficzna
*/
public static float zamienIdKwadratuYNaSzerokoscGeoLD(int idY) {
long yms = zamienIdKwadratuYNaWspYmsLD(idY);
double lat = (double) yms / (double) MapConsts.DEG_MS - 90;
return (float) lat;
}
public static int zamienWspUtmNaIdkwadratuX(String wspolrzedneUtm) {
// //////////////////////////////////
// wspolrzedne - znaki w formacie 522644N0154232E
// wyznaczenie numeru kwadraty Au2 dla wspolrzednej X
// np.: '153200' to 304
int xms = Teren.zamienWspUtmNaWspXms(wspolrzedneUtm);
int idKwX = GridCoord.zamienWspXmsNaIdKwadratuX(xms);
return idKwX;
}
public static int zamienWspUtmNaIdkwadratuY(String wspolrzedneUtm) {
// //////////////////////////////////
// wspolrzedne - znaki w formacie 522644N0154232E
// wyznaczenie numeru kwadraty Au2 dla wspolrzednej Y
// np.: '153200' to 304
int yms = Teren.zamienWspUtmNaWspYms(wspolrzedneUtm);
int idKwY = GridCoord.zamienWspYmsNaIdKwadratuY(yms);
return idKwY;
}
public GridCoord(String wspolrzedne) {
this.x = zamienWspUtmNaIdkwadratuX(wspolrzedne);
this.y = zamienWspUtmNaIdkwadratuY(wspolrzedne);
}
public static GridCoord zamienWspUtmNaIdKwadratu(String wspolrzedne) {
// Utworzenie obiektu GridCoord ze wspolrzednych UTM
GridCoord kwadrat = new GridCoord(wspolrzedne);
return kwadrat;
}
public static String zamienIdKwadratuNaWspUtm(GridCoord kwadrat) {
long xms = zamienIdKwadratuXNaWspXms(kwadrat.x);
long yms = zamienIdKwadratuYNaWspYms(kwadrat.y);
return Teren.zamienWspXmsYmsNaWspUtm(xms, yms);
}
/**
* Funkcja zamienia wsp. X GridCoord na wsp. geo xms w milisekundach.
* Zwracana wspolrzedna lezy w srodku kwadratu.
*/
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);
xms %= MapConsts.ANGLE_360_MS;
return xms;
}
/**
* Funkcja zamienia wsp. Y GridCoord na wsp. geo yms w milisekundach.
* Zwracana wspolrzedna lezy w srodku kwadratu.
*/
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);
return yms;
}
/**
* Funkcja zamienia wsp. X GridCoord na wsp. geo xms w milisekundach lewego dolnego rogu malego kwadratu.
* Zwracana wspolrzedna lezy w srodku kwadratu.
*/
public static long zamienIdKwadratuXNaWspXmsLD(int idKwX) {
// indeksowanie kwadratow pola walki zaczyna sie od (0, 0)
// przesuniecie wspolrzednych do srodka kwadratu
long xms = MapConsts.X_REF_MS + (long) (idKwX * MapConsts.SS_DX_MS);
xms %= MapConsts.ANGLE_360_MS;
return xms;
}
/**
* Funkcja zamienia wsp. Y GridCoord na wsp. geo yms w milisekundach lewego dolnego rogu malego kwadratu.
* Zwracana wspolrzedna lezy w srodku kwadratu.
*/
public static long zamienIdKwadratuYNaWspYmsLD(int idKwY) {
// indeksowanie kwadratow pola walki zaczyna sie od (0, 0)
// przesuniecie wspolrzednych do srodka kwadratu
long yms = MapConsts.Y_REF_MS + (long) (idKwY * MapConsts.SS_DY_MS);
return yms;
}
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;
/**
* Funkcja sprawdza, czy kwadraty sa takie same.
*
* @param id1
* @param id2
* @return
*/
public static boolean czyIdentyczne(GridCoord id1, GridCoord id2) {
if (null == id1 || null == id2) {
return false;
}
if (id1.x != id2.x || id1.y != id2.y) {
return false;
} else
return true;
}
/**
* Funkcja zwraca odleglosc miedzy srodkami malych kwadratow [m].
*
* @param p1 współrzędna malego kwadratu pocz.
* @param p2 współrzędna malego kwadratu konc.
* @return Odległość między środkami małych kwadratów [m].
*/
public static float odleglosc(GridCoord p1, GridCoord p2) {
// odleglosc miedzy srodkami malych kwadratow
if (null == p1 || null == p2) {
return -1.0f;
}
int xx = p1.x - p2.x;
xx *= xx;
int yy = p1.y - p2.y;
yy *= yy;
float odl = (float) Math.sqrt(xx + yy);
odl *= MapConsts.DL_MK;
return odl;
}
/**
* Funkcja zwraca odległość między środkami małych kwadratów [m].
*
* @param x1 Wsp X id malego kwadratu pocz.
* @param y1 Wsp Y id malego kwadratu pocz.
* @param x2 Wsp X id malego kwadratu konc.
* @param y2 Wsp Y id malego kwadratu konc.
* @return Odległość miedzy srodkami malych kwadratow [m].
*/
public static float odleglosc(int x1, int y1, int x2, int y2) {
// odleglosc miedzy srodkami malych kwadratow
int xx = x1 - x2;
xx *= xx;
int yy = y1 - y2;
yy *= yy;
float odl = (float) Math.sqrt(xx + yy);
odl *= MapConsts.DL_MK;
return odl;
}
/**
* Funkcja zwraca odległość między środkami małych kwadratów [m].
*
* @param dx odległość w kwadratach na osi OX.
* @param dy odległość w kwadratach na osi OY.
* @return Odległość miedzy srodkami malych kwadratow [m].
*/
public static float odleglosc(int dx, int dy) {
float odl = (float) Math.sqrt(dx * dx + dy * dy);
odl *= MapConsts.DL_MK;
return odl;
}
private static final float DL_MK2 = MapConsts.DL_MK * 0.0009765625f;
/**
* Funkcja zwraca aproksymowaną odległość między środkami małych kwadratów [m].
*
* @param x1 Wsp X id malego kwadratu pocz.
* @param y1 Wsp Y id malego kwadratu pocz.
* @param x2 Wsp X id malego kwadratu konc.
* @param y2 Wsp Y id malego kwadratu konc.
* @return Odległość miedzy srodkami malych kwadratow [m].
*/
public static float odlegloscApprox(int x1, int y1, int x2, int y2) {
int dx = x2 - x1;
int dy = y2 - y1;
int min, max, approx;
if (dx < 0) dx = -dx;
if (dy < 0) dy = -dy;
if (dx < dy) {
min = dx;
max = dy;
} else {
min = dy;
max = dx;
}
approx = (max * 1007) + (min * 441);
if (max < (min << 4)) {
approx -= (max * 40);
}
float odl = approx * DL_MK2;
return odl;
}
public static int iloczynSkalarny(GridCoord p1, GridCoord p2) {
int wynik;
wynik = p1.x * p2.x + p1.y * p2.y;
return wynik;
}
// funkcja sprawdza, czy dwa obszary skierowane maja czesc wspolna
public static boolean majaCzescWspolna(GridCoord[] rejon1, GridCoord[] rejon2) {
if ((rejon1 == null) || (rejon2 == null)) {
return false;
}
for (int i = 0; i < rejon2.length; i++) {
if (GeomUtils.insidePolygon(rejon1, rejon2[i].x, rejon2[i].y)) {
return true;
}
}
for (int i = 0; i < rejon1.length; i++) {
if (GeomUtils.insidePolygon(rejon2, rejon1[i].x, rejon1[i].y)) {
return true;
}
}
return false;
}
// wyznacza stosunek czesci wspolnej obszarow do obszaru bazowego
public static float stosunekCzesciWspolnej(GridCoord[] rejon_bazowy, GridCoord[] rejon2) {
if ((rejon_bazowy == null) || (rejon2 == null)) {
return 0.0f;
}
boolean majaCzescWspolna = majaCzescWspolna(rejon_bazowy, rejon2);
if (!majaCzescWspolna) {
return 0.0f;
}
GridCoord[] kwadraty1 = GeomUtils.kwadratyObszaru(rejon_bazowy);
GridCoord[] kwadraty2 = GeomUtils.kwadratyObszaru(rejon2);
int maxWspolnych = 0;
if (kwadraty1.length <= kwadraty2.length) {
maxWspolnych = kwadraty1.length;
} else {
maxWspolnych = kwadraty2.length;
}
if ((kwadraty1 == null) || (kwadraty2 == null)) {
return 0.0f;
}
int wspolnych = 0;
for (int i = 0; i < kwadraty1.length; i++) {
for (int j = 0; j < kwadraty2.length; j++) {
if (czyIdentyczne(kwadraty1[i], kwadraty2[j])) {
wspolnych++;
}
}
}
return ((float) wspolnych) / ((float) (maxWspolnych));
}
// wyznacza wspolrzedne lewego dolnego wierzcholka oraz
// prawego gornego wierzcholka prostokata opisanego na obszarze: rejon
public static void minMaxIdKwadratu(GridCoord[] rejon, GridCoord min, GridCoord max) {
if (rejon == null) {
return;
}
if (min == null) {
min = new GridCoord(rejon[0].x, rejon[0].y);
}
if (max == null) {
max = new GridCoord(rejon[0].x, rejon[0].y);
}
for (int i = 1; i < rejon.length; i++) {
if (min.x > rejon[i].x) {
min.x = rejon[i].x;
}
if (min.y > rejon[i].y) {
min.y = rejon[i].y;
}
if (max.x < rejon[i].x) {
max.x = rejon[i].x;
}
if (max.y < rejon[i].y) {
max.y = rejon[i].y;
}
}
}
public void update(double lon, double lat) {
double xms_f = (lon + 180) * MapConsts.DEG_MS;
long xms = (long) xms_f;
x = zamienWspXmsNaIdKwadratuX(xms);
double yms_f = (lat + 90) * MapConsts.DEG_MS;
long yms = (long) yms_f;
y = zamienWspYmsNaIdKwadratuY(yms);
}
public GridCoord() {
x = -1;
y = -1;
}
public GridCoord(int x, int y) {
/* try {
if (x < 0 || y < 0)
throw new IdKwadratuException();
}
catch (IdKwadratuException e) {
System.out.print(e.opis);
}
*/
this.x = x;
this.y = y;
}
public GridCoord(GridCoord oryginal) {
this.x = oryginal.x;
this.y = oryginal.y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void set(GridCoord oryginal) {
x = oryginal.x;
y = oryginal.y;
}
public void set(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = prime + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof GridCoord)) {
return false;
}
GridCoord other = (GridCoord) obj;
if (x != other.x) {
return false;
}
if (y != other.y) {
return false;
}
return true;
}
}

View File

@@ -1,358 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
import pl.wat.ms4ds.common.EGeoDirection;
public class Kwadrat {
public static final Kwadrat EMPTY_SQUARE = new Kwadrat(null, 0.0f, 0.0f, 0.0f, 0.0f, 200, 0,
new boolean[8], new boolean[8], new boolean[8]);
float stopienZabudowy;
float stopienZalesienia;
float stopienZawodnienia;
float stopienZabagnienia;
boolean jestDroga[];
boolean jestRow[];
boolean jestPrzeszkodaWodna[];
int roznicaWzniesien;
int wysokoscSrednia;
/**
* The height above the level of the sea.
*/
short elevation;
/**
* 0 - BARE_GROUND
* 1 - GRASS
* 2 - SWAMP
* 3 - WATER
* 4 - SCRUB, BUSHES
* 5 - BUILDINGS
* 6 - FOREST
*/
short terrainType;
/**
* Rodzaj drogi na danym kierunku.
* 0 - no road, 1 - small roads, 2 - minor roads, 3 - major roads
*/
byte[] roads;
/**
* Rodzaj przeszkody wodnej na danym kierunku.
* 0 - no watercourse, 1 - drain, ditch, 2 - canal, stream, 3 - river
*/
byte[] waterWays;
transient RightBigSquare bs;
public float getStopienZabudowy() {
return stopienZabudowy;
}
public float getStopienZalesienia() {
return stopienZalesienia;
}
public float getStopienZawodnienia() {
return stopienZawodnienia;
}
public float getStopienZabagnienia() {
return stopienZabagnienia;
}
public int getRoznicaWzniesien() {
return roznicaWzniesien;
}
public int getWysokoscSrednia() {
return wysokoscSrednia;
}
public boolean[] getJestDroga() {
return jestDroga;
}
public boolean jestOdcinekDrogi() {
for (int i = 0; i < 8; i++) {
if (jestDroga[i])
return true;
}
return false;
}
public boolean getJestDroga(EGeoDirection naKierunku) {
if (naKierunku == EGeoDirection.UNDEFINED) {
return false;
}
return jestDroga[naKierunku.id];
}
public boolean[] getJestRow() {
return jestRow;
}
public boolean[] getJestPrzeszkodaWodna() {
return jestPrzeszkodaWodna;
}
public void setStopienZabudowy(float stopienZabudowy) {
this.stopienZabudowy = stopienZabudowy;
normalizujDanePokrycia();
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setStopienZalesienia(float stopienZalesienia) {
this.stopienZalesienia = stopienZalesienia;
normalizujDanePokrycia();
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setStopienZawodnienia(float stopienZawodnienia) {
this.stopienZawodnienia = stopienZawodnienia;
normalizujDanePokrycia();
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setStopienZabagnienia(float stopienZabagnienia) {
this.stopienZabagnienia = stopienZabagnienia;
normalizujDanePokrycia();
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void normalizujDanePokrycia() {
float suma = stopienZalesienia + stopienZawodnienia + stopienZabudowy + stopienZabagnienia;
if (suma > 1.0f) {
stopienZalesienia /= suma;
stopienZawodnienia /= suma;
stopienZabudowy /= suma;
stopienZabagnienia = 1.0f - stopienZalesienia - stopienZawodnienia - stopienZabudowy;
}
}
public void setRoznicaWzniesien(int roznicaWzniesien) {
this.roznicaWzniesien = roznicaWzniesien;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setWysokoscSrednia(int wysokoscSrednia) {
this.wysokoscSrednia = wysokoscSrednia;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestDroga(boolean[] czyJestDroga) {
this.jestDroga = czyJestDroga;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestDroga(EGeoDirection naKierunku, boolean czyJest) {
if (naKierunku == EGeoDirection.UNDEFINED) {
return;
}
this.jestDroga[naKierunku.id] = czyJest;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestPrzeszkodaWodna(EGeoDirection naKierunku, boolean czyJest) {
if (naKierunku == EGeoDirection.UNDEFINED) {
return;
}
this.jestPrzeszkodaWodna[naKierunku.id] = czyJest;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestRow(EGeoDirection naKierunku, boolean czyJest) {
if (naKierunku == EGeoDirection.UNDEFINED) {
return;
}
this.jestRow[naKierunku.id] = czyJest;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestRow(boolean[] czyJestRow) {
this.jestRow = czyJestRow;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public void setJestPrzeszkodaWodna(boolean[] czyJestPrzeszkodaWodna) {
this.jestPrzeszkodaWodna = czyJestPrzeszkodaWodna;
// try {
// if (null != bs) {
// bs.updateFile(false);
// }
// } catch (IOException e) {
// }
}
public float getStopienPofaldowania() {
// TODO: dodac do normatywow w klasie Teren (parametr kalibracyjny)
float stopienPofaldowania = 0.0f;
if (this.roznicaWzniesien >= 50)
stopienPofaldowania = 1.0f;
else if (this.roznicaWzniesien >= 10)
stopienPofaldowania = 0.6f;
else if (this.roznicaWzniesien >= 5)
stopienPofaldowania = 0.4f;
else if (this.roznicaWzniesien >= 3)
stopienPofaldowania = 0.2f;
return stopienPofaldowania;
}
public Kwadrat() {
jestDroga = new boolean[8];
jestPrzeszkodaWodna = new boolean[8];
jestRow = new boolean[8];
}
public Kwadrat(RightBigSquare _bs, float _stopienZabudowy, float _stopienZalesienia, float _stopienZabagnienia, float _stopienZawodnienia,
int _wysokoscSrednia, int _roznicaWzniesien, boolean _czyJestDroga[], boolean _czyJestRow[], boolean _czyJestPrzeszkodaWodna[]){
bs = _bs;
stopienZabudowy = _stopienZabudowy;
stopienZalesienia = _stopienZalesienia;
stopienZabagnienia = _stopienZabagnienia;
stopienZawodnienia = _stopienZawodnienia;
wysokoscSrednia = _wysokoscSrednia;
roznicaWzniesien = _roznicaWzniesien;
jestDroga = new boolean[8];
jestRow = new boolean[8];
jestPrzeszkodaWodna = new boolean[8];
for (int i = 0; i < _czyJestDroga.length; i++) {
jestDroga[i]=_czyJestDroga[i];
}
for (int i = 0; i < jestRow.length; i++) {
jestRow[i]=_czyJestRow[i];
}
for (int i = 0; i < _czyJestPrzeszkodaWodna.length; i++) {
jestPrzeszkodaWodna[i]=_czyJestPrzeszkodaWodna[i];
}
}
public String toString() {
float f = this.stopienZabudowy * 255.0f;
int hex = (int)f;
String s = String.format("%02X", hex);
String linia = s;
linia += " ";
f = this.stopienZalesienia * 255.0f;
hex = (int)f;
s = String.format("%02X", hex);
linia += s;
linia += " ";
f = this.stopienZabagnienia * 255.0f;
hex = (int)f;
s = String.format("%02X", hex);
linia += s;
linia += " ";
f = this.stopienZawodnienia * 255.0f;
hex = (int)f;
s = String.format("%02X", hex);
linia += s;
linia += " ";
s = String.format("%4d", this.wysokoscSrednia);
linia += s;
linia += " ";
s = String.format("%4d", this.roznicaWzniesien);
linia += s;
linia += " ";
int bity = 0;
int bit_1 = 1;
for (int i = 0; i < this.jestDroga.length; i++) {
if (this.jestDroga[i]) // jest odcinek drogi na tym kierunku
bity += bit_1;
bit_1 = bit_1 << 1;
}
s = String.format("%02X", bity);
linia += s;
linia += " ";
bity = 0;
bit_1 = 1;
for (int i = 0; i < this.jestPrzeszkodaWodna.length; i++) {
if (this.jestPrzeszkodaWodna[i]) // jest przeszkod na tym kierunku
bity += bit_1;
bit_1 = bit_1 << 1;
}
s = String.format("%02X", bity);
linia += s;
linia += " ";
bity = 0;
bit_1 = 1;
for (int i = 0; i < this.jestRow.length; i++) {
if (this.jestRow[i]) // jest row na tym kierunku
bity += bit_1;
bit_1 = bit_1 << 1;
}
s = String.format("%02X", bity);
linia += s;
return linia;
}
}

View File

@@ -1,113 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
import java.util.StringTokenizer;
public class LukDrogowy {
private WezelDrogowy[] wezly = new WezelDrogowy[2];
int id = -1;
int dlugosc = 0;
int szerokosc = 0;
int rodzajNawierzchni = 0;
boolean jestMostem = false;
LukDrogowy() {}
LukDrogowy(String opis) {
if (null == opis || opis.length() == 0){
SiecDrogowa.logger.debug("Pusty ciag opis w konstruktorze Luku Drogowego.");
return;
}
StringTokenizer st = new StringTokenizer(opis, " \t");
String[] tokenTable = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++) {
tokenTable[i] = st.nextToken();
}
if (tokenTable.length == 6) {
try {
int id = Integer.parseInt(tokenTable[0]);
WezelDrogowy wezel = SiecDrogowa.instancja.wezly.get(id);
if (null == wezel)
SiecDrogowa.logger.warn("Brak wierzcholka (1) poczatkowego luku. [" + opis + "].");
this.getWezly()[0] = wezel;
wezel.luki.add(this);
} catch (NumberFormatException e) {
SiecDrogowa.logger.warn("Bledne dane w pliku z lukami [Wezel 1].");
}
try {
int id = Integer.parseInt(tokenTable[1]);
WezelDrogowy wezel = SiecDrogowa.instancja.wezly.get(id);
if (null == wezel)
SiecDrogowa.logger.warn("Brak wierzcholka (2) koncowego luku. [" + opis + "].");
this.getWezly()[1] = wezel;
wezel.luki.add(this);
} catch (NumberFormatException e) {
SiecDrogowa.logger.warn("Bledne dane w pliku z lukami [Wezel 2].");
}
if (this.wezly[0].id == this.wezly[1].id) {
SiecDrogowa.logger.warn("Bledne dane w pliku z lukami [wezly sa identyczne].");
}
if (GridCoord.czyIdentyczne(this.wezly[0].idKw, this.wezly[1].idKw)) {
SiecDrogowa.logger.warn("Bledne dane w pliku z lukami [wezly sa identyczne].");
}
try {
this.dlugosc = Integer.parseInt(tokenTable[2]);
} catch (NumberFormatException e) {
SiecDrogowa.logger.warn("Bledne dane w pliku z lukami [Dlugosc].");
}
try {
this.szerokosc = Integer.parseInt(tokenTable[3]);
} catch (NumberFormatException e) {
SiecDrogowa.logger.warn("Bledne dane w pliku z lukami [Szerokosc].");
}
try {
this.rodzajNawierzchni = Integer.parseInt(tokenTable[4]);
} catch (NumberFormatException e) {
SiecDrogowa.logger.warn("Bledne dane w pliku z lukami [RodzajNawierzchni].");
}
try {
int b = Integer.parseInt(tokenTable[5]);
this.jestMostem = (b != 0);
} catch (NumberFormatException e) {
SiecDrogowa.logger.warn("Bledne dane w pliku z lukami [CzyJestMost].");
}
}
}
public int getDlugosc() {
return dlugosc;
}
public void setDlugosc(int dlugosc) {
this.dlugosc = dlugosc;
}
public int getSzerokosc() {
return szerokosc;
}
public void setSzerokosc(int szerokosc) {
this.szerokosc = szerokosc;
}
public int getRodzajNawierzchni() {
return rodzajNawierzchni;
}
public void setRodzajNawierzchni(int rodzajNawierzchni) {
this.rodzajNawierzchni = rodzajNawierzchni;
}
public boolean isJestMostem() {
return jestMostem;
}
public void setJestMostem(boolean jestMostem) {
this.jestMostem = jestMostem;
}
public WezelDrogowy[] getWezly() {
return wezly;
}
}

View File

@@ -1,242 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public final class MapConsts {
private static final Logger LOGGER = LoggerFactory.getLogger(MapConsts.class);
/**
* Umowny uklad odniesienia dla lokalizacji geograficznej: <p>
* Długość geograficzna (wsp. X) przyjmuje wartości: [0, 360) odpowiadające [-180, 180]<p>
* Szerokość geograficzna (wsp. Y) przyjmuje wartości: [0, 180] odpowadające [-90, 90]
*/
public static final int X_REF;
/**
* Umowny uklad odniesienia dla lokalizacji geograficznej: <p>
* Długość geograficzna (wsp. X) przyjmuje wartości: [0, 360) odpowiadające [-180, 180]<p>
* Szerokość geograficzna (wsp. Y) przyjmuje wartości: [0, 180] odpowadające [-90, 90]
*/
public static final int Y_REF;
public static final int DX_REF;
public static final int DY_REF;
public static final String KWADRATY_DIR;
public static final String DROGI_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";
/**
* Dlugosc boku duzego kwadratu na osi OX w liczbie malych kwadratow.
*/
public static final int SS_PER_BS_X;
/**
* Dlugosc boku duzego kwadratu na osi OY w liczbie malych kwadratow.
*/
public static final int SS_PER_BS_Y;
/**
* Dlugosc boku malego kwadratu w metrach.
*/
public static final int DL_MK;
/**
* Powierzchnia malego kwadratu w metrach.
*/
public static final int POW_MK;
/**
* Szerokość małego kwadratu w stopniach.
*/
public static final double DELTA_X;
/**
* Wysokość małego kwadratu w stopniach.
*/
public static final double DELTA_Y;
/**
* Liczba duzych kwadratow na stopien geograficzny po osi OX (dlugosc geograficzna).
*/
public static final int BS_PER_DEG_X = 4;
/**
* Liczba duzych kwadratow na stopien geograficzny po osi OY (szerokosc geograficzna).
*/
public static final int BS_PER_DEG_Y = 6;
/**
* Szerokość duzych kwadratow w stopniach geograficznych po osi OX (dlugosc geograficzna).
*/
public static final double BS_DX;
/**
* Wysokość duzych kwadratow w stopniach geograficznych po osi OY (szerokosc geograficzna).
*/
public static final double BS_DY;
static Properties ustawienia;
/**
* Odczytanie ustawien z pliku konfiguracyjnego.
*/
static {
String propertiesFileName = System.getProperty("user.dir") + "\\" + PLIK_Z_USTAWIENIAMI;
ustawienia = new Properties();
try {
LOGGER.debug("Odczyt ustawien z pliku " + propertiesFileName + ".");
ustawienia.load(new FileInputStream(propertiesFileName));
LOGGER.debug("Ustawienia wczytane.");
} catch (FileNotFoundException e) {
LOGGER.error(e.getLocalizedMessage());
} catch (IOException e) {
LOGGER.error(e.getLocalizedMessage());
}
// logger.debug("Ustawienia wczytane.");
// 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;
// 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"));
String val = ustawienia.getProperty("dl_mk");
switch (val) {
case "20":
DL_MK = 20;
break;
case "25":
DL_MK = 25;
break;
case "50":
DL_MK = 50;
break;
case "100":
DL_MK = 100;
break;
default:
DL_MK = 200;
break;
}
POW_MK = DL_MK * DL_MK;
DROGI_DIR = ustawienia.getProperty("drogi_dir");
if (DL_MK == 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/";
} else if (DL_MK == 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/";
} else if (DL_MK == 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/";
} else if (DL_MK == 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/";
} 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/";
}
BS_DX = 1.0 / (double) BS_PER_DEG_X;
BS_DY = 1.0 / (double) BS_PER_DEG_Y;
}
/**
* Liczba milisekund na stopien.
*/
public static final int DEG_MS = 3600000;
/**
* Liczba milisekund na 360 stopni.
*/
public static final long ANGLE_360_MS = 3600000 * 360;
/**
* Wielkosc cache'u pola walki (liczba duzych kwadratow trzymanych w RAM).
*/
public static final int MAX_BIG_SQUARES_IN_MEMORY = 500;
/**
* Wspolrzedna referencyjna X (dlugosc geograficzna) lewego dolnego rogu mapy w stopniach geograficznych.
* @return
*/
public static int getX_REF() {
return X_REF;
}
/**
* Wspolrzedna referencyjna Y (szerokosc geograficzna) lewego dolnego rogu mapy w stopniach geograficznych.
* @return
*/
public static int getY_REF() {
return Y_REF;
}
/**
* Szerokosc referencyjna prostokata pola walki w stopniach na osi OX (dlugosc geograficzna).
* @return
*/
public static int getDX_REF() {
return DX_REF;
}
/**
* Wysokosc referencyjna prostokata pola walki w stopniach na osi OY (szerokosc geograficzna).
* @return
*/
public static int getDY_REF() {
return DY_REF;
}
public static String getKwadratyDir() {
return KWADRATY_DIR;
}
public static String getDrogiDir() {
return DROGI_DIR;
}
/**
* Dlugosci bokow malego kwadratu w milisekundach geograficznych po osi OX (dlugosc geograficzna).
*/
public static final double SS_DX_MS = DELTA_X * 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;
// 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 BS_DX_MS = (int) (BS_DX * DEG_MS);
public static final int BS_DY_MS = (int) (BS_DY * DEG_MS);
/**
* Liczba malych kwadratow przypadajaca na bok arkusza mapy drogowej.
*/
public static final int SS_PER_SHEET = 20;
}

View File

@@ -1,364 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.wat.ms4ds.common.EGeoDirection;
public class SiecDrogowa {
static final Logger logger = LoggerFactory.getLogger(SiecDrogowa.class);
ArrayList<LukDrogowy> luki;
ArrayList<WezelDrogowy> wezly;
static SiecDrogowa instancja;
static String path;
Arkusz[][] arkusze;
public int liczbaZmian = 0;
static final int LICZBA_ZMIAN = 50;
SiecDrogowa(String dataPath) {
instancja = this;
// File wd = new File(".");
// PATH = wd.getPath();
path = dataPath;
this.odczytajWezly(path + "/nodes.txt");
logger.debug("wczytano " + this.wezly.size() + " wezlow.");
this.odczytajLuki(path + "/arcs.txt");
logger.debug("wczytano " + this.luki.size() + " lukow.");
stworzArkusze();
// logger.debug("Liczba lukow w arkuszach:");
// int ll = 0;
// for (int i = 0; i < Arkusz.lx; i++) {
// for (int j = 0; j < Arkusz.ly; j++) {
// logger.debug(String.format("(%1$2d, %2$2d) - %3$6d", i, j, this.arkusze[i][j].luki.size()));
// ll += this.arkusze[i][j].luki.size();
// }
// }
// logger.debug("Sum. liczba lukow w arkuszach:" + ll);
}
void odczytajWezly(String fname) {
try {
FileReader fis = new FileReader(fname);
BufferedReader br = new BufferedReader(fis);
if (br.ready()) {
String line = br.readLine().trim();
int licz = Integer.parseInt(line);
this.wezly = new ArrayList<WezelDrogowy>(licz);// + 1000);
while (null != (line = br.readLine())) {
WezelDrogowy nowyWezel = new WezelDrogowy(line);
nowyWezel.id = this.wezly.size(); //Indeksowanie od 0
this.wezly.add(nowyWezel);
}
}
br.close();
} catch (IOException e) {
logger.warn("Brak pliku z wezlami: " + fname);
}
}
void odczytajLuki(String fname) {
try {
FileReader fis = new FileReader(fname);
BufferedReader br = new BufferedReader(fis);
if (br.ready()) {
String line = br.readLine().trim();
int licz = Integer.parseInt(line);
this.luki = new ArrayList<LukDrogowy>(licz);// + 1000);
while (null != (line = br.readLine())) {
LukDrogowy nowyLuk = new LukDrogowy(line);
nowyLuk.id = this.luki.size(); //Indeksowanie od 0
this.luki.add(nowyLuk);
}
}
br.close();
} catch (IOException e) {
logger.warn("Brak pliku z lukami: " + fname);
}
}
void stworzArkusze() {
// wyznaczenie wymiarow pola walki w malych kwadratach
Arkusz.lx = MapConsts.getDX_REF() * MapConsts.BS_PER_DEG_X * MapConsts.SS_PER_BS_X;
Arkusz.ly = MapConsts.getDY_REF() * MapConsts.BS_PER_DEG_Y * MapConsts.SS_PER_BS_Y;
// wyznacznie liczby arkuszy mapy w obu wymiarach
Arkusz.lx = Arkusz.lx / MapConsts.SS_PER_SHEET + 1;
Arkusz.ly = Arkusz.ly / MapConsts.SS_PER_SHEET + 1;
this.arkusze = new Arkusz[Arkusz.lx][Arkusz.ly];
for (int i = 0; i < Arkusz.lx; i++) {
for (int j = 0; j < Arkusz.ly; j++) {
this.arkusze[i][j] = new Arkusz();
}
}
// wspolrzedne arkusza mapy
int xa, ya;
for (int i = 0; i < this.wezly.size(); i++) {
WezelDrogowy wezel = this.wezly.get(i);
xa = wezel.idKw.x / MapConsts.SS_PER_SHEET;
ya = wezel.idKw.y / MapConsts.SS_PER_SHEET;
this.arkusze[xa][ya].wezly.add(wezel);
}
int xa2, ya2;
for (int i = 0; i < this.luki.size(); i++) {
LukDrogowy luk = this.luki.get(i);
xa = luk.getWezly()[0].idKw.x / MapConsts.SS_PER_SHEET;
ya = luk.getWezly()[0].idKw.y / MapConsts.SS_PER_SHEET;
xa2 = luk.getWezly()[1].idKw.x / MapConsts.SS_PER_SHEET;
ya2 = luk.getWezly()[1].idKw.y / MapConsts.SS_PER_SHEET;
boolean b = Arkusz.mniejszeWspolrzedne(xa, ya, xa2, ya2);
if (b) {
this.arkusze[xa][ya].luki.add(luk);
} else {
this.arkusze[xa2][ya2].luki.add(luk);
}
}
}
public static void utworzSiecDrogowa(){
// if (null == instancja){
// instancja = new SiecDrogowa(MapConsts.DROGI_DIR);
// }
}
public static LukDrogowy dodajLuk(WezelDrogowy wezel1, WezelDrogowy wezel2) {
utworzSiecDrogowa();
LukDrogowy nowyLuk = new LukDrogowy();
nowyLuk.getWezly()[0] = wezel1;
wezel1.luki.add(nowyLuk);
nowyLuk.getWezly()[1] = wezel2;
wezel2.luki.add(nowyLuk);
instancja.luki.add(nowyLuk);
nowyLuk.id = instancja.luki.size() - 1;
return nowyLuk;
}
public static WezelDrogowy dodajWezel(String wspUTM) {
utworzSiecDrogowa();
// TODO dodac weryfikacje poprawnosci wspolrzednych UTM
WezelDrogowy nowyWezel = new WezelDrogowy();
nowyWezel.setXms(Teren.zamienWspUtmNaWspXms(wspUTM.substring(0, 6)));
nowyWezel.setYms(Teren.zamienWspUtmNaWspXms(wspUTM.substring(8, 14)));
int x = GridCoord.zamienWspXmsNaIdKwadratuX(nowyWezel.getXms());
int y = GridCoord.zamienWspYmsNaIdKwadratuY(nowyWezel.getYms());
nowyWezel.idKw = new GridCoord(x, y);
nowyWezel.luki = new ArrayList<LukDrogowy>();
instancja.wezly.add(nowyWezel);
nowyWezel.id = instancja.wezly.size() - 1;
return nowyWezel;
}
public static void usunLuk(LukDrogowy usuwanyLuk) {
utworzSiecDrogowa();
if (usuwanyLuk.id < 0 || usuwanyLuk.id >= instancja.luki.size()) {
return;
}
int ostatniId = instancja.luki.size() - 1;
LukDrogowy lukOstatni = instancja.luki.get(ostatniId);
lukOstatni.id = usuwanyLuk.id;
instancja.luki.set(lukOstatni.id, lukOstatni);
instancja.luki.remove(ostatniId);
// aktualizacja wezlow luku
usuwanyLuk.getWezly()[0].luki.remove(usuwanyLuk);
usuwanyLuk.getWezly()[1].luki.remove(usuwanyLuk);
if (usuwanyLuk.getWezly()[0].luki.size() == 0) {
usunWezel(usuwanyLuk.getWezly()[0]);
}
if (usuwanyLuk.getWezly()[1].luki.size() == 0) {
usunWezel(usuwanyLuk.getWezly()[1]);
}
}
public static void usunWezel(WezelDrogowy usuwanyWezel) {
utworzSiecDrogowa();
if (usuwanyWezel.id < 0 || usuwanyWezel.id >= instancja.wezly.size()) {
return;
}
int ostatniId = instancja.wezly.size() - 1;
WezelDrogowy wezelOstatni = instancja.wezly.get(ostatniId);
wezelOstatni.id = usuwanyWezel.id;
instancja.wezly.set(wezelOstatni.id, wezelOstatni);
instancja.wezly.remove(ostatniId);
}
public static void wpiszDrogiWKwadraty() {
utworzSiecDrogowa();
GridCoord[] kwadratyOdcinka;
for (int i = 0; i < instancja.luki.size(); i++) {
LukDrogowy luk = instancja.luki.get(i);
GridCoord kw1 = luk.getWezly()[0].idKw;
GridCoord kw2 = luk.getWezly()[1].idKw;
kwadratyOdcinka = GeomUtils.kwadratyOdcinka(kw1, kw2);
wpiszOdcinekDrogiWKwadraty(kwadratyOdcinka);
}
Teren.zapisBuforaMapyDoPliku();
}
static void wpiszOdcinekDrogiWKwadraty(GridCoord[] kwadratyOdcinka) {
if (null == kwadratyOdcinka) {
return;
}
for (int i = 0; i < kwadratyOdcinka.length - 1; i++) {
GridCoord idkw1 = kwadratyOdcinka[i];
GridCoord idkw2 = kwadratyOdcinka[i + 1];
EGeoDirection kier = GeomUtils.kierunekDlaSasiada(idkw1, idkw2);
Kwadrat kw = Teren.getKwadrat(idkw1.x, idkw1.y);
if (null != kw) {
kw.setJestDroga(kier, true);
}
kw = Teren.getKwadrat(idkw2.x, idkw2.y);
if (null != kw) {
// wyznaczam kierunek przeciwny
kier = kier.oppositeDirect();
kw.setJestDroga(kier, true);
}
}
}
public void aktualizujPliki(boolean wymuszony) throws IOException {
if (wymuszony) {
if (this.liczbaZmian == 0)
// nie bylo modyfikacji od ostatniej zapisu
return;
this.liczbaZmian = -1;
}
this.liczbaZmian++;
this.liczbaZmian %= LICZBA_ZMIAN;
if (0 == this.liczbaZmian) {
try {
// zapisanie wezlow
BufferedWriter bw = new BufferedWriter(new FileWriter(path + "\\nodes.txt"));
String linia = Integer.toString(this.wezly.size());
bw.write(linia, 0, linia.length());
bw.newLine();
String s;
for (int i = 0; i < this.wezly.size(); i++) {
WezelDrogowy wezel = this.wezly.get(i);
s = String.format("%07d", wezel.id);
linia = s;
linia += " ";
s = String.format("%010d", wezel.getXms());
linia += s;
linia += " ";
s = String.format("%010d", wezel.getYms());
linia += s;
linia += " ";
int most = 0;
if (wezel.jestMostem) {
most = 1;
}
s = String.format("%01d", most);
linia += s;
bw.write(linia, 0, linia.length());
bw.newLine();
}
bw.close();
logger.info("Zapisano plik wezlow sieci drogowej: " + path + "\\nodes.txt");
} catch (IOException e) {
logger.warn("Blad zapisu pliku wezlow sieci drogowej: " + path + "\\nodes.txt");
}
try {
// zapisanie lukow
BufferedWriter bw = new BufferedWriter(new FileWriter(path + "\\arcs.txt"));
String linia = Integer.toString(this.luki.size());
bw.write(linia, 0, linia.length());
bw.newLine();
String s;
for (int i = 0; i < this.luki.size(); i++) {
LukDrogowy luk = this.luki.get(i);
s = String.format("%07d", luk.getWezly()[0].id);
linia = s;
linia += " ";
s = String.format("%07d", luk.getWezly()[1].id);
linia += s;
linia += " ";
s = String.format("%05d", luk.dlugosc);
linia += s;
linia += " ";
s = String.format("%02d", luk.szerokosc);
linia += s;
linia += " ";
int most = 0;
if (luk.jestMostem) {
most = 1;
}
s = String.format("%01d", most);
linia += s;
bw.write(linia, 0, linia.length());
bw.newLine();
}
bw.close();
logger.info("Zapisano plik lukow sieci drogowej: " + path + "\\arcs.txt");
} catch (IOException e) {
logger.warn("Blad zapisu pliku lukow sieci drogowej: " + path + "\\arcs.txt");
}
}
}
// funkcja zwraca kolekcje lukow wewnatrz prostokata
// zawartego miedzy lewym dolnym i prawym gornym punktem
public static ArrayList<LukDrogowy> dajLukiWObszarze(String wspUtmLD, String wspUtmPG) {
utworzSiecDrogowa();
int xms = Teren.zamienWspUtmNaWspXms(wspUtmLD);
int yms = Teren.zamienWspUtmNaWspYms(wspUtmLD);
int xa_ld = GridCoord.zamienWspXmsNaIdKwadratuX(xms);
xa_ld /= MapConsts.SS_PER_SHEET;
int ya_ld = GridCoord.zamienWspYmsNaIdKwadratuY(yms);
ya_ld /= MapConsts.SS_PER_SHEET;
xms = Teren.zamienWspUtmNaWspXms(wspUtmPG);
yms = Teren.zamienWspUtmNaWspYms(wspUtmPG);
int xa_pg = GridCoord.zamienWspXmsNaIdKwadratuX(xms);
xa_pg /= MapConsts.SS_PER_SHEET;
int ya_pg = GridCoord.zamienWspYmsNaIdKwadratuY(yms);
ya_pg /= MapConsts.SS_PER_SHEET;
//if (xa_ld > xa_pg || ya_ld > ya_pg) {
// return null;
//}
if (xa_ld > xa_pg){
int tmp = xa_ld;
xa_ld = xa_pg;
xa_pg = tmp;
}
if (ya_ld > ya_pg){
int tmp = ya_ld;
ya_ld = ya_pg;
ya_pg = tmp;
}
ArrayList<LukDrogowy> luki = new ArrayList<LukDrogowy>();
// wspolrzedne arkusza mapy
for (int xa = xa_ld; xa <= xa_pg; xa++) {
for (int ya = ya_ld; ya <= ya_pg; ya++) {
if (instancja.arkusze[xa][ya].luki != null) {
luki.addAll(instancja.arkusze[xa][ya].luki);
}
}
}
return luki;
}
public static void main(String[] args) {
// GridCoord idKw = GridCoord.zamienWspUtmNaIdKwadratu("520101N0160202E");
// String utm = GridCoord.zamienIdKwadratuNaWspUtm(idKw);
// int xms = GridCoord.zamienIdKwadratuXNaWspXms(idKw.x);
// int yms = GridCoord.zamienIdKwadratuYNaWspYms(idKw.y);
// utm = Teren.zamienWspXmsYmsNaWspUtm(xms, yms);
// float lon = GridCoord.zamienIdKwadratuXNaDlugoscGeo(idKw.x);
// float lat = GridCoord.zamienIdKwadratuYNaSzerokoscGeo(idKw.y);
// idKw.x = GridCoord.zamienDlugoscGeoNaIdKwadratuX(lon);
// idKw.y = GridCoord.zamienSzerokoscGeoNaIdKwadratuY(lat);
utworzSiecDrogowa();
SiecDrogowa.wpiszDrogiWKwadraty();
}
}

View File

@@ -1,83 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SmallSquare {
/**
* The height above the level of the sea.
*/
short elevation;
/**
* 0 - BARE_GROUND
* 1 - GRASS
* 2 - SWAMP
* 3 - WATER
* 4 - SCRUB, BUSHES
* 5 - BUILDINGS
* 6 - FOREST
*/
byte terrainType;
/**
* Rodzaj drogi na danym kierunku.
* 0 - no road, 1 - small roads, 2 - minor roads, 3 - major roads
*/
// byte[] roads;
byte smallRoads;
byte minorRoads;
byte majorRoads;
/**
* Rodzaj przeszkody wodnej na danym kierunku.
* 0 - no watercourse, 1 - drain, ditch, 2 - canal, stream, 3 - river
*/
// byte[] waterWays;
byte drains;
byte streams;
byte rivers;
public void reset() {
elevation = 0;
terrainType = 0;
smallRoads = 0;
minorRoads = 0;
majorRoads = 0;
drains = 0;
streams = 0;
rivers = 0;
}
public void save(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 load(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 SmallSquare(short elevation, byte terrainType) {
this.elevation = elevation;
this.terrainType = terrainType;
}
public SmallSquare() {
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,166 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
import pl.wat.ms4ds.common.EGeoDirection;
import pl.wat.ms4ds.common.ERodzajPodwozia;
import java.util.ArrayList;
public class TerrainUtils {
// ========================================================================
public static float widocznoscOptyczna(float wysokoscObserwatora, float wysokoscCelu,
int x1, int y1, int x2, int y2) {
if ((x1 == x2) && (y1 == y2)) {
return 1.0f;
}
Kwadrat kwDo = Teren.getKwadrat(x1, y1);
Kwadrat kwOd = Teren.getKwadrat(x2, y2);
if (kwDo == Kwadrat.EMPTY_SQUARE || kwOd == Kwadrat.EMPTY_SQUARE) {
return 0.0f;
}
// roznica wysokosci miedzy skrajnymi kwadratami
float roznicaWysokosci = kwDo.wysokoscSrednia + wysokoscCelu - kwOd.wysokoscSrednia - wysokoscObserwatora;
float wysBezwzgObserwatora;
if (roznicaWysokosci < 0) {
// sprawdzanie kwOd -> kwDo
int swap = x1;
x1 = x2;
x2 = swap;
swap = y1;
y1 = y2;
y2 = swap;
roznicaWysokosci = -roznicaWysokosci;
wysBezwzgObserwatora = kwDo.wysokoscSrednia + wysokoscCelu;
} else {
wysBezwzgObserwatora = kwOd.wysokoscSrednia + wysokoscObserwatora;
}
GridCoord[] kwadratyNaOdcinku = Bresenham.generateSegment(x1, y1, x2, y2);
float dlugoscOdcinka = GridCoord.odleglosc(x1, y1, x2, y2);
float tangAlfa0 = roznicaWysokosci / dlugoscOdcinka;
float dh_max = 0;
for (int i = 1; i < kwadratyNaOdcinku.length - 1; i++) {
// badanie wewnetrznych kwadratow nalezacych do odcinka,
// czy nie sa powyzej linii widocznosci dla kwadratow skrajnych
float wysokoscPrzeszkody = 0.0f;
Kwadrat kwAkt = Teren.getKwadrat(kwadratyNaOdcinku[i].x, kwadratyNaOdcinku[i].y);
if (kwAkt.stopienZalesienia > 0.5f) {
wysokoscPrzeszkody = 10.0f;
}
if (kwAkt.stopienZabudowy > 0.5f) {
wysokoscPrzeszkody = 10.0f;
}
// wyznaczenie roznicy wysokosci kwadratu badanego i docelowego
// uwzgledniajac wysokosc obserwatora oraz wysokosc przeszkody
float roznWysAkt = kwAkt.wysokoscSrednia + wysokoscPrzeszkody - wysBezwzgObserwatora;
if (dh_max >= roznWysAkt) {
continue;
}
float odleg = GridCoord.odleglosc(kwadratyNaOdcinku[i].x, kwadratyNaOdcinku[i].y, x1, y1);
// float tangAlfa = roznWysAkt / odleg;
// if (tangAlfa0 < tangAlfa) {
if (tangAlfa0 * odleg < roznWysAkt) {
// wysokosc aktualnie badanego kwadratu jest powyzej/ponizej
// linii poprowadzonej z kwadratu startowego do docelowego (z uwzglednieniem wysokosci obserwatora i celu)
// odpowiednio dla katow dodatnich/ujemnych
return 0.0f;
}
dh_max = roznWysAkt;
}
return 1.0f;
}
public static float widocznoscOptyczna(int x, int y) {
Kwadrat kw = Teren.getKwadrat(x, y);
if (kw.stopienZabudowy > 0.25f || kw.stopienZalesienia > 0.25f) {
return 0.3f;
}
return 1.0f;
}
public static float widocznoscOptyczna2(float wysokoscObserwatora, float wysokoscCelu,
int x1, int y1, int x2, int y2) {
if ((x1 == x2) && (y1 == y2)) {
return 1.0f;
}
Kwadrat kwDo = Teren.getKwadrat(x1, y1);
Kwadrat kwOd = Teren.getKwadrat(x2, y2);
if (kwDo == Kwadrat.EMPTY_SQUARE || kwOd == Kwadrat.EMPTY_SQUARE) {
return 0.0f;
}
// roznica wysokosci miedzy skrajnymi kwadratami
float roznicaWysokosci = kwDo.wysokoscSrednia + wysokoscCelu - kwOd.wysokoscSrednia - wysokoscObserwatora;
GridCoord[] kwadratyNaOdcinku = GeomUtils.kwadratyOdcinka(x1, y1, x2, y2);
float dlugoscOdcinka = GridCoord.odleglosc(x1, y1, x2, y2);
float tangAlfa0 = roznicaWysokosci / dlugoscOdcinka;
for (int i = 1; i < kwadratyNaOdcinku.length - 1; i++) {
// badanie wewnetrznych kwadratow nalezacych do odcinka,
// czy nie sa powyzej linii widocznosci dla kwadratow skrajnych
float wysokoscPrzeszkody = 0.0f;
Kwadrat kwAkt = Teren.getKwadrat(kwadratyNaOdcinku[i].x, kwadratyNaOdcinku[i].y);
if (kwAkt.stopienZalesienia > 0.5f) {
wysokoscPrzeszkody = 10.0f;
}
if (kwAkt.stopienZabudowy > 0.5f) {
wysokoscPrzeszkody = 10.0f;
}
// wyznaczenie roznicy wysokosci kwadratu badanego i docelowego
// uwzgledniajac wysokosc obserwatora oraz wysokosc przeszkody
float roznWysAkt = kwAkt.wysokoscSrednia + wysokoscPrzeszkody - kwOd.wysokoscSrednia - wysokoscObserwatora;
float odleg = GridCoord.odleglosc(kwadratyNaOdcinku[i].x, kwadratyNaOdcinku[i].y, x1, y1);
float tangAlfa = roznWysAkt / odleg;
if (tangAlfa0 < tangAlfa) {
// wysokosc aktualnie badanego kwadratu jest powyzej/ponizej
// linii poprowadzonej z kwadratu startowego do docelowego (z uwzglednieniem wysokosci obserwatora i celu)
// odpowiednio dla katow dodatnich/ujemnych
return 0.0f;
}
}
if (kwDo.stopienZabudowy > 0.25f || kwDo.stopienZalesienia > 0.25f) {
return 0.3f;
}
return 1.0f;
}
public static float sredStopienWidoczOptycznej(float wysokoscObserwatora, float wysokoscCelu,
GridCoord kwadratOd, int dl1, GridCoord kwadratDo, int dl2) {
float stop = 0.0f;
for (int x1 = kwadratOd.x; x1 < kwadratOd.x + dl1; x1++)
for (int y1 = kwadratOd.y; y1 < kwadratOd.y + dl1; y1++)
for (int x2 = kwadratDo.x; x2 < kwadratDo.x + dl2; x2++)
for (int y2 = kwadratDo.y; y2 < kwadratDo.y + dl2; y2++)
stop += widocznoscOptyczna(wysokoscObserwatora, wysokoscCelu, x1, y1, x2, y2);
stop /= (dl1 * dl1 * dl2 * dl2);
return stop;
}
public static float sredStopienWidoczOptycznej2(float wysokoscObserwatora, float wysokoscCelu,
GridCoord kwadratOd, int dl1, GridCoord kwadratDo, int dl2) {
float stop = 0.0f;
for (int x1 = kwadratOd.x; x1 < kwadratOd.x + dl1; x1++)
for (int y1 = kwadratOd.y; y1 < kwadratOd.y + dl1; y1++)
for (int x2 = kwadratDo.x; x2 < kwadratDo.x + dl2; x2++)
for (int y2 = kwadratDo.y; y2 < kwadratDo.y + dl2; y2++)
stop += widocznoscOptyczna2(wysokoscObserwatora, wysokoscCelu, x1, y1, x2, y2);
stop /= (dl1 * dl1 * dl2 * dl2);
return stop;
}
public static float stopienPrzejezdnosciAktualOdcinkaDrogi(ArrayList<GridCoord> droga, int pozycja,
EGeoDirection zkierunku, ERodzajPodwozia podwozie) {
if ((droga == null) || (droga.size() == 0) || (pozycja < 0) || (pozycja >= droga.size() - 1)) {
return 0.0f;
}
GridCoord idKw1 = droga.get(pozycja);
GridCoord idKw2 = droga.get(pozycja + 1);
return (float) Teren.getStopienPrzejezdnosci(idKw1.x, idKw1.y, idKw2.x, idKw2.y, zkierunku, podwozie);
}
}

View File

@@ -1,96 +0,0 @@
package pl.wat.ms4ds.terenfunkcje;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class WezelDrogowy {
int id = -1;
private int xms = 0;
private int yms = 0;
boolean jestMostem = false;
GridCoord idKw;
ArrayList<LukDrogowy> luki = new ArrayList<LukDrogowy>();
WezelDrogowy() {
}
WezelDrogowy(String opis) {
if (null == opis || opis.length() == 0){
SiecDrogowa.logger.debug("Pusty ciag opis w konstruktorze Wezla Drogowego.");
return;
}
StringTokenizer st = new StringTokenizer(opis, " \t");
String[] tokenTable = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++) {
tokenTable[i] = st.nextToken();
}
if (tokenTable.length == 3) {
try {
this.xms = Integer.parseInt(tokenTable[0]);
//TODO KONSULTACJA WYWALAMY/ ODKOMENTOWUJEMY
// //Zabezpieczenie przed zaokraglaniem na krawedziach mapy
// if (this.xms < MapConsts.X_REF_MS)
// this.xms = MapConsts.X_REF_MS;
// if (this.xms > MapConsts.X_REF_MS + MapConsts.DX_REF_MS)
// this.xms = MapConsts.X_REF_MS + MapConsts.DX_REF_MS;
} catch (NumberFormatException e) {
SiecDrogowa.logger.warn("Bledne dane w pliku z wezlami [Wezel: " + this.id + " X].");
}
try {
this.yms = Integer.parseInt(tokenTable[1]);
// //Zabezpieczenie przed zaokraglaniem na krawedziach mapy
// if (this.yms < MapConsts.Y_REF_MS)
// this.yms = MapConsts.Y_REF_MS;
// if (this.yms > MapConsts.Y_REF_MS + MapConsts.DY_REF_MS)
// this.yms = MapConsts.Y_REF_MS + MapConsts.DY_REF_MS;
} catch (NumberFormatException e) {
SiecDrogowa.logger.warn("Bledne dane w pliku z wezlami [Wezel: " + this.id + " Y].");
}
try {
this.jestMostem = Integer.parseInt(tokenTable[2]) != 0 ? true : false;
} catch (NumberFormatException e) {
SiecDrogowa.logger.warn("Bledne dane w pliku z wezlami [Wezel: " + this.id + " czyJestMost].");
}
int x = GridCoord.zamienWspXmsNaIdKwadratuX(getXms());
int y = GridCoord.zamienWspYmsNaIdKwadratuY(getYms());
this.idKw = new GridCoord(x, y);
}
else
{
SiecDrogowa.logger.warn("Bledne ilosc tokenow w linii [" + opis + "].");
}
}
public boolean isJestMostem() {
return jestMostem;
}
public void setJestMostem(boolean jestMostem) {
this.jestMostem = jestMostem;
}
public GridCoord getIdKw() {
return idKw;
}
public void setIdKw(GridCoord idKw) {
this.idKw = new GridCoord(idKw);
}
public void setXms(int xms) {
this.xms = xms;
}
public int getXms() {
return xms;
}
public void setYms(int yms) {
this.yms = yms;
}
public int getYms() {
return yms;
}
}

View File

@@ -1,485 +0,0 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
import pl.wat.ms4ds.terenfunkcje.GeoCoord;
import pl.wat.ms4ds.terenfunkcje.GridCoord;
import pl.wat.ms4ds.terenfunkcje.Kwadrat;
import pl.wat.ms4ds.terenfunkcje.Teren;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.StringTokenizer;
/**
* Odczyt danych wysokościowych z numerycznego modelu terenu (NMT_100).
* <p>
* Kod źródłowy funkcji do transformacji współrzędnych elipsoidalnych na płaskie odwzorowań kartograficznych UTM, 1992, 2000
*/
public class CoordUtils {
private static final Logger logger = LoggerFactory.getLogger(CoordUtils.class);
static String dataDir = "d:/Workspace2/dane_wysok/";
public static void main(String[] args) throws Exception {
HashMap<GridCoord, DaneWysok> daneWysokHashMap = new HashMap<GridCoord, DaneWysok>();
if (args.length > 0) {
dataDir = args[0];
}
for (int i = 1; i < args.length; i++) {
String nmt_fn = args[i];
daneWysokHashMap.clear();
readData(nmt_fn, daneWysokHashMap);
for (DaneWysok daneWysok : daneWysokHashMap.values()) {
Kwadrat kw = Teren.getKwadrat(daneWysok.idKw.x, daneWysok.idKw.y);
kw.setWysokoscSrednia((int) (daneWysok.suma / daneWysok.licz + 0.5));
}
logger.debug("Poczatek zapisu danych dla regionu " + nmt_fn + " >> " + i + "/" + (args.length - 1));
Teren.zapisBuforaMapyDoPliku();
logger.debug("Koniec zapisu danych dla regionu " + nmt_fn + " >> " + i + "/" + (args.length - 1));
Teren.reset();
}
logger.debug("Start: poprawy danych wysokosciowych");
Teren.poprawDaneWysokosciowe();
logger.debug("Koniec: poprawy danych wysokosciowych");
// GeoCoord latLon = new GeoCoord();
// PUWGCoord puwgCoord = new PUWGCoord();
// puwgCoord.easting = 542800.0;
// puwgCoord.northing = 732200.0;
// puwgCoord.proj = 1;
//
// convertPuwgToLatLon(puwgCoord, latLon);
// logger.debug("latLon= (" + latLon.lat + ", " + latLon.lon + ")");
// puwgCoord.easting = 718500.0;
// puwgCoord.northing = 663500.0;
// convertPuwgToLatLon(puwgCoord, latLon);
// logger.debug("latLon= (" + latLon.lat + ", " + latLon.lon + ")");
}
private static void readData(String fileName, HashMap<GridCoord, DaneWysok> daneWysokHashMap) throws IOException {
try {
StringBuilder sb = new StringBuilder(100);
sb.append(dataDir);
sb.append(fileName);
sb.append(".txt");
FileReader fis = new FileReader(sb.toString());
// PUWG 1992
PUWGCoord puwgCoord = new PUWGCoord();
GeoCoord latLon = new GeoCoord();
double wysokosc = 0.0;
StringTokenizer st = null;
String line = null;
BufferedReader br = new BufferedReader(fis);
if (br.ready()) {
line = br.readLine();
int m = 1;
while (line != null) {
st = new StringTokenizer(line, " ");
if (st.countTokens() != 3) {
continue;
}
String[] tokTable = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++) {
tokTable[i] = st.nextToken();
}
try {
puwgCoord.easting = Double.parseDouble(tokTable[0]);
} catch (NumberFormatException e) {
logger.warn("Bledne dane w pliku: " + fileName);
}
try {
puwgCoord.northing = Double.parseDouble(tokTable[1]);
} catch (NumberFormatException e) {
logger.warn("Bledne dane w pliku: " + fileName);
}
try {
wysokosc = Double.parseDouble(tokTable[2]);
} catch (NumberFormatException e) {
logger.warn("Bledne dane w pliku: " + fileName);
}
convertPuwgToLatLon(puwgCoord, latLon);
GridCoord idKw = new GridCoord(latLon.lon, latLon.lat);
DaneWysok daneWysok = daneWysokHashMap.get(idKw);
if (daneWysok == null) {
daneWysok = new DaneWysok(idKw, wysokosc, 1);
daneWysokHashMap.put(idKw, daneWysok);
} else {
daneWysok.suma += wysokosc;
daneWysok.licz++;
}
line = br.readLine();
if (m++ % 100000 == 0) {
System.out.print('-');
}
}
}
br.close();
System.out.println();
logger.debug("Koniec odczytu pliku: " + fileName);
} catch (IOException e) {
throw e;
}
}
private static final double fe = 500000.0;
//Deklaracja tablicy stref rownoleżnikowych
private static final char[] cArray = {'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X'};
// private static final String LITERALS = "CDEFGHJKLMNPQRSTUVWX";
//------------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
//Funkcje pomocnicze
/// /////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------------
static double calculateESquared(double a, double b) {
a *= a;
b *= b;
return (a - b) / a;
// return ((a * a) - (b * b)) / (a * a);
}
static double calculateE2Squared(double a, double b) {
a *= a;
b *= b;
return (a - b) / b;
// return ((a * a) - (b * b)) / (b * b);
}
static double denom(double es, double sphi) {
double sinSphi = Math.sin(sphi);
return Math.sqrt(1.0 - es * (sinSphi * sinSphi));
}
static double sphsr(double a, double es, double sphi) {
double dn = denom(es, sphi);
return a * (1.0 - es) / (dn * dn * dn);
}
static double sphsn(double a, double es, double sphi) {
double sinSphi = Math.sin(sphi);
return a / Math.sqrt(1.0 - es * (sinSphi * sinSphi));
}
static double sphtmd(double ap, double bp, double cp, double dp, double ep, double sphi) {
return (ap * sphi) - (bp * Math.sin(2.0 * sphi)) + (cp * Math.sin(4.0 * sphi))
- (dp * Math.sin(6.0 * sphi)) + (ep * Math.sin(8.0 * sphi));
}
//=======================================================================
// Funkcja służy do konwersji współrzednych elipsoidalnych B, L (lat/lon) WGS84 na płaskie X-northing, Y-easting odwzorowania kartograficznego UTM
//=======================================================================
// Argumenty wejściowe i wyjściowe:
// --------------------------------
// int& utmXZone: nr strefy UTM wg. podziału południkowego (zwracane numery od 1 do 60, każda strefa ma sześć stopni)
// char& utmYZone: nr strefy wg. podziału równoleżnikowego (zwracane wartości: CDEFGHJKLMNPQRSTUVWX)
// double& easting: współrzędna Y UTM, w metrach po konwersji [metry]
// double& northing: współrzędna X UTM, w metrach po konwersji [metry]
// double lat, double lon: współrzędne lat/lon do konwersji [stopnie]
//=======================================================================
/**
*
* @param lat współrzędna lat (szerokość geograficzna) do konwersji [stopnie] (układ WGS84)
* @param lon współrzędna lon (długość geograficzna) do konwersji [stopnie] (układ WGS84)
* @param utmCoord współrzędne UTM
*/
public static void convertLatLonToUtm(double lat, double lon, UTMCoord utmCoord) {
// Współczynnik zniekształcenia skali w południku osiowym
double tmd;
double nfn;
if (lon <= 0.0) {
utmCoord.xZone = 30 + (int) (lon / 6.0);
} else {
utmCoord.xZone = 31 + (int) (lon / 6.0);
}
if (lat < 84.0 && lat >= 72.0) {
// Specjalne zatrzymanie: strefa X ma 12 stopni od północy do południa, nie 8
utmCoord.yZone = cArray[19];
} else {
utmCoord.yZone = cArray[(int) ((lat + 80.0) / 8.0)];
}
if (lat >= 84.0 || lat < -80.0) {
// Błędna wartość szerokości geograficznej (zwracany znak gwiazdki)
utmCoord.yZone = '*';
}
double latRad = lat * DEG_2_RAD;
double lonRad = lon * DEG_2_RAD;
double olam = (utmCoord.xZone * 6 - 183) * DEG_2_RAD;
double dlam = lonRad - olam;
double s = Math.sin(latRad);
double c = Math.cos(latRad);
double t = s / c;
double eta = e2Squared * (c * c);
double sn = sphsn(a, eSquared, latRad);
tmd = sphtmd(ap, bp, cp, dp, ep, latRad);
double t1, t2, t3, t4, t5, t6, t7, t8, t9;
t1 = tmd * ok;
t2 = sn * s * c * ok / 2.0;
t3 = sn * s * (c * c * c) * ok * (5.0 - (t * t) + 9.0 * eta + 4.0 * (eta * eta)) / 24.0;
t4 = sn * s * (c * c * c * c * c) * ok * (61.0 - 58.0 * (t * t) + (t * t * t * t) + 270.0 * eta - 330.0 * (t * t) * eta + 445.0 * (eta * eta) + 324.0 * (eta * eta * eta) - 680.0 * (t * t) * (eta * eta) + 88.0 * (eta * eta * eta * eta) - 600.0 * (t * t) * (eta * eta * eta) - 192.0 * (t * t) * (eta * eta * eta * eta)) / 720.0;
t5 = sn * s * (c * c * c * c * c * c * c) * ok * (1385.0 - 3111.0 * (t * t) + 543.0 * (t * t * t * t) - (t * t * t * t * t * t)) / 40320.0;
if (latRad < 0.0) nfn = 10000000.0;
else nfn = 0;
utmCoord.northing = nfn + t1 + (dlam * dlam) * t2 + (dlam * dlam * dlam * dlam) * t3 + (dlam * dlam * dlam * dlam * dlam * dlam) * t4 + (dlam * dlam * dlam * dlam * dlam * dlam * dlam * dlam) * t5;
t6 = sn * c * ok;
t7 = sn * (c * c * c) * ok * (1.0 - (t * t) + eta) / 6.0;
t8 = sn * (c * c * c * c * c) * ok * (5.0 - 18.0 * (t * t) + (t * t * t * t) + 14.0 * eta - 58.0 * (t * t) * eta + 13.0 * (eta * eta) + 4.0 * (eta * eta * eta) - 64.0 * (t * t) * (eta * eta) - 24.0 * (t * t) * (eta * eta * eta)) / 120.0;
t9 = sn * (c * c * c * c * c * c * c) * ok * (61.0 - 479.0 * (t * t) + 179.0 * (t * t * t * t) - (t * t * t * t * t * t)) / 5040.0;
utmCoord.easting = fe + dlam * t6 + (dlam * dlam * dlam) * t7 + (dlam * dlam * dlam * dlam * dlam) * t8 + (dlam * dlam * dlam * dlam * dlam * dlam * dlam) * t9;
if (utmCoord.northing >= 9999999.0) utmCoord.northing = 9999999.0;
}
//=======================================================================
// Funkcja służy do konwersji współrzednych elipsoidalnych WGS84 B, L (lat/lon) na płaskie X-northing, Y-easting odwzorowania kartograficznego 1992 i 2000
//=======================================================================
// --------------------------------
// int& utmXZone: nr strefy UTM wg. podziału południkowego (zwracane numery od 1 do 60, każda strefa ma sześć stopni)
// char& utmYZone: nr strefy wg. podziału równoleżnikowego (zwracane wartości: CDEFGHJKLMNPQRSTUVWX)
// double& easting: współrzędna Y UTM, w metrach po konwersji [metry]
// double& northing: współrzędna X UTM, w metrach po konwersji [metry]
// double lat, double lon: współrzędne lat/lon do konwersji [stopnie]
// int proj: odwzorowanie kartograficzne (proj = 1 odpowiada odwzorowaniu 1992, natomiast każda inna odwzorowaniu 2000)
//=======================================================================
public static void convertLatLonToPUWG(PUWGCoord puwgCoord, double lat, double lon) {
// Współczynnik zniekształcenia skli mapy w południku osiowym dla odwzorowania kartograficznego 2000
//Współczynnik zniekształcenia skli mapy w południku osiowym dla odwzorowania kartograficznego 1992
double ok_new = (puwgCoord.proj != 1) ? 0.999923 : 0.9993;
double olam = 0.0;
double tmd;
double nfn;
double strf = 0.0;
if (lon < 13.5 || lon > 25.5) {
//Błędna wartość długości geograficznej (zwracana wartość 99999999999999)
puwgCoord.easting = 999999999999999.0;
puwgCoord.northing = 999999999999999.0;
return;
} else {
if (puwgCoord.proj == 1) {
olam = 19.0 * DEG_2_RAD;
strf = 0.0;
nfn = -5300000.0;
} else {
nfn = 0;
if (lon >= 13.5 && lon < 16.5) {
olam = 15.0 * DEG_2_RAD;
strf = 5000000.0;
}
if (lon >= 16.5 && lon < 19.5) {
olam = 18.0 * DEG_2_RAD;
strf = 6000000.0;
}
if (lon >= 19.5 && lon < 22.5) {
olam = 21.0 * DEG_2_RAD;
strf = 7000000.0;
}
if (lon >= 22.5 && lon < 25.5) {
olam = 24.0 * DEG_2_RAD;
strf = 8000000.0;
}
}
}
double latRad = lat * DEG_2_RAD;
double lonRad = lon * DEG_2_RAD;
double dlam = lonRad - olam;
double s = Math.sin(latRad);
double c = Math.cos(latRad);
double t = s / c;
double eta = e2Squared * (c * c);
double sn = sphsn(a, eSquared, latRad);
tmd = sphtmd(ap, bp, cp, dp, ep, latRad);
double t1, t2, t3, t4, t5, t6, t7, t8, t9;
t1 = tmd * ok_new;
t2 = sn * s * c * ok_new / 2.0;
t3 = sn * s * (c * c * c) * ok_new * (5.0 - (t * t) + 9.0 * eta + 4.0 * (eta * eta)) / 24.0;
t4 = sn * s * (c * c * c * c * c) * ok_new * (61.0 - 58.0 * (t * t) + (t * t * t * t) + 270.0 * eta - 330.0 * (t * t) * eta + 445.0 * (eta * eta) + 324.0 * (eta * eta * eta) - 680.0 * (t * t) * (eta * eta) + 88.0 * (eta * eta * eta * eta) - 600.0 * (t * t) * (eta * eta * eta) - 192.0 * (t * t) * (eta * eta * eta * eta)) / 720.0;
t5 = sn * s * (c * c * c * c * c * c * c) * ok_new * (1385.0 - 3111.0 * (t * t) + 543.0 * (t * t * t * t) - (t * t * t * t * t * t)) / 40320.0;
puwgCoord.northing = nfn + t1 + (dlam * dlam) * t2 + (dlam * dlam * dlam * dlam) * t3 + (dlam * dlam * dlam * dlam * dlam * dlam) * t4 + (dlam * dlam * dlam * dlam * dlam * dlam * dlam * dlam) * t5;
t6 = sn * c * ok_new;
t7 = sn * (c * c * c) * ok_new * (1.0 - (t * t) + eta) / 6.0;
t8 = sn * (c * c * c * c * c) * ok_new * (5.0 - 18.0 * (t * t) + (t * t * t * t) + 14.0 * eta - 58.0 * (t * t) * eta + 13.0 * (eta * eta) + 4.0 * (eta * eta * eta) - 64.0 * (t * t) * (eta * eta) - 24.0 * (t * t) * (eta * eta * eta)) / 120.0;
t9 = sn * (c * c * c * c * c * c * c) * ok_new * (61.0 - 479.0 * (t * t) + 179.0 * (t * t * t * t) - (t * t * t * t * t * t)) / 5040.0;
puwgCoord.easting = fe + strf + dlam * t6 + (dlam * dlam * dlam) * t7 + (dlam * dlam * dlam * dlam * dlam) * t8 + (dlam * dlam * dlam * dlam * dlam * dlam * dlam) * t9;// + 0.5;
}
//=======================================================================
// Funkcja do konwersji współrzędnych płaskich X/Y UTM na elipsoidalne lat/lon (dla dowolnej elipsoidy)
//=======================================================================
// Wymagania:
// -------------------------------------
// utmXZone musi być wartością w garanicach od 1 do 60
// utmYZone musi być jedną z liter: CDEFGHJKLMNPQRSTUVWX
// Argumenty wejściowe i wyjściowe:
// ------------------------------------
// double a: długość dużej półosi, w metrach (np. dla elipsoidy WGS 84, 6378137.0)
// double f: spłaszczenie elipsoidalne (np. dla elipsoidy WGS 84, 1 / 298.257223563)
// int utmXZone: nr strefy UTM wg. podziału południkowego (zwracane numery od 1 do 60, każda strefa ma sześć stopni)
// char utmYZone: nr strefy wg. podziału równoleżnikowego (zwracane wartości: CDEFGHJKLMNPQRSTUVWX)
// double easting, double northing: współrzędna X, Y UTM do konwersji [metry]
// double& lat, double& lon: współrzędne elipsoidalne lat/lon po konwersji [stopnie]
//=======================================================================
public static void convertUtmToLatLon(UTMCoord utmCoord, GeoCoord geoCoord) {
double nfn;
utmCoord.yZone = Character.toUpperCase(utmCoord.yZone);
if (utmCoord.yZone <= 'M' && utmCoord.yZone >= 'C') {
nfn = 10000000.0;
} else {
nfn = 0;
}
double tmd = (utmCoord.northing - nfn) / ok;
double sr = sphsr(a, eSquared, 0.0);
double ftphi = tmd / sr;
double t10, t11, t12, t13, t14, t15, t16, t17;
for (int i = 0; i < 5; i++) {
t10 = sphtmd(ap, bp, cp, dp, ep, ftphi);
sr = sphsr(a, eSquared, ftphi);
ftphi = ftphi + (tmd - t10) / sr;
}
sr = sphsr(a, eSquared, ftphi);
double sn = sphsn(a, eSquared, ftphi);
double s = Math.sin(ftphi);
double c = Math.cos(ftphi);
double t = s / c;
double eta = e2Squared * (c * c);
double de = utmCoord.easting - fe;
t10 = t / (2.0 * sr * sn * (ok * ok));
t11 = t * (5.0 + 3.0 * (t * t) + eta - 4.0 * (eta * eta) - 9.0 * (t * t) * eta) / (24.0 * sr * (sn * sn * sn) * (ok * ok * ok * ok));
t12 = t * (61.0 + 90.0 * (t * t) + 46.0 * eta + 45.0 * (t * t * t * t) - 252.0 * (t * t) * eta - 3.0 * (eta * eta) + 100.0 * (eta * eta * eta) - 66.0 * (t * t) * (eta * eta) - 90.0 * (t * t * t * t) * eta + 88.0 * (eta * eta * eta * eta) + 225.0 * (t * t * t * t) * (eta * eta) + 84.0 * (t * t) * (eta * eta * eta) - 192.0 * (t * t) * (eta * eta * eta * eta)) / (720.0 * sr * (sn * sn * sn * sn * sn) * (ok * ok * ok * ok * ok * ok));
t13 = t * (1385.0 + 3633 * (t * t) + 4095.0 * (t * t * t * t) + 1575.0 * (t * t * t * t * t * t)) / (40320 * sr * (sn * sn * sn * sn * sn * sn * sn) * (ok * ok * ok * ok * ok * ok * ok * ok));
geoCoord.lat = ftphi - (de * de) * t10 + (de * de * de * de) * t11 - (de * de * de * de * de * de) * t12 + (de * de * de * de * de * de * de * de) * t13;
t14 = 1.0 / (sn * c * ok);
t15 = (1.0 + 2.0 * (t * t) + eta) / (6.0 * (sn * sn * sn) * c * (ok * ok * ok));
t16 = 1.0 * (5.0 + 6.0 * eta + 28.0 * (t * t) - 3.0 * (eta * eta) + 8.0 * (t * t) * eta + 24.0 * (t * t * t * t) - 4.0 * (eta * eta * eta) + 4.0 * (t * t) * (eta * eta) + 24.0 * (t * t) * (eta * eta * eta)) / (120.0 * (sn * sn * sn * sn * sn) * c * (ok * ok * ok * ok * ok));
t17 = 1.0 * (61.0 + 662.0 * (t * t) + 1320.0 * (t * t * t * t) + 720.0 * (t * t * t * t * t * t)) / (5040.0 * (sn * sn * sn * sn * sn * sn * sn) * c * (ok * ok * ok * ok * ok * ok * ok));
double dlam = de * t14 - (de * de * de) * t15 + (de * de * de * de * de) * t16 - (de * de * de * de * de * de * de) * t17;
double olam = (utmCoord.xZone * 6 - 183.0) * DEG_2_RAD;
geoCoord.lon = olam + dlam;
geoCoord.lon *= RAD_2_DEG;
geoCoord.lat *= RAD_2_DEG;
}
// Współczynnik zniekształcenia skali mapy w południku osiowym dla odwzorowania kartograficznego UTM
private static final double ok = 0.9996;
private static final double DEG_2_RAD = Math.PI / 180.0;
private static final double RAD_2_DEG = 180.0 / Math.PI;
/**
* double a: dlługość dużej półsi, w metrach dla elipsoidy WGS-84, 6378137.0
*/
private static final double a = 6378137.0;
private static final double recf = 298.257223563;
/**
* double f: spłaszczenie elipsoidalne dla elipsoidy WGS-84, 1 / 298.257223563
*/
private static final double f = 1.0 / recf;
// private static final double b = a * (recf - 1) / recf;
private static final double b = a * (1.0 - f);
private static final double eSquared = calculateESquared(a, b);
private static final double e2Squared = calculateE2Squared(a, b);
private static final double tn = (a - b) / (a + b);
private static final double ap = a * (1.0 - tn + 5.0 * ((tn * tn) - (tn * tn * tn)) / 4.0 + 81.0 * ((tn * tn * tn * tn) - (tn * tn * tn * tn * tn)) / 64.0);
private static final double bp = 3.0 * a * (tn - (tn * tn) + 7.0 * ((tn * tn * tn) - (tn * tn * tn * tn)) / 8.0 + 55.0 * (tn * tn * tn * tn * tn) / 64.0) / 2.0;
private static final double cp = 15.0 * a * ((tn * tn) - (tn * tn * tn) + 3.0 * ((tn * tn * tn * tn) - (tn * tn * tn * tn * tn)) / 4.0) / 16.0;
private static final double dp = 35.0 * a * ((tn * tn * tn) - (tn * tn * tn * tn) + 11.0 * (tn * tn * tn * tn * tn) / 16.0) / 48.0;
private static final double ep = 315.0 * a * ((tn * tn * tn * tn) - (tn * tn * tn * tn * tn)) / 512.0;
/**
* Funkcja do konwersji współrzędnych płaskich X/Y odwzorowania kartograficznego 1992 i 2000 na elipsoidalne lat/lon elipsoide WGS84.
* <p>
* PUWGCoord.proj: odwzorowanie kartograficzne (proj = 1 odpowiada odwzorowaniu 1992, natomiast każda inna odwzorowaniu 2000)
*
* @param puwgCoord współrzędne odwzorowania kartograficznego PUWG-1992 lub PUWG-2000 do konwersji [metry]
* @param geoCoord współrzędne geograficzne odwzorowania WGS-84 po konwersji [stopnie]
*/
public static void convertPuwgToLatLon(PUWGCoord puwgCoord, GeoCoord geoCoord) {
double ok = (puwgCoord.proj != 1) ? 0.999923 : 0.9993;
double nfn;
double tmd;
double ftphi;
double eta;
double dlam;
double olam = 0.0;
double strf = 0.0;
if (puwgCoord.proj == 1) {
olam = 19.0 * DEG_2_RAD;
strf = 0.0;
nfn = -5300000.0;
} else {
nfn = 0;
if (puwgCoord.easting < 6000000.0 && puwgCoord.easting > 5000000.0) {
strf = 5000000.0;
olam = 15.0 * DEG_2_RAD;
}
if (puwgCoord.easting < 7000000.0 && puwgCoord.easting > 6000000.0) {
strf = 6000000.0;
olam = 18.0 * DEG_2_RAD;
}
if (puwgCoord.easting < 8000000.0 && puwgCoord.easting > 7000000.0) {
strf = 7000000.0;
olam = 21.0 * DEG_2_RAD;
}
if (puwgCoord.easting < 9000000.0 && puwgCoord.easting > 8000000.0) {
strf = 8000000.0;
olam = 24.0 * DEG_2_RAD;
}
}
tmd = (puwgCoord.northing - nfn) / ok;
double sr = sphsr(a, eSquared, 0.0);
ftphi = tmd / sr;
double t10, t11, t12, t13, t14, t15, t16, t17;
for (int i = 0; i < 5; i++) {
t10 = sphtmd(ap, bp, cp, dp, ep, ftphi);
sr = sphsr(a, eSquared, ftphi);
ftphi = ftphi + (tmd - t10) / sr;
}
sr = sphsr(a, eSquared, ftphi);
double sn = sphsn(a, eSquared, ftphi);
double sn_pow_2 = sn * sn;
double sn_pow_3 = sn_pow_2 * sn;
double sn_pow_4 = sn_pow_3 * sn;
double sn_pow_5 = sn_pow_4 * sn;
double sn_pow_7 = sn_pow_5 * sn_pow_2;
double s = Math.sin(ftphi);
double c = Math.cos(ftphi);
double t = s / c;
double t_pow_2 = t * t;
double t_pow_4 = t_pow_2 * t_pow_2;
double t_pow_6 = t_pow_4 * t_pow_2;
eta = e2Squared * (c * c);
double eta_pow_2 = eta * eta;
double eta_pow_3 = eta_pow_2 * eta;
double eta_pow_4 = eta_pow_2 * eta_pow_2;
double de = puwgCoord.easting - fe - strf;
double de_pow_2 = de * de;
double de_pow_3 = de_pow_2 * de;
double de_pow_4 = de_pow_3 * de;
t10 = t / (2.0 * sr * sn * (ok * ok));
t11 = t * (5.0 + 3.0 * t_pow_2 + eta - 4.0 * eta_pow_2 - 9.0 * t_pow_2 * eta) / (24.0 * sr * sn_pow_3 * (ok * ok * ok * ok));
t12 = t * (61.0 + 90.0 * t_pow_2 + 46.0 * eta + 45.0 * t_pow_4 - 252.0 * t_pow_2 * eta - 3.0 * eta_pow_2 + 100.0 * eta_pow_3 - 66.0 * t_pow_2 * eta_pow_2 - 90.0 * t_pow_4 * eta + 88.0 * eta_pow_4 + 225.0 * t_pow_4 * eta_pow_2 + 84.0 * t_pow_2 * eta_pow_3 - 192.0 * t_pow_2 * eta_pow_4) / (720.0 * sr * sn_pow_5 * (ok * ok * ok * ok * ok * ok));
t13 = t * (1385.0 + 3633 * t_pow_2 + 4095.0 * t_pow_4 + 1575.0 * t_pow_6) / (40320 * sr * sn_pow_7 * (ok * ok * ok * ok * ok * ok * ok * ok));
geoCoord.lat = ftphi - de_pow_2 * t10 + de_pow_4 * t11 - de_pow_3 * de_pow_3 * t12 + de_pow_4 * de_pow_3 * t13;
t14 = 1.0 / (sn * c * ok);
t15 = (1.0 + 2.0 * t_pow_2 + eta) / (6.0 * sn_pow_3 * c * (ok * ok * ok));
t16 = 1.0 * (5.0 + 6.0 * eta + 28.0 * t_pow_2 - 3.0 * eta_pow_2 + 8.0 * t_pow_2 * eta + 24.0 * t_pow_4 - 4.0 * eta_pow_3 + 4.0 * t_pow_2 * eta_pow_2 + 24.0 * t_pow_2 * eta_pow_3) / (120.0 * sn_pow_5 * c * (ok * ok * ok * ok * ok));
t17 = 1.0 * (61.0 + 662.0 * t_pow_2 + 1320.0 * t_pow_4 + 720.0 * t_pow_6) / (5040.0 * sn_pow_7 * c * (ok * ok * ok * ok * ok * ok * ok));
dlam = de * t14 - de_pow_3 * t15 + de_pow_3 * de_pow_2 * t16 - de_pow_3 * de_pow_4 * t17;
geoCoord.lon = olam + dlam;
geoCoord.lon *= RAD_2_DEG;
geoCoord.lat *= RAD_2_DEG;
}
}

View File

@@ -1,21 +0,0 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
import pl.wat.ms4ds.terenfunkcje.GridCoord;
/**
*
*/
public class DaneWysok {
GridCoord idKw;
double suma;
int licz;
public DaneWysok(GridCoord idKw, double suma, int licz) {
this.idKw = idKw;
this.suma = suma;
this.licz = licz;
}
}

View File

@@ -1,35 +0,0 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
/**
* Współrzędne punktu odwzorowania kartograficznego PUWG 1992 lub 2000.
* <p>
* Wartośći współrzędnych [metry].
*
*/
public class PUWGCoord {
/**
* Współrzędna X (oś odcietych) odwzorowania kartograficznego [metry].
*/
public double easting;
/**
* Współrzędna Y (oś rzędnych) odwzorowania kartograficznego [metry].
*/
public double northing;
/**
* proj = 1 odpowiada odwzorowaniu 1992, natomiast każda inna odwzorowaniu 2000
*/
public int proj;
public PUWGCoord() {
this.easting = 0;
this.northing = 0;
// PUWG 1992
this.proj = 1;
}
public PUWGCoord(double easting, double northing, int proj) {
this.easting = easting;
this.northing = northing;
this.proj = proj;
}
}

View File

@@ -1,34 +0,0 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
/**
* Współrzędna w układzie UTM. <p>
* Przykład: 17T 630084 4833438,
* gdzie: xZone = 17, yZone = T, easting = 630084, northing = 4833438
* <p>
* xZone - nr strefy UTM wg. podziału południkowego (zwracane numery od 1 do 60, każda strefa ma sześć stopni);
* <p>
* yZone - nr strefy wg. podziału równoleżnikowego (zwracane wartości: CDEFGHJKLMNPQRSTUVWX).
* <p>
* easting - odległość w kierunku wschodnim od początku układu współrzędnych w danej strefie UTM [metr].
* <p>
* northing - odległość w kierunku północnym od początku układu współrzędnych w danej strefie UTM [metr].
*/
public class UTMCoord {
/**
* Nr strefy UTM wg. podziału południkowego (zwracane numery od 1 do 60, każda strefa ma sześć stopni).
*/
public int xZone;
/**
* Nr strefy wg. podziału równoleżnikowego (zwracane wartości: CDEFGHJKLMNPQRSTUVWX).
*/
public char yZone;
/**
* Odległość w kierunku wschodnim od początku układu współrzędnych w danej strefie UTM [metr].
*/
public double easting;
/**
* Odległość w kierunku północnym od początku układu współrzędnych w danej strefie UTM [metr].
*/
public double northing;
}

View File

@@ -1,58 +0,0 @@
package pl.wat.ms4ds.terenfunkcje.nmt;
import java.io.*;
public class NMTReader {
static void main(String[] args) {
// File dir = new File(System.getProperty("user.home") + "/nmt/gugik_SkorowidzNMT2018.gml");
InputStream is = null;
try {
File file = new File("C:/Workspace/nmt/N-34-139-A-b-2-4.asc");
is = new FileInputStream(file);
readFromInputStream(is);
//...
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private static void readFromInputStream(InputStream inputStream) throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
String line= br.readLine();
String[] split = line.split(" ");
int ncols = Integer.parseInt(split[1]);
line= br.readLine();
split = line.split(" ");
int nrows = Integer.parseInt(split[1]);
line= br.readLine();
split = line.split(" ");
double xll = Double.parseDouble(split[1]);
line= br.readLine();
split = line.split(" ");
double yll = Double.parseDouble(split[1]);
line= br.readLine();
split = line.split(" ");
double cellsize = Double.parseDouble(split[1]);
line= br.readLine();
split = line.split(" ");
double nodata = Double.parseDouble(split[1]);
while ((line = br.readLine()) != null) {
split = line.split(" ");
}
}
}
}

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje;
package pl.wat.ms4ds.terrain;
import pl.wat.ms4ds.common.EGeoDirection;
import pl.wat.ms4ds.common.ERodzajDzialania;
@@ -36,10 +36,6 @@ public final class AStar {
return node;
}
static Node dajAStarNode(GridCoord gridCoord) {
return dajAStarNode(gridCoord.x, gridCoord.y);
}
ArrayList<Node> dajNiezamknietychSasiadow() {
ArrayList<Node> wynik = new ArrayList<>();
Node sasiad;
@@ -85,7 +81,7 @@ public final class AStar {
zKierunku = EGeoDirection.UNDEFINED;
}
Node(GridCoord id) {
Node(Coord.Grid id) {
this(id.x, id.y);
}
@@ -133,16 +129,16 @@ public final class AStar {
* @param rodzajDzialania rodzaj działania, w ramach którego określana jest droga
* @return uporządkowana kolekcja współrzędnych kolejnych kwadratów drogi zawierająca kwadrat startowy i docelowy lub kolekcja pusta, gdy nie istnieje droga
*/
public static ArrayList<GridCoord> wyznaczDroge(GridCoord[] punktyProfilujace, EGeoDirection staryKierunek,
ERodzajPodwozia podwozie, ERodzajDzialania rodzajDzialania) {
public static ArrayList<Coord.Grid> wyznaczDroge(Coord.Grid[] punktyProfilujace, EGeoDirection staryKierunek,
ERodzajPodwozia podwozie, ERodzajDzialania rodzajDzialania) {
if (null == punktyProfilujace || 0 == punktyProfilujace.length) {
return null;
}
Node.reset();
ArrayList<GridCoord> wynik = new ArrayList<>();
GridCoord start;
GridCoord stop = punktyProfilujace[0];
ArrayList<GridCoord> odcinek;
ArrayList<Coord.Grid> wynik = new ArrayList<>();
Coord.Grid start;
Coord.Grid stop = punktyProfilujace[0];
ArrayList<Coord.Grid> odcinek;
for (int i = 1; i < punktyProfilujace.length; i++) {
start = stop;
stop = punktyProfilujace[i];
@@ -178,8 +174,8 @@ public final class AStar {
* @param zawieraStartowy parametr wskazujący, czy wyznaczona droga ma zawierać kwadrat startowy
* @return uporządkowana kolekcja współrzędnych kolejnych kwadratów drogi zawierająca kwadrat startowy (jeśli zawieraStartowy==true) i docelowy lub kolekcja pusta, gdy nie istnieje droga
*/
public static ArrayList<GridCoord> wyznaczDroge(GridCoord start, GridCoord stop, EGeoDirection staryKierunek,
boolean zawieraStartowy, ERodzajPodwozia podwozie, ERodzajDzialania rodzajDzialania) {
public static ArrayList<Coord.Grid> wyznaczDroge(Coord.Grid start, Coord.Grid stop, EGeoDirection staryKierunek,
boolean zawieraStartowy, ERodzajPodwozia podwozie, ERodzajDzialania rodzajDzialania) {
PriorityQueue<Node> listaOtwarta = new PriorityQueue<>(100, (o1, o2) -> Double.compare(o1.kosztZHeurystyka, o2.kosztZHeurystyka));
boolean naPrzelaj = false;
@@ -204,13 +200,13 @@ public final class AStar {
aktualny = Node.dajAStarNode(start.x, start.y);
aktualny.zKierunku = staryKierunek;
listaOtwarta.add(aktualny);
ArrayList<GridCoord> wynik = new ArrayList<GridCoord>();
ArrayList<Coord.Grid> wynik = new ArrayList<Coord.Grid>();
int licznik_zabezpieczajacy = 200000;
while (listaOtwarta.size() > 0 && licznik_zabezpieczajacy-- > 0) {
aktualny = listaOtwarta.remove();
if (aktualny.koncowy) {
while (null != aktualny) {
wynik.add(new GridCoord(aktualny.x, aktualny.y));
wynik.add(new Coord.Grid(aktualny.x, aktualny.y));
aktualny = aktualny.poprzednik;
}
if (!zawieraStartowy) {
@@ -222,16 +218,17 @@ public final class AStar {
}
sasiedzi = aktualny.dajNiezamknietychSasiadow();
for (Node sasiad : sasiedzi) {
double stopienPrzejezdnosci = Teren.getStopienPrzejezdnosci(aktualny.x, aktualny.y, sasiad.x, sasiad.y,
aktualny.zKierunku, podwozie);
// double stopienPrzejezdnosci = Teren.getStopienPrzejezdnosci(aktualny.x, aktualny.y, sasiad.x, sasiad.y,
// aktualny.zKierunku, podwozie);
double stopienPrzejezdnosci = 1;
if (stopienPrzejezdnosci < 0.005f) {
continue;
}
if (naPrzelaj) {
stopienPrzejezdnosci = Math.max(Teren.minStopienPrzejezdNaPrzelaj, stopienPrzejezdnosci);
}
double nowyKosztOdStartu = (float) aktualny.kosztOdStartu + GridCoord.odleglosc(aktualny.x, aktualny.y, sasiad.x, sasiad.y) / stopienPrzejezdnosci;
double nowyKosztZHeurystyka = nowyKosztOdStartu + GridCoord.odleglosc(sasiad.x, sasiad.y, stop.x, stop.y);
double nowyKosztOdStartu = aktualny.kosztOdStartu + Coord.Grid.distance(aktualny.x, aktualny.y, sasiad.x, sasiad.y) / stopienPrzejezdnosci;
double nowyKosztZHeurystyka = nowyKosztOdStartu + Coord.Grid.distance(sasiad.x, sasiad.y, stop.x, stop.y);
if (sasiad.kosztZHeurystyka > nowyKosztZHeurystyka) {
//UPDATE kosztow i zmiany w kolejce
sasiad.kosztOdStartu = nowyKosztOdStartu;
@@ -258,12 +255,12 @@ public final class AStar {
* @param zawieraStartowy parametr wskazujący, czy wyznaczona droga ma zawierać kwadrat startowy
* @return uporządkowana kolekcja współrzędnych kolejnych kwadratów drogi zawierająca kwadrat startowy (jeśli zawieraStartowy==true) i docelowy lub kolekcja pusta, gdy nie istnieje droga
*/
public static ArrayList<GridCoord> wyznaczDrogeNew(GridCoord start, GridCoord stop, EGeoDirection staryKierunek,
boolean zawieraStartowy, ERodzajPodwozia podwozie,
ERodzajDzialania rodzajDzialania,
double szerokoscPokonywRowow,
double glebokoscBrodzenia,
double predkoscPlywania) {
public static ArrayList<Coord.Grid> wyznaczDrogeNew(Coord.Grid start, Coord.Grid stop, EGeoDirection staryKierunek,
boolean zawieraStartowy, ERodzajPodwozia podwozie,
ERodzajDzialania rodzajDzialania,
double szerokoscPokonywRowow,
double glebokoscBrodzenia,
double predkoscPlywania) {
PriorityQueue<Node> listaOtwarta = new PriorityQueue<>(100, new Comparator<Node>() {
public int compare(Node o1, Node o2) {
return Double.compare(o1.kosztZHeurystyka, o2.kosztZHeurystyka);
@@ -292,13 +289,13 @@ public final class AStar {
aktualny = Node.dajAStarNode(start.x, start.y);
aktualny.zKierunku = staryKierunek;
listaOtwarta.add(aktualny);
ArrayList<GridCoord> wynik = new ArrayList<GridCoord>();
ArrayList<Coord.Grid> wynik = new ArrayList<Coord.Grid>();
int licznik_zabezpieczajacy = 200000;
while (listaOtwarta.size() > 0 && licznik_zabezpieczajacy-- > 0) {
aktualny = listaOtwarta.remove();
if (aktualny.koncowy) {
while (null != aktualny) {
wynik.add(new GridCoord(aktualny.x, aktualny.y));
wynik.add(new Coord.Grid(aktualny.x, aktualny.y));
aktualny = aktualny.poprzednik;
}
if (!zawieraStartowy) {
@@ -310,16 +307,17 @@ public final class AStar {
}
sasiedzi = aktualny.dajNiezamknietychSasiadow();
for (Node sasiad : sasiedzi) {
double stopienPrzejezdnosci = Teren.getStopienPrzejezdnosciNew(aktualny.x, aktualny.y, sasiad.x, sasiad.y,
aktualny.zKierunku, podwozie, szerokoscPokonywRowow, glebokoscBrodzenia, predkoscPlywania);
// double stopienPrzejezdnosci = Teren.getStopienPrzejezdnosciNew(aktualny.x, aktualny.y, sasiad.x, sasiad.y,
// aktualny.zKierunku, podwozie, szerokoscPokonywRowow, glebokoscBrodzenia, predkoscPlywania);
double stopienPrzejezdnosci = 1;
if (stopienPrzejezdnosci < 0.005f) {
continue;
}
if (naPrzelaj) {
stopienPrzejezdnosci = Math.max(Teren.minStopienPrzejezdNaPrzelaj, stopienPrzejezdnosci);
}
double nowyKosztOdStartu = (float) aktualny.kosztOdStartu + GridCoord.odleglosc(aktualny.x, aktualny.y, sasiad.x, sasiad.y) / stopienPrzejezdnosci;
double nowyKosztZHeurystyka = nowyKosztOdStartu + GridCoord.odleglosc(sasiad.x, sasiad.y, stop.x, stop.y);
double nowyKosztOdStartu = aktualny.kosztOdStartu + Coord.Grid.distance(aktualny.x, aktualny.y, sasiad.x, sasiad.y) / stopienPrzejezdnosci;
double nowyKosztZHeurystyka = nowyKosztOdStartu + Coord.Grid.distance(sasiad.x, sasiad.y, stop.x, stop.y);
if (sasiad.kosztZHeurystyka > nowyKosztZHeurystyka) {
//UPDATE kosztow i zmiany w kolejce
sasiad.kosztOdStartu = nowyKosztOdStartu;

View File

@@ -0,0 +1,18 @@
package pl.wat.ms4ds.terrain;
import javafx.scene.image.ImageView;
abstract class BigSquare {
abstract Square getKwadrat(int x, int y);
protected transient String fileName;
public int idX = 0;
public int idY = 0;
public transient int liczbaZmian = 0;
// TODO zamienic na 100
static final int LICZBA_ZMIAN_DO_ZAPISU = 100000;
public ImageView imageView = null;
}

View File

@@ -1,5 +1,4 @@
package pl.wat.ms4ds.terenfunkcje;
package pl.wat.ms4ds.terrain;
/**
* Klasa algorytmiczna do wyznaczania kwadratów odcinka (dyskretyzacja odcinka kwadratami/pikselami).
@@ -25,7 +24,7 @@ public class Bresenham {
* @param y2 współrzędna y końca
* @return tablicę kolejnych kwadratów tworzących odcinek o zadanych końcach
*/
public static GridCoord[] generateSegment(int x1, int y1, int x2, int y2) {
public static Coord.Grid[] generateSegment(int x1, int y1, int x2, int y2) {
int x = x1;
int y = y1;
int dx = x2 - x1;
@@ -44,9 +43,9 @@ public class Bresenham {
if (dx >= dy) {
// poruszamy się po x
p = ddy - dx;
GridCoord[] res = new GridCoord[dx + 1];
Coord.Grid[] res = new Coord.Grid[dx + 1];
for (int i = 0; i <= dx; i++) {
res[i] = new GridCoord(x, y);
res[i] = new Coord.Grid(x, y);
if (p > 0) {
y += sy;
p -= ddx;
@@ -58,9 +57,9 @@ public class Bresenham {
} else {
// poruszamy sie po y
p = ddx - dy;
GridCoord[] res = new GridCoord[dy + 1];
Coord.Grid[] res = new Coord.Grid[dy + 1];
for (int i = 0; i <= dy; i++) {
res[i] = new GridCoord(x, y);
res[i] = new Coord.Grid(x, y);
if (p > 0) {
x += sx;
p -= ddy;
@@ -72,8 +71,7 @@ public class Bresenham {
}
}
static void print(GridCoord[] segment) {
static void print(Coord.Grid[] segment) {
StringBuilder sb = new StringBuilder(300);
sb.append('[');
int last = segment.length - 1;

View File

@@ -0,0 +1,526 @@
package pl.wat.ms4ds.terrain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Coord {
private static final Logger logger = LoggerFactory.getLogger(Coord.class);
public static class Geo {
public double lat;
public double lon;
public Geo() {
}
public Geo(double lat, double lon) {
this.lat = lat;
this.lon = lon;
}
public Geo(GeoCoord other) {
lat = other.lat;
lon = other.lon;
}
@Override
public String toString() {
return "Geo{" +
"lat=" + lat +
", lon=" + lon +
'}';
}
}
/**
* Współrzędne punktu odwzorowania kartograficznego PUWG 1992.
* <p>
* Wartości współrzędnych [metry].
*
*/
public static class Puwg {
/**
* Współrzędna X (oś odcietych) odwzorowania kartograficznego [metry].
*/
public double easting;
/**
* Współrzędna Y (oś rzędnych) odwzorowania kartograficznego [metry].
*/
public double northing;
public Puwg() {
this.easting = 0;
this.northing = 0;
}
public Puwg(double easting, double northing) {
this.easting = easting;
this.northing = northing;
}
@Override
public String toString() {
return "Puwg{" +
"easting=" + easting +
", northing=" + northing +
'}';
}
}
public static class Grid {
/**
* Współrzędna pozioma (oś OX) w siatce kwadratów. Indeks kolumny.
*/
public int x;
/**
* Współrzędna pionowa (oś OY) w siatce kwadratów. Indeks wiersza.
*/
public int y;
/**
* Konstruktor klasy na bazie współrzędnych geograficznych.
*
* @param lon długość geograficzna
* @param lat szerokość geograficzna
*/
public Grid(double lon, double lat) {
double xms_f = (lon + 180) * MapConsts.DEG_MS;
long xms = (long) xms_f;
x = zamienWspXmsNaIdKwadratuX(xms);
double yms_f = (lat + 90) * MapConsts.DEG_MS;
long yms = (long) yms_f;
y = zamienWspYmsNaIdKwadratuY(yms);
}
@Override
public String toString() {
return "Grid{" +
"x=" + x +
", y=" + y +
'}';
}
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;
public static double distance(Grid a, Grid b) {
int dx = a.x - b.x;
int dy = a.y - b.y;
return Math.sqrt(dx * dx + dy * dy) * MapConsts.SS_SIZE;
}
public static double distance(int x1, int y1, int x2, int y2) {
int dx = x2 - x1;
int dy = y2 - y1;
return Math.sqrt(dx * dx + dy * dy) * MapConsts.SS_SIZE;
}
private static final float DL_MK2 = MapConsts.SS_SIZE * 0.0009765625f;
/**
* Funkcja zwraca aproksymowaną odległość między środkami małych kwadratów [m].
*
* @param x1 Wsp X id malego kwadratu pocz.
* @param y1 Wsp Y id malego kwadratu pocz.
* @param x2 Wsp X id malego kwadratu konc.
* @param y2 Wsp Y id malego kwadratu konc.
* @return Odległość miedzy srodkami malych kwadratow [m].
*/
public static float distanceApprox(int x1, int y1, int x2, int y2) {
int dx = x2 - x1;
int dy = y2 - y1;
int min, max, approx;
if (dx < 0) dx = -dx;
if (dy < 0) dy = -dy;
if (dx < dy) {
min = dx;
max = dy;
} else {
min = dy;
max = dx;
}
approx = (max * 1007) + (min * 441);
if (max < (min << 4)) {
approx -= (max * 40);
}
float odl = approx * DL_MK2;
return odl;
}
public Grid() {
x = -1;
y = -1;
}
public Grid(int x, int y) {
this.x = x;
this.y = y;
}
public Grid(Grid orig) {
this.x = orig.x;
this.y = orig.y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void set(Grid orig) {
x = orig.x;
y = orig.y;
}
public void set(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public final boolean equals(Object o) {
if (!(o instanceof Grid grid)) return false;
return x == grid.x && y == grid.y;
}
@Override
public final int hashCode() {
int result = x;
result = 31 * result + y;
return result;
}
}
/**
* Zamienia współrzęną GridCoord.x na długość geograficzną środka małego kwadratu
*
* @param idX współrzęna x GridCoord
* @return długość geograficzna
*/
public static float zamienIdKwadratuXNaDlugoscGeo(int idX) {
long xms = zamienIdKwadratuXNaWspXms(idX);
double lon = (double) xms / (double) MapConsts.DEG_MS - 180;
return (float) lon;
}
/**
* Zamienia współrzęną GridCoord.y na szerokość geograficzną środka małego kwadratu
*
* @param idY współrzęna y GridCoord
* @return szerokość geograficzna
*/
public static float zamienIdKwadratuYNaSzerokoscGeo(int idY) {
long yms = zamienIdKwadratuYNaWspYms(idY);
double lat = (double) yms / (double) MapConsts.DEG_MS - 90;
return (float) lat;
}
/**
* Funkcja zamienia wsp. X GridCoord na wsp. geo xms w milisekundach.
* Zwracana wspolrzedna lezy w srodku kwadratu.
*/
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);
xms %= MapConsts.ANGLE_360_MS;
return xms;
}
/**
* Funkcja zamienia wsp. Y GridCoord na wsp. geo yms w milisekundach.
* Zwracana wspolrzedna lezy w srodku kwadratu.
*/
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);
return yms;
}
/**
* Zamienia długość geograficzną na współrzędna x GridCoord.
*
* @param lon długość geograficzna
* @return współrzędna x klasy GridCoord
*/
public static int zamienDlugoscGeoNaIdKwadratuX(double lon) {
double xms_f = (lon + 180) * MapConsts.DEG_MS;
return zamienWspXmsNaIdKwadratuX((long) xms_f);
}
/**
* Zamienia szerokość geograficzną na współrzędna y GridCoord.
*
* @param lat szerokość geograficzna
* @return współrzędna y klasy GridCoord
*/
public static int zamienSzerokoscGeoNaIdKwadratuY(double lat) {
double yms_f = (lat + 90) * MapConsts.DEG_MS;
return zamienWspYmsNaIdKwadratuY((long) yms_f);
}
/**
* Funkcja zamienia dlugosc geog. xms w milisekundach na IdKwadrat.x.
*
* @param xms długość geograficzna (lon) w milisekundach
* @return współrzędna GridCoord.x
*/
public static int zamienWspXmsNaIdKwadratuX(long xms) {
// 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)) {
// poza zakresem
return -1;
}
long x = xms;
if (x < MapConsts.X_REF_MS) {
// // poza zakresem
long dx = x + MapConsts.ANGLE_360_MS - MapConsts.X_REF_MS;
if (dx > MapConsts.DX_REF_MS) {
return -1;
}
x += MapConsts.ANGLE_360_MS;
}
// if (x > MapConsts.X_REF_MS + MapConsts.DX_REF_MS) {
// // poza zakresem
// return -1;
// }
// indeksowanie kwadratow pola walki zaczyna sie od (0, 0)
double xx = (x - MapConsts.X_REF_MS) * ODWROT_SS_DX_MS;
// x = (x - MapConsts.X_REF_MS) / MapConsts.SS_DX_MS;
return (int) xx;
}
/**
* Funkcja zamienia szerokosc geog. yms w milisekundach na IdKwadrat.y.
*
* @param yms szerokosc geograficzna (lat) w milisekundach
* @return współrzędna GridCoord.y
*/
public static int zamienWspYmsNaIdKwadratuY(long yms) {
// wspolrzedne geograficzne w milisekundach zawieraja sie w zakresie:
// 0 <= x < 360 dlugosc geograficzna
// 0 <= y <= 180 szerokosc geograficzna
if (yms < MapConsts.Y_REF_MS) {
// poza zakresem
return -1;
}
// indeksowanie kwadratow pola walki zaczyna sie od (0, 0)
double yy = (yms - MapConsts.Y_REF_MS) * ODWROT_SS_DY_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;
/**
* Funkcja służy do konwersji współrzednych elipsoidalnych WGS84 (lat/lon) na płaskie X-northing, Y-easting
* odwzorowania kartograficznego 1992.
*
* @param puwgCoord współrzędne PUWG1992 (easting, northing) [metry]
* @param lat szerokość geograficzna WSG-84 [stopnie dziesiętnie]
* @param lon długość geograficzna WSG-84 [stopnie dziesiętnie]
*/
public static void convertWGS84ToPUWG1992(double lat, double lon, Coord.Puwg puwgCoord) {
if (lon < 13.5 || lon > 25.5) {
//Błędna wartość długości geograficznej (zwracana wartość 999999999999999)
puwgCoord.easting = 999999999999999.0;
puwgCoord.northing = 999999999999999.0;
return;
}
double latRad = lat * DEG_2_RAD;
double dlam = (lon - 19.0) * DEG_2_RAD;
double dlam_pow_2 = dlam * dlam;
double dlam_pow_3 = dlam_pow_2 * dlam;
double dlam_pow_4 = dlam_pow_3 * dlam;
double s = Math.sin(latRad);
double c = Math.cos(latRad);
double c_pow_2 = c * c;
double c_pow_3 = c_pow_2 * c;
double c_pow_4 = c_pow_3 * c;
double t = s / c;
double t_pow_2 = t * t;
double t_pow_3 = t_pow_2 * t;
double t_pow_4 = t_pow_3 * t;
double t_pow_5 = t_pow_4 * t;
double eta = E2_SQUARED * c_pow_2;
double eta_pow_2 = eta * eta;
double eta_pow_3 = eta_pow_2 * eta;
double eta_pow_4 = eta_pow_3 * eta;
double sn = sphsn(latRad);
double tmd = sphtmd(latRad);
double t1, t2, t3, t4, t5;
t1 = tmd * OK;
double sns = sn * s;
t2 = sns * c * OK / 2.0;
t3 = sns * c_pow_3 * OK * (5.0 - t_pow_2 + 9.0 * eta + 4.0 * eta_pow_2) / 24.0;
t4 = sns * c_pow_4 * c * OK * (61.0 - 58.0 * t_pow_2 + t_pow_4
+ 270.0 * eta - 330.0 * t_pow_2 * eta + 445.0 * eta_pow_2
+ 324.0 * eta_pow_3 - 680.0 * t_pow_2 * eta_pow_2
+ 88.0 * eta_pow_4 - 600.0 * t_pow_2 * eta_pow_3 - 192.0 * t_pow_2 * eta_pow_4) / 720.0;
t5 = sns * c_pow_4 * c_pow_3 * OK * (1385.0 - 3111.0 * t_pow_2
+ 543.0 * t_pow_4 - t_pow_5 * t) / 40320.0;
puwgCoord.northing = -5300000.0 + t1 + dlam_pow_2 * t2 + dlam_pow_4 * t3
+ dlam_pow_4 * dlam_pow_2 * t4 + dlam_pow_4 * dlam_pow_4 * t5;
t1 = sn * c * OK;
t2 = sn * c_pow_3 * OK * (1.0 - t_pow_2 + eta) / 6.0;
t3 = sn * c_pow_4 * c * OK * (5.0 - 18.0 * t_pow_2 + t_pow_4 + 14.0 * eta
- 58.0 * t_pow_2 * eta + 13.0 * eta_pow_2 + 4.0 * eta_pow_3
- 64.0 * t_pow_2 * eta_pow_2 - 24.0 * t_pow_2 * eta_pow_3) / 120.0;
t4 = sn * c_pow_4 * c_pow_3 * OK * (61.0 - 479.0 * t_pow_2 + 179.0 * t_pow_4 - t_pow_5 * t) / 5040.0;
puwgCoord.easting = 500000.0 + dlam * t1 + dlam_pow_3 * t2
+ dlam_pow_4 * dlam * t3 + dlam_pow_4 * dlam_pow_3 * t4;// + 0.5;
}
/**
* Funkcja do konwersji współrzędnych płaskich X/Y odwzorowania kartograficznego 1992 na elipsoidalne lat/lon elipsoide WGS84.
* <p>
* PUWGCoord.proj: odwzorowanie kartograficzne (proj = 1 odpowiada odwzorowaniu 1992, natomiast każda inna odwzorowaniu 2000)
*
* @param northing współrzędne na osi OY odwzorowania kartograficznego PUWG-1992 do konwersji [metry]
* @param easting współrzędne na osi OX odwzorowania kartograficznego PUWG-1992 do konwersji [metry]
* @param geoCoord współrzędne geograficzne odwzorowania WGS-84 po konwersji [stopnie]
*/
public static void convertPUWG1992ToWGS84(double northing, double easting, Coord.Geo geoCoord) {
double tmd = (northing + 5300000.0) / OK;
double sr = sphsr(0.0);
double ftphi = tmd / sr;
for (int i = 0; i < 5; i++) {
ftphi += (tmd - sphtmd(ftphi)) / sphsr(ftphi);
}
sr = sphsr(ftphi);
double sn = sphsn(ftphi);
double sn_pow_2 = sn * sn;
double sn_pow_3 = sn_pow_2 * sn;
double sn_pow_4 = sn_pow_3 * sn;
double sn_pow_5 = sn_pow_4 * sn;
double sn_pow_7 = sn_pow_5 * sn_pow_2;
double s = Math.sin(ftphi);
double c = Math.cos(ftphi);
double t = s / c;
double t_pow_2 = t * t;
double t_pow_4 = t_pow_2 * t_pow_2;
double t_pow_6 = t_pow_4 * t_pow_2;
double eta = E2_SQUARED * (c * c);
double eta_pow_2 = eta * eta;
double eta_pow_3 = eta_pow_2 * eta;
double eta_pow_4 = eta_pow_2 * eta_pow_2;
double de = easting - 500000.0;
double de_pow_2 = de * de;
double de_pow_3 = de_pow_2 * de;
double de_pow_4 = de_pow_3 * de;
double t0, t1, t2, t3;
t0 = t / (2.0 * sr * sn * OK_POW_2);
t1 = t * (5.0 + 3.0 * t_pow_2 + eta - 4.0 * eta_pow_2 - 9.0 * t_pow_2 * eta) / (24.0 * sr * sn_pow_3 * OK_POW_4);
t2 = t * (61.0 + 90.0 * t_pow_2 + 46.0 * eta + 45.0 * t_pow_4 - 252.0 * t_pow_2 * eta - 3.0 * eta_pow_2
+ 100.0 * eta_pow_3 - 66.0 * t_pow_2 * eta_pow_2 - 90.0 * t_pow_4 * eta + 88.0 * eta_pow_4
+ 225.0 * t_pow_4 * eta_pow_2 + 84.0 * t_pow_2 * eta_pow_3 - 192.0 * t_pow_2 * eta_pow_4) / (720.0 * sr * sn_pow_5 * OK_POW_6);
t3 = t * (1385.0 + 3633 * t_pow_2 + 4095.0 * t_pow_4 + 1575.0 * t_pow_6) / (40320 * sr * sn_pow_7 * (OK_POW_8));
geoCoord.lat = ftphi - de_pow_2 * t0 + de_pow_4 * t1 - de_pow_3 * de_pow_3 * t2 + de_pow_4 * de_pow_3 * t3;
t0 = 1.0 / (sn * c * OK);
t1 = (1.0 + 2.0 * t_pow_2 + eta) / (6.0 * sn_pow_3 * c * (OK_POW_3));
t2 = (5.0 + 6.0 * eta + 28.0 * t_pow_2 - 3.0 * eta_pow_2 + 8.0 * t_pow_2 * eta
+ 24.0 * t_pow_4 - 4.0 * eta_pow_3 + 4.0 * t_pow_2 * eta_pow_2
+ 24.0 * t_pow_2 * eta_pow_3) / (120.0 * sn_pow_5 * c * (OK_POW_5));
t3 = (61.0 + 662.0 * t_pow_2 + 1320.0 * t_pow_4 + 720.0 * t_pow_6) / (5040.0 * sn_pow_7 * c * OK_POW_7);
double dlam = de * t0 - de_pow_3 * t1 + de_pow_3 * de_pow_2 * t2 - de_pow_3 * de_pow_4 * t3;
// 19.0 * DEG_2_RAD == 0.33161255787892263;
// geoCoord.lon = 0.33161255787892263 + dlam;
// geoCoord.lon *= RAD_2_DEG;
geoCoord.lon = dlam * RAD_2_DEG;
geoCoord.lon += 19.0;
geoCoord.lat *= RAD_2_DEG;
}
////////////////////////////////////////////////////////////////////////////////
// Funkcje pomocnicze i stałe
/// /////////////////////////////////////////////////////////////////////////////
static double calculateESquared(double a, double b) {
a *= a;
b *= b;
return (a - b) / a;
}
static double calculateE2Squared(double a, double b) {
a *= a;
b *= b;
return (a - b) / b;
}
static double denom(double sphi) {
double sinSphi = Math.sin(sphi);
return Math.sqrt(1.0 - E_SQUARED * (sinSphi * sinSphi));
}
static double sphsr(double sphi) {
double dn = denom(sphi);
return A * (1.0 - E_SQUARED) / (dn * dn * dn);
}
static double sphsn(double sphi) {
double sinSphi = Math.sin(sphi);
return A / Math.sqrt(1.0 - E_SQUARED * (sinSphi * sinSphi));
}
static double sphtmd(double sphi) {
return (AP * sphi) - (BP * Math.sin(2.0 * sphi)) + (CP * Math.sin(4.0 * sphi))
- (DP * Math.sin(6.0 * sphi)) + (EP * Math.sin(8.0 * sphi));
}
private static final double DEG_2_RAD = Math.PI / 180.0;
private static final double RAD_2_DEG = 180.0 / Math.PI;
/**
* Dlługość dużej półsi, w metrach dla elipsoidy WGS-84.
*/
private static final double A = 6378137.0;
/**
* double f: spłaszczenie elipsoidalne dla elipsoidy WGS-84, 1 / 298.257223563
*/
// private static final double F = 1.0 / 298.257223563;
private static final double B = A * (1.0 - 1.0 / 298.257223563);
private static final double E_SQUARED = calculateESquared(A, B);
private static final double E2_SQUARED = calculateE2Squared(A, B);
private static final double TN = (A - B) / (A + B);
private static final double AP = A * (1.0 - TN + 5.0 * (TN * TN - TN * TN * TN) / 4.0 + 81.0 * TN * TN * TN * TN - TN * TN * TN * TN * TN / 64.0);
private static final double BP = 3.0 * A * (TN - TN * TN + 7.0 * (TN * TN * TN - TN * TN * TN * TN) / 8.0 + 55.0 * TN * TN * TN * TN * TN / 64.0) / 2.0;
private static final double CP = 15.0 * A * (TN * TN - TN * TN * TN + 3.0 * (TN * TN * TN * TN - TN * TN * TN * TN * TN) / 4.0) / 16.0;
private static final double DP = 35.0 * A * (TN * TN * TN - TN * TN * TN * TN + 11.0 * TN * TN * TN * TN * TN / 16.0) / 48.0;
private static final double EP = 315.0 * A * (TN * TN * TN * TN - TN * TN * TN * TN * TN) / 512.0;
/**
* Współczynnik zniekształcenia skali mapy w południku osiowym dla odwzorowania kartograficznego PUWG-1992.
*/
private static final double OK = 0.9993;
private static final double OK_POW_2 = OK * OK;
private static final double OK_POW_3 = OK_POW_2 * OK;
private static final double OK_POW_4 = OK_POW_3 * OK;
private static final double OK_POW_5 = OK_POW_4 * OK;
private static final double OK_POW_6 = OK_POW_5 * OK;
private static final double OK_POW_7 = OK_POW_6 * OK;
private static final double OK_POW_8 = OK_POW_7 * OK;
}

View File

@@ -0,0 +1,158 @@
package pl.wat.ms4ds.terrain;
public class CoordConversion {
/*
Opis:
konwersja wspolrzednych z ukladu WGS 84 do ukladu PUWG 1992
Parametry:
B_stopnie - szerokosc geograficzna wyrazona w stopniach
L_stopnie - dlugosc geograficzna wyrazona w stopniach
Xpuwg - wskazanie na wspolrzedna X ukladu PUWG 1992 (UWAGA - wspolrzedna pionowa)
Ypuwg - wskazanie na wspolrzedna Y ukladu PUWG 1992 (UWAGA - wspolrzedna pozioma)
Zwracana wartosc:
0 - konwersja powiodla sie
1 - szerokosc geograficzna B poza zakresem
2 - dlugosc geograficzna L poza zakresem
*/
public static int wgs84ToPuwg1992(double B_stopnie, double L_stopnie) {
double Xpuwg;
double Ypuwg;
// Parametry elipsoidy GRS-80
double e = 0.0818191910428; //pierwszymimo¶ród elipsoidy
double R0 = 6367449.14577; //promieñ sfery Lagrange.a
double Snorm = 2.0E-6; //parametr normuj±cy
double xo = 5760000.0; //parametr centruj±cy
//Wspolczynniki wielomianu
double a0 = 5765181.11148097;
double a1 = 499800.81713800;
double a2 = -63.81145283;
double a3 = 0.83537915;
double a4 = 0.13046891;
double a5 = -0.00111138;
double a6 = -0.00010504;
// Parametry odwzorowania Gaussa-Kruegera dla uk³adu PUWG92
double L0_stopnie = 19.0; //Pocz±tek uk³adu wsp. PUWG92 (d³ugo¶æ)
double m0 = 0.9993;
double x0 = -5300000.0;
double y0 = 500000.0;
// Zakres stosowalnosci metody
double Bmin = 48.0 * Math.PI / 180.0;
double Bmax = 56.0 * Math.PI / 180.0;
double dLmin = -6.0 * Math.PI / 180.0;
double dLmax = 6.0 * Math.PI / 180.0;
// Weryfikacja danych wejsciowych
double B = B_stopnie * Math.PI / 180.0;
double dL_stopnie = L_stopnie - L0_stopnie;
double dL = dL_stopnie * Math.PI / 180.0;
if ((B < Bmin) || (B > Bmax))
return 1;
if ((dL < dLmin) || (dL > dLmax))
return 2;
//etap I - elipsoida na kulê
double U = 1.0 - e * Math.sin(B);
double V = 1.0 + e * Math.sin(B);
double K = Math.pow((U / V), (e / 2.0));
double C = K * Math.tan(B / 2.0 + Math.PI / 4.0);
double fi = 2.0 * Math.atan(C) - Math.PI / 2.0;
double d_lambda = dL;
// etap II - kula na walec
double p = Math.sin(fi);
double q = Math.cos(fi) * Math.cos(d_lambda);
double r = 1.0 + Math.cos(fi) * Math.sin(d_lambda);
double s = 1.0 - Math.cos(fi) * Math.sin(d_lambda);
double XMERC = R0 * Math.atan(p / q);
double YMERC = 0.5 * R0 * Math.log(r / s);
// //etap III - walec na p³aszczyznê
// complex<double> Z ((XMERC - xo) * Snorm, YMERC * Snorm);
// complex<double> Zgk;
// Zgk = a0 + Z * (a1 + Z * (a2 + Z * (a3 + Z * (a4 + Z * (a5 + Z * a6)))));
// double Xgk = Zgk.real();
// double Ygk = Zgk.imag();
//
// //Przej¶cie do uk³adu aplikacyjnego
// Xpuwg = m0 * Xgk + x0;
// Ypuwg = m0 * Ygk + y0;
return 0;
}
/*
Opis:
konwersja wspolrzednych z ukladu PUWG 1992 do ukladu WGS 84
Parametry:
Xpuwg - wskazanie na wspolrzedna X ukladu PUWG 1992 (UWAGA - wspolrzedna pionowa)
Ypuwg - wskazanie na wspolrzedna Y ukladu PUWG 1992 (UWAGA - wspolrzedna pozioma)
B_stopnie - szerokosc geograficzna wyrazona w stopniach
L_stopnie - dlugosc geograficzna wyrazona w stopniach
Zwracana wartosc:
0 - konwersja powiodla sie
*/
public static int puwg1992ToWgs84(double Xpuwg, double Ypuwg, double B_stopnie, double L_stopnie) {
double L0_stopnie = 19.0; //Pocz±tek uk³adu wsp. PUWG92 (d³ugo¶æ)
double m0 = 0.9993;
double x0 = -5300000.0;
double y0 = 500000.0;
double R0 = 6367449.14577; //promieñ sfery Lagrange.a
double Snorm = 2.0E-6; //parametr normuj±cy
double xo_prim = 5765181.11148097; //parametr centruj±cy
// Wspolczynniki wielomianu
double b0 = 5760000;
double b1 = 500199.26224125;
double b2 = 63.88777449;
double b3 = -0.82039170;
double b4 = -0.13125817;
double b5 = 0.00101782;
double b6 = 0.00010778;
// Wspolczynniki szeregu tryg.
double c2 = 0.0033565514856;
double c4 = 0.0000065718731;
double c6 = 0.0000000176466;
double c8 = 0.0000000000540;
//Przejscie z ukladu aplikacyjnego
double Xgk, Ygk;
Xgk = (Xpuwg - x0) / m0;
Ygk = (Ypuwg - y0) / m0;
// //etap I - (Xgk, Ygk) -> (Xmerc, Ymerc)
// complex<double> Z ((Xgk - xo_prim) * Snorm, Ygk * Snorm);
// complex<double> Zmerc;
//
// Zmerc = b0 + Z * (b1 + Z * (b2 + Z * (b3 + Z * (b4 + Z * (b5 + Z * b6)))));
//
// double Xmerc = Zmerc.real();
// double Ymerc = Zmerc.imag();
//
// //etap II - Xmerc,Ymerc -> fi, delta_lambda
// double alfa = Xmerc / R0;
// double beta = Ymerc / R0;
//
// double w = 2.0 * atan(exp(beta)) - M_PI / 2.0;
// double fi = asin(cos(w) * sin(alfa));
// double d_lambda = atan(tan(w) / cos(alfa));
//
// //etap III
// double B = fi + c2 * sin(2.0 * fi) + c4 * sin(4.0 * fi) + c6 * sin(6.0 * fi) + c8 * sin(8.0 * fi);
// double dL = d_lambda;
//
// //Obliczenia koncowe
// *B_stopnie = B / M_PI * 180.0;
// double dL_stopnie = dL / M_PI * 180.0;
// *L_stopnie = dL_stopnie + L0_stopnie;
return 0;
}
}

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje;
package pl.wat.ms4ds.terrain;
class EmptyBigSquare extends BigSquare {
@@ -7,7 +7,7 @@ class EmptyBigSquare extends BigSquare {
private EmptyBigSquare() {
}
Kwadrat getKwadrat(int ssX, int ssY) {
return Kwadrat.EMPTY_SQUARE;
Square getKwadrat(int ssX, int ssY) {
return Square.EMPTY;
}
}

View File

@@ -0,0 +1,19 @@
package pl.wat.ms4ds.terrain;
/**
*
*/
public class GeoCoord {
public double lat;
public double lon;
public GeoCoord() {}
public GeoCoord(double lat, double lon) {
this.lat = lat;
this.lon = lon;
}
public GeoCoord(GeoCoord other) {
lat = other.lat;
lon = other.lon;
}
}

View File

@@ -0,0 +1,250 @@
package pl.wat.ms4ds.terrain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public final class MapConsts {
private static final Logger LOGGER = LoggerFactory.getLogger(MapConsts.class);
/**
* Umowny uklad odniesienia dla lokalizacji geograficznej: <p>
* Długość geograficzna (wsp. X) przyjmuje wartości: [0, 360) odpowiadające [-180, 180]<p>
* Szerokość geograficzna (wsp. Y) przyjmuje wartości: [0, 180] odpowadające [-90, 90]
*/
public static final int X_REF;
/**
* Umowny uklad odniesienia dla lokalizacji geograficznej: <p>
* Długość geograficzna (wsp. X) przyjmuje wartości: [0, 360) odpowiadające [-180, 180]<p>
* Szerokość geograficzna (wsp. Y) przyjmuje wartości: [0, 180] odpowadające [-90, 90]
*/
public static final int Y_REF;
public static final int DX_REF;
public static final int DY_REF;
public static final String KWADRATY_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";
/**
* Dlugosc boku duzego kwadratu na osi OX w liczbie malych kwadratow.
*/
public static final int SS_PER_BS_X;
/**
* Dlugosc boku duzego kwadratu na osi OY w liczbie malych kwadratow.
*/
public static final int SS_PER_BS_Y;
/**
* Dlugosc boku malego kwadratu w metrach.
*/
public static final int SS_SIZE;
/**
* Powierzchnia malego kwadratu w metrach.
*/
public static final int POW_MK;
/**
* Szerokość małego kwadratu w stopniach.
*/
public static final double DELTA_X;
/**
* Wysokość małego kwadratu w stopniach.
*/
public static final double DELTA_Y;
/**
* Liczba duzych kwadratow na stopien geograficzny po osi OX (dlugosc geograficzna).
*/
public static final int BS_PER_DEG_X = 4;
/**
* Liczba duzych kwadratow na stopien geograficzny po osi OY (szerokosc geograficzna).
*/
public static final int BS_PER_DEG_Y = 6;
/**
* Szerokość duzych kwadratow w stopniach geograficznych po osi OX (dlugosc geograficzna).
*/
public static final double BS_DX;
/**
* Wysokość duzych kwadratow w stopniach geograficznych po osi OY (szerokosc geograficzna).
*/
public static final double BS_DY;
/**
* Szerokości geograficzne środków kwadratów.
*/
static final double[] LATS;
/**
* Długości geograficzne środków kwadratów.
*/
static final double[] LONS;
static Properties ustawienia;
static {
String propertiesFileName = System.getProperty("user.dir") + "\\" + PLIK_Z_USTAWIENIAMI;
ustawienia = new Properties();
try {
LOGGER.debug("Odczyt ustawien z pliku: {}.", propertiesFileName);
ustawienia.load(new FileInputStream(propertiesFileName));
} catch (IOException e) {
LOGGER.error("Brak pliku z ustawieniami.");
throw new RuntimeException(e);
}
// 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;
// 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"));
String val = ustawienia.getProperty("dl_mk");
switch (val) {
case "20":
SS_SIZE = 20;
break;
case "25":
SS_SIZE = 25;
break;
case "50":
SS_SIZE = 50;
break;
case "100":
SS_SIZE = 100;
break;
default:
SS_SIZE = 200;
break;
}
POW_MK = 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/";
} 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/";
} 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/";
} 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/";
} 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/";
}
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];
for (int i = 0; i < LONS.length; i++) {
LONS[i] = X_REF + DELTA_X * (i + 0.5);
}
LATS = new double[DY_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);
}
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);
}
/**
* Liczba milisekund na stopien.
*/
public static final int DEG_MS = 3600000;
/**
* Liczba milisekund na 360 stopni.
*/
public static final long ANGLE_360_MS = 3600000 * 360;
/**
* Wielkosc cache'u pola walki (liczba duzych kwadratow trzymanych w RAM).
*/
public static final int MAX_BIG_SQUARES_IN_MEMORY = 500;
/**
* Wspolrzedna referencyjna X (dlugosc geograficzna) lewego dolnego rogu mapy w stopniach geograficznych.
*
* @return
*/
public static int getX_REF() {
return X_REF;
}
/**
* Wspolrzedna referencyjna Y (szerokosc geograficzna) lewego dolnego rogu mapy w stopniach geograficznych.
*
* @return
*/
public static int getY_REF() {
return Y_REF;
}
/**
* Szerokosc referencyjna prostokata pola walki w stopniach na osi OX (dlugosc geograficzna).
*
* @return
*/
public static int getDX_REF() {
return DX_REF;
}
/**
* Wysokosc referencyjna prostokata pola walki w stopniach na osi OY (szerokosc geograficzna).
*
* @return
*/
public static int getDY_REF() {
return DY_REF;
}
/**
* Dlugosci bokow malego kwadratu w milisekundach geograficznych po osi OX (dlugosc geograficzna).
*/
public static final double SS_DX_MS = DELTA_X * 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;
// 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 BS_DX_MS = (int) (BS_DX * DEG_MS);
public static final int BS_DY_MS = (int) (BS_DY * DEG_MS);
/**
* Liczba malych kwadratow przypadajaca na bok arkusza mapy drogowej.
*/
public static final int SS_PER_SHEET = 20;
}

View File

@@ -0,0 +1,417 @@
package pl.wat.ms4ds.terrain;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Square {
/**
* The height above the level of the sea. Unit of measure meter [m].
*/
public float elevation;
/**
* Terrain type. <p></p>Possible values:
* 0 - BARE_GROUND
* 1 - GRASS
* 2 - SWAMP
* 3 - WATER
* 4 - SCRUB, BUSHES
* 5 - BUILDINGS
* 6 - FOREST
*/
public short terrainType;
/**
* Type of watercourse (water obstacle) in a given direction. Each index corresponds to a given direction.
* <p></p>Possible values: 0 - no watercourse, 1 - drain, ditch, 2 - canal, stream, 3 - river
*/
public final byte[] watercourses;
/**
* Type of road in a given direction. Each index corresponds to a given direction.
* <p></p>Possible values: 0 - no road, 1 - small roads, 2 - minor roads, 3 - major roads
*/
public final byte[] roads;
/// /////////////////////////////////////
/// tymczasowo
public float stopienZabudowy;
public float stopienZalesienia;
public float stopienZawodnienia;
public float stopienZabagnienia;
public boolean[] jestDroga;
public boolean[] jestRow;
public boolean[] jestPrzeszkodaWodna;
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. <p></p>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() {
this(-2, -2);
}
public Square(int x, int y) {
this.x = x;
this.y = y;
roads = new byte[8];
watercourses = new byte[8];
}
public Square(int x, int y, RawData rawData) {
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;
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 int writeToBuffer(byte[] buffer, int offset) {
// Konwersja [m] -> [0.25m].
int elev = (short) (elevation * 4);
byte bit = 1;
byte drains = 0;
byte streams = 0;
byte rivers = 0;
byte smallRoads = 0;
byte minorRoads = 0;
byte majorRoads = 0;
for (int i = 0; i < watercourses.length; i++) {
switch (watercourses[i]) {
case 1:
drains |= bit;
break;
case 2:
streams |= bit;
break;
case 3:
rivers |= bit;
break;
default:
break;
}
switch (roads[i]) {
case 1:
smallRoads |= bit;
break;
case 2:
minorRoads |= bit;
break;
case 3:
majorRoads |= bit;
break;
default:
break;
}
bit <<= 1;
}
byte b1 = (byte) (elev & 0xFF);
elev >>= 8;
byte b0 = (byte) (elev & 0xFF);
if (b0 == -1 && b1 == -4) {
System.out.println("a");
}
buffer[offset + 1] = b1;
buffer[offset] = b0;
buffer[offset + 2] = (byte) terrainType;
buffer[offset + 3] = smallRoads;
buffer[offset + 4] = minorRoads;
buffer[offset + 5] = majorRoads;
buffer[offset + 6] = drains;
buffer[offset + 7] = streams;
buffer[offset + 8] = rivers;
return offset + 9;
}
public int readFromBuffer(byte[] buffer, int offset) {
int elev = buffer[offset] & 0xFF;
elev = (elev << 8) + (buffer[offset + 1] & 0xFF);
short v = (short) elev;
// Konwersja na metry a[0.25m] -> b[m]
elevation = (float) (v) / 4;
if (elevation > 2660) {
System.out.println("h=" + elevation);
}
terrainType = buffer[offset + 2];
byte smallRoads = buffer[offset + 3];
byte minorRoads = buffer[offset + 4];
byte majorRoads = buffer[offset + 5];
byte drains = buffer[offset + 6];
byte streams = buffer[offset + 7];
byte rivers = buffer[offset + 8];
int bit = 1;
// 8 kierunków geograficznych (0 - NORTH, 1 - NORTH_EAST, ...)
for (int i = 0; i < 8; i++) {
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 = ((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;
}
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;
return x == SQUARE.x && y == SQUARE.y;
}
@Override
public int hashCode() {
int result = 7;
result = 31 * result + x;
result = 31 * result + y;
return result;
}
public String toString() {
StringBuilder linia = new StringBuilder(100);
linia.append("[");
char c = switch (terrainType) {
case 1 -> 'G';
case 2 -> 'S';
case 3 -> 'W';
case 4 -> 'R';
case 5 -> 'B';
case 6 -> 'F';
default -> ' ';
};
linia.append(c);
linia.append(' ');
String s = String.format("%7.2f", elevation);
linia.append(s);
linia.append(' ');
for (byte road : roads) {
c = switch (road) {
case 1 -> '1';
case 2 -> '2';
case 3 -> '3';
default -> '0';
};
linia.append(c);
}
linia.append(' ');
for (byte watercours : watercourses) {
c = switch (watercours) {
case 1 -> '1';
case 2 -> '2';
case 3 -> '3';
default -> '0';
};
linia.append(c);
}
linia.append(']');
return linia.toString();
}
}

View File

@@ -0,0 +1,578 @@
package pl.wat.ms4ds.terrain;
import java.io.*;
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.wat.ms4ds.common.ERodzajPodwozia;
import pl.wat.ms4ds.common.ERodzajTerenuPokrycie;
import pl.wat.ms4ds.terrain.nmt.NMTDataProvider;
import static pl.wat.ms4ds.terrain.Square.EMPTY;
public class Teren {
private static final Logger LOGGER = LoggerFactory.getLogger(Teren.class);
private static final int BIG_X_MAX = 100;
private static final int BIG_Y_MAX = 100;
private static BigSquare bigSquares[][] = new BigSquare[BIG_X_MAX][BIG_Y_MAX];
// tablica obiektów synchronizujących dostęp do dużych kwadratów przy odczycie z pliku
private static Object bsSynch = new Object();
private static final float[][] STOPIEN_PRZEJEZDNOSCI;
private static final String LITERALS = "ABCDEF";
private static boolean przejezdnoscZawsze;
static double minStopienPrzejezd;
static double minStopienPrzejezdNaPrzelaj;
private static double minStopienPrzejezdNaDrodzeNachylenie;
private static double minStopienPrzejezdNaPrzelajNachylenie;
private static double minKatNachylTerenuNaDrodze;
private static double maxKatNachylTerenuNaDrodze;
private static double minKatNachylTerenuNaPrzelaj;
private static double maxKatNachylTerenuNaPrzelaj;
/**
* Jawne wywolanie zapisu do pliku bufora zmian terenu. Zapisane zostaną aktywne/załadowane duże kwadraty.
*/
public static void saveToFiles(String dir) {
for (int i = 0; i < bigSquares.length; i++) {
for (int j = 0; j < bigSquares[i].length; j++) {
BigSquare bs = bigSquares[i][j];
if (bs instanceof RightBigSquare rbs) {
try {
rbs.writeToFile(dir);
bigSquares[i][j] = null;
} catch (IOException e) {
LOGGER.warn("Błąd zapisu pliku mapy: " + rbs.fileName);
}
}
}
}
}
public static void reset() {
for (int i = 0; i < bigSquares.length; i++) {
for (int j = 0; j < bigSquares[i].length; j++) {
bigSquares[i][j] = null;
}
}
bigSquaresInMemory = 0;
for (int i = 0; i < history.length; i++) {
history[i].set(-1, -1);
}
System.gc();
}
/**
* Zwraca nazwę pliku na podstawie współrzędnych geograficznych.
*
* @param lat szerokość geograficzna
* @param lon długość geograficzna
* @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 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.X_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;
char cLat = (y_stop < 0) ? 'S' : 'N';
if (y_stop < 0) {
y_stop = -y_stop;
}
int dy = bsY % MapConsts.BS_PER_DEG_Y;
char cy = LITERALS.charAt(dy);
// przykładowa nazwa pliku: E024B_N50F
//
StringBuilder sb = new StringBuilder();
sb.append(cLon);
if (x_stop < 10) {
sb.append("00");
} else if (x_stop < 100) {
sb.append('0');
}
sb.append(x_stop);
sb.append(cx);
sb.append('_');
sb.append(cLat);
if (y_stop < 10) {
sb.append('0');
}
sb.append(y_stop);
sb.append(cy);
return sb.toString();
}
private static BigSquare loadAreaOld(int bsX, int bsY) {
String fName = getFileName(bsX, bsY) + ".bin";
try {
return new RightBigSquare(fName, null);
} catch (IOException e) {
LOGGER.warn("Brak pliku mapy: {}{}{}", MapConsts.KWADRATY_DIR, fName, ".bin");
return EmptyBigSquare.EMPTY_BIG_SQUARE;
}
}
private static BigSquare loadArea(int bsX, int bsY) {
String fName = getFileName(bsX, bsY);
try {
RightBigSquare bs = new RightBigSquare();
bs.fileName = fName;
bs.readFromFile(MapConsts.KWADRATY_DIR);
return bs;
} catch (IOException e) {
LOGGER.warn("Brak pliku mapy: {}{}{}", MapConsts.KWADRATY_DIR, fName, ".bin");
return EmptyBigSquare.EMPTY_BIG_SQUARE;
}
}
private static ReentrantLock synchr;
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);
}
public static Square getKwadrat(double lat, double lon) {
int idX = Coord.zamienDlugoscGeoNaIdKwadratuX(lon);
int idY = Coord.zamienSzerokoscGeoNaIdKwadratuY(lat);
return getKwadrat(idX, idY);
}
/**
* Zwraca kwadrat o podanych współrzędnych siatki (grida).
*
* @param x współrzędna pozioma (indeks kolumny)
* @param y współrzędna pionowa (indeks wiersza)
* @return obiekt reprezentujący charakterystyki fragmentu terenu
*/
public static Square getKwadrat(int x, int y) {
if (x < 0 || y < 0) {
return EMPTY;
}
// wspolrzędna x dużego kwadratu
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) {
return EMPTY;
}
// wspolrzędna x małego kwadratu w ramach dużego kwadratu
int ssX = x % MapConsts.SS_PER_BS_X;
// wspolrzędna y małego kwadratu w ramach dużego kwadratu
int ssY = y % MapConsts.SS_PER_BS_Y;
synchronized (bsSynch) {
if (bigSquares[bsX][bsY] == null) {
makeRoom(bsX, bsY);
bigSquares[bsX][bsY] = loadArea(bsX, bsY);
}
}
return bigSquares[bsX][bsY].getKwadrat(ssX, ssY);
}
private static Coord.Grid[] history = new Coord.Grid[MapConsts.MAX_BIG_SQUARES_IN_MEMORY];
private static int bigSquaresInMemory = 0;
private static void makeRoom(int bigX, int bigY) {
if (bigSquaresInMemory >= MapConsts.MAX_BIG_SQUARES_IN_MEMORY) {
// najpierw zapisuję w pliku dokonane zmiany
if (bigSquares[history[0].x][history[0].y] instanceof RightBigSquare rbs) {
try {
//!! dla potrzeb generowania danych
rbs.liczbaZmian = 1;
rbs.writeToFile(null);
} catch (IOException e) {
e.printStackTrace();
}
}
// następnie usuwam duzy kwadrat z pamięci
bigSquares[history[0].x][history[0].y] = null;
for (int i = 1; i < history.length; i++) {
// przesuwam elementy w lewo
history[i - 1].set(history[i]);
}
// uaktualniam indeksy duzego kwadratu w historii (ostatni == najnowszy element)
history[MapConsts.MAX_BIG_SQUARES_IN_MEMORY - 1].x = bigX;
history[MapConsts.MAX_BIG_SQUARES_IN_MEMORY - 1].y = bigY;
} else {
history[bigSquaresInMemory].x = bigX;
history[bigSquaresInMemory].y = bigY;
bigSquaresInMemory++;
}
}
/**
* Tablica danych o braku rowów w kwadracie dla funkcji przejezdnosci, gdy nie uwzględniamy rowów.
*/
private static final boolean[] ROWY_DLA_PRZEJEZDNOSCI = new boolean[8];
private static final double TANG_ALFA_MAX_NA_DRODZE;
private static final double TANG_ALFA_MIN_NA_DRODZE;
private static final double a1;
private static final double b1;
/**
* Funkcja opisujaca zmianę stopnia przejezdności podczas ruchu na drodze dla kątów w przedziale <22.5, 45>
*
* @param tangKataNachyl tangens kąta nachylenia zbocza
* @return stopień przejezdności z punktu widzenia nachylenia terenu przy ruchu na drodze
*/
private static double stopienPrzejezdNaDrodzeNachylenie(double tangKataNachyl) {
if (tangKataNachyl <= TANG_ALFA_MIN_NA_DRODZE) {
return 1.0;
}
double st = tangKataNachyl * a1 + b1;
return (st < minStopienPrzejezdNaDrodzeNachylenie) ? minStopienPrzejezdNaDrodzeNachylenie : st;
}
private static final double TANG_ALFA_MAX_NA_PRZELAJ;
private static final double TANG_ALFA_MIN_NA_PRZELAJ;
private static final double a2;
private static final double b2;
/**
* Funkcja opisujaca zmianę stopnia przejezdności podczas ruchu na przełaj dla kątów w przedziale <22.5, 45>
*
* @param tangKataNachyl tangens kąta nachylenia zbocza
* @return stopień przejezdności z punktu widzenia nachylenia terenu przy ruchu na przełaj
*/
private static double stopienPrzejezdNaPrzelajNachylenie(double tangKataNachyl) {
if (tangKataNachyl <= TANG_ALFA_MIN_NA_PRZELAJ) {
return 1.0;
}
if (tangKataNachyl >= TANG_ALFA_MAX_NA_PRZELAJ || tangKataNachyl <= -TANG_ALFA_MAX_NA_PRZELAJ) {
// brak przejezdnosci z powodu nachylenia
return 0.0;
}
double st = tangKataNachyl * a2 + b2;
return (st < minStopienPrzejezdNaPrzelajNachylenie) ? minStopienPrzejezdNaPrzelajNachylenie : st;
}
private Teren() {
}
static {
for (int i = 0; i < history.length; i++) {
history[i] = new Coord.Grid();
}
przejezdnoscZawsze = MapConsts.ustawienia.getProperty("przejezdnosc_zawsze").equals("on");
minStopienPrzejezd = Double.parseDouble(MapConsts.ustawienia.getProperty("minimalny_stopien_przejezdnosci"));
minStopienPrzejezdNaPrzelaj = Double.parseDouble(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.minimalny_na_przelaj"));
minStopienPrzejezdNaDrodzeNachylenie = Double.parseDouble(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.minimalny.na_drodze.nachylenie_terenu"));
minStopienPrzejezdNaPrzelajNachylenie = Double.parseDouble(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.minimalny.na_przelaj.nachylenie_terenu"));
minKatNachylTerenuNaDrodze = Double.parseDouble(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.na_drodze.nachylenie_terenu.kat_minimalny"));
minKatNachylTerenuNaDrodze = Math.max(0, minKatNachylTerenuNaDrodze);
minKatNachylTerenuNaDrodze = Math.min(60, minKatNachylTerenuNaDrodze);
minKatNachylTerenuNaDrodze *= Math.PI / 180;
maxKatNachylTerenuNaDrodze = Double.parseDouble(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.na_drodze.nachylenie_terenu.kat_maksymalny"));
maxKatNachylTerenuNaDrodze = Math.max(0, maxKatNachylTerenuNaDrodze);
maxKatNachylTerenuNaDrodze = Math.min(60, maxKatNachylTerenuNaDrodze);
maxKatNachylTerenuNaDrodze *= Math.PI / 180;
if (maxKatNachylTerenuNaDrodze < minKatNachylTerenuNaDrodze) {
double temp = maxKatNachylTerenuNaDrodze;
maxKatNachylTerenuNaDrodze = minKatNachylTerenuNaDrodze;
minKatNachylTerenuNaDrodze = temp;
}
minKatNachylTerenuNaPrzelaj = Double.parseDouble(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.na_przelaj.nachylenie_terenu.kat_minimalny"));
minKatNachylTerenuNaPrzelaj = Math.max(0, minKatNachylTerenuNaPrzelaj);
minKatNachylTerenuNaPrzelaj = Math.min(60, minKatNachylTerenuNaPrzelaj);
minKatNachylTerenuNaPrzelaj *= Math.PI / 180;
maxKatNachylTerenuNaPrzelaj = Double.parseDouble(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.na_przelaj.nachylenie_terenu.kat_maksymalny"));
maxKatNachylTerenuNaPrzelaj = Math.max(0, maxKatNachylTerenuNaPrzelaj);
maxKatNachylTerenuNaPrzelaj = Math.min(60, maxKatNachylTerenuNaPrzelaj);
maxKatNachylTerenuNaPrzelaj *= Math.PI / 180;
if (maxKatNachylTerenuNaPrzelaj < minKatNachylTerenuNaPrzelaj) {
double temp = maxKatNachylTerenuNaPrzelaj;
maxKatNachylTerenuNaPrzelaj = minKatNachylTerenuNaPrzelaj;
minKatNachylTerenuNaPrzelaj = temp;
}
TANG_ALFA_MAX_NA_DRODZE = Math.tan(maxKatNachylTerenuNaDrodze);
TANG_ALFA_MIN_NA_DRODZE = Math.tan(minKatNachylTerenuNaDrodze);
a1 = (minStopienPrzejezdNaDrodzeNachylenie - 1) / (TANG_ALFA_MAX_NA_DRODZE - TANG_ALFA_MIN_NA_DRODZE);
b1 = 1 - a1 * TANG_ALFA_MIN_NA_DRODZE;
TANG_ALFA_MAX_NA_PRZELAJ = Math.tan(maxKatNachylTerenuNaPrzelaj);
TANG_ALFA_MIN_NA_PRZELAJ = Math.tan(minKatNachylTerenuNaPrzelaj);
a2 = (minStopienPrzejezdNaPrzelajNachylenie - 1) / (TANG_ALFA_MAX_NA_PRZELAJ - TANG_ALFA_MIN_NA_PRZELAJ);
b2 = 1 - a2 * TANG_ALFA_MIN_NA_PRZELAJ;
STOPIEN_PRZEJEZDNOSCI = new float[ERodzajPodwozia.numberOfValues()][ERodzajTerenuPokrycie.numberOfValues()];
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.GASIENICE.id][ERodzajTerenuPokrycie.TEREN_ZABUDOWANY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_gasienicowe.teren_zabudowany"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.GASIENICE.id][ERodzajTerenuPokrycie.TEREN_ZALESIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_gasienicowe.teren_zalesiony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.GASIENICE.id][ERodzajTerenuPokrycie.TEREN_ZABAGNIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_gasienicowe.teren_zabagniony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.GASIENICE.id][ERodzajTerenuPokrycie.TEREN_ZAWODNIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_gasienicowe.teren_zawodniony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.GASIENICE.id][ERodzajTerenuPokrycie.TEREN_CZYSTY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_gasienicowe.teren_czysty"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.KOLA_GASIENICE.id][ERodzajTerenuPokrycie.TEREN_ZABUDOWANY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_kolowo_gasienicowe.teren_zabudowany"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.KOLA_GASIENICE.id][ERodzajTerenuPokrycie.TEREN_ZALESIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_kolowo_gasienicowe.teren_zalesiony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.KOLA_GASIENICE.id][ERodzajTerenuPokrycie.TEREN_ZABAGNIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_kolowo_gasienicowe.teren_zabagniony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.KOLA_GASIENICE.id][ERodzajTerenuPokrycie.TEREN_ZAWODNIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_kolowo_gasienicowe.teren_zawodniony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.KOLA_GASIENICE.id][ERodzajTerenuPokrycie.TEREN_CZYSTY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_kolowo_gasienicowe.teren_czysty"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.KOLA.id][ERodzajTerenuPokrycie.TEREN_ZABUDOWANY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_kolowe.teren_zabudowany"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.KOLA.id][ERodzajTerenuPokrycie.TEREN_ZALESIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_kolowe.teren_zalesiony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.KOLA.id][ERodzajTerenuPokrycie.TEREN_ZABAGNIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_kolowe.teren_zabagniony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.KOLA.id][ERodzajTerenuPokrycie.TEREN_ZAWODNIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_kolowe.teren_zawodniony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.KOLA.id][ERodzajTerenuPokrycie.TEREN_CZYSTY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_kolowe.teren_czysty"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.PODUSZKA_POW.id][ERodzajTerenuPokrycie.TEREN_ZABUDOWANY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_poduszka.teren_zabudowany"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.PODUSZKA_POW.id][ERodzajTerenuPokrycie.TEREN_ZALESIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_poduszka.teren_zalesiony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.PODUSZKA_POW.id][ERodzajTerenuPokrycie.TEREN_ZABAGNIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_poduszka.teren_zabagniony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.PODUSZKA_POW.id][ERodzajTerenuPokrycie.TEREN_ZAWODNIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_poduszka.teren_zawodniony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.PODUSZKA_POW.id][ERodzajTerenuPokrycie.TEREN_CZYSTY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_poduszka.teren_czysty"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.PLOZY.id][ERodzajTerenuPokrycie.TEREN_ZABUDOWANY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_plozy.teren_zabudowany"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.PLOZY.id][ERodzajTerenuPokrycie.TEREN_ZALESIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_plozy.teren_zalesiony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.PLOZY.id][ERodzajTerenuPokrycie.TEREN_ZABAGNIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_plozy.teren_zabagniony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.PLOZY.id][ERodzajTerenuPokrycie.TEREN_ZAWODNIONY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_plozy.teren_zawodniony"));
STOPIEN_PRZEJEZDNOSCI[ERodzajPodwozia.PLOZY.id][ERodzajTerenuPokrycie.TEREN_CZYSTY.id] =
Float.parseFloat(MapConsts.ustawienia.getProperty("stopien_przejezdnosci.podwozie_plozy.teren_czysty"));
}
public static void main(String[] args) throws Exception {
// boolean[] przeszk = new boolean[8];
// boolean[] row = new boolean[8];
// przeszk[2] = true;
// przeszk[6] = true;
// Teren.poprawDaneWysokosciowe();
LOGGER.debug("start");
// Teren.normalizujDanePokrycia();
String newDir = "D:/work/kwadraty_nmt/temp/25/";
String dir1 = "D:/work/nowe/25m/";
String inDir = "D:/work/kwadraty_nmt/withElevation/25m/";
String dir2 = "C:/Workspace/_data/swdt/ms4ds/teren/kwadraty/100m/";
// Square kw = getKwadrat(1500, 2100);
// System.out.println(kw);
// kw = getKwadrat(2100, 1500);
// System.out.println(kw);
Set<String> fileNames = NMTDataProvider.listFiles(dir1);
// String fn = "E017B_N54E";
// RightBigSquare rbs = new RightBigSquare(dir2 + fn + ".bin", null);
// rbs.writeToFileOldToNewFormatWithElevetion(dir1, 25);
RightBigSquare rbs = new RightBigSquare();
rbs.fileName = "E017B_N54E";
rbs.readFromFileNew(dir1);
// Teren.generateData(fileNames, dir1, newDir);
// Teren.generateDataOldToNewFormat(fileNames, dir2, dir1, 25);
// Teren.wygenerujCzysteDane(dir, 25, false, false, false, false, true, false, false, false, false);
// Teren.wyzerujDane();
// Teren.zapisBuforaMapyDoPliku();
// String dir1 = "D:/work/kwadraty_nmt/withElevation/25m/";
// Set<String> fileNames = NMTDataProvider.listFiles(dir1);
// for (String fileName : fileNames) {
// File file = new File(fileName);
// String fn = file.getName().substring(0, file.getName().lastIndexOf('.'));
// RightBigSquare rbs = new RightBigSquare();
// rbs.fileName = fn;
// rbs.readFromFile(dir1);
// }
// rbs.writeToFile(newDir);
}
public static void wyzerujDane() {
// WYGENEROWANIE CZYSTYCH PLIKÓW DANYCH
for (int x = 0; x < bigSquares.length; x++) {
for (int y = 0; y < bigSquares[x].length; y++) {
try {
BigSquare bs = loadArea(x, y);
if (bs != null && bs instanceof RightBigSquare) {
RightBigSquare rbs = (RightBigSquare) bs;
// wyzerowanie wszystkiego poza wysokością i różnicą wzniesień
rbs.resetSquares(true, true, true, true, true, true, true, true, true);
rbs.liczbaZmian = 1;
rbs.writeToFile(null);
}
} catch (IOException e) {
// e.printStackTrace();
}
}
}
}
/**
* Funkcja uzupełnia brakujące dane wysokosciowe jako średnia kwadratów sąsiednich o niezerowych wysokosciach.
* Funkcja powinna być wywoływana dla danych zawierających informacje o wodach morskich.
*/
public static void poprawDaneWysokosciowe() {
int maxX = MapConsts.SS_PER_BS_X * MapConsts.BS_PER_DEG_X * MapConsts.DX_REF;
int maxY = MapConsts.SS_PER_BS_Y * MapConsts.BS_PER_DEG_Y * MapConsts.DY_REF;
for (int x = 0; x < maxX; x++) {
for (int y = 0; y < maxY; y++) {
Square kw = getKwadrat(x, y);
if (kw == EMPTY) {
continue;
}
if (kw.stopienZawodnienia == 0 && kw.wysokoscSrednia == 0) {
// operacja dla kwadratów lądowych
int licz = 0;
int suma = 0;
for (int i = -1; i < 1; i++) {
for (int j = -1; j < 1; j++) {
if (i == 0 && j == 0) {
// pomijam dane bieżącego kwadratu
continue;
}
int xx = x + i;
int yy = y + j;
Square kwSasiad = getKwadrat(xx, yy);
if (kwSasiad == EMPTY) {
// pomijam kwadraty poza mapą
continue;
}
if (kwSasiad.wysokoscSrednia > 0) {
// uśredniam tylko po kwadratach o niezerowej wysokości
suma += kwSasiad.wysokoscSrednia;
licz++;
}
}
}
float wys = (float) suma / (float) licz;
kw.wysokoscSrednia = (int) wys;
}
}
}
for (int x = 0; x < bigSquares.length; x++) {
for (int y = 0; y < bigSquares[x].length; y++) {
try {
BigSquare bs = bigSquares[x][y];
if (bs instanceof RightBigSquare rbs) {
rbs.liczbaZmian = 1;
rbs.writeToFile(null);
}
} catch (IOException e) {
// e.printStackTrace();
}
}
}
}
/**
* Funkcja poprawia dane o pokryciu, aby dane sumowały się do jedynki.
*/
static void normalizujDanePokrycia() {
int maxX = MapConsts.SS_PER_BS_X * MapConsts.BS_PER_DEG_X * MapConsts.DX_REF;
int maxY = MapConsts.SS_PER_BS_Y * MapConsts.BS_PER_DEG_Y * MapConsts.DY_REF;
for (int x = 0; x < maxX; x++) {
for (int y = 0; y < maxY; y++) {
Square kw = getKwadrat(x, y);
if (kw == EMPTY) {
continue;
}
float suma = kw.stopienZalesienia + kw.stopienZawodnienia + kw.stopienZabudowy + kw.stopienZabagnienia;
if (suma > 1.0f) {
kw.stopienZalesienia /= suma;
kw.stopienZawodnienia /= suma;
kw.stopienZabudowy /= suma;
kw.stopienZabagnienia = 1.0f - kw.stopienZalesienia - kw.stopienZawodnienia - kw.stopienZabudowy;
}
}
}
for (int x = 0; x < bigSquares.length; x++) {
for (int y = 0; y < bigSquares[x].length; y++) {
try {
BigSquare bs = bigSquares[x][y];
if (bs instanceof RightBigSquare rbs) {
rbs.liczbaZmian = 1;
rbs.writeToFile(null);
}
} catch (IOException e) {
// e.printStackTrace();
}
}
}
}
/**
* Generuje pliki z danymi w nowym formacie na podstawie danych w satrym formacie.
*
* @param outDir katalog z danymi terenowymi np. "d:/Workspace2/kwadraty/czyste-wysokosc/"
* @param dlmk docelowy rozmiar generowanych kwadratów terenu
*/
public static void generateDataOldToNewFormat(Set<String> fileNames, String inDir, String outDir, int dlmk) throws IOException {
for (String fileName : fileNames) {
RightBigSquare rbs = new RightBigSquare(fileName, null);
rbs.writeToFileOldToNewFormatWithElevetion(outDir, dlmk);
}
}
/**
* Generuje pliki z danymi w starym formacie na podstawie danych w nowym formacie.
*
* @param outDir katalog z danymi terenowymi np. "d:/Workspace2/kwadraty/czyste-wysokosc/"
*/
public static void generateData(Set<String> fileNames, String inDir, String outDir) throws IOException {
for (String fileName : fileNames) {
File file = new File(fileName);
String fn = file.getName().substring(0, file.getName().lastIndexOf('.'));
RightBigSquare rbs = new RightBigSquare();
rbs.fileName = fn;
rbs.readFromFileNew(inDir);
// rbs.writeToFile(outDir);
}
}
}

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje;
package pl.wat.ms4ds.terrain;
public enum TerrainType {
BARE_GROUND(0),

View File

@@ -0,0 +1,105 @@
package pl.wat.ms4ds.terrain;
public class TerrainUtils {
// ========================================================================
/**
* Wyznacza widoczność optyczną w linii prostej między zadanymi kwadratami. Widoczność jest cechą symetryczną
* względem badanych kwadratów.
* <p> Wersja metody z wykorzystaniem
*
* @param ho
* @param ht
* @param x1
* @param y1
* @param x2
* @param y2
* @return
*/
public static float widocznoscOptyczna(float ho, float ht, int x1, int y1, int x2, int y2) {
if ((x1 == x2) && (y1 == y2)) {
return 1.0f;
}
Square kwDo = Teren.getKwadrat(x1, y1);
Square kwOd = Teren.getKwadrat(x2, y2);
if (kwDo == Square.EMPTY || kwOd == Square.EMPTY) {
return 0.0f;
}
// roznica wysokosci miedzy skrajnymi kwadratami
float roznicaWysokosci = kwDo.wysokoscSrednia + ht - kwOd.wysokoscSrednia - ho;
float wysBezwzgObserwatora;
if (roznicaWysokosci < 0) {
// sprawdzanie kwOd -> kwDo
int swap = x1;
x1 = x2;
x2 = swap;
swap = y1;
y1 = y2;
y2 = swap;
roznicaWysokosci = -roznicaWysokosci;
wysBezwzgObserwatora = kwDo.wysokoscSrednia + ht;
} else {
wysBezwzgObserwatora = kwOd.wysokoscSrednia + ho;
}
Coord.Grid[] kwadratyNaOdcinku = Bresenham.generateSegment(x1, y1, x2, y2);
double dlugoscOdcinka = Coord.Grid.distance(x1, y1, x2, y2);
double tangAlfa0 = roznicaWysokosci / dlugoscOdcinka;
float dh_max = 0;
for (int i = 1; i < kwadratyNaOdcinku.length - 1; i++) {
// badanie wewnetrznych kwadratow nalezacych do odcinka,
// czy nie sa powyzej linii widocznosci dla kwadratow skrajnych
float wysokoscPrzeszkody = 0.0f;
Square kwAkt = Teren.getKwadrat(kwadratyNaOdcinku[i].x, kwadratyNaOdcinku[i].y);
if (kwAkt.stopienZalesienia > 0.5f) {
wysokoscPrzeszkody = 10.0f;
}
if (kwAkt.stopienZabudowy > 0.5f) {
wysokoscPrzeszkody = 10.0f;
}
// wyznaczenie roznicy wysokosci kwadratu badanego i docelowego
// uwzgledniajac wysokosc obserwatora oraz wysokosc przeszkody
float dh = kwAkt.wysokoscSrednia + wysokoscPrzeszkody - wysBezwzgObserwatora;
if (dh_max >= dh) {
continue;
}
double odleg = Coord.Grid.distance(kwadratyNaOdcinku[i].x, kwadratyNaOdcinku[i].y, x1, y1);
// float tangAlfa = roznWysAkt / odleg;
// if (tangAlfa0 < tangAlfa) {
if (tangAlfa0 * odleg < dh) {
// wysokosc aktualnie badanego kwadratu jest powyzej/ponizej
// linii poprowadzonej z kwadratu startowego do docelowego (z uwzglednieniem wysokosci obserwatora i celu)
// odpowiednio dla katow dodatnich/ujemnych
return 0.0f;
}
dh_max = dh;
}
return 1.0f;
}
public static float widocznoscOptyczna(int x, int y) {
Square kw = Teren.getKwadrat(x, y);
if (kw.stopienZabudowy > 0.25f || kw.stopienZalesienia > 0.25f) {
return 0.3f;
}
return 1.0f;
}
public static float sredStopienWidoczOptycznej(float wysokoscObserwatora, float wysokoscCelu,
Coord.Grid kwadratOd, int dl1, Coord.Grid kwadratDo, int dl2) {
float stop = 0.0f;
for (int x1 = kwadratOd.x; x1 < kwadratOd.x + dl1; x1++)
for (int y1 = kwadratOd.y; y1 < kwadratOd.y + dl1; y1++)
for (int x2 = kwadratDo.x; x2 < kwadratDo.x + dl2; x2++)
for (int y2 = kwadratDo.y; y2 < kwadratDo.y + dl2; y2++)
stop += widocznoscOptyczna(wysokoscObserwatora, wysokoscCelu, x1, y1, x2, y2);
stop /= (dl1 * dl1 * dl2 * dl2);
return stop;
}
}

View File

@@ -0,0 +1,168 @@
package pl.wat.ms4ds.terrain.konwersja;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.wat.ms4ds.terrain.Coord;
import pl.wat.ms4ds.terrain.MapConsts;
import java.io.*;
import java.nio.ByteBuffer;
public class CoordTest {
static Logger logger = LoggerFactory.getLogger(CoordTest.class);
static void main() {
byte[] INT_BYTE_ARRAY = new byte[]{
(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
};
int intValue = 0xCAFEBABE;
int v1 = 32000;
short value = 32033;
byte[] bytes1 = new byte[Short.BYTES];
int length = bytes1.length;
for (int i = 0; i < length; i++) {
bytes1[length - i - 1] = (byte) (value & 0xFF);
value >>= 8;
}
value = 0;
for (byte b : bytes1) {
value = (short) ((value << 8) + (b & 0xFF));
}
v1 = bytes1[0] & 0xFF;
v1 = (v1 << 8) + (bytes1[1] & 0xFF);
value = (short) v1;
// try {
// BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("./CoordTest.bin"));
short[] val1 = {-4, -100, 32035, 32036, 32037};
byte[] val2 = {24, 25, 26, 27, 28};
byte[] val3 = {7, 8, 9, 10, 11};
int pos = 0;
byte[] buf = new byte[4 * 5];
for (int i = 0; i < 5; i++) {
// 4 * i - pozycja startowa i-tego recordu
pos = 4 * i;
short val = val1[i];
buf[pos + 1] = (byte) (val & 0xFF);
val >>= 8;
buf[pos] = (byte) (val & 0xFF);
buf[pos + 2] = val2[i];
buf[pos + 3] = val3[i];
}
// out.write(buf);
// out.flush();
// out.close();
// BufferedInputStream in = new BufferedInputStream(new FileInputStream("./CoordTest.bin"), 8);
// byte[] buf = new byte[4 * 5];
// in.read(buf2);
for (int i = 0; i < 5; i++) {
// 4 * i - pozycja startowa i-tego recordu
pos = 4 * i;
v1 = buf[pos] & 0xFF;
v1 = (v1 << 8) | (buf[pos + 1] & 0xFF);
val1[i] = (short) v1;
val2[i] = buf[pos + 2];
val3[i] = buf[pos + 3];
}
// in.close();
// } catch (IOException e) {
// System.out.println(e.getMessage());
// }
short e1 = 110;
float elevation = (float) (e1) / 4;
e1 = 111;
elevation = (float) (e1) / 4;
float f1 = 101.237f;
f1 *= 4;
f1 = (int) f1;
f1 /= 4;
f1 = 101.257f;
f1 *= 4;
f1 = (int) f1;
f1 /= 4;
f1 = 101.25f;
f1 *= 4;
f1 = (int) f1;
f1 /= 4;
f1 = 101.75f;
f1 *= 4;
f1 = (int) f1;
f1 /= 4;
f1 = 101.0237f;
f1 *= 4;
f1 = (int) f1;
f1 /= 4;
f1 = 101.82f;
f1 *= 4;
f1 = (int) f1;
f1 /= 4;
String s = String.format("e = %9.4f", Math.E);
logger.debug(" ");
Coord.Puwg puwgCoord = new Coord.Puwg();
Coord.Geo geoCoord = new Coord.Geo();
geoCoord.lon = 19;
geoCoord.lat = 50;
Coord.convertWGS84ToPUWG1992(geoCoord.lat, geoCoord.lon, puwgCoord);
logger.debug("Lat={}, Lon={} => PUWG (e,n)=({}, {})", geoCoord.lat, geoCoord.lon, puwgCoord.easting, puwgCoord.northing);
double e = puwgCoord.easting;
double n = puwgCoord.northing;
geoCoord.lon = 20;
geoCoord.lat = 51;
Coord.convertWGS84ToPUWG1992(geoCoord.lat, geoCoord.lon, puwgCoord);
double dx = puwgCoord.easting - e;
double dy = puwgCoord.northing - n;
logger.debug("Lat={}, Lon={} => PUWG (e,n)=({}, {})", geoCoord.lat, geoCoord.lon, puwgCoord.easting, puwgCoord.northing);
Coord.convertPUWG1992ToWGS84(puwgCoord.northing, puwgCoord.easting, geoCoord);
logger.debug("PUWG (e,n)=({}, {}) => Lat={}, Lon={}", puwgCoord.easting, puwgCoord.northing, geoCoord.lat, geoCoord.lon);
// coord.proj = 1;
// CoordUtils.convertWGS84ToPUWG(coord, geoCoord.lat, geoCoord.lon);
// logger.debug("Lat={}, Lon={}, PUWG (proj={}, e={}, n={})", geoCoord.lat, geoCoord.lon, coord.proj, coord.easting, coord.northing);
// CoordUtils.convertPuwg1992ToWgs84(coord, geoCoord);
// logger.debug("Lat={}, Lon={}, PUWG (proj={}, e={}, n={})", geoCoord.lat, geoCoord.lon, coord.proj, coord.easting, coord.northing);
//
// coord.proj = 2;
// CoordUtils.convertWGS84ToPUWG(coord, geoCoord.lat, geoCoord.lon);
// logger.debug("Lat={}, Lon={}, PUWG (proj={}, e={}, n={})", geoCoord.lat, geoCoord.lon, coord.proj, coord.easting, coord.northing);
// CoordUtils.convertPuwg2000ToWgs84(coord, geoCoord);
// logger.debug("Lat={}, Lon={}, PUWG (proj={}, e={}, n={})", geoCoord.lat, geoCoord.lon, coord.proj, coord.easting, coord.northing);
// 195828.000 673108.000
// puwgCoord.easting = 253974;
// puwgCoord.northing = 476879;
puwgCoord.easting = 500000;
puwgCoord.northing = 500000;
logger.debug("----------------------------------");
Coord.convertPUWG1992ToWGS84(puwgCoord.northing, puwgCoord.easting, geoCoord);
logger.debug("PUWG (e,n)=({}, {}) => Lat={}, Lon={}", puwgCoord.easting, puwgCoord.northing, geoCoord.lat, geoCoord.lon);
Coord.convertWGS84ToPUWG1992(geoCoord.lat, geoCoord.lon, puwgCoord);
logger.debug("Lat={}, Lon={} => PUWG (e,n)=({}, {})", geoCoord.lat, geoCoord.lon, puwgCoord.easting, puwgCoord.northing);
puwgCoord.easting = 100000;
puwgCoord.northing = 470642;
Coord.convertPUWG1992ToWGS84(puwgCoord.northing, puwgCoord.easting, geoCoord);
logger.debug("PUWG (e,n)=({}, {}) => Lat={}, Lon={}", puwgCoord.easting, puwgCoord.northing, geoCoord.lat, geoCoord.lon);
Coord.convertWGS84ToPUWG1992(geoCoord.lat, geoCoord.lon, puwgCoord);
logger.debug("Lat={}, Lon={} => PUWG (e,n)=({}, {})", geoCoord.lat, geoCoord.lon, puwgCoord.easting, puwgCoord.northing);
puwgCoord.easting = 821310;
puwgCoord.northing = 369750;
Coord.convertPUWG1992ToWGS84(puwgCoord.northing, puwgCoord.easting, geoCoord);
logger.debug("PUWG (e,n)=({}, {}) => Lat={}, Lon={}", puwgCoord.easting, puwgCoord.northing, geoCoord.lat, geoCoord.lon);
Coord.convertWGS84ToPUWG1992(geoCoord.lat, geoCoord.lon, puwgCoord);
logger.debug("Lat={}, Lon={} => PUWG (e,n)=({}, {})", geoCoord.lat, geoCoord.lon, puwgCoord.easting, puwgCoord.northing);
}
}

View File

@@ -0,0 +1,119 @@
package pl.wat.ms4ds.terrain.konwersja;
import pl.wat.ms4ds.terrain.Coord;
import pl.wat.ms4ds.terrain.Teren;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.wat.ms4ds.terrain.nmt.NMTData;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.StringTokenizer;
/**
* Odczyt danych wysokościowych z numerycznego modelu terenu (NMT_100).
* <p>
* Kod źródłowy funkcji do transformacji współrzędnych elipsoidalnych na płaskie odwzorowań kartograficznych UTM, 1992, 2000
*/
public class CoordUtils {
private static final Logger logger = LoggerFactory.getLogger(CoordUtils.class);
static String dataDir = "d:/Workspace2/dane_wysok/";
public static void main(String[] args) throws Exception {
HashMap<Coord.Grid, NMTData> daneWysokHashMap = new HashMap();
if (args.length > 0) {
dataDir = args[0];
}
for (int i = 1; i < args.length; i++) {
String nmt_fn = args[i];
daneWysokHashMap.clear();
readData(nmt_fn, daneWysokHashMap);
for (NMTData daneWysok : daneWysokHashMap.values()) {
// Square kw = Teren.getKwadrat(daneWysok.idKw.x, daneWysok.idKw.y);
// kw.setWysokoscSrednia((int) (daneWysok.suma / daneWysok.licz + 0.5));
}
logger.debug("Poczatek zapisu danych dla regionu " + nmt_fn + " >> " + i + "/" + (args.length - 1));
Teren.saveToFiles(null);
logger.debug("Koniec zapisu danych dla regionu " + nmt_fn + " >> " + i + "/" + (args.length - 1));
Teren.reset();
}
logger.debug("Start: poprawy danych wysokosciowych");
Teren.poprawDaneWysokosciowe();
logger.debug("Koniec: poprawy danych wysokosciowych");
}
private static void readData(String fileName, HashMap<Coord.Grid, NMTData> daneWysokHashMap) throws IOException {
try {
StringBuilder sb = new StringBuilder(100);
sb.append(dataDir);
sb.append(fileName);
sb.append(".txt");
FileReader fis = new FileReader(sb.toString());
// PUWG 1992
Coord.Puwg puwgCoord = new Coord.Puwg();
Coord.Geo latLon = new Coord.Geo();
double wysokosc = 0.0;
StringTokenizer st = null;
String line = null;
BufferedReader br = new BufferedReader(fis);
if (br.ready()) {
line = br.readLine();
int m = 1;
while (line != null) {
st = new StringTokenizer(line, " ");
if (st.countTokens() != 3) {
continue;
}
String[] tokTable = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++) {
tokTable[i] = st.nextToken();
}
try {
puwgCoord.easting = Double.parseDouble(tokTable[0]);
} catch (NumberFormatException e) {
logger.warn("Bledne dane w pliku: " + fileName);
}
try {
puwgCoord.northing = Double.parseDouble(tokTable[1]);
} catch (NumberFormatException e) {
logger.warn("Bledne dane w pliku: " + fileName);
}
try {
wysokosc = Double.parseDouble(tokTable[2]);
} catch (NumberFormatException e) {
logger.warn("Bledne dane w pliku: " + fileName);
}
Coord.convertPUWG1992ToWGS84(puwgCoord.northing, puwgCoord.easting, latLon);
Coord.Grid idKw = new Coord.Grid(latLon.lon, latLon.lat);
NMTData daneWysok = daneWysokHashMap.get(idKw);
if (daneWysok == null) {
daneWysok = new NMTData(idKw.x, idKw.y, wysokosc, 1);
daneWysokHashMap.put(idKw, daneWysok);
} else {
daneWysok.sum += wysokosc;
daneWysok.count++;
}
line = br.readLine();
if (m++ % 100000 == 0) {
System.out.print('-');
}
}
}
br.close();
System.out.println();
logger.debug("Koniec odczytu pliku: " + fileName);
} catch (IOException e) {
throw e;
}
}
}

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum EAreaFeature {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum ELinearFeature {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum EOSMAmenity {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum EOSMBridge {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum EOSMBuilding {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum EOSMHighway {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum EOSMLandcover {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum EOSMLanduse {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum EOSMNatural {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum EOSMWater {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
public enum EOSMWaterway {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
import org.nocrala.tools.gis.data.esri.shapefile.ShapeFileReader;
import org.nocrala.tools.gis.data.esri.shapefile.ValidationPreferences;
@@ -10,11 +10,12 @@ import org.nocrala.tools.gis.data.esri.shapefile.shape.shapes.MultiPointZShape;
import org.nocrala.tools.gis.data.esri.shapefile.shape.shapes.PointShape;
import org.nocrala.tools.gis.data.esri.shapefile.shape.shapes.PolygonShape;
import org.nocrala.tools.gis.data.esri.shapefile.shape.shapes.PolylineShape;
import pl.wat.ms4ds.terenfunkcje.GridCoord;
import pl.wat.ms4ds.terenfunkcje.MapConsts;
import pl.wat.ms4ds.terenfunkcje.Teren;
import pl.wat.ms4ds.terrain.Coord;
import pl.wat.ms4ds.terrain.MapConsts;
import pl.wat.ms4ds.terrain.Teren;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
@@ -98,8 +99,8 @@ public class EsriFileReader {
currNode.lat = Math.min(currNode.lat, MapConsts.Y_REF + MapConsts.DY_REF);
currNode.lat -= 90;
currNode.idX = GridCoord.zamienDlugoscGeoNaIdKwadratuX(currNode.lon);
currNode.idY = GridCoord.zamienSzerokoscGeoNaIdKwadratuY(currNode.lat);
currNode.idX = Coord.zamienDlugoscGeoNaIdKwadratuX(currNode.lon);
currNode.idY = Coord.zamienSzerokoscGeoNaIdKwadratuY(currNode.lat);
if (currNode.idX > 0 || currNode.idY > 0) {
currWay.nodes.add(currNode);
}
@@ -149,7 +150,7 @@ public class EsriFileReader {
}
}
LOGGER.debug("Poczatek zapisu danych o pokryciu wodami");
Teren.zapisBuforaMapyDoPliku();
Teren.saveToFiles(null);
// Teren.setBinarnyFormatPliku(false);
// Teren.zapisBuforaMapyDoPliku();
Teren.reset();

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
/**
*

View File

@@ -1,8 +1,8 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
import pl.wat.ms4ds.terenfunkcje.Kwadrat;
import pl.wat.ms4ds.terenfunkcje.MapConsts;
import pl.wat.ms4ds.terenfunkcje.Teren;
import pl.wat.ms4ds.terrain.Square;
import pl.wat.ms4ds.terrain.MapConsts;
import pl.wat.ms4ds.terrain.Teren;
/**
*
@@ -48,7 +48,7 @@ public class Node {
static final int BUILDINGS_COUNT;
static {
switch (MapConsts.DL_MK) {
switch (MapConsts.SS_SIZE) {
case 200:
BUILDINGS_COUNT = 8;
break;
@@ -69,11 +69,11 @@ public class Node {
public void writeAreaFeatureIntoSquare(EAreaFeature type) {
if (buildingsCount >= BUILDINGS_COUNT) {
Kwadrat kw = Teren.getKwadrat(idX, idY);
kw.setStopienZabudowy(1.0f);
Square kw = Teren.getKwadrat(idX, idY);
kw.stopienZabudowy = 1.0f;
} else if (buildingsCount > 0) {
Kwadrat kw = Teren.getKwadrat(idX, idY);
kw.setStopienZabudowy(0.5f);
Square kw = Teren.getKwadrat(idX, idY);
kw.stopienZabudowy = 0.5f;
}
}

View File

@@ -1,7 +1,7 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
import pl.wat.ms4ds.terenfunkcje.GridCoord;
import pl.wat.ms4ds.terenfunkcje.Teren;
import pl.wat.ms4ds.terrain.Coord;
import pl.wat.ms4ds.terrain.Teren;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileInputStream;
@@ -66,7 +66,7 @@ public class OpenStreetMapReader {
// Teren.setBinarnyFormatPliku(true);
}
LOGGER.debug("Poczatek zapisu danych dla regionu " + osm_fn);
Teren.zapisBuforaMapyDoPliku();
Teren.saveToFiles(null);
LOGGER.debug("Koniec zapisu danych dla regionu " + osm_fn);
}
@@ -238,8 +238,8 @@ public class OpenStreetMapReader {
switch (reader.getLocalName()) {
case "node":
if (currNode != null) {
currNode.idX = GridCoord.zamienDlugoscGeoNaIdKwadratuX(currNode.lon);
currNode.idY = GridCoord.zamienSzerokoscGeoNaIdKwadratuY(currNode.lat);
currNode.idX = Coord.zamienDlugoscGeoNaIdKwadratuX(currNode.lon);
currNode.idY = Coord.zamienSzerokoscGeoNaIdKwadratuY(currNode.lat);
if ("zabudowa".equals(genGoal) && currNode.buildingsCount > 0) {
buildingNodesMap.put(currNode.id, currNode);
}

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -1,9 +1,10 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
import pl.wat.ms4ds.common.EGeoDirection;
import pl.wat.ms4ds.terenfunkcje.*;
import pl.wat.ms4ds.terrain.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
/**
@@ -243,16 +244,16 @@ public class Way {
if (nodes.size() == 0) {
return;
}
GridCoord[] punktyLamanej = new GridCoord[nodes.size()];
Coord.Grid[] punktyLamanej = new Coord.Grid[nodes.size()];
for (int i = 0; i < nodes.size(); i++) {
punktyLamanej[i] = new GridCoord(nodes.get(i).idX, nodes.get(i).idY);
punktyLamanej[i] = new Coord.Grid(nodes.get(i).idX, nodes.get(i).idY);
}
Kwadrat kw0;
Kwadrat kw1;
GridCoord id0;
GridCoord id1;
Square kw0;
Square kw1;
Coord.Grid id0;
Coord.Grid id1;
EGeoDirection kier;
GridCoord[] kwadraty = GeomUtils.kwadratyLamanej2(punktyLamanej);
Coord.Grid[] kwadraty = GeomUtils.kwadratyLamanej2(punktyLamanej);
// float dlug = GeomUtils.dlugoscDrogiPoKwadratch(kwadraty);
for (int i = 0; i < kwadraty.length - 1; i++) {
try {
@@ -263,16 +264,16 @@ public class Way {
kier = GeomUtils.kierunekDlaSasiada(id0, id1);
switch (type) {
case ROAD:
kw0.setJestDroga(kier, true);
kw1.setJestDroga(kier.oppositeDirect(), true);
kw0.jestDroga[kier.id] = true;
kw0.jestDroga[kier.oppositeDirect().id] = true;
break;
case WATER_WAY:
kw0.setJestPrzeszkodaWodna(kier, true);
kw1.setJestPrzeszkodaWodna(kier.oppositeDirect(), true);
kw0.jestPrzeszkodaWodna[kier.id] = true;
kw0.jestPrzeszkodaWodna[kier.oppositeDirect().id] = true;
break;
case DITCH:
kw0.setJestRow(kier, true);
kw1.setJestRow(kier.oppositeDirect(), true);
kw0.jestRow[kier.id] = true;
kw0.jestRow[kier.oppositeDirect().id] = true;
break;
default:
}
@@ -282,25 +283,25 @@ public class Way {
}
}
public static void writeAreaFeatureIntoSquares2(EAreaFeature type, boolean clearFeature, GridCoord[] polygon) {
public static void writeAreaFeatureIntoSquares2(EAreaFeature type, boolean clearFeature, Coord.Grid[] polygon) {
if (polygon.length > 20) {
// podział wielokata na dwa mniejsze
int m = 2;
GridCoord pocz = polygon[0];
Coord.Grid pocz = polygon[0];
boolean poprawnyPodzial = false;
while (m < polygon.length - 1 && !poprawnyPodzial) {
// sprawdzenie, czy punkty wielokata po podziale sa po jednej stronie wektora podzialu
poprawnyPodzial = true;
GridCoord kon = polygon[m];
Coord.Grid kon = polygon[m];
for (int i = 0; i < polygon.length; i++) {
int i_puls_1 = (i + 1) % polygon.length;
boolean przeciecie = GeomUtils.intersection(pocz, kon, polygon[i], polygon[i_puls_1]);
if (przeciecie) {
// sprawdzenie, czy jakiś koniec jednego odcinka jest równy końcowi drugiego odcinka
boolean b = pocz.rowne(polygon[i].x, polygon[i].y) ||
pocz.rowne(polygon[i_puls_1].x, polygon[i_puls_1].y) ||
kon.rowne(polygon[i].x, polygon[i].y) ||
kon.rowne(polygon[i_puls_1].x, polygon[i_puls_1].y);
boolean b = pocz.equals(polygon[i]) ||
pocz.equals(polygon[i_puls_1]) ||
kon.equals(polygon[i]) ||
kon.equals(polygon[i_puls_1]);
if (!b) {
poprawnyPodzial = false;
m++;
@@ -311,13 +312,13 @@ public class Way {
}
if (poprawnyPodzial) {
// punkt podziału wielokąta jest poprawny, zatem dzielę wielokąt na dwa
GridCoord[] polygon1 = new GridCoord[m + 1];
Coord.Grid[] polygon1 = new Coord.Grid[m + 1];
for (int i = 0; i < polygon1.length; i++) {
polygon1[i] = polygon[i];
}
writeAreaFeatureIntoSquares2(type, clearFeature, polygon1);
GridCoord[] polygon2 = new GridCoord[polygon.length - m + 1];
Coord.Grid[] polygon2 = new Coord.Grid[polygon.length - m + 1];
polygon2[0] = polygon[0];
for (int i = m; i < polygon.length; i++) {
polygon2[i - m + 1] = polygon[i];
@@ -326,7 +327,7 @@ public class Way {
} else {
// nie udało się poprawnie podzielić wielokąta, zatem przesuwam wierzchołki, aby zmienić wierzchołek
// startowy, który jest wierchołkiem referencyjnym podziału (drugi wierzchołek podziału jest szukany)
GridCoord temp = polygon[0];
Coord.Grid temp = polygon[0];
for (int i = 0; i < polygon.length - 1; i++) {
polygon[i] = polygon[i + 1];
}
@@ -341,35 +342,35 @@ public class Way {
int maxX = polygon[0].x;
int maxY = polygon[0].y;
for (int i = 1; i < polygon.length; i++) {
minX = (polygon[i].x < minX) ? polygon[i].x : minX;
minY = (polygon[i].y < minY) ? polygon[i].y : minY;
maxX = (polygon[i].x > maxX) ? polygon[i].x : maxX;
maxY = (polygon[i].y > maxY) ? polygon[i].y : maxY;
minX = Math.min(polygon[i].x, minX);
minY = Math.min(polygon[i].y, minY);
maxX = Math.max(polygon[i].x, maxX);
maxY = Math.max(polygon[i].y, maxY);
}
GridCoord idTest = new GridCoord();
Coord.Grid idTest = new Coord.Grid();
boolean inside;
for (int j = maxY; j >= minY; j--) {
for (int i = minX; i <= maxX; i++) {
idTest.x = i;
idTest.y = j;
Kwadrat kw = Teren.getKwadrat(idTest.x, idTest.y);
if (kw == Kwadrat.EMPTY_SQUARE) {
Square kw = Teren.getKwadrat(idTest.x, idTest.y);
if (kw == Square.EMPTY) {
continue;
}
inside = GeomUtils.insidePolygon(polygon, idTest);
if (inside) {
switch (type) {
case FOREST:
kw.setStopienZalesienia(val);
kw.stopienZalesienia = val;
break;
case WATER:
kw.setStopienZawodnienia(val);
kw.stopienZawodnienia = val;
break;
case SWAMP:
kw.setStopienZabagnienia(val);
kw.stopienZabagnienia = val;
break;
case BUILDINGS:
kw.setStopienZabudowy(val);
kw.stopienZabudowy = val;
break;
default:
}
@@ -378,33 +379,33 @@ public class Way {
}
}
public static void writeAreaFeatureIntoSquares(EAreaFeature type, boolean clearFeature, GridCoord[] polygon,
int minX,int maxX, int minY, int maxY) {
public static void writeAreaFeatureIntoSquares(EAreaFeature type, boolean clearFeature, Coord.Grid[] polygon,
int minX, int maxX, int minY, int maxY) {
float val = (clearFeature) ? 0.0f : 1.0f;
GridCoord idTest = new GridCoord();
Coord.Grid idTest = new Coord.Grid();
boolean inside;
for (int i = minX; i <= maxX; i++) {
for (int j = minY; j <= maxY; j++) {
idTest.x = i;
idTest.y = j;
Kwadrat kw = Teren.getKwadrat(idTest.x, idTest.y);
if (kw == Kwadrat.EMPTY_SQUARE) {
Square kw = Teren.getKwadrat(idTest.x, idTest.y);
if (kw == Square.EMPTY) {
continue;
}
inside = GeomUtils.insidePolygon(polygon, idTest);
if (inside) {
switch (type) {
case FOREST:
kw.setStopienZalesienia(val);
kw.stopienZalesienia = val;
break;
case WATER:
kw.setStopienZawodnienia(val);
kw.stopienZawodnienia = val;
break;
case SWAMP:
kw.setStopienZabagnienia(val);
kw.stopienZabagnienia = val;
break;
case BUILDINGS:
kw.setStopienZabudowy(val);
kw.stopienZabudowy = val;
break;
default:
}
@@ -417,53 +418,53 @@ public class Way {
if (nodes.size() == 0) {
return;
}
Kwadrat kw;
Square kw;
float val = (clearFeature) ? 0.0f : 1.0f;
if (nodes.size() == 1) {
kw = Teren.getKwadrat(nodes.get(0).idX, nodes.get(0).idY);
switch (type) {
case FOREST:
kw.setStopienZalesienia(val);
kw.stopienZalesienia = val;
break;
case WATER:
kw.setStopienZawodnienia(val);
kw.stopienZawodnienia = val;
break;
case SWAMP:
kw.setStopienZabagnienia(val);
kw.stopienZabagnienia = val;
break;
case BUILDINGS:
kw.setStopienZabudowy(val);
kw.stopienZabudowy = val;
break;
default:
}
return;
}
if (nodes.size() == 2) {
GridCoord[] kwadraty = GeomUtils.kwadratyOdcinka(nodes.get(0).idX, nodes.get(0).idY,
Coord.Grid[] kwadraty = GeomUtils.kwadratyOdcinka(nodes.get(0).idX, nodes.get(0).idY,
nodes.get(1).idX, nodes.get(1).idY);
for (int i = 0; i < kwadraty.length; i++) {
kw = Teren.getKwadrat(kwadraty[i].x, kwadraty[i].y);
switch (type) {
case FOREST:
kw.setStopienZalesienia(val);
kw.stopienZalesienia = val;
break;
case WATER:
kw.setStopienZawodnienia(val);
kw.stopienZawodnienia = val;
break;
case SWAMP:
kw.setStopienZabagnienia(val);
kw.stopienZabagnienia = val;
break;
case BUILDINGS:
kw.setStopienZabudowy(val);
kw.stopienZabudowy = val;
break;
default:
}
}
return;
}
GridCoord[] wielokat = new GridCoord[nodes.size()];
Coord.Grid[] wielokat = new Coord.Grid[nodes.size()];
for (int i = 0; i < nodes.size(); i++) {
wielokat[i] = new GridCoord(nodes.get(i).idX, nodes.get(i).idY);
wielokat[i] = new Coord.Grid(nodes.get(i).idX, nodes.get(i).idY);
}
writeAreaFeatureIntoSquares2(type, clearFeature, wielokat);
}
@@ -472,61 +473,61 @@ public class Way {
if (nodes.size() == 0) {
return;
}
Kwadrat kw;
Square kw;
float val = (clearFeature) ? 0.0f : 1.0f;
if (nodes.size() == 1) {
kw = Teren.getKwadrat(nodes.get(0).idX, nodes.get(0).idY);
switch (type) {
case FOREST:
kw.setStopienZalesienia(val);
kw.stopienZalesienia = val;
break;
case WATER:
kw.setStopienZawodnienia(val);
kw.stopienZawodnienia = val;
break;
case SWAMP:
kw.setStopienZabagnienia(val);
kw.stopienZabagnienia = val;
break;
case BUILDINGS:
kw.setStopienZabudowy(val);
kw.stopienZabudowy = val;
break;
default:
}
return;
}
if (nodes.size() == 2) {
GridCoord[] kwadraty = GeomUtils.kwadratyOdcinka(nodes.get(0).idX, nodes.get(0).idY,
Coord.Grid[] kwadraty = GeomUtils.kwadratyOdcinka(nodes.get(0).idX, nodes.get(0).idY,
nodes.get(1).idX, nodes.get(1).idY);
for (int i = 0; i < kwadraty.length; i++) {
kw = Teren.getKwadrat(kwadraty[i].x, kwadraty[i].y);
switch (type) {
case FOREST:
kw.setStopienZalesienia(val);
kw.stopienZalesienia = val;
break;
case WATER:
kw.setStopienZawodnienia(val);
kw.stopienZawodnienia = val;
break;
case SWAMP:
kw.setStopienZabagnienia(val);
kw.stopienZabagnienia = val;
break;
case BUILDINGS:
kw.setStopienZabudowy(val);
kw.stopienZabudowy = val;
break;
default:
}
}
return;
}
GridCoord[] wielokat = new GridCoord[nodes.size()];
Coord.Grid[] wielokat = new Coord.Grid[nodes.size()];
int minX = nodes.get(0).idX;
int minY = nodes.get(0).idY;
int maxX = nodes.get(0).idX;
int maxY = nodes.get(0).idY;
for (int i = 0; i < nodes.size(); i++) {
wielokat[i] = new GridCoord(nodes.get(i).idX, nodes.get(i).idY);
minX = (wielokat[i].x < minX) ? wielokat[i].x : minX;
minY = (wielokat[i].y < minY) ? wielokat[i].y : minY;
maxX = (wielokat[i].x > maxX) ? wielokat[i].x : maxX;
maxY = (wielokat[i].y > maxY) ? wielokat[i].y : maxY;
wielokat[i] = new Coord.Grid(nodes.get(i).idX, nodes.get(i).idY);
minX = Math.min(wielokat[i].x, minX);
minY = Math.min(wielokat[i].y, minY);
maxX = Math.max(wielokat[i].x, maxX);
maxY = Math.max(wielokat[i].y, maxY);
}
int ileKwTest = (maxX - minX) * (maxY - minY);
if (ileKwTest > 100000) {
@@ -542,7 +543,7 @@ public class Way {
}
return;
}
GridCoord idTest = new GridCoord();
Coord.Grid idTest = new Coord.Grid();
boolean nalezyDoWielokata;
// int liczKw = 0;
// int liczKwObszaru = 0;
@@ -555,7 +556,7 @@ public class Way {
// char c = ' ';
// liczKw++;
kw = Teren.getKwadrat(idTest.x, idTest.y);
if (kw == Kwadrat.EMPTY_SQUARE) {
if (kw == Square.EMPTY) {
continue;
}
nalezyDoWielokata = GeomUtils.insidePolygon(wielokat, idTest);
@@ -563,16 +564,16 @@ public class Way {
// c = 'O';
switch (type) {
case FOREST:
kw.setStopienZalesienia(val);
kw.stopienZalesienia = val;
break;
case WATER:
kw.setStopienZawodnienia(val);
kw.stopienZawodnienia = val;
break;
case SWAMP:
kw.setStopienZabagnienia(val);
kw.stopienZabagnienia = val;
break;
case BUILDINGS:
kw.setStopienZabudowy(val);
kw.stopienZabudowy = val;
break;
default:
}

View File

@@ -1,8 +1,9 @@
package pl.wat.ms4ds.terenfunkcje.konwersja;
package pl.wat.ms4ds.terrain.konwersja;
import pl.wat.ms4ds.terenfunkcje.GridCoord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.wat.ms4ds.terrain.Coord;
import java.util.ArrayList;
/**
@@ -18,13 +19,13 @@ public class Worker extends Thread {
EAreaFeature type;
boolean clearFeature;
GridCoord[] polygon;
Coord.Grid[] polygon;
int minX;
int maxX;
int minY;
int maxY;
public Worker(EAreaFeature type, boolean clearFeature, GridCoord[] polygon, int minX, int maxX, int minY, int maxY) {
public Worker(EAreaFeature type, boolean clearFeature, Coord.Grid[] polygon, int minX, int maxX, int minY, int maxY) {
super("Worker_" + nr++);
this.type = type;
this.clearFeature = clearFeature;

View File

@@ -0,0 +1,41 @@
package pl.wat.ms4ds.terrain.nmt;
/**
*
*/
public class NMTData {
public int x;
public int y;
public double sum;
public int count;
public double ell;
public double nll;
public double eur;
public double nur;
public NMTData(int x, int y, double sum, int count) {
this.x = x;
this.y = y;
this.sum = sum;
this.count = count;
}
@Override
public String toString() {
return "NMTData{" +
"x=" + x +
", y=" + y +
", sum=" + sum +
", count=" + count +
", ell=" + ell +
", nll=" + nll +
", eur=" + eur +
", nur=" + nur +
'}';
}
}

View File

@@ -1,22 +1,18 @@
package pl.wat.ms4ds.terenfunkcje.nmt;
package pl.wat.ms4ds.terrain.nmt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.*;
import java.net.URI;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import java.util.HashMap;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
@@ -26,6 +22,15 @@ public class NMTDataProvider {
private static final Logger LOGGER = LoggerFactory.getLogger(NMTDataProvider.class);
public static void main(String[] args) throws Exception {
String dir = "C:/Workspace/nmt/gugik_1m/unzip/";
Set<String> files = listFiles(dir);
for (String file : files) {
String fn = file.substring(0, file.indexOf('.'));
zipFile(dir + fn);
File f = new File(dir + file);
f.delete();
}
// File dir = new File(System.getProperty("user.home") + "/nmt/gugik_SkorowidzNMT2018.gml");
// HashMap<String, String> map = new HashMap<>();
// String fn0 = "D:/nmt/gugik_SkorowidzNMT20";
@@ -38,32 +43,16 @@ public class NMTDataProvider {
//
// String dir = "C:/Workspace/nmt/gugik_1m/";
// String links_fn = "C:/Workspace/nmt/gugik_links.txt";
String dir = args[0];
String links_fn = args[1];
// String dir = args[0];
// String links_fn = args[1];
// int start = Integer.parseInt(args[2]);
// int end = Integer.parseInt(args[3]);
Set<String> files = listFiles("C:/Workspace/nmt/gugik_1m/");
// Set<String> files = listFiles("C:/Workspace/nmt/gugik_1m/");
// downloadFileSet(links_fn, start, end, dir);
// ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
// executor.execute(() -> {
// try {
// downloadFileSet(links_fn, 290, 730, dir);
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// });
// executor.execute(() -> {
// try {
// downloadFileSet(links_fn, 779, 1230, dir);
// } catch (IOException e) {
// throw new RuntimeException(e);
// }
// });
// executor.shutdown();
// executor.awaitTermination(25, TimeUnit.MINUTES);
LOGGER.info("Koniec");
}
@@ -133,7 +122,7 @@ public class NMTDataProvider {
FileOutputStream fos = new FileOutputStream(sourceFile + ".zip");
ZipOutputStream zipOut = new ZipOutputStream(fos);
File fileToZip = new File(sourceFile);
File fileToZip = new File(sourceFile + ".asc");
FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
zipOut.putNextEntry(zipEntry);

View File

@@ -0,0 +1,530 @@
package pl.wat.ms4ds.terrain.nmt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.wat.ms4ds.terrain.*;
import java.io.*;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class NMTDataReader {
private static final Logger logger = LoggerFactory.getLogger(NMTDataReader.class);
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("[ ]+");
String fn_list = "D:/work/nmt/m-33_files.txt";
String inDir = "D:/work/nmt/m-33/";
String workDir = "D:/work/temp/";
String outDir = "D:/work/kwadraty_nmt/withElevation/25m/";
Thread t = new Thread(() -> {
generateNMTData(fn_list, 0, 24000, inDir, workDir, outDir);
});
// HashMap<Coord.Grid, NMTData> nmtDataHashMap = new HashMap<>();
// try {
// readFromFile(workDir + "73232_990195_NMT-M3492Ad33.xyz", nmtDataHashMap);
// } catch (IOException e) {
// return;
// }
// generateNMTData(workDir, workDir, outDir);
t.start();
// t2.start();
Scanner s = new Scanner(System.in);
// exit
//
String s1;
while (true) {
s1 = s.nextLine();
if (s1.equals("exit")) {
stop();
break;
}
}
try {
System.out.println("Czekam");
t.join();
} catch (InterruptedException e) {
}
System.out.println("End.");
// renameFiles2(inDir, inDir);
// Set<String> files = NMTDataProvider.listFiles(inDir);
// Object[] array = files.stream().sorted().toArray();
// String[] fnames = new String[files.size()];
// for (int i = 0; i < fnames.length; i++) {
// fnames[i] = (String) array[i];
// }
// try {
// saveFileList("D:/work/nmt/asc_n-34_files.txt", fnames);
// } catch (IOException e) {
//
// }
}
static volatile boolean stop = false;
static synchronized boolean isStopped() {
return stop;
}
static synchronized void stop() {
stop = true;
}
/**
* Generuje dane na podstawie rozpakowanych danych z podanego katalogu.
*
* @param inDir
* @param workDir
* @param outDir
*/
static void generateNMTData(String inDir, String workDir, String outDir) {
Set<String> files = NMTDataProvider.listFiles(inDir);
HashMap<Coord.Grid, NMTData> nmtDataHashMap = new HashMap<>();
for (String fn : files) {
String fpath = workDir + fn;
try {
readFromFile(fpath, nmtDataHashMap);
File f = new File(fpath);
f.delete();
} catch (Exception e) {
logger.warn("Error while reading from file: {}", fpath);
try (BufferedWriter writer = new BufferedWriter(new FileWriter("D:/Work/nmt/status.txt", true))) {
writer.write("Error while processing file: " + fn);
} catch (IOException e1) {
logger.error(e1.getMessage());
}
}
}
for (Coord.Grid gridCoord : nmtDataHashMap.keySet()) {
NMTData nmtData = nmtDataHashMap.get(gridCoord);
Square square = Teren.getKwadrat(gridCoord.x, gridCoord.y);
if (square == Square.EMPTY) {
continue;
}
if (nmtData.count > 0) {
square.elevation = (float) (nmtData.sum / nmtData.count);
// Konwersja na jednostkę 0.25m i zaokrąglenie do (0.0, 0.25, 0.5, 0.75)
square.elevation *= 4;
square.elevation = (int) square.elevation;
square.elevation /= 4;
if (H_MIN >= square.elevation || H_MAX <= square.elevation) {
logger.trace("!!!Dane poza zakresem: h= {}", square.elevation);
}
}
}
nmtDataHashMap.clear();
Teren.saveToFiles(outDir);
}
/**
* Generuje dane na podstawie listy spakowanych (zip) plików z podanego katalogu.
*
* @param fn_list
* @param startPos
* @param endPos
* @param inDir
* @param workDir
* @param outDir
*/
static void generateNMTData(String fn_list, int startPos, int endPos, String inDir, String workDir, String outDir) {
File file = new File(fn_list);
ArrayList<String> fileNames = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) {
String line;
while ((line = br.readLine()) != null) {
fileNames.add(line);
}
} catch (IOException e) {
return;
}
HashMap<Coord.Grid, NMTData> nmtDataHashMap = new HashMap<>();
int count = 0;
for (int i = startPos; i < endPos; i++) {
count++;
long start = System.currentTimeMillis();
if (i >= fileNames.size()) {
break;
}
String fn = fileNames.get(i);
File f = null;
String[] unzippedFileNames = null;
try {
unzippedFileNames = unzipFile(inDir + fn, workDir);
} catch (IOException e) {
logger.warn("IO error while processing zip file: {}", inDir + fn);
try (BufferedWriter writer = new BufferedWriter(new FileWriter("D:/Work/nmt/status.txt", true))) {
writer.write("Error while processing zip file: " + fileNames.get(i) + " at position: " + i + "\n");
} catch (IOException e1) {
logger.debug(e1.getMessage());
}
} catch (Exception e) {
logger.warn(e.getMessage());
}
for (String ufn : unzippedFileNames) {
String fpath = workDir + ufn;
try {
readFromFile(fpath, nmtDataHashMap);
f = new File(fpath);
f.delete();
} catch (Exception e) {
if (f.length() < 10) {
logger.warn("File: {} is empty.", ufn);
f.delete();
} else {
logger.warn("Error while reading from file: {}.", ufn);
try (BufferedWriter writer = new BufferedWriter(new FileWriter("D:/Work/nmt/status.txt", true))) {
writer.write("Error while reading file: " + ufn + " at position: " + i + "\n");
} catch (IOException e1) {
logger.debug(e1.getMessage());
}
}
}
}
logger.debug("File processed: {}, duration= {}[ms], status: {}/{}", fn, System.currentTimeMillis() - start, i, endPos - 1);
for (Coord.Grid gridCoord : nmtDataHashMap.keySet()) {
NMTData nmtData = nmtDataHashMap.get(gridCoord);
Square square = Teren.getKwadrat(gridCoord.x, gridCoord.y);
if (square == Square.EMPTY) {
continue;
}
if (nmtData.count > 0) {
square.elevation = (float) (nmtData.sum / nmtData.count);
// Zaokrąglenie do ćwiartki metra (0.0, 0.25, 0.5, 0.75)
//
square.elevation *= 4;
square.elevation = (int) square.elevation;
square.elevation /= 4;
if (H_MIN >= square.elevation || H_MAX <= square.elevation) {
logger.trace("!!!Dane poza zakresem: h= {}", square.elevation);
}
}
}
nmtDataHashMap.clear();
if (count % 2000 == 0) {
Teren.saveToFiles(outDir);
}
// Reakcja na wymuszenie zakończenia przetwarzania.
if (isStopped()) {
Teren.saveToFiles(outDir);
try (BufferedWriter writer = new BufferedWriter(new FileWriter("D:/Work/nmt/status.txt", true))) {
writer.write("Work interrupted with the file list: " + fn_list + ", last processed file: " + fileNames.get(i) + " at position: " + i + "\n");
} catch (IOException e) {
logger.error(e.getMessage());
}
logger.info("Interrupted processing file list: {}", fn_list);
return;
}
}
Teren.saveToFiles(outDir);
try (BufferedWriter writer = new BufferedWriter(new FileWriter("D:/Work/nmt/status.txt", true))) {
int last = Math.min(fileNames.size() - 1, endPos);
writer.write("Work finished with the file list: " + fn_list + ", last processed file: " + fileNames.get(last) + " at position: " + last + "\n");
} catch (IOException e) {
logger.error(e.getMessage());
}
logger.info("Finished processing file list: {}", fn_list);
}
private static void saveFileList(String fn, String[] fileList) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter(fn));
for (String val : fileList) {
writer.write(val);
writer.newLine();
}
writer.close();
}
// usuwanie z nazwy nadmiarowych rozszerz przed rozszerzeniem
static void renameFiles(String inDir, String outDir) {
Set<String> fileNames = NMTDataProvider.listFiles(inDir);
for (String fn : fileNames) {
String nfn = fn.substring(0, fn.indexOf('.'));
File fileToMove = new File(inDir + fn);
boolean isMoved = fileToMove.renameTo(new File(outDir + nfn + ".zip"));
if (!isMoved) {
logger.warn("Failed to rename {} to {}", inDir + fn, outDir + nfn + ".zip");
}
System.out.println(nfn);
}
}
// dodanie 0 do liczb dla wyrównania długości
static void renameFiles2(String inDir, String outDir) {
Set<String> fileNames = NMTDataProvider.listFiles(inDir);
for (String fn : fileNames) {
if (fn.length() >= 20) {
continue;
}
// M-33-70-A-d-4-3.zip
// M-33-7-A-d-4-3.zip
int pos1 = fn.indexOf('-', 3);
int pos2 = fn.indexOf('-', pos1 + 1);
String f1 = fn.substring(0, pos1 + 1);
String f2 = fn.substring(pos2);
String val = fn.substring(pos1 + 1, pos2);
int v = Integer.parseInt(val);
String val_0;
if (v < 10) {
val_0 = "00" + val;
} else if (v < 100) {
val_0 = "0" + val;
} else {
val_0 = val;
}
String nfn = f1 + val_0 + f2;
File fileToMove = new File(inDir + fn);
boolean isMoved = fileToMove.renameTo(new File(outDir + nfn));
if (!isMoved) {
logger.warn("Failed to rename {} to {}", inDir + fn, outDir + nfn);
}
System.out.println(nfn);
}
}
private static void readFromFile(String fn, HashMap<Coord.Grid, NMTData> nmtDataHashMap) throws IOException {
File file = new File(fn);
InputStream inputStream = new FileInputStream(file);
try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
String line = br.readLine();
// Dzieli na podstringi biorąc jako znak podziału spację i jej wielokrotność
// nawias kwadratowy zawiera znaki podziału
String[] split = line.split("[ ]+");
// Identyfikacja formatu na podstawie liczby danych w pierwszej linii.
if (split.length == 2) {
// ASC GRID format
readASC(br, line, nmtDataHashMap);
} else {
// split.length ==3
// XYZ format
readXYZ(br, line, nmtDataHashMap);
}
}
}
static final int H_MIN = -70;
static final int H_MAX = 2660;
private static void readASC(BufferedReader br, String firstLine, HashMap<Coord.Grid, NMTData> nmtDataHashMap) throws IOException {
String line = firstLine;
// Dzieli na podstringi biorąc jako znak podziału spację i jej wielokrotność
// nawias kwadratowy zawiera znaki podziału
String[] split = line.split("[ ]+");
int ncols = Integer.parseInt(split[1]);
line = br.readLine();
split = line.split("[ ]+");
int nrows = Integer.parseInt(split[1]);
line = br.readLine();
split = line.split("[ ]+");
double xll_puwg = Double.parseDouble(split[1]);
line = br.readLine();
split = line.split("[ ]+");
double yll_puwg = Double.parseDouble(split[1]);
line = br.readLine();
split = line.split("[ ]+");
double cellsize = Double.parseDouble(split[1]);
line = br.readLine();
split = line.split("[ ]+");
double nodata = Double.parseDouble(split[1]);
double[][] data = new double[nrows][ncols];
String s;
for (int i = nrows - 1; i >= 0; i--) {
line = br.readLine();
// start od 0 (brak spacji na początku) lub 1 (wiersz zaczyna się od spacji)
int start = (line.charAt(0) == ' ') ? 1 : 0;
int end;
for (int j = 0; j < ncols - 1; j++) {
end = line.indexOf(' ', start);
while (end - start == 0 && start < line.length() - 1) {
start = end + 1;
end = line.indexOf(' ', start);
}
s = line.substring(start, end);
start = end + 1;
data[i][j] = Double.parseDouble(s);
}
end = line.indexOf(' ', start);
while (end - start == 0 && start < line.length() - 1) {
start = end + 1;
end = line.indexOf(' ', start);
}
s = line.substring(start);
data[i][ncols - 1] = Double.parseDouble(s);
}
NMTData nmtData = new NMTData(-1, -1, 0, 0);
Coord.Geo geoCoord = new Coord.Geo();
Coord.Puwg puwgCoord = new Coord.Puwg();
double h;
int x;
int y;
double y_puwg = yll_puwg;
for (int i = 0; i < nrows; i++) {
double x_puwg = xll_puwg;
for (int j = 0; j < ncols; j++) {
h = data[i][j];
if (h == nodata) {
// Przejdź do następnej kolumny danych.
x_puwg += cellsize;
continue;
}
if (nmtData.ell > x_puwg || nmtData.eur < x_puwg || nmtData.nll > y_puwg || nmtData.nur < y_puwg) {
// Punkt poza granicą bieżącego kwadratu.
Coord.convertPUWG1992ToWGS84(y_puwg, x_puwg, geoCoord);
x = Coord.zamienDlugoscGeoNaIdKwadratuX(geoCoord.lon);
y = Coord.zamienSzerokoscGeoNaIdKwadratuY(geoCoord.lat);
final int x1 = x;
final int y1 = y;
nmtData = nmtDataHashMap.computeIfAbsent(new Coord.Grid(x, y), k -> new NMTData(x1, y1, 0, 0));
if (nmtData.nur == 0) {
// Kwadrat jeszcze nie był odczytany (czysty).
// Współrzędne geo środka kwadratu.
geoCoord.lon = Coord.zamienIdKwadratuXNaDlugoscGeo(x);
geoCoord.lat = Coord.zamienIdKwadratuYNaSzerokoscGeo(y);
// Wyznacz współrzędne PUWG lewego dolnego rogu kwadratu.
Coord.convertWGS84ToPUWG1992(geoCoord.lat - MapConsts.DELTA_Y / 2, geoCoord.lon - MapConsts.DELTA_X / 2, puwgCoord);
nmtData.ell = (int) puwgCoord.easting;
nmtData.nll = (int) puwgCoord.northing;
// Wyznacz współrzędne PUWG prawego górnego rogu kwadratu.
Coord.convertWGS84ToPUWG1992(geoCoord.lat + MapConsts.DELTA_Y / 2, geoCoord.lon + MapConsts.DELTA_X / 2, puwgCoord);
nmtData.eur = (int) puwgCoord.easting;
nmtData.nur = (int) puwgCoord.northing;
}
}
if (H_MIN < h && h < H_MAX) {
// Filtracja danych z rozsądnego zakresu dla Polski.
nmtData.sum += h;
nmtData.count++;
} else {
logger.trace("!!!Dane poza zakresem: h= {}, [i,j]=[{},{}]", h, i, j);
}
// Przejdź do następnej kolumny.
x_puwg += cellsize;
}
// Przejdź do następnego wiersza.
y_puwg += cellsize;
}
}
private static void readXYZ(BufferedReader br, String firstLine, HashMap<Coord.Grid, NMTData> nmtDataHashMap) throws IOException {
Coord.Puwg puwgCoord = new Coord.Puwg();
Coord.Geo geo = new Coord.Geo();
String line = firstLine;
if (line.charAt(0) == 'S' || line.charAt(0) == 'E') {
line = br.readLine();
}
char c = ' ';
if (line.indexOf('\t', 1) != -1) {
c = '\t';
}
double x_puwg;
double y_puwg;
double h;
int x;
int y;
NMTData nmtData = new NMTData(-1, -1, 0, 0);
int start;
int end;
int row = 0;
while (line != null) {
if (line.length() < 5 || line.charAt(0) == 'S' || line.charAt(0) == 'E') {
line = br.readLine();
row++;
continue;
}
// start od 0, gdyż nie ma spacji na początku
start = 0;
end = line.indexOf(c, start);
while (end - start == 0 && start < line.length() - 1) {
start = end + 1;
end = line.indexOf(c, start);
}
String s = line.substring(start, end);
x_puwg = Double.parseDouble(s);
start = end + 1;
end = line.indexOf(c, start);
while (end - start == 0 && start < line.length() - 1) {
start = end + 1;
end = line.indexOf(c, start);
}
s = line.substring(start, end);
y_puwg = Double.parseDouble(s);
start = end + 1;
s = line.substring(start);
h = Double.parseDouble(s);
if (nmtData.ell > x_puwg || nmtData.eur < x_puwg || nmtData.nll > y_puwg || nmtData.nur < y_puwg) {
// Punkt poza granicą bieżącego kwadratu.
Coord.convertPUWG1992ToWGS84(y_puwg, x_puwg, geo);
x = Coord.zamienDlugoscGeoNaIdKwadratuX(geo.lon);
y = Coord.zamienSzerokoscGeoNaIdKwadratuY(geo.lat);
final int x1 = x;
final int y1 = y;
nmtData = nmtDataHashMap.computeIfAbsent(new Coord.Grid(x1, y1), k -> new NMTData(x1, y1, 0, 0));
if (nmtData.nur == 0) {
// Kwadrat jeszcze nie był odczytany (czysty).
// Współrzędne geo środka kwadratu.
geo.lon = Coord.zamienIdKwadratuXNaDlugoscGeo(x);
geo.lat = Coord.zamienIdKwadratuYNaSzerokoscGeo(y);
// Wyznacz współrzędne PUWG lewego dolnego rogu kwadratu.
Coord.convertWGS84ToPUWG1992(geo.lat - MapConsts.DELTA_Y / 2, geo.lon - MapConsts.DELTA_X / 2, puwgCoord);
nmtData.ell = (int) puwgCoord.easting;
nmtData.nll = (int) puwgCoord.northing;
// Wyznacz współrzędne PUWG prawego górnego rogu kwadratu.
Coord.convertWGS84ToPUWG1992(geo.lat + MapConsts.DELTA_Y / 2, geo.lon + MapConsts.DELTA_X / 2, puwgCoord);
nmtData.eur = (int) puwgCoord.easting;
nmtData.nur = (int) puwgCoord.northing;
}
}
if (H_MIN < h && h < H_MAX) {
// Filtracja danych z rozsądnego zakresu dla Polski.
nmtData.sum += h;
nmtData.count++;
} else {
logger.trace("!!!Dane poza zakresem: h= {}, row={}", h, row);
}
line = br.readLine();
row++;
}
}
public static String[] unzipFile(String zipFileName, String destDir) throws IOException {
byte[] buffer = new byte[1024];
String[] unzipFileNames = new String[10];
int i = 0;
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFileName))) {
ZipEntry zipEntry = zis.getNextEntry();
while (zipEntry != null) {
unzipFileNames[i] = zipEntry.getName();
File newFile = new File(destDir + unzipFileNames[i]);
// File newFile = new File(destDir + File.separator + unzipFileName);
int len;
// write file content
FileOutputStream fos = new FileOutputStream(newFile);
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
zipEntry = zis.getNextEntry();
i++;
}
zis.closeEntry();
}
if (i > 0) {
unzipFileNames = Arrays.copyOf(unzipFileNames, i);
} else {
unzipFileNames = new String[0];
}
return unzipFileNames;
}
}

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
public class DbfField {

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
import java.io.BufferedInputStream;
import java.io.UnsupportedEncodingException;

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
import java.io.BufferedInputStream;
import java.nio.charset.StandardCharsets;

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
public class Main {
@@ -6,8 +6,7 @@ public class Main {
static void main(String[] args) {
try {
// GET DIRECTORY
String curDir = (args[0] != null) ? args[0] : System.getProperty("user.dir");
curDir = "";
String curDir = (args.length > 0) ? args[0] : "";
String folder = "C:/Workspace/osm/dolnoslaskie-251217-free.shp/";
// LOAD SHAPE FILE (.shp, .shx, .dbf)

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
import java.io.BufferedInputStream;
import java.io.File;
@@ -84,34 +84,34 @@ public class OsmShapeFileReader {
ShpShape shape = null;
DbfRecord info = null;
switch (shpHeader.shapeType) {
// case Point, PointZ, PointM:
// shape = new ShpPoint(shpHeader.shapeType);
// shape.read(bisShp);
// info = new DbfRecord();
// info.read(bisDbf, dbfHeader);
// shape.setInfo(info);
// return shape;
// case PolyLine, PolyLineZ, PolyLineM:
// shape = new ShpPolyLine(shpHeader.shapeType);
// shape.read(bisShp);
// info = new DbfRecord();
// info.read(bisDbf, dbfHeader);
// shape.setInfo(info);
// return shape;
// case Polygon, PolygonZ, PolygonM:
// shape = new ShpPolygon(shpHeader.shapeType);
// shape.read(bisShp);
// info = new DbfRecord();
// info.read(bisDbf, dbfHeader);
// shape.setInfo(info);
// return shape;
// case MultiPoint, MultiPointZ, MultiPointM:
// shape = new ShpMultiPoint(shpHeader.shapeType);
// shape.read(bisShp);
// info = new DbfRecord();
// info.read(bisDbf, dbfHeader);
// shape.setInfo(info);
// return shape;
case Point, PointZ, PointM:
shape = new ShpPoint(shpHeader.shapeType);
shape.read(bisShp);
info = new DbfRecord();
info.read(bisDbf, dbfHeader);
shape.setInfo(info);
return shape;
case PolyLine, PolyLineZ, PolyLineM:
shape = new ShpPolyLine(shpHeader.shapeType);
shape.read(bisShp);
info = new DbfRecord();
info.read(bisDbf, dbfHeader);
shape.setInfo(info);
return shape;
case Polygon, PolygonZ, PolygonM:
shape = new ShpPolygon(shpHeader.shapeType);
shape.read(bisShp);
info = new DbfRecord();
info.read(bisDbf, dbfHeader);
shape.setInfo(info);
return shape;
case MultiPoint, MultiPointZ, MultiPointM:
shape = new ShpMultiPoint(shpHeader.shapeType);
shape.read(bisShp);
info = new DbfRecord();
info.read(bisDbf, dbfHeader);
shape.setInfo(info);
return shape;
default:
return shape;
}

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
import java.io.*;
import java.nio.ByteBuffer;

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
import java.nio.ByteBuffer;

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
import java.nio.ByteBuffer;

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
import java.nio.ByteBuffer;

View File

@@ -1,7 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
import java.nio.ByteBuffer;
import java.util.Locale;
package pl.wat.ms4ds.terrain.osm.shapefile;
/**
* Shape: PolyLine.<br>

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
/**

View File

@@ -1,4 +1,4 @@
package pl.wat.ms4ds.terenfunkcje.osm.shapefile;
package pl.wat.ms4ds.terrain.osm.shapefile;
import java.io.BufferedInputStream;
import java.nio.ByteBuffer;

View File

@@ -4,26 +4,18 @@ x_ref=14
y_ref=49
dx_ref=11
dy_ref=7
#kwadraty_dir=c:/Workspace/git/teren-funkcje/au2data/new_teren/Polska/kwadraty/
#kwadraty_dir=D:/work/kwadraty_nmt/withElevation/
#kwadraty_dir=D:/Workspace/_data/new/
kwadraty_dir=C:/Workspace/_data/swdt/ms4ds/teren/kwadraty/
drogi_dir=au2data/new_teren/Polska/drogi/
#Afganistan
#Wspolrzedne referencyjne i wielkosc obszaru
#x_ref=60
#y_ref=29
#dx_ref=15
#dy_ref=10
#kwadraty_dir=/au2data/new_teren/Afganistan/kwadraty/
#drogi_dir=/au2data/new_teren/Afganistan/drogi/
#
#Rozdzielczosc terenu dl_mk=200 | 100 | 50 | 25 | 20
dl_mk=100
#
#W celu wymuszenia (mimo jej braku) przejezdności terenu nalezy ustawić na: on
przejezdnosc_zawsze=off
minimalny_stopien_przejezdnosci=0.1
#
#Minimalny stopień przejezdności dla ruchu na przełaj dla kwadratów przejezdnych
#dla algorytmów wyznaczania dróg dla działań typu: atak, obrona, rozmieszczenie, ...
stopien_przejezdnosci.minimalny_na_przelaj=0.7
@@ -42,32 +34,32 @@ stopien_przejezdnosci.na_drodze.nachylenie_terenu.kat_maksymalny=50
stopien_przejezdnosci.na_przelaj.nachylenie_terenu.kat_minimalny=15
#Maksymalny kąt nachylenia terenu wpływający na stopień przejezdności (alfa_min) dla ruchu na przełaj [stopnie]
stopien_przejezdnosci.na_przelaj.nachylenie_terenu.kat_maksymalny=45
#
#stopień przejezdności - parametr dla symulacji ruchu
stopien_przejezdnosci.podwozie_gasienicowe.teren_zabudowany=0.8
stopien_przejezdnosci.podwozie_gasienicowe.teren_zalesiony=0.25
stopien_przejezdnosci.podwozie_gasienicowe.teren_zabagniony=0.2
stopien_przejezdnosci.podwozie_gasienicowe.teren_zawodniony=0.0
stopien_przejezdnosci.podwozie_gasienicowe.teren_czysty=1.0
#
stopien_przejezdnosci.podwozie_kolowo_gasienicowe.teren_zabudowany=0.7
stopien_przejezdnosci.podwozie_kolowo_gasienicowe.teren_zalesiony=0.15
stopien_przejezdnosci.podwozie_kolowo_gasienicowe.teren_zabagniony=0.1
stopien_przejezdnosci.podwozie_kolowo_gasienicowe.teren_zawodniony=0.0
stopien_przejezdnosci.podwozie_kolowo_gasienicowe.teren_czysty=0.9
#
stopien_przejezdnosci.podwozie_kolowe.teren_zabudowany=0.6
stopien_przejezdnosci.podwozie_kolowe.teren_zalesiony=0.1
stopien_przejezdnosci.podwozie_kolowe.teren_zabagniony=0.05
stopien_przejezdnosci.podwozie_kolowe.teren_zawodniony=0.0
stopien_przejezdnosci.podwozie_kolowe.teren_czysty=0.8
#
stopien_przejezdnosci.podwozie_poduszka.teren_zabudowany=0.7
stopien_przejezdnosci.podwozie_poduszka.teren_zalesiony=0.1
stopien_przejezdnosci.podwozie_poduszka.teren_zabagniony=0.9
stopien_przejezdnosci.podwozie_poduszka.teren_zawodniony=1.0
stopien_przejezdnosci.podwozie_poduszka.teren_czysty=1.0
#
stopien_przejezdnosci.podwozie_plozy.teren_zabudowany=0.1
stopien_przejezdnosci.podwozie_plozy.teren_zalesiony=0.1
stopien_przejezdnosci.podwozie_plozy.teren_zabagniony=0.1