/// \file
/// \ingroup tutorial_dataframe
/// \notebook -js
/// Plot the location of ROOT downloads reading a remote sqlite3 file with RSqliteDS.
/// The world map is hold by a TH2Poly histogram which, after filling, will show
/// the world wide dispersion of ROOT's users.
/// To histogram filling, is done thanks to a lambda expression having as input parameters
/// the two columns of the database: "IPLongitude' - for the longitude, and the
/// "IPLatitude" - for the latitude.
/// The data related to the latitude and the longitude has been provided from the
/// log files storing the users IP.
/// This product includes GeoLite2 data created by MaxMind, available from
/// http://www.maxmind.com.
///
/// \macro_code
/// \macro_image
///
/// \date August 2018
/// \author Alexandra-Maria Dobrescu
void df028_SQliteIPLocation() {
auto rdf = ROOT::RDF::MakeSqliteDataFrame( "http://root.cern/files/root_download_stats.sqlite", "SELECT * FROM accesslog;" );
auto f = TFile::Open("http://root.cern.ch/files/WM.root");
auto worldMap = f->Get("WMUSA");
auto fillIPLocation = [&worldMap] ( const std::string &sLongitude, const std::string &sLatitude ) {
if (!( sLongitude == "" ) && !( sLatitude == "" )) {
auto latitude = std::stof(sLatitude);
auto longitude = std::stof(sLongitude);
worldMap->Fill(longitude, latitude);
}
};
rdf.Foreach( fillIPLocation, { "IPLongitude", "IPLatitude" } );
auto worldMapCanvas = new TCanvas();
worldMapCanvas->SetLogz();
worldMap->SetTitle("ROOT Downloads per Location (GitHub exluded);Longitude;Latitude");
worldMap->DrawClone("colz");
}