#include #include #include #include #include #include #include #include #include using namespace std; #include "Produit.h" static char tampon [2048]; Produit::Produit() { } Produit::~Produit() { } //Mise � jour d'un produit void Produit::majProduit() { } //Insertion d'un nouveau produit void Produit::nvProduit() { } //Fonction de calcul des surfaces de pixels long double Produit::createAreaVincenty(Point point) { // Point* pBas = new Point(point.lat, point.lon + pas/2); Point* pBas = new Point(point.lat+pas/2, point.lon); // Point* pHaut = new Point(point.lat+pas, point.lon + pas/2); Point* pHaut = new Point(point.lat-pas/2, point.lon); // Point* pGauche = new Point(point.lat+pas/2, point.lon); Point* pGauche = new Point(point.lat, point.lon-pas/2); // Point* pDroit = new Point(point.lat+pas/2, point.lon+pas); Point* pDroit = new Point(point.lat , point.lon+pas/2); // double distancePhautPbas = distance(pHaut, pBas)/1000; double distancePhautPbas = distance(pBas, pHaut)/1000; double distancePgauchePdroit = distance(pGauche, pDroit)/1000; delete pBas; delete pHaut; delete pGauche; delete pDroit; return ( (distancePhautPbas * distancePgauchePdroit) ); } long double Produit::distance(Point* p1, Point* p2) { ////cout<<"lon p1 "<lon<<" lat p2 "<lon<lonRad = p1->lon * ((2*3.14159265)/360) ; p2->lonRad = p2->lon * ((2*3.14159265)/360) ; p1->latRad = p1->lat * ((2*3.14159265)/360) ; p2->latRad = p2->lat * ((2*3.14159265)/360) ; ////cout<<"lonrad p2 "<lonRad<<" lonrad p1 "<lonRad<lonRad - p1->lonRad; ////cout<<"L "<latRad)); long double U2 = atan((1 - f) * tan(p2->latRad)); long double sinU1 = sin(U1); long double cosU1 = cos(U1); long double sinU2 = sin(U2); long double cosU2 = cos(U2); long double sinLambda = 0, cosLambda = 0, sinSigma = 0, cosSigma = 0, sigma = 0, sinAlpha = 0, cosSqAlpha = 0, cos2SigmaM = 0; long double lambda = L, lambdaP = 2* 3.14159265; long double iterLimit = 20; while( fabs(lambda-lambdaP) > 1e-12 && --iterLimit>0 ) { sinLambda = sin(lambda); cosLambda = cos(lambda); sinSigma = sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda)); if (sinSigma==0) return 0; // co-incident points cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda; sigma = atan2(sinSigma, cosSigma); sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma; cosSqAlpha = 1 - sinAlpha*sinAlpha; cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha; if (isnan(cos2SigmaM)) cos2SigmaM = 0; // equatorial line: cosSqAlpha=0 (6) long double C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha)); lambdaP = lambda; lambda = L + (1-C) * f * sinAlpha * (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM))); } if (iterLimit == 0) return NAN; // formula failed to converge long double uSq = cosSqAlpha * (a*a - b*b) / (b*b); long double A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq))); long double B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq))); long double deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM))); long double s = b*A*(sigma-deltaSigma); ////cout<<"s "<lat-p1->lat)/2) ,2)+ cos(p2->lat) * pow( sin((p2->lon-p1->lon)/2) ,2); long double c = 2*atan2(sqrt(a), sqrt(1-a)); return R*c; } long double Produit::createAreaHaversine(Point point) { // Point* pBas = new Point(point.lat, point.lon + pas/2); Point* pBas = new Point(point.lat+pas/2, point.lon); // Point* pHaut = new Point(point.lat+pas, point.lon + pas/2); Point* pHaut = new Point(point.lat-pas/2, point.lon); // Point* pGauche = new Point(point.lat+pas/2, point.lon); Point* pGauche = new Point(point.lat, point.lon-pas/2); // Point* pDroit = new Point(point.lat+pas/2, point.lon+pas); Point* pDroit = new Point(point.lat , point.lon+pas/2); // double distancePhautPbas = distanceHaversine(pHaut, pBas)/1000; double distancePhautPbas = distanceHaversine(pBas, pHaut)/1000; double distancePgauchePdroit = distanceHaversine(pGauche, pDroit)/1000; delete pBas; delete pHaut; delete pGauche; delete pDroit; return ( distancePhautPbas * distancePgauchePdroit ); } char* Produit::getExtensionFileRead(char* fichier) { string fichierStr = fichier; string nomFich = SplitFilename(fichier); size_t found = (nomFich).find_last_of(".") ; //if ((nomFich).substr(found+1, nomFich.length() ) != NULL ) fichierStr=(nomFich).substr(found+1, nomFich.length()); //else //fichierStr=""; return (char*)fichierStr.c_str(); /* char* fich = fichier; while (strchr(fich, '/') != NULL) { fich = strchr(fich, '/')+1; } if ( strchr(fich, '.') != NULL ) fich = strchr(fich, '.')+1; else fich = ""; return fich;*/ } //------------------------------------Fonctions de lecture des donn�es brutes-------------------------------------------// //Scan d'un repertoire : determiner les sous repertoires et les fichiers Repertoire Produit::scanRep(Repertoire rep) { struct dirent *item; static struct stat stat_item; DIR *dirp; char *addr; //cout<<"-----------------------------------------ScanRep------------------------------------"<d_name); if (!stat(tampon, &stat_item)) { if (S_ISDIR(stat_item.st_mode)) { if (strcmp(item->d_name, ".") && strcmp(item->d_name, "..")) { Repertoire child; child.allouRep(stat_item,item->d_name, tampon, rep.level); rep.children.push_back(child); } } else { Feuille fich = Feuille(stat_item, item->d_name,tampon, rep.level); rep.fichier.push_back(fich); } } } //cout<<"-----------------------------------------end ScanRep------------------------------------"<addReadersMessagesErrors("Impossible d'ouvrir le perertoire : "+rep.chemin); cout << " ---> Impossible d'ouvrir le repertoire : " << rep.chemin << endl; } return(rep); } //iterer sur toute l'arborescence void Produit::scanParcour(Repertoire rep) { rep = scanRep(rep); parcourRep(rep); } //--------------------------------------------------------------------------------------------------------------------// void Produit::parcourRep(Repertoire rep) { if (!rep.children.empty()) { list::iterator it; for (it = rep.children.begin(); it != rep.children.end(); it++){ scanParcour((*it)); } } if (!rep.fichier.empty()) { base.readBD(logger); // cout << " traitement des fichiers du repertoire : "<< rep.nom << endl; bool verifExt; list::iterator itt; for (itt = rep.fichier.begin(); itt != rep.fichier.end(); itt++) { // cout << ".......... Fichier à traiter:"<< (*itt).nom <id, (*itt).nom) ) ) { //cout<<"-----------verifDate------------"<< base.fichier.verifDate(ctime(&((*itt).stt.st_ctime)), base.produit.getTuple(NomProduit)->id, (*itt).nom) <<(*itt).chemin <traitementBaseMessages(" DELETE GRILLE " , res); ////cout<<"delete"<traitementBaseMessages(" DELETE FICHIER " , res); ////cout<<"delete fichier"<::iterator itRep; for (itRep = rep.children.begin(); itRep != rep.children.end(); itRep++) { Repertoire reper = scanRep((*itRep)); trouve = chercheFichierRep(fichier, reper); } } if (trouve) return trouve; else { list::iterator itt; ////cout<<"taille "<id) {*/ ////cout <<(*itt).nom<<" "<id ) && ( !strcmp((*itt).nom, (fichier.name).c_str()) ) ) { ////cout <<(*itt).nom<<" ** "<::iterator it; for (it = tabFichier.tuples.begin() ; it != tabFichier.tuples.end(); it++){ if ((*it).idProduit == base.produit.getTuple(NomProduit)->id){ if(!chercheFichierRep((*it), rep)){ absent = true; break; } } } } else absent=false; return absent; } void Produit::readFile(Feuille f) { } void Produit::verifMinMax(float min, float max) { Base baseVerif; baseVerif.readBD(logger); float minBase = atof( (baseVerif.parametre.getTuple(NomParametre)->minCalculate).c_str() ); float maxBase = atof( (baseVerif.parametre.getTuple(NomParametre)->maxCalculate).c_str() ); // cout<<"minbase="<traitementBaseMessages(" UPDATE PARAM MIN " , res); }*/ } if (max > maxBase) { PGconn* conn = base.connectBD(logger); string sql = "update parametre set max_param_calculate ="+ ftoa(max) +" where id_param="+ base.parametre.getTuple(NomParametre)->id +";"; ////cout<<"sql "<traitementBaseMessages(" UPDATE PARAM MAX " , res); }*/ } }