216 lines
4.9 KiB
Java
216 lines
4.9 KiB
Java
package eirb.pg203.weather.data;
|
|
|
|
import java.time.Instant;
|
|
import java.util.Locale;
|
|
|
|
import org.json.JSONObject;
|
|
|
|
import eirb.pg203.weather.utils.City;
|
|
|
|
public class WeatherData {
|
|
public enum Condition {
|
|
SUNNY("☀️"),
|
|
PARTIAL("🌤"),
|
|
CLOUDY("☁️"),
|
|
RAINY("🌧"),
|
|
ERROR("E");
|
|
|
|
private String desc;
|
|
Condition(String desc) { this.desc = desc; }
|
|
|
|
public static Condition fromString(String desc) {
|
|
switch (desc) {
|
|
case "☀️":
|
|
return SUNNY;
|
|
|
|
case "🌤":
|
|
return PARTIAL;
|
|
|
|
case "☁️":
|
|
return CLOUDY;
|
|
|
|
case "🌧":
|
|
return RAINY;
|
|
|
|
default:
|
|
return ERROR;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return this.desc;
|
|
}
|
|
}
|
|
|
|
enum WindDirection {
|
|
N("🡩"),
|
|
NE("🡭"),
|
|
E("🡪"),
|
|
SE("🡮"),
|
|
S("🡫"),
|
|
SW("🡯"),
|
|
W("🡨"),
|
|
NW("🡬"),
|
|
ERROR("E");
|
|
|
|
public static WindDirection fromString(String desc) {
|
|
switch (desc) {
|
|
case "🡩":
|
|
return N;
|
|
case "🡭":
|
|
return NE;
|
|
case "🡪":
|
|
return E;
|
|
case "🡮":
|
|
return SE;
|
|
case "🡫":
|
|
return S;
|
|
case "🡯":
|
|
return SW;
|
|
case "🡨":
|
|
return W;
|
|
case "🡬":
|
|
return NW;
|
|
default:
|
|
return ERROR;
|
|
}
|
|
}
|
|
|
|
private String desc;
|
|
WindDirection(String desc) {this.desc = desc;}
|
|
|
|
@Override
|
|
public String toString(){ return this.desc;};
|
|
}
|
|
|
|
|
|
private City city;
|
|
private Instant date;
|
|
private float temp;
|
|
private Condition condition; // cloudly, sunny ...
|
|
private float windSpeed;
|
|
private float windDirectionAngle;
|
|
private WindDirection windDirection;
|
|
|
|
|
|
private WindDirection getWindDirection(float windDirectionAngle) {
|
|
if ((windDirectionAngle >= 337.5 && windDirectionAngle <= 360) || (windDirectionAngle >= 0 && windDirectionAngle <= 22.5))
|
|
return WindDirection.N;
|
|
if (windDirectionAngle > 22.5 && windDirectionAngle <= 67.5)
|
|
return WindDirection.NE;
|
|
if (windDirectionAngle > 67.5 && windDirectionAngle <= 112.5)
|
|
return WindDirection.E;
|
|
if (windDirectionAngle > 112.5 && windDirectionAngle <= 157.5)
|
|
return WindDirection.SE;
|
|
if (windDirectionAngle > 157.5 && windDirectionAngle <= 202.5)
|
|
return WindDirection.S;
|
|
if (windDirectionAngle > 202.5 && windDirectionAngle <= 247.5)
|
|
return WindDirection.SW;
|
|
if (windDirectionAngle > 247.5 && windDirectionAngle <= 292.5)
|
|
return WindDirection.W;
|
|
if (windDirectionAngle > 292.5 && windDirectionAngle <= 337.5)
|
|
return WindDirection.NW;
|
|
|
|
return WindDirection.ERROR;
|
|
|
|
}
|
|
|
|
public WeatherData(City city, Instant date, float temp, float windSpeed, float windDirectionAngle, Condition condition) {
|
|
this.city = city;
|
|
this.date = date;
|
|
this.temp = temp;
|
|
this.condition = condition;
|
|
this.windSpeed = windSpeed;
|
|
this.windDirectionAngle = windDirectionAngle;
|
|
this.windDirection = this.getWindDirection(windDirectionAngle);
|
|
}
|
|
|
|
public City getCity() {
|
|
return city;
|
|
}
|
|
|
|
public Instant getDate() {
|
|
return date;
|
|
}
|
|
|
|
public Condition getCondition() {
|
|
return condition;
|
|
}
|
|
|
|
public float getTemp() {
|
|
return temp;
|
|
}
|
|
|
|
public float getWindSpeed() {
|
|
return windSpeed;
|
|
}
|
|
|
|
public float getWindDirectionAngle() {return this.windDirectionAngle;}
|
|
|
|
public WindDirection getWindDirection() {
|
|
return windDirection;
|
|
}
|
|
|
|
public void setCity(City city) {
|
|
this.city = city;
|
|
}
|
|
|
|
public void setDate(Instant date) {
|
|
this.date = date;
|
|
}
|
|
|
|
public void setCondition(Condition condition) {
|
|
this.condition = condition;
|
|
}
|
|
|
|
public void setTemp(float temp) {
|
|
this.temp = temp;
|
|
}
|
|
|
|
public void setWindSpeed(float windSpeed) {
|
|
this.windSpeed = windSpeed;
|
|
}
|
|
|
|
public void setWindDirectionAngle(float windDirectionAngle) {
|
|
this.windDirectionAngle = windDirectionAngle;
|
|
this.windDirection = this.getWindDirection(windDirectionAngle);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return String.format(Locale.ENGLISH, "%05.2f° %s %05.2fkm/h %06.2f° %s",
|
|
this.getTemp(),
|
|
this.getCondition().toString(),
|
|
this.getWindSpeed(),
|
|
this.getWindDirectionAngle(),
|
|
this.getWindDirection().toString()
|
|
);
|
|
}
|
|
|
|
public JSONObject toJSON() {
|
|
JSONObject jsonObject = new JSONObject();
|
|
|
|
jsonObject.put("city", city.getCityName());
|
|
jsonObject.put("date", date.toEpochMilli());
|
|
jsonObject.put("temp", temp);
|
|
jsonObject.put("condition", condition.toString());
|
|
jsonObject.put("windSpeed", windSpeed);
|
|
jsonObject.put("windDirectionAngle", windDirectionAngle);
|
|
jsonObject.put("windDirection", windDirection.toString());
|
|
|
|
return jsonObject;
|
|
}
|
|
|
|
public static WeatherData fromJSON(JSONObject data) {
|
|
City city = new City(data.getString("city"));
|
|
Instant date = Instant.ofEpochMilli(data.getLong("date"));
|
|
float temp = data.getFloat("temp");
|
|
float windSpeed = data.getFloat("windSpeed");
|
|
float windDirectionAngle = data.getFloat("windDirectionAngle");
|
|
Condition condition = Condition.fromString(data.getString("windDirection"));
|
|
|
|
return new WeatherData(city, date, temp, windSpeed, windDirectionAngle, condition);
|
|
}
|
|
}
|