Crocetti2024
Will return the ZWD prediction for a requested latitude, longitude, height, and time/timespan.
The model will only return ZWD predictions at full hours. If the query time or timespan does not cover full
hours, the surrounding time is provided.
For example: if the query time is 00:03:00, it will return a ZWD prediction for 00:00:00
and one for 01:00:00.
Interpolation to 00:03:00 must be performed by the user.
Important: ZWD predictions using the Crocetti2024 approach are limited to the year 2019! For predictions outside 2019, use the ZWDX approach.
Parameter | Value | Example |
---|---|---|
"lat" |
Query latitude in degrees | -15.322 |
"lon" |
Query longitude in degrees | 302.231 |
"height" |
Query height in meters (WGS84) | 132.13 |
"time" 1 |
String, query time. Format: "yyyy-mm-dd HH:MM:SS" |
"2019-01-31 12:34:56" |
"time_range" 1 |
String, query timespan. Format: "yyyy-mm-dd HH:MM:SS/yyyy-mm-dd HH:MM:SS" |
"2019-01-31 12:34:56/2019-01-31 14:02:10" |
Return: Dictinary with following key/value pairs:
Key | Value | Example |
---|---|---|
"zwd" |
Dictionary with time as key and predicted ZWD in millimeter as value | "zwd":{"2019-01-01 00:00:00":80.79846954345703,"2019-01-01 01:00:00":76.88582611083984}
|
"source" |
Dictionary with time as key and data source of meteorological features ("ERA5(T)" or "yyyy-mm-dd.HH"
indicating forecast file) as value
|
"source":{"2019-01-01 00:00:00":"ERA5(T)","2019-01-01 01:00:00":"ERA5(T)"} |
"_duration_load_q" |
Duration to load meteorological parameters | "_duration_load_q":"0.1 [s]" |
"_duration_predict" |
Duration to make ZWD predictions | "_duration_predict":"0.0 [s]" |
"_model" |
Machine learning model version | "_model":"v000" |
"_unit" |
ZWD unit | "_unit":"[mm]" |
ZWDX
Currently under development
Examples
curl
Can be executed from most terminals:Request for time:
curl -L -H"Content-Type: application/json" -d '{"lat":12.1311,"lon":13.1313,"height":331.131,"time":"2019-01-01 00:00:00"}' https://test-zwd.space01.phys.ethz.ch/Crocetti2024
Request for timespan:
curl -L -H"Content-Type: application/json" -d '{"lat":12.1311,"lon":13.1313,"height":331.131,"time_range":"2019-01-01 00:00:00/2019-03-01 23:00:00"}' https://test-zwd.space01.phys.ethz.ch/Crocetti2024
Python
import requests
import json
url = "https://test.space01.phys.ethz.ch/return_sum"
headers = {
"Content-Type": "application/json"
}
data = {
"lat": 12.1311,
"lon": 13.1313,
"height": 331.131,
# "time": "2019-01-01 00:00:00" # request for time
"time_range": "2019-01-01 00:00:00/2019-01-01 23:00:00" # request for timespan
}
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
print("Request was successful")
print(response.text)
else:
print(f"Request failed with status code {response.status_code}")
if you want to get your ZWD as a Pandas DataFrame, you can simply convert it:
import pandas as pd
...
if response.status_code == 200:
data = response.json()
df = pd.DataFrame.from_dict(data["zwd"], orient="index", columns=["ZWD"])
df.index = pd.to_datetime(df.index)
Matlab
url = 'https://test-zwd.space01.phys.ethz.ch/Crocetti2024/';
data = struct(...
'lat', 12.1311, ...
'lon', 13.1313, ...
'height', 331.131, ...
... % 'time', '2019-01-01 00:00:00' ... % request for time
'time_range', '2019-01-01 00:00:00/2019-01-01 23:00:00' ... % request for timespan
);
options = weboptions('RequestMethod', 'post');
options.HeaderFields = {'Content-Type', 'application/json'};
request = matlab.net.http.RequestMessage;
uri = matlab.net.URI(url);
[response,completedrequest,history] = send(request,uri);
finaluri = history(end).URI;
response = webwrite(url, data, options);
disp(response);
disp(response.zwd)
C++
CMakeLists.txt
cmake_minimum_required(VERSION 3.17)
project(project_name)
# Find the libcurl package
find_package(CURL REQUIRED)
set(CMAKE_CXX_STANDARD 20)
add_executable(project_name main.cpp)
# Link against the libcurl library
target_link_libraries(project_name CURL::libcurl)
main.cpp
#include <iostream>
#include <string>
#include <curl/curl.h>
// Callback function to capture response data
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {
size_t totalSize = size * nmemb;
output->append(static_cast<char*>(contents), totalSize);
return totalSize;
}
int main() {
// Initialize libcurl
CURL* curl = curl_easy_init();
if (curl) {
// Set the URL
const char* url = "https://test-zwd.space01.phys.ethz.ch/Crocetti2024";
curl_easy_setopt(curl, CURLOPT_URL, url);
// Set the request headers
struct curl_slist* headers = nullptr;
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// Set the request data
const char* data = "{\"lat\":12.1311,\"lon\":13.1313,\"height\":331.131,\"time\":\"2019-01-01 00:00:00\"}";
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
// Follow redirects
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
// Response data
std::string response_data;
// Set the callback to capture the response data
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_data);
// Perform the request
CURLcode res = curl_easy_perform(curl);
// Check for errors
if (res != CURLE_OK) {
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
} else {
// Response data is now in 'response_data'
std::cout << "Response Data: " << response_data << std::endl;
// Parse the JSON response to access the "zwd" variable
// You'll need a JSON parsing library for this task
// For example, you can use a library like nlohmann/json, or cJSON.
// Example parsing using nlohmann/json:
// #include <nlohmann/json.hpp>
// nlohmann::json json_response = nlohmann::json::parse(response_data);
// double zwd = json_response["zwd"];
// std::cout << "zwd: " << zwd << std::endl;
}
// Cleanup
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
return 0;
}