Browse Source

Добавлен расчет координат станции и timestamp_ns для каждого страйка

master v0.1.2
FedorSarafanov 3 years ago
parent
commit
d95a3f355b
  1. 2
      setup.py
  2. 59
      src/main.cpp

2
setup.py

@ -6,7 +6,7 @@ from pybind11 import get_cmake_dir
from pybind11.setup_helpers import Pybind11Extension, build_ext from pybind11.setup_helpers import Pybind11Extension, build_ext
from setuptools import setup from setuptools import setup
__version__ = "0.1.1" __version__ = "0.1.2"
ext_modules = [ ext_modules = [
Pybind11Extension( Pybind11Extension(

59
src/main.cpp

@ -3,6 +3,8 @@
#include <pybind11/stl.h> #include <pybind11/stl.h>
#include <vector> #include <vector>
#include <fstream> #include <fstream>
#include <ctime>
#include <cmath>
#include "stormpci.h" #include "stormpci.h"
#define STRINGIFY(x) #x #define STRINGIFY(x) #x
@ -18,6 +20,26 @@ typedef struct {
} BlockBinary; } BlockBinary;
double haversine(double angle){
return sin(angle / 2.0)*sin(angle / 2.0);
}
double inverse_haversine(double value){
return 2.0 * asin(sqrt(value));
}
double distance(double lat1, double lon1, double lat2, double lon2)
{
double theta = (lon2 - lon1) * M_PI / 180;
double phi1 = lat1 * M_PI / 180;
double phi2 = lat2 * M_PI / 180;
double curve = inverse_haversine(haversine(phi1 - phi2) +
cos(phi1) * cos(phi2) * haversine(theta));
return curve * 6'371'000;
}
class BlockReader class BlockReader
{ {
public: public:
@ -155,6 +177,43 @@ PYBIND11_MODULE(stormpci_bin_reader, m) {
.def_readonly("EastPol", &StrikeData::EastPol) .def_readonly("EastPol", &StrikeData::EastPol)
.def_readonly("EFieldPol", &StrikeData::EFieldPol) .def_readonly("EFieldPol", &StrikeData::EFieldPol)
.def_readonly("lts2_data", &StrikeData::lts2_data) .def_readonly("lts2_data", &StrikeData::lts2_data)
.def_property_readonly("_timestamp_ns", [](const StrikeData &strike) {
std::tm tm {};
tm.tm_year = (int)strike.lts2_data.year - 1900;
tm.tm_mon = (int)strike.lts2_data.month - 1;
tm.tm_mday = (int)strike.lts2_data.day;
tm.tm_hour = (int)strike.lts2_data.hours;
tm.tm_min = (int)strike.lts2_data.minutes;
tm.tm_sec = (int)strike.lts2_data.seconds;
tm.tm_isdst = 0;
std::time_t epoch_s = std::mktime(&tm);
unsigned long long oscillator_ns = ((unsigned long long)strike.lts2_data.TS_time*1'000'000'000)/(unsigned long long)strike.lts2_data.TS_Osc;
unsigned long long timestamp_ns = epoch_s*1'000'000'000 + oscillator_ns;
return timestamp_ns;
})
.def_property_readonly("_station_coords", [](const StrikeData &strike) {
double lat = (double)strike.lts2_data.latitude_mas / 324000000 * 90;
double lon = (double)strike.lts2_data.longitude_mas / 648000000 * 180;
switch(strike.lts2_data.latitude_ns)
{
case 'N': break;
case 'S': lat = -lat; break;
}
switch(strike.lts2_data.longitude_ew)
{
case 'E': break;
case 'W': lon = -lon; break;
}
return std::pair(lat, lon);
})
; ;

Loading…
Cancel
Save