107 lines
2.9 KiB
C
107 lines
2.9 KiB
C
#include "miscellaneous.h"
|
|
|
|
|
|
void getExtrema(Point const* const pts, uint32_t const taille, Coordonnees *const hautGauche, Coordonnees *const basDroit)
|
|
{
|
|
hautGauche->lat = 90;
|
|
hautGauche->lon = -180;
|
|
basDroit->lat = -90;
|
|
basDroit->lon = 180;
|
|
|
|
for(uint32_t i = 0; i < taille; i++)
|
|
{
|
|
if(hautGauche->lat > pts[i].pos.lat)
|
|
{
|
|
hautGauche->lat = pts[i].pos.lat;
|
|
}
|
|
|
|
if(hautGauche->lon < pts[i].pos.lon)
|
|
{
|
|
hautGauche->lon = pts[i].pos.lon;
|
|
}
|
|
|
|
if(basDroit->lat < pts[i].pos.lat)
|
|
{
|
|
basDroit->lat = pts[i].pos.lat;
|
|
}
|
|
|
|
if(basDroit->lon > pts[i].pos.lon)
|
|
{
|
|
basDroit->lon = pts[i].pos.lon;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
bool getBackgroundMap(const Coordonnees *const pointCentral, const uint8_t zoom)
|
|
{
|
|
// Ici on fabrique notre """petite""" URL magique
|
|
char request[REQUESTSIZE] = "";
|
|
snprintf(request, REQUESTSIZE,
|
|
"https://maps.googleapis.com/maps/api/staticmap?center=%f,%f&size=%ux%u&scale=%u&zoom=%u&key=%s",
|
|
pointCentral->lat, pointCentral->lon,
|
|
MAPSIZE, MAPSIZE,
|
|
MAPSCALE,
|
|
zoom,
|
|
APIKEY);
|
|
|
|
/* cURL Request */
|
|
|
|
// On crée notre objet cURL pour la suite
|
|
CURL *curl = curl_easy_init();
|
|
if(curl == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// On crée / ouvre un fichier en écriture
|
|
FILE *map = fopen(MAPFILE, "wb");
|
|
if(map == NULL)
|
|
{
|
|
curl_easy_cleanup(curl);
|
|
fprintf(stderr, "L'ouverture du fichier n\'a pas été possible: %s\n", strerror(errno));
|
|
return false;
|
|
}
|
|
|
|
// On crée nos opérations à effectuer lors de l'exécution de la requête
|
|
curl_easy_setopt(curl, CURLOPT_URL, request);
|
|
curl_easy_setopt(curl, CURLOPT_WRITEDATA, map);
|
|
|
|
// On exécute !
|
|
CURLcode res = curl_easy_perform(curl);
|
|
|
|
// On détruit notre objet cURL
|
|
curl_easy_cleanup(curl);
|
|
|
|
// On ferme le fichier
|
|
if(fclose(map) == EOF)
|
|
{
|
|
fprintf(stderr, "La fermeture du fichier n\'a pas été possible: %s\n", strerror(errno));
|
|
return false;
|
|
}
|
|
|
|
// On indique à la fonction appelante si cURL correctement effectué les opérations ou non !
|
|
return (res == CURLE_OK ? true : false);
|
|
}
|
|
|
|
|
|
void getZoomEchelle(const Coordonnees *const pointHautGauche, const Coordonnees *const pointBasDroite, uint8_t *const zoom, double *const echelle)
|
|
{
|
|
const double distLat = RAYON * RADIANS(pointHautGauche->lon-pointBasDroite->lon);
|
|
const double distLon = RAYON * log(tan(PI / 4.0 + RADIANS(pointBasDroite->lat) / 2.0)
|
|
/ tan(PI / 4.0 + RADIANS(pointHautGauche->lat) / 2.0));
|
|
|
|
// Calcul de la distance maximum entre les points les plus éloignés, que l'on devra
|
|
// pouvoir être en mesure d'afficher
|
|
const double distanceMaximale = distLat > distLon ? distLat : distLon;
|
|
|
|
// L'échelle faisant correspondre la taille de la carte à la réalité voulue
|
|
*echelle = (distanceMaximale + 1.0e-2 * BORDERSIZE / PPCM) / (1.0e-2 * (WIDTH < HEIGHT ? WIDTH : HEIGHT) / PPCM);
|
|
|
|
// Partie entière du zoom à cause de l'API google maps.
|
|
*zoom = floor(log2(CONSTANTE / (*echelle)) - 1);
|
|
|
|
// L'échelle de la carte avec le zoom arrondi.
|
|
*echelle = CONSTANTE / pow(2.0, *zoom + 1);
|
|
}
|