kopia lustrzana https://gitlab.com/tomaszg/geostat
Redo cache list style and add stats related to hidden date
rodzic
ac7a677924
commit
74f220302c
14
cache.cpp
14
cache.cpp
|
@ -22,10 +22,10 @@ float Cache::distance() const {
|
|||
return 2 * Earth_radius * asin(sqrt(pow(sin(degtorad((pos.lat - home.lat) / 2)), 2) + cos(degtorad(pos.lat)) * cos(degtorad(home.lat)) * pow(sin(degtorad((pos.lon - home.lon) / 2)), 2)));
|
||||
}
|
||||
|
||||
void Cache::set_date(const std::tm* t) {
|
||||
void Cache::set_date(const std::tm& t) {
|
||||
char tmp[20];
|
||||
|
||||
date_tm = *t;
|
||||
date_tm = t;
|
||||
std::mktime(&date_tm);
|
||||
|
||||
year = std::to_string(1900 + date_tm.tm_year);
|
||||
|
@ -41,6 +41,16 @@ void Cache::set_date(const std::tm* t) {
|
|||
//date += std::to_string(date_tm.tm_hour) + ":" + std::to_string(date_tm.tm_min) + ":" + std::to_string(date_tm.tm_sec);
|
||||
}
|
||||
|
||||
void Cache::set_date_hidden(const std::tm& t) {
|
||||
char tmp[20];
|
||||
|
||||
date_hidden_tm = t;
|
||||
std::mktime(&date_hidden_tm);
|
||||
|
||||
std::strftime(tmp, 20, "%F", &date_hidden_tm);
|
||||
date_hidden = tmp;
|
||||
}
|
||||
|
||||
float cache_distance(const Cache& a, const Cache& b) {
|
||||
return 2 * Earth_radius * asin(sqrt(pow(sin(degtorad((a.pos.lat - b.pos.lat) / 2)), 2) + cos(degtorad(a.pos.lat)) * cos(degtorad(b.pos.lat)) * pow(sin(degtorad((a.pos.lon - b.pos.lon) / 2)), 2)));
|
||||
}
|
||||
|
|
5
cache.h
5
cache.h
|
@ -56,14 +56,17 @@ public:
|
|||
std::string owner;
|
||||
std::string owner_uuid;
|
||||
std::tm date_tm;
|
||||
std::tm date_hidden_tm;
|
||||
std::string year;
|
||||
std::string mon;
|
||||
std::string day;
|
||||
std::string hour;
|
||||
std::string day_of_week;
|
||||
std::string date;
|
||||
std::string date_hidden;
|
||||
|
||||
void set_date(const std::tm* t);
|
||||
void set_date(const std::tm& t);
|
||||
void set_date_hidden(const std::tm& t);
|
||||
|
||||
static Position home;
|
||||
|
||||
|
|
21
geo.css
21
geo.css
|
@ -78,17 +78,28 @@ dl,
|
|||
color: #666;
|
||||
}
|
||||
|
||||
.dt_head {
|
||||
.list td {
|
||||
background: #f0f8ff;
|
||||
color: #000;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.list_head td {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
td {
|
||||
width: 4em;
|
||||
.dt td {
|
||||
background: #CCC;
|
||||
color: #000;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.dt_head td {
|
||||
font-weight: bold;
|
||||
width: 4em;
|
||||
}
|
||||
|
||||
td.dt_zero {
|
||||
color: #888;
|
||||
}
|
||||
|
@ -203,6 +214,8 @@ dl {
|
|||
padding: .5rem 1rem;
|
||||
}
|
||||
|
||||
/* index flow */
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
width: 900px;
|
||||
|
@ -212,4 +225,4 @@ dl {
|
|||
|
||||
.column {
|
||||
flex: 50%;
|
||||
}
|
||||
}
|
||||
|
|
66
geostat.cpp
66
geostat.cpp
|
@ -216,16 +216,21 @@ int main(int argc, char** argv) {
|
|||
// Prepare sorted list of caches, excluding moving caches
|
||||
std::map<std::string, int> dates;
|
||||
Date_Caches sorted_caches;
|
||||
Date_Caches sorted_fcaches;
|
||||
Date_Caches sorted_caches_by_hidden;
|
||||
Caches fcc;
|
||||
|
||||
std::tm tmp;
|
||||
for (auto& i : cc) {
|
||||
dates[i.date]++;
|
||||
tmp = i.date_tm;
|
||||
sorted_caches.insert({ std::mktime(&tmp), &i });
|
||||
if (i.type != "Moving" && i.type != "Own") {
|
||||
tmp = i.date_tm;
|
||||
sorted_caches.insert({ std::mktime(&tmp), &i });
|
||||
sorted_fcaches.insert({ std::mktime(&tmp), &i });
|
||||
fcc.insert(i);
|
||||
}
|
||||
tmp = i.date_hidden_tm;
|
||||
sorted_caches_by_hidden.insert({ std::mktime(&tmp), &i });
|
||||
}
|
||||
|
||||
std::cout << "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n";
|
||||
|
@ -271,12 +276,12 @@ int main(int argc, char** argv) {
|
|||
std::cout << "Longest caching streak: <span class=\"value\">" << longest_str << "</span> starting on <span class=\"value\">" << str_tmp << "</span><br>\n";
|
||||
|
||||
int tot_dist = 0;
|
||||
for (auto i = sorted_caches.begin(); i != std::prev(sorted_caches.end()); i++) {
|
||||
for (auto i = sorted_fcaches.begin(); i != std::prev(sorted_fcaches.end()); i++) {
|
||||
//std::cout << "Distance between " << i->second->name << " and " << std::next(i)->second->name << " is " << cache_distance(*i->second, *std::next(i)->second) << "<br>";
|
||||
tot_dist += cache_distance(*i->second, *std::next(i)->second);
|
||||
}
|
||||
std::cout << "Total distance between caches: <span class=\"value\">" << tot_dist << "</span> km (equivalent to <span class=\"value\">" << tot_dist / (2 * Pi * Earth_radius) << "x</span> trips around Earth)<br>\n";
|
||||
std::cout << "Average distance between caches: <span class=\"value\">" << tot_dist / sorted_caches.size() << "</span> km<br>\n";
|
||||
std::cout << "Average distance between caches: <span class=\"value\">" << tot_dist / sorted_fcaches.size() << "</span> km<br>\n";
|
||||
std::cout << "</div>\n";
|
||||
}
|
||||
|
||||
|
@ -293,15 +298,15 @@ int main(int argc, char** argv) {
|
|||
auto W = std::min_element(fcc.begin(), fcc.end(), [&](const Cache& a, const Cache& b) { return a.pos.lon < b.pos.lon; });
|
||||
|
||||
std::cout << "<h2>Geographically extreme caches</h2>\n";
|
||||
std::cout << "<table class=\"minmax\">\n";
|
||||
std::cout << "<table class=\"list\">\n";
|
||||
std::cout << "<tr>\n";
|
||||
std::cout << " <td>North:</td><td><a href=\"" << N->link() << "\">" << N->name << " (" << N->code << ")</a></td><td>" << N->pos.lat << "</td>\n";
|
||||
std::cout << " <td class=\"list_head\">North:</td><td><a href=\"" << N->link() << "\">" << N->name << " (" << N->code << ")</a></td><td>" << N->pos.lat << "</td>\n";
|
||||
std::cout << "</tr><tr>\n";
|
||||
std::cout << " <td>South:</td><td><a href=\"" << S->link() << "\">" << S->name << " (" << S->code << ")</a></td><td>" << S->pos.lat << "</td>\n";
|
||||
std::cout << " <td class=\"list_head\">South:</td><td><a href=\"" << S->link() << "\">" << S->name << " (" << S->code << ")</a></td><td>" << S->pos.lat << "</td>\n";
|
||||
std::cout << "</tr><tr>\n";
|
||||
std::cout << " <td>East:</td> <td><a href=\"" << E->link() << "\">" << E->name << " (" << E->code << ")</a></td><td>" << E->pos.lon << "</td>\n";
|
||||
std::cout << " <td class=\"list_head\">East:</td> <td><a href=\"" << E->link() << "\">" << E->name << " (" << E->code << ")</a></td><td>" << E->pos.lon << "</td>\n";
|
||||
std::cout << "</tr><tr>\n";
|
||||
std::cout << " <td>West:</td> <td><a href=\"" << W->link() << "\">" << W->name << " (" << W->code << ")</a></td><td>" << W->pos.lon << "</td>\n";
|
||||
std::cout << " <td class=\"list_head\">West:</td> <td><a href=\"" << W->link() << "\">" << W->name << " (" << W->code << ")</a></td><td>" << W->pos.lon << "</td>\n";
|
||||
std::cout << "</tr>\n";
|
||||
std::cout << "</table>\n";
|
||||
|
||||
|
@ -382,6 +387,49 @@ int main(int argc, char** argv) {
|
|||
std::cout << "<div class=\"basic_stats\">\n";
|
||||
std::cout << "Total <span class=\"value\">" << n << "</span> days out of 366 (" << std::setprecision(3) << n / 3.66 << "%).\n";
|
||||
std::cout << "</div>\n";
|
||||
|
||||
const int LIST_MAX = 15;
|
||||
n = 1;
|
||||
|
||||
std::cout << "<h2>Oldest caches found</h2>\n";
|
||||
std::cout << "<table class=\"list\">\n";
|
||||
std::cout << "<tr class=\"list_head\"><td></td>";
|
||||
std::cout << "<td>Cache</td>";
|
||||
std::cout << "<td>Date hidden</td>";
|
||||
std::cout << "<td>Date found</td>";
|
||||
std::cout << "</tr>\n";
|
||||
|
||||
for (auto i = sorted_caches_by_hidden.begin(); i != sorted_caches_by_hidden.end(); i++) {
|
||||
std::cout << "<tr><td class=\"list_head\">" << n << "</td> ";
|
||||
std::cout << "<td>" << "<a href=\"" << i->second->link() << "\">" << i->second->name << " (" << i->second->code << ")</a>" << "</td>";
|
||||
std::cout << "<td>" << i->second->date_hidden << "</td>";
|
||||
std::cout << "<td>" << i->second->date << "</td>";
|
||||
std::cout << "</tr>\n";
|
||||
n++;
|
||||
if (n > LIST_MAX) break;
|
||||
}
|
||||
std::cout << "</table>\n";
|
||||
|
||||
n = 1;
|
||||
|
||||
std::cout << "<h2>Newest caches found</h2>\n";
|
||||
std::cout << "<table class=\"list\">\n";
|
||||
std::cout << "<tr class=\"list_head\"><td></td>";
|
||||
std::cout << "<td>Cache</td>";
|
||||
std::cout << "<td>Date hidden</td>";
|
||||
std::cout << "<td>Date found</td>";
|
||||
std::cout << "</tr>\n";
|
||||
|
||||
for (auto i = sorted_caches_by_hidden.rbegin(); i != sorted_caches_by_hidden.rend(); i++) {
|
||||
std::cout << "<tr><td class=\"list_head\">" << n << "</td> ";
|
||||
std::cout << "<td>" << "<a href=\"" << i->second->link() << "\">" << i->second->name << " (" << i->second->code << ")</a>" << "</td>";
|
||||
std::cout << "<td>" << i->second->date_hidden << "</td>";
|
||||
std::cout << "<td>" << i->second->date << "</td>";
|
||||
std::cout << "</tr>\n";
|
||||
n++;
|
||||
if (n > LIST_MAX) break;
|
||||
}
|
||||
std::cout << "</table>\n";
|
||||
}
|
||||
|
||||
std::cout << "<div id=\"footer\">\n";
|
||||
|
|
10
okapi.cpp
10
okapi.cpp
|
@ -75,7 +75,7 @@ std::string Okapi::get_user_caches_json(std::string uuid, int count, int offset)
|
|||
|
||||
std::string Okapi::get_caches_json(std::string codes) {
|
||||
std::string service = url + OKAPI_caches;
|
||||
std::string query = "consumer_key=" + key + "&cache_codes=" + codes + "&fields=code|name|location|type|status|difficulty|terrain|owner|region|size2";
|
||||
std::string query = "consumer_key=" + key + "&cache_codes=" + codes + "&fields=code|name|location|type|status|difficulty|terrain|owner|region|size2|date_hidden";
|
||||
return curl_post(service, query);
|
||||
}
|
||||
|
||||
|
@ -136,10 +136,16 @@ Caches Okapi::get_caches(std::vector<std::pair<std::string, std::tm>> codes) {
|
|||
c.owner_uuid = el.value()["owner"]["uuid"];
|
||||
c.pos = get_lat_lon(el.value()["location"]);
|
||||
c.origin = "OC.pl";
|
||||
|
||||
std::tm tmp;
|
||||
std::stringstream ss(el.value()["date_hidden"].get<std::string>());
|
||||
ss >> std::get_time(&tmp, "%Y-%m-%dT%H:%M:%S+");
|
||||
c.set_date_hidden(tmp);
|
||||
|
||||
//ugly way to handle date...
|
||||
for (auto& el2 : codes) {
|
||||
if (el2.first == c.code) {
|
||||
c.set_date(&el2.second);
|
||||
c.set_date(el2.second);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue