[PHP / GD lib ] - Génération d'une carte - Aidez moi à finir ce script

Voilà pour notre site encyclopédique une carte avait commencé à être développée.

Le problème c’est que la personne qui a développé ca n’est plus présente, et le prototype est resté tel quel, sans pouvoir passer en production :confused: ce qui est dommage.

Maintenant que je commences à pratiquer un peu php, et mysql, je me sens plus à même de tenter d’améliorer ce truc, mais une partie est encore en dehors de mes compétences… d’où ma demande d’aide :slight_smile:

Le principe est simple : génération d’une image avec des points de couleurs (suivant le type de planète). Ensuite sur une page html classique on affiche cette image, et on chope dans notre base de données les informations qui vont bien pour générer un area et faire des liens qui permettent de cliquer les planètes sur la carte.

Voilà la partie qui, je pense, sert à créer l’image :

<?
header("content-Type: image/png");

include("global.inc.php");

$image = imagecreate(700,500);                      // create image
$noir = imagecolorallocate($image,0,0,0);             // couleur du fond
$vert = imagecolorallocate($image, 0, 255, 0);        // couleur vert
$rouge = imageColorAllocate($image, 255, 0, 0);
$blanc = imageColorAllocate($image, 255, 255, 255);
$gris1 = imageColorAllocate($image, 50, 50, 50);

$im = imagecreatefrompng("Planete.png");

ImageLine ($image, 350, 0, 350, 500, $gris1);
ImageLine ($image, 0, 250, 700, 250, $gris1);

$w   = imagecolorallocate ($im, 255, 255, 255);
$red = imagecolorallocate ($im, 255, 0, 0);

/* Draw a dashed line, 5 red pixels, 5 white pixels */
$style = array($gris1,$gris1,$gris1,$gris1,$gris1,$noir,$noir,$noir,$noir,$noir);
imagesetstyle ($image, $style);
imageline($image, 175, 0, 175, 500, IMG_COLOR_STYLED);
imageline($image, 525, 0, 525, 500, IMG_COLOR_STYLED);
imageline ($image, 0, 125, 700, 125, IMG_COLOR_STYLED);

imageline ($image, 0, 375, 700, 375, IMG_COLOR_STYLED);


mysql_connect($host, $user, $passwd) || UhOh("Can't Connect to Database: ".mysql_error());
$result = mysql_db_query($database, "SELECT * FROM encyclopedie_carte");
while ($row = mysql_fetch_object($result)){
$Id = $row->Id;
$Nom_Planete = $row->Nom_Planete;
$Coord_X = $row->Coord_X;
$Coord_Y = $row->Coord_Y;
$Aff_Nom = $row->Aff_Nom;
$Couleur = $row->Couleur;
$Info = $row->Info;

switch ($Couleur) {
    case "J":
        $Im_planete=0;
        break;
    case "V":
        $Im_planete=9;
        break;
    case "B":
        $Im_planete=18;
        break;
    case "R":
        $Im_planete=27;
        break;
    case "G":
        $Im_planete=36;
        break;
}

ImageCopy($image, $im, $Coord_X, $Coord_Y, $Im_planete, 0, 9, 9);

$font_size = 1;
/* Calcule la longueur du texte en pixels */
$font_width = strlen($Nom_Planete) * ImageFontWidth($font_size);
/* Calcule la hauteur du texte en pixels */
$font_height = ImageFontHeight($font_size);

switch ($Aff_Nom) {
       case "H":
       $Plan_Coord_x = $Coord_X +3 - ($font_height/2);
       $Plan_Coord_y = $Coord_y +10 + $font_height;
       break;
       Case "B":
       $Plan_Coord_x = $Coord_X +3 - ($font_width/2);
       $Plan_Coord_y = $Coord_y - 10 - $font_height;
       break;
       Case "G":
       $Plan_Coord_x = $Coord_X - 3 - $font_width;
       $Plan_Coord_y = $Coord_Y +1;
       break;
       Case "D":
       $Plan_Coord_x = $Coord_X + 11;
       $Plan_Coord_y = $Coord_Y +1;
       break;
       Default:
       $Plan_Coord_x = $Coord_X + 11;
       $Plan_Coord_y = $Coord_Y +1;
}

ImageString ($image, $font_size, $Plan_Coord_x, $Plan_Coord_y, $Nom_Planete, $blanc);
}

ImageString($image, $font_size, 537, 491, "http:/www.archives-alliance.com", $blanc);

imagepng($image, "carte.png");
?>

Ensuite un autre script génère les area… celui là ne pose à priori pas de soucis.

Je ne capte pas trop ce que fais GD, il nous manque deux fonctionnalités ici :

  • pouvoir placer le nom d’une planète au dessus, au dessous, sur les côtés… par rapport au point de couleur. C’est la variable affich_nom si j’arrive à bien capter le script.
  • pouvoir zoomer… mais de façon simple je pense, c’est à dire refaire l’image, et diviser les coordonnées pour recalculer le tout… je pense que c’est le plus simple… encore que je sois pas bien certain de comment le faire :slight_smile:

Ma grosse interrogation porte donc sur comment pouvoir mettre mon texte autour du point de couleur.

Un grand merci par avance, c’est un script qui traine sans réelle utilité depuis très très longtemps, et c’est vraiment dommage :confused: :slight_smile:

Ton code, je me demande comment il marche avec le echo ‘…’ ?

Pour ton texte, tu as des fonctions pour écrire du texte, mais php.net étant dans les choux chez moi, je te laisse chercher "imagetext".

Tu n’as plus qu’à écrire le texte au bon endroit, avec un décallage par exemple.

En fait je viens de découvrir qu’il y avait deux fois ce fichier, l’un devait servir pour des tests…

J’ai mis à jour le premier post, en effet je captais pas trop certains choses, il manquait du code c’était évident mais je comprennais pas d’où ^^

ca donne ca :

http://www.archives-alliance.com/carte.png

si on change l’attribus d’une planète, ca fait intervenir le CASE là, enfin je crois, mais suivant ce qui est indiqué ca fait surtout foirer les carte ^^ je vais changer l’attrib sur deux trois planètes pour illustrer ca :slight_smile:

PS : j’ai retiré le echo, en effet ca me choquait un peut ce truc ^^

EDIT : ok GAUCHE / DROITE ca fonctionne, c’est HAUT qui colle mon texte en haut de l’image, et bas… je sais pas où il se barre le truc :smiley:

C’est pas très lisible ton truc:)

Ah bon ? et je poses la question pourquoi à ton avis ? :smiley:

Bon donc c’est bien la partie du switch affich_nom qui chie, une des variables doit déconner. si je capte ce que ca fait : ca positionne le texte en fonction de la position de base du point de couleur, sauf que pour H et B ca marche trop pas :confused:

Pour le zoom j’ai pensé faire 4 fois la carte, une par quadran, et redimensionner pour que ca colle.

Ca te semble logique comme principe ?

Oui, sauf que tu vas t’amuser pour le zoom:p

Ben je pense faire 4 cartes, et générer les images en usant de la fonction between, et donc je prend genre X < 140 y < 120 pour un bloc, et ainsi de suite.

Et pareil pour la page PHP qui génère les image maps…

Et tout simplement en marge de ma carte je fais une mini carte qu’on peut cliquer et qui appelle le reste.

Mais avant tout ca faut que les noms des planètes s’affichent aux bons endroits :frowning:

Ils se chevaussent, mais apparaissent au bon endroit hein.

Sinon tu peux peut-être tenter de générer une map virtuelle en javascript : du genre, si tu es sur les coordonnées (x,y) (avec un rayon) tu affiche un texte avec le nom de la planète.

non, le but c’est afficher le texte au dessus, au dessous et compagnie :slight_smile: Pour limiter les blems de chevauchement justement :

switch ($Aff_Nom) {

se charge pour chaque point de dire : texte au dessus, texte au dessous…

si tu regardes le point gris, au dessus tout en haut c marqué ossus, le script le place pas au bon endroit en fait :confused: voilà mon problème principal en fait :smiley:

ROOO PUTAIN ^^

C’est tellement con que j’ai presque honte de pas l’avoir vu avant !!

La personne qui a développé au départ à fait une grave erreur… dans le nom des variables :smiley: majuscules / minuscules…

C’est ce qui cause le bug ^^ les Y ou les X sont mal pris en compte :smiley:

Donc ca, c’est corrigé :slight_smile: reste à faire le zoom ^^

Ok le zoom ca marche suffisait de sélectionner les planètes par plages de coordonnées, et multiplier les valeurs par deux puisque les mini cartes sont deux fois plus grandes… et naturellement soustraire (fois 2) les valeurs non nécessaires en X ou Y (genre carte de 700 de large, pour la zone haut droite on retire 349 * 2 aux coordonnées X car elles sont prévues normalement pour la carte grande échelle).

Content, ca fonctionne. Je cape pas pourquoi sous firefox la génération des cartes renvoit une erreur, car en revanche le navigateur arrive à accéder sans soucis à l’image quand on l’ouvre par son URL.

Pourtant j’ai viré le echo truc bazar là :confused: