3D优化
This commit is contained in:
@@ -1,12 +1,56 @@
|
||||
#include "Database.h"
|
||||
#include "Data_Source.h"
|
||||
#include "../server/Global.h"
|
||||
#include "../server/Performance_Monitor.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <chrono>
|
||||
#include <cmath>
|
||||
#include <functional>
|
||||
#include <map>
|
||||
#include <string_view>
|
||||
|
||||
namespace {
|
||||
double to_radians(double degrees) {
|
||||
return degrees * 3.14159265358979323846 / 180.0;
|
||||
}
|
||||
double to_degrees(double radians) {
|
||||
return radians * 180.0 / 3.14159265358979323846;
|
||||
}
|
||||
bool aircraft_in_base_station_radio_range(const std::optional<SSR::Position_3D> &base_position,
|
||||
const SSR::Position_Info &position,
|
||||
double factor) {
|
||||
if (!base_position) {
|
||||
return true;
|
||||
}
|
||||
return SSR::CPR::in_radio_line_of_sight_range(*base_position, base_position->alt, position, position.alt, factor);
|
||||
}
|
||||
double track_heading_from_points(const SSR::Position_Info &first,
|
||||
const SSR::Position_Info &second) {
|
||||
auto lat1 = to_radians(first.lat);
|
||||
auto lat2 = to_radians(second.lat);
|
||||
auto dlon = to_radians(second.lon - first.lon);
|
||||
auto y = std::sin(dlon) * std::cos(lat2);
|
||||
auto x = std::cos(lat1) * std::sin(lat2) -
|
||||
std::sin(lat1) * std::cos(lat2) * std::cos(dlon);
|
||||
auto angle = to_degrees(std::atan2(y, x));
|
||||
return angle < 0 ? angle + 360.0 : angle;
|
||||
}
|
||||
double track_pitch_from_points(const SSR::Position_Info &first,
|
||||
const SSR::Position_Info &second) {
|
||||
auto distance = SSR::CPR::haversine(first, second);
|
||||
return std::atan2(second.alt - first.alt, distance) * 180.0 /
|
||||
3.14159265358979323846;
|
||||
}
|
||||
Psc::JSON track_orientation_json_from_points(const SSR::Position_Info &first,
|
||||
const SSR::Position_Info &second) {
|
||||
auto ret = Psc::JSON::object();
|
||||
ret.append({"heading", track_heading_from_points(first, second)});
|
||||
ret.append({"pitch", track_pitch_from_points(first, second)});
|
||||
ret.append({"roll", 0.0});
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
Aircraft::Aircraft(std::string_view icao) : Aircraft_Info(icao) {
|
||||
auto size = Global::instance()->mode_acs.max_track_point_size.load();
|
||||
air_pos_track_list.init(size);
|
||||
@@ -77,14 +121,34 @@ Psc::JSON DataBase::get_aircraftlist(int limit_msg_num) {
|
||||
JSON DataBase::get_all_aircraft_json() {
|
||||
JSON json = JSON::array();
|
||||
auto g = Global::instance();
|
||||
auto min_position_points =
|
||||
g->mode_acs.aircraft_change_list_min_position_points.load();
|
||||
auto range_filter = g->mode_acs.aircraft_change_list_adsb_range_filter.load();
|
||||
auto range_factor = g->mode_acs.aircraft_change_list_adsb_range_factor.load();
|
||||
auto source = g->source(get_key());
|
||||
auto base_position = base_station.get_pos();
|
||||
if (source) {
|
||||
if (!base_position && source->base_station_has_valid_position.load()) {
|
||||
base_position = SSR::Position_3D{source->lat, source->lon, source->alt};
|
||||
}
|
||||
}
|
||||
size_t num = 0;
|
||||
for (auto &it : aircraft_map.values()) {
|
||||
auto vto = Flight_VTO::to_VTO(it.get());
|
||||
bool have_pos = !it.get()->air_pos_track_list.empty();
|
||||
if (have_pos) {
|
||||
json.children.push_back(vto.to_json());
|
||||
num++;
|
||||
if (it->air_pos_track_list.size() < min_position_points) {
|
||||
continue;
|
||||
}
|
||||
auto last_position = it->air_pos_track_list.last();
|
||||
if (!last_position) {
|
||||
continue;
|
||||
}
|
||||
if (range_filter &&
|
||||
!aircraft_in_base_station_radio_range(base_position, *last_position,
|
||||
range_factor)) {
|
||||
continue;
|
||||
}
|
||||
auto vto = Flight_VTO::to_VTO(it.get());
|
||||
json.children.push_back(vto.to_json());
|
||||
num++;
|
||||
}
|
||||
have_pos_aircraft_num = num;
|
||||
return json;
|
||||
@@ -187,6 +251,16 @@ void database_server(Global *g) {
|
||||
auto ret = JSON::object();
|
||||
if (db) {
|
||||
ret = db->base_station.to_Json();
|
||||
auto target_height =
|
||||
g->mode_acs.adsb_theoretical_target_altitude_meters.load();
|
||||
auto range = BaseStation::theoretical_detection_range_meters(db->alt,
|
||||
target_height);
|
||||
ret.append({"latitude", db->lat});
|
||||
ret.append({"longitude", db->lon});
|
||||
ret.append({"height", db->alt});
|
||||
ret.append({"adsb_theoretical_target_altitude_meters", target_height});
|
||||
ret.append({"adsb_theoretical_detection_range_meters", range});
|
||||
ret.append({"理论探测范围", range});
|
||||
}
|
||||
res->setBody(warp(ret).to_json_string());
|
||||
});
|
||||
@@ -198,7 +272,7 @@ void database_server(Global *g) {
|
||||
JSON ret;
|
||||
if (aircraft != nullptr) {
|
||||
auto vto = Flight_VTO::to_VTO(aircraft.get());
|
||||
ret = vto.to_json();
|
||||
ret = vto.to_base_info_json();
|
||||
}
|
||||
res->setBody(ret.to_json_string());
|
||||
});
|
||||
@@ -222,6 +296,14 @@ void database_server(Global *g) {
|
||||
JSON ret;
|
||||
if (aircraft != nullptr) {
|
||||
ret = aircraft->air_pos_track_list.get_last_array_json(last_size);
|
||||
auto last_two = aircraft->air_pos_track_list.last_two();
|
||||
if (last_two.has_value()) {
|
||||
ret.children.insert(
|
||||
ret.children.begin(),
|
||||
JSON("track_orientation",
|
||||
track_orientation_json_from_points(last_two->first,
|
||||
last_two->second)));
|
||||
}
|
||||
ret.children.insert(ret.children.begin(), JSON("ds", data_source_key));
|
||||
ret.children.insert(ret.children.begin(), JSON("icao", icao));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user