package org.medias.eccad.metier.dessinCarte; import java.awt.Point; import java.io.File; import java.util.Map; import org.medias.eccad.helpers.Donnees; import org.medias.eccad.helpers.LoggerPerso; import org.medias.eccad.helpers.SpringBeanFactory; import org.medias.eccad.metier.generationRaster.GenerateurWorldFile; import org.medias.eccad.metier.generationRaster.ServiceRaster; import org.medias.eccad.metier.statistique.ServiceStatistique; import org.medias.eccad.modele.StatReponse; import org.medias.eccad.modele.Zone; import org.medias.eccad.persistance.GestionFichier; import org.medias.eccad.persistance.dao.GrilleDAO; import org.medias.eccad.persistance.exception.PersistanceException; import org.springframework.beans.factory.xml.XmlBeanFactory; public class ServiceCarte { private CarteMapScript carte; private String emplacement; private XmlBeanFactory xmlbean; private ServiceStatistique serviceStat; /** * Constructeur par défaut. Initialise le chemin d'accès à l'application et la carte. * */ public ServiceCarte() { xmlbean = SpringBeanFactory.getXmlFactory(); initEmplacement(); initMap(); serviceStat = new ServiceStatistique(); } /** * Initialisation de l'emplacement de l'application * */ private void initEmplacement() { emplacement = Donnees.getHome(); } /** * Initialisation de la carte * Chargement d'un descripteur de carte vide et initialisation des couches à la volée * */ private void initMap() { LoggerPerso.log(ServiceCarte.class, LoggerPerso.DEBUG, "chargement neutre.map"); carte = new CarteMapScript("neutre.map", emplacement + "/mapfile/"); carte.setOTFRaster("donnees", "null"); carte.setOTFLineLayer("monde", "world", 150, 150, 150); carte.setOTFRasterCopyright("copyright", emplacement + "/images/logo_copy.jpg"); } /** * Cette fonction génère une image de carte pour la grille passée en paramêtre avec la table de couleur demandée * @param id_grille * @param id_colormap * @param zone_affiche * @param zone_selection * @param identifiant_unique * @return l'emplacement et le nom de l'image générée * @throws PersistanceException */ public StatReponse getCarte(long id_grille, long id_colormap, Zone zone_aff, String identifiant_unique){ String img_temporaire = new String(); ServiceRaster serviceRaster = new ServiceRaster(); StatReponse statReponse = serviceRaster.genereRaster(id_grille, id_colormap, zone_aff); img_temporaire = statReponse.getUrlImage(); double center = statReponse.getCenter(); // TODO: placer le generateur de worldfile au niveau du service raster GenerateurWorldFile gen_worldfile = (GenerateurWorldFile) xmlbean.getBean("worldfile"); //initialiser la resolution double resolution= getResolution(id_grille); gen_worldfile.setPasX(resolution); gen_worldfile.setPasY(-resolution); gen_worldfile.writeWorldFile("/tmp/" + id_grille + "." + id_colormap); String urlImage = gestionImageCarte(img_temporaire, zone_aff, identifiant_unique); LoggerPerso.log(ServiceCarte.class, LoggerPerso.DEBUG, "urlImage " +urlImage); statReponse.setUrlImage(urlImage); return statReponse; } public double getResolution(long id_grille){ // initialiser la resolution double resolution=0; GrilleDAO grilleDAO = (GrilleDAO) xmlbean.getBean("grilleDAO"); try {resolution = grilleDAO.getGrilleResolution(id_grille);}catch (PersistanceException e) {LoggerPerso.log(ServiceRaster.class, LoggerPerso.ERROR, "ERROR generateRaster " + e.getM_message(), e);} LoggerPerso.log(ServiceCarte.class, LoggerPerso.DEBUG, "resolution------------------------------------------------------> :: " + resolution); return resolution; } public StatReponse getStatReponse(long id_grille, long id_colormap, Zone zone_aff){ ServiceRaster serviceRaster = new ServiceRaster(); StatReponse statReponse = serviceRaster.genereRaster(id_grille, id_colormap, zone_aff); LoggerPerso.log(ServiceCarte.class, LoggerPerso.DEBUG, "********************getStatReponse***************************"); return statReponse; } /* public StatReponse getCenter(long id_grille, long id_colormap, Zone zone_affiche, String identifiant_unique){ } */ /** * Genere une carte calculé à partir des données moyennes, somme, min, max ou ecart-type * @param criteres * @param id_param * @param id_produit * @param id_colormap * @param fonction * @param id_unique * @return */ public StatReponse getCarteStat(Map criteres, long id_param, long id_produit, long id_colormap, String fonction, String id_unique, Zone selection) { String img_temporaire = new String(); StatReponse statReponse = serviceStat.getCarteStat(criteres, id_param, id_produit, id_colormap, fonction, id_unique); img_temporaire = statReponse.getUrlImage(); // TODO: placer le generateur de worldfile au niveau du service raster GenerateurWorldFile gen_worldfile = (GenerateurWorldFile) xmlbean.getBean("worldfile"); gen_worldfile.writeWorldFile(img_temporaire); // initialiser la resolution float resolution=0; GrilleDAO grilleDAO = (GrilleDAO) xmlbean.getBean("grilleDAO"); try {resolution = grilleDAO.getGrilleResolution(id_produit);}catch (PersistanceException e) {LoggerPerso.log(ServiceRaster.class, LoggerPerso.ERROR, "ERROR generateRaster " + e.getM_message(), e);} LoggerPerso.log(ServiceCarte.class, LoggerPerso.DEBUG, "resolution------------------------------------------------------> :: " + resolution); gen_worldfile.setPasX(resolution); gen_worldfile.setPasY(-resolution); String urlImage = gestionImageCarte(img_temporaire, selection, id_unique); LoggerPerso.log(ServiceCarte.class, LoggerPerso.DEBUG, "urlImage " +urlImage); statReponse.setUrlImage(urlImage); return statReponse; } public StatReponse getStatReponse(Map criteres, long id_param, long id_produit, long id_colormap, String fonction, String id_unique, Zone selection) { StatReponse statReponse = serviceStat.getCarteStat(criteres, id_param, id_produit, id_colormap, fonction, id_unique); return statReponse; } public String getLegendStat(long id_grille, long id_colormap, String fonction, String id) { if (!fonction.equals("ecartCarte") && !fonction.equals("moyenneCarte") &&!fonction.equals("sommeCarte")) return getLegend(id_grille, id_colormap); String legend = serviceStat.getLegend(emplacement + "/images/cartes_temporaires/" + id_grille + "_" + id_colormap +"_" + id , id_colormap, id_grille); LoggerPerso.log(ServiceCarte.class, LoggerPerso.DEBUG, "getLegendCarte :: " + legend); return "/images/cartes_temporaires/" + id_grille + "_" + id_colormap +"_" + id +".legend.png"; } /** * * @param id_grille * @param id_colormap * @param image_temporaire * @param zone_affiche * @param identifiant_unique * @return */ public String gestionImageCarte(String image_temporaire,Zone zone_aff, String identifiant_unique) { LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "gestion image carte"); String img_erreur = "/images/nodata.png"; String nom_image_final; try { LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "modif layer : donnees " + image_temporaire); carte.modifDataLayer("donnees", image_temporaire); LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "modif layer ok"); if (zone_aff != null) carte.zoneAffiche(zone_aff.getNorthbc(), zone_aff.getSouthbc(), zone_aff.getEastbc(), zone_aff.getWestbc()); //carte.changeProjection(""); nom_image_final = carte.dessinerCarte(emplacement + "/images/cartes_temporaires/", identifiant_unique); } catch (Exception e) { LoggerPerso.log(ServiceCarte.class, LoggerPerso.ERROR, "erreur lors de la création de la carte", e); return img_erreur; } GestionFichier effaceur = new GestionFichier(); //effaceur.effacerFichier(image_temporaire.substring(0, image_temporaire.length()-4) +".wld"); effaceur.effacerFichierAncien(emplacement+"/images/cartes_temporaires/"); return ("/images/cartes_temporaires/" + nom_image_final); } /** * Retourne la légende associée à la colormap pour la grille donnée * @param id_grille * @param id_colormap * @return */ public String getLegend(long id_grille, long id_colormap) { File legend_img = new File(emplacement + "/images/cartes_temporaires/" + id_grille + "_" + id_colormap +".legend.png"); if (legend_img.exists()) return "/images/cartes_temporaires/" + id_grille + "_" + id_colormap +".legend.png"; ServiceRaster serviceRaster = new ServiceRaster(); serviceRaster.genereLegend(id_grille, id_colormap, emplacement + "/images/cartes_temporaires/" + id_grille + "_" + id_colormap); return "/images/cartes_temporaires/" + id_grille + "_" + id_colormap +".legend.png"; } /** * Permet d'obtenir la zone que la carte couvre * @return la Zone couverte */ public Zone getCarteCoordinate() { if (carte == null) return new Zone(); Zone zone = carte.getZoneCouverte(); LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "zonnnnnnnnnnnnnnnnnnnnnnnne : getEastbc "+ zone.getEastbc()); LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "zonnnnnnnnnnnnnnnnnnnnnnnne : getWestbc "+ zone.getWestbc()); LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "zonnnnnnnnnnnnnnnnnnnnnnnne : getNorthbc "+ zone.getNorthbc()); LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "zonnnnnnnnnnnnnnnnnnnnnnnne : getSouthbc "+ zone.getSouthbc()); /*if (zone.getEastbc() <180) { if((zone.getEastbc()- ((int)zone.getEastbc())) < 0.5) zone.setEastbc(((int)zone.getEastbc()+ 0.25)); else zone.setEastbc(((int)zone.getEastbc()+ 0.75));}; if (zone.getWestbc() > -180 ) { if((zone.getWestbc()- ((int)zone.getWestbc())) < 0.5) zone.setWestbc(((int)zone.getWestbc()+ 0.25)); else zone.setWestbc(((int)zone.getWestbc()+ 0.75));}; if (zone.getNorthbc()< 90) { if((zone.getNorthbc()- ((int)zone.getNorthbc())) < 0.5) zone.setNorthbc(((int)zone.getNorthbc()+ 0.25)); else zone.setNorthbc(((int)zone.getNorthbc()+ 0.75));}; if (zone.getSouthbc() >-90) { if((zone.getSouthbc()- ((int)zone.getSouthbc())) < 0.5) zone.setSouthbc(((int)zone.getSouthbc()+ 0.25)); else zone.setSouthbc(((int)zone.getSouthbc()+ 0.75));}; */ LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "zonnnnnnnnnnnnnnnnnnnnnnnne : getEastbcN "+ zone.getEastbcN()); LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "zonnnnnnnnnnnnnnnnnnnnnnnne : getWestbcN "+ zone.getWestbcN()); LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "zonnnnnnnnnnnnnnnnnnnnnnnne : getNorthbcN "+ zone.getNorthbcN()); LoggerPerso.log(LoggerPerso.class, LoggerPerso.DEBUG, "zonnnnnnnnnnnnnnnnnnnnnnnne : getSouthbcN "+ zone.getSouthbcN()); return zone; } /** * Permet de zoomer sur la carte suivant les coordonnées passées * @param coef coefficient de zoom * @param clicX position en x du point central du zoom * @param clicY position en y du point central du zoom */ public void zoomCarte(int coef, int clicX, int clicY, double resol) { carte.definirZoom(coef, new Point(clicX, clicY), resol); } }