[
ActionCarto est une proposition en cours de
YannLeGuennec et ne fait pas partie de la distribution officielle de
WikiNi.]
tests et commentaires:
http://www.x-arn.org/w3/ActionCartoPourWikini
v0.1 : principe de base: placer des points sur une image qui correspondent à des pages du wiki
v0.2 : introduction de parametres et nom de carte pour
multi-carte sur un wikini
v0.3 : recherche sur le bug lié à la réecriture d'URL : remplacement methode GET par POST
v0.4 : enregistrement des liens de la carte pour Backlinks sur pages créées à partir de la carte (l'action Backlinks permet alors de pointer vers la carte)
v0.5 : changement de stratégie, les coordonnées ne sont plus enregistrées dans le nom de page, mais dans le corps des pages, ce qui permet de positionner sur la carte des pages préexistantes dans le wiki.
v0.6 : correction de bug de la v0.5, impossibilité d'avoir un point qui pointe vers la même page sur différentes cartes à différentes positions.
v0.7 : ajout de la couleur des points
v0.8 : changement de stratégie : les données sont stockées dans des fichiers textes séparés. ajout de tracés de formes
code source v0.7
<?php
/*
action carto pour wikini
auteur : yann le guennec
22.02.2005
version 0.7
usage: {{carto srcmap="chemin/vers/image/de/fond/de/carte.jpg" destmap="chemin/vers/image/carteacreer.png"}}
le paramètre destmap est optionnel mais semble-t-il utile en cas de réécriture d'url
note: le script créé un fichier PNG à partir d'un JPG.
*/
// parametres de l'action
// srcmap : image de base
// destmap : image map courante
$this->StopLinkTracking();
$map_name = $this->getPageTag();
$src_map = $this->GetParameter("srcmap");
if(!$this->GetParameter("destmap")) {
//par defaut, l'image est créée à la racine du wiki
$dest_map = "".$this->getPageTag().".png";
} else {
$dest_map = $this->GetParameter("destmap");
}
$prefix = $this->config["table_prefix"];
$image = $src_map;
// todo: déduire les dimensions du fichier image
$info = getimagesize($image);
$im_w = $info[0];
$im_h = $info[1];
$d = 2; //demi largeur/hauteur de zone
$rs = 10; //demi largeur du rectangle de selection
$resultat = "";
$color['blanc'] = '255,255,255';
$color['noir'] = '0,0,0';
$color['rouge'] = '255,0,0';
$color['vert'] = '0,255,0';
$color['bleu'] = '0,0,255';
$color['jaune'] = '255,255,0';
$color['cyan'] = '0,255,255';
$color['fushia'] = '255,0,255';
if(isset($_POST['select_color']) && $_POST['select_color'] != "") {
$cur_color= $_POST['select_color'];
} else {
$cur_color= "blanc";
}
$color_menu = "<select name=\"select_color\">";
$color_menu .= "<option value=\"\" style=\"\"></option>";
while(list($k, $v) = each($color)){
$color_menu .= "<option value=\"$k\" style=\"background-color:rgb($v)\"";
if($cur_color == $k) {
$color_menu .= " selected=\"selected\"";
}
$color_menu .= ">".$k."</option>\r\n";
}
$color_menu .= "</select>";
//type d'action / option bouton radio
if(isset($_POST['act']) && $_POST['act']== "ecriture") {
$checklecture = "";
$checkecriture = "checked=\"checked\"";
$act = "ecr";
} else {
$checklecture = "checked=\"checked\"";
$checkecriture = "";
$act = "lec";
}
if(isset($_POST['aff']) && $_POST['aff']== "on") {
$checkaff = "checked=\"checked\"";
$aff= "txt";
} else {
$checkaff = "";
$aff="";
}
$im = @imagecreatefromjpeg($image);
$imcolor['blanc'] = imagecolorallocate($im, 255,255,255);
$imcolor['noir'] = imagecolorallocate($im, 0,0,0);
$imcolor['rouge'] = imagecolorallocate($im, 255,0,0);
$imcolor['vert'] = imagecolorallocate($im, 0,255,0);
$imcolor['bleu'] = imagecolorallocate($im, 0,0,255);
$imcolor['jaune'] = imagecolorallocate($im, 255,255,0);
$imcolor['cyan'] = imagecolorallocate($im, 0,255,255);
$imcolor['fushia'] = imagecolorallocate($im, 255,0,255);
if(isset($_POST['carte_x']) && isset($_POST['carte_y'])) {
//coordonnées cliquées sur l'image
$cur_x = $_POST['carte_x'];
$cur_y = $_POST['carte_y'];
//zone selectionée non enregistrée
imagefilledrectangle($im, $cur_x-$d, $cur_y-$d, $cur_x+$d , $cur_y+$d, $imcolor[$cur_color]);
//zone de sélection
imagerectangle($im, $cur_x-$rs, $cur_y-$rs, $cur_x+$rs, $cur_y+$rs, $imcolor[$cur_color]);
//si le nom de zone est renseigné dans le formulaire
if($_POST['nom_zone'] != "") {
$nom_zone = $_POST['nom_zone'];
//si le nom ne contient pas que des lettres et des chiffres
if(!eregi("^[a-z0-9]*$", $nom_zone)) {
echo "<script language=\"javascript\">alert('erreur de nom')</script>";
$nom_zone = "";
} else {
//bloc HTML qui contient les coordonnées et le nom de carte
// §§§ est le separateur de cartes
// § est le separateur de coordonnées
$html_coords_head = "\"\"<!--§§§".$map_name."§".$cur_x."§".$cur_y."§".$cur_color."§-->\"\"";
$html_coords_foot = "\r\n-------\r\n $map_name";
//si le nom est celui d'une page existante
if($page = $this->LoadPage($nom_zone)) {
//la page est-elle deja reliée à la carte
if(ereg("<!--§§§".$map_name."§[0-9]*§[0-9]*§[a-z]*§-->", $page['body'])) {
//modification des coordonnées existantes
$new_body = ereg_replace("<!--§§§".$map_name."§[0-9]*§[0-9]*§[a-z]*§-->", "<!--§§§".$map_name."§".$cur_x."§".$cur_y."§".$cur_color."§-->", $page['body']);
} else {
//on ajoute les coordonnées dans le corps de la page
$new_body = $html_coords_head.$page['body'].$html_coords_foot;
}
} else {
$new_body = $html_coords_head."page générée automatiquement depuis la carte $map_name".$html_coords_foot;
}
//on enregistre la page créée
$this->SavePage($nom_zone, $new_body);
}
}
}
//construction de l'image
//recherche des pages contenant des cordonnées et le nom de la carte courante
$query = "SELECT tag, body FROM ".$prefix."pages WHERE body REGEXP '<!--§§§".$map_name."§[0-9]*§[0-9]*§[a-z]*§-->' AND latest='Y'";
if ($pages = $this->LoadAll($query))
{
//carte HTML pour lecture seule
$html_map = "<map name=\"themap\">\r\n";
foreach ($pages as $page)
{
$tag = $page['tag'];
//recupération des coordonnées dans le corps de la page liée
$t0 = explode("§§§".$map_name, $page['body']);
$t1 = explode("§", $t0[1]);
$x = $t1[1];
$y = $t1[2];
if(isset($t1[3])){
$color = $t1[3];
$c = $imcolor[$color];
} else {
$color = "blanc";
$c = $imcolor['blanc'];
}
$x1 = $x-$d;
$y1 = $y-$d;
$x2 = $x+$d;
$y2 = $y+$d;
imagefilledrectangle($im,$x1,$y1,$x2,$y2,$c);
if($aff == "txt") {
imagestring($im, 2, $x, $y2, $tag, $c);
}
$html_map .= "<area shape=\"rect\" coords=\"$x1,$y1,$x2,$y2\" href=\"".$this->config["base_url"].$tag."\"";
if($aff != "txt") {
$html_map .= " title=\"$tag\""; //info bulle
}
$html_map .= " />\r\n";
//mise à jour table des liens de la page
//$this->StartLinkTracking();
//$this->TrackLinkTo($page['tag']);
//$this->StopLinkTracking();
//zones enregistrées dans le rayon de selection
if(isset($cur_x)) {
if($x > $cur_x-$rs && $x < $cur_x+$rs && $y > $cur_y-$rs && $y < $cur_y+$rs) {
$resultat .= "<b>selected:</b>". $this->ComposeLinkToPage($tag)."<br /> ";
$nom_zone = $tag;
}
}
}
$html_map .= "</map>\r\n";
}
$fichier = $dest_map;
imagepng($im, $fichier);
imagedestroy($im);
$url = $this->config["base_url"].$this->getPageTag();
echo "\r\n";
echo "<div style=\"background-color:rgb(220,220,220);border:1px #000000 solid;padding:2em;\" >";
echo "<form name=\"mp\" action=\"$url\" method=\"post\">\r\n";
//option lecture / ecriture
echo "lecture <input type=\"radio\" name=\"act\" value=\"lecture\" $checklecture onclick=\"document.forms['mp'].submit()\"/>";
echo "ecriture <input type=\"radio\" name=\"act\" value=\"ecriture\" $checkecriture onclick=\"document.forms['mp'].submit()\"/><br />";
//echo "<input type=\"submit\" name=\"switch\" value=\"valider\" /><br />";
echo "afficher les noms dans la carte <input type=\"checkbox\" name=\"aff\" value=\"on\" $checkaff onclick=\"document.forms['mp'].submit()\"/><br />";
if($act == "ecr") {//si option ecriture selectionnée
echo "<br />nom de la zone à créer ou déplacer: <input type=\"text\" name=\"nom_zone\" value=\"$nom_zone\" /><span style=\"background-color:rgb(0,0,0);border:1px #000000 solid;color:#ffffff;\" onclick=\"document.forms['mp'].elements['nom_zone'].value=''\">R</span> couleur: $color_menu<br />\r\n";
echo "<input type=\"image\" name=\"carte\" id=\"carte\" src=\"$fichier\" style=\"cursor:crosshair\" /><br />\r\n";
} else {
echo $html_map;
echo "<img src=\"$fichier\" style=\"border:none; cursor:crosshair\" alt=\"\" usemap=\"#themap\" /><br />\r\n";
}
echo "</form>\r\n";
echo $resultat;
echo "</div>";
//$this->WriteLinkTable();
$this->StartLinkTracking();
?>
code source v0.8
<?php
/*
action carto pour wikini
auteur : yann le guennec
24.02.2005
version 0.8
usage: {{carto srcmap="carte.jpg"}}
note: le script créé un fichier PNG à partir d'un JPG.
*/
$this->StopLinkTracking();
// EDITER CETTE VARIABLE
// chemin vers dossier de stockage images et fichiers txt
// a partir de la racine du wiki
$carto_root = "x/maps/";
// chemin vers fichier image de fond de carte
$carto_src_map = $carto_root.$this->GetParameter("srcmap");
// chemin vers fichier texte de la carte courante
$carto_text_file = $carto_root.$this->getPageTag().".txt";
define('CTF',$carto_text_file);
// chemin vers fichier image de la carte générée
$carto_dest_map = $carto_root.$this->getPageTag().".png";
//creation du fichier txt s'il n'existe pas
if(!is_file($carto_text_file)){
if($f = fopen($carto_text_file, "w+")) {
fclose($f);
} else {
echo "impossible de créer le fichier $carto_text_file";
exit;
}
}
// creation de l'image courante
if(eregi(".jpg",$carto_src_map)) {
$im = @imagecreatefromjpeg($carto_src_map);
} else if(eregi(".png",$carto_src_map)) {
$im = @imagecreatefrompng($carto_src_map);
}
if(!$im) {
echo "impossible de créer la carte à partir de l'image $carto_src_map";
exit;
}
/*
traitement des données reçues du formulaire
*/
//type d'action / option bouton radio
if(isset($_POST['select_action']) && $_POST['select_action']== "ecriture") {
$checklecture = "";
$checkecriture = "checked=\"checked\"";
$action_courante = "ecriture";
} else {
$checklecture = "checked=\"checked\"";
$checkecriture = "";
$action_courante = "lecture";
}
//option d'affichage des noms
if(isset($_POST['aff']) && $_POST['aff']== "on") {
$checkaff = "checked=\"checked\"";
$aff= "txt";
} else {
$checkaff = "";
$aff="";
}
//tag, forme, type, r, g, b, coords
//nom de zone en mode écriture
if(isset($_POST['select_tag']) && $_POST['select_tag'] != "") {
// un nom doit commencer par une lettre suivie de lettres ou chiffres
if(!eregi("^[a-z][a-z0-9]*$", $_POST['select_tag'])) {
echo "<script language=\"javascript\">alert('erreur de nom')</script>";
$cur_tag = "";
} else {
$cur_tag = $_POST['select_tag'];
}
}
//forme de zone en mode écriture
if(isset($_POST['select_shape']) && $_POST['select_shape'] != "") {
$cur_shape = $_POST['select_shape'];
} else {
$cur_shape = "point"; // rect circle poly
}
//type de remplissage en mode écriture NON UTILISE
if(isset($_POST['select_type']) && $_POST['select_type'] != "") {
$cur_type = $_POST['select_type'];
} else {
$cur_type = "contour"; // plein
}
//couleur de zone en mode écriture
if(isset($_POST['select_color']) && $_POST['select_color'] != "") {
$cur_color = $_POST['select_color'];
} else {
$cur_color = "255,255,255";
}
//coordonnées cliquées sur l'image en mode écriture
if(isset($_POST['carte_x']) && isset($_POST['carte_y'])) {
$cur_x = $_POST['carte_x'];
$cur_y = $_POST['carte_y'];
}
//coordonnées temporaires
if(isset($_POST['temp_coords'])) {
$temp_coords = $_POST['temp_coords'];
}
/*
Fonctions de mise à jour du fichier TXT
*/
function isInMap($tag) {
$result = false;
$f = file(CTF);
foreach($f as $line)
{
$t = explode(",",$line);
if ($t[0] == $tag) {
$result= true;
}
}
return $result;
}
function putInMap($data) {
$f = fopen(CTF, "a");
fputs($f, $data);
fclose($f);
}
function removeFromMap($tag) {
$fc = file(CTF);
$f = fopen(CTF,"w");
foreach($fc as $line)
{
$t = explode(",",$line);
if ($t[0] != $tag) {
fputs($f,$line);
}
}
fclose($f);
}
function updateMap($tag, $data) {
$fc = file(CTF);
$f = fopen(CTF,"w");
foreach($fc as $line)
{
$t = explode(",", $line);
if ($t[0] != $tag) {
fputs($f, $line);
} else {
fputs($f, $data);
}
}
fclose($f);
}
$prefix = $this->config["table_prefix"];
// dimensions du fichier image
// $info = getimagesize($carto_src_map);
// $im_w = $info[0];
// $im_h = $info[1];
//suppression de forme
if($_POST['delete'] == "supprimer") {
removeFromMap($cur_tag);
$cur_tag = "";
}
if($cur_x && $cur_y) {
$cc = explode(",", $cur_color);
$c = imagecolorallocate($im, $cc[0], $cc[1], $cc[2]);
//zone du clic
imagefilledrectangle($im, $cur_x-2, $cur_y-2, $cur_x+2 , $cur_y+2, $c);
//zone de sélection
imagerectangle($im, $cur_x-10, $cur_y-10, $cur_x+10, $cur_y+10, $c);
}
if($cur_tag != "")
{
//echo "<br />DEBUG:";
if($cur_shape == "point" && $cur_x && $cur_y)
{
$cur_coords = $cur_x."-".$cur_y;
$cur_data = "$cur_tag,$cur_shape,$cur_type,$cur_color,$cur_coords\r\n";
if(isInMap($cur_tag)) {
updateMap($cur_tag, $cur_data);
} else {
putInMap($cur_data);
}
// mise à jour de la page wiki pointée depuis la carte
// $html_foot = "\r\n-------\r\n$cur_tag";
// si le nom est celui d'une page existante dans le wiki:
// if($page = $this->LoadPage($cur_tag)) {
// $new_body = $page['body'].$html_foot;
// } else {
// $new_body = "Page générée automatiquement depuis la carte ".$this->getPageTag().$html_foot;
// }
// on enregistre la page créée:
// $this->SavePage($cur_tag, $new_body);
}
else if($cur_shape == "rect" && $cur_x && $cur_y)
{
//echo "<br />DEBUG:temp_coords:$temp_coords";
if($temp_coords != "") {
$cur_coords = $temp_coords."-".$cur_x."-".$cur_y;
$cur_data = "$cur_tag,$cur_shape,$cur_type,$cur_color,$cur_coords\r\n";
if(isInMap($cur_tag)) {
updateMap($cur_tag, $cur_data);
} else {
putInMap($cur_data);
}
$temp_coords = "";
$cur_tag = "";
} else {
$temp_coords = $cur_x."-".$cur_y;
$aff_result = "<span style=\"color:#ff0000\">Vous avez positionné le coin supérieur gauche du rectangle, veuillez maintenant cliquer dans l'image pour définir le coin inférieur droit.</span>";
}
}
else if ($cur_shape == "circle" && $cur_x && $cur_y)
{
if($temp_coords != "") {
$centre= explode("-", $temp_coords);
$cx = $centre[0];
$cy = $centre[1];
if($cur_x > $cx) { $a = $cur_x - $cx; } else { $a = $cx - $cur_x; }
if($cur_y > $cy) { $b = $cur_y - $cy; } else { $b = $cy - $cur_y; }
$a2 = $a*$a;
$b2 = $b*$b;
$s = $a2 + $b2;
$r = round(sqrt($s));
$cur_coords = $cx."-".$cy."-".$r;
$cur_data = "$cur_tag,$cur_shape,$cur_type,$cur_color,$cur_coords\r\n";
if(isInMap($cur_tag)) {
updateMap($cur_tag, $cur_data);
} else {
putInMap($cur_data);
}
$temp_coords = "";
$cur_tag = "";
} else {
$temp_coords = $cur_x."-".$cur_y;
$aff_result = "<span style=\"color:#ff0000\">Vous avez positionné le centre du cercle, veuillez maintenant cliquer dans l'image pour définir son rayon.</span>";
}
}
else if ($cur_shape == "poly")
{
//BUG: cur_x non défini
if(isset($_POST["fermer_polygone"])) {
$cur_coords = $temp_coords."-".$_POST['temp_poly'];
//echo "<br />DEBUG:temp_poly:$cur_coords";
$cur_data = "$cur_tag,$cur_shape,$cur_type,$cur_color,$cur_coords\r\n";
if(isInMap($cur_tag)) {
updateMap($cur_tag, $cur_data);
} else {
putInMap($cur_data);
}
$temp_coords = "";
$cur_tag = "";
} else {
$cur_coords = $cur_x."-".$cur_y;
if($temp_coords != "") {
$temp_coords .= "-";
$d_coords = $_POST['temp_poly'];
} else {
$d_coords = $cur_x."-".$cur_y;
}
$aff_result = "<span style=\"color:#ff0000\">Positionnez d'autres points du polygone ou refermer le en cliquent sur 'fermer le polygone'.</span>";
$menu_temp_poly = "<input name=\"temp_poly\" type=\"hidden\" value=\"$d_coords\" /><input name=\"fermer_polygone\" type=\"submit\" value=\"fermer le polygone\" />";
$temp_coords .= $cur_x."-".$cur_y;
//previsu du polygone
$tcoords = explode("-",$temp_coords);
for($n=0; $n<=count($tcoords)-4; $n++) {
if($n%2 == 0) {
$x1 = $tcoords[$n];
$y1 = $tcoords[$n+1];
$x2 = $tcoords[$n+2];
$y2 = $tcoords[$n+3];
imageline($im, $x1, $y1, $x2, $y2, $c);
}
}
//Fin previsu du polygone
}
}
else if($cur_shape == "label" && $cur_x && $cur_y)
{
$cur_coords = $cur_x."-".$cur_y;
$cur_data = "$cur_tag,$cur_shape,$cur_type,$cur_color,$cur_coords\r\n";
if(isInMap($cur_tag)) {
updateMap($cur_tag, $cur_data);
} else {
putInMap($cur_data);
}
}
}
/*
construction de l'image
*/
$html_map = "<map name=\"themap\">\r\n";
//ouverture du fichier texte de la carte courante
$f = file($carto_text_file);
foreach($f as $line)
{
//tag, forme (rect, circle, poly), type (plein ou contour), rouge, vert, bleu, coordonnées séparées par des tirets;
$tab = explode(",",$line);
$tag = $tab[0];
$shape = $tab[1];
$type = $tab[2];
$r = $tab[3];
$g = $tab[4];
$b = $tab[5];
$col[$tag] = imagecolorallocate($im, $r, $g, $b);
$coords = explode("-", $tab[6]);
if ($shape == "point")
{
$x = $coords[0];
$y = $coords[1];
$x1 = $x-2;
$y1 = $y-2;
$x2 = $x+2;
$y2 = $y+2;
imagefilledrectangle($im, $x1, $y1, $x2, $y2, $col[$tag]);
$html_map .= "<area shape=\"rect\" coords=\"$x1,$y1,$x2,$y2\" href=\"".$this->config["base_url"].$tag."\" title=\"$tag\" />\r\n";
if($aff == "txt") {
imagestring($im, 2, $x, $y2, $tag, $col[$tag]);
}
// mise à jour table des liens de la page ??
// $this->StartLinkTracking();
// $this->TrackLinkTo($tag);
// $this->StopLinkTracking();
}
else if($shape == "rect")
{
$x1 = $coords[0];
$y1 = $coords[1];
$x2 = $coords[2];
$y2 = $coords[3];
if($type == "plein") {
imagefilledrectangle($im, $x1, $y1, $x2, $y2, $col[$tag]);
} else if ($type == "contour") {
imagerectangle($im, $x1, $y1, $x2, $y2, $col[$tag]);
}
//$html_map .= "<area shape=\"rect\" coords=\"$x1,$y1,$x2,$y2\" href=\"".$this->config["base_url"].$tag."\" title=\"$tag\" />\r\n";
if($aff == "txt") {
imagestring($im, 2, $x2, $y2, $tag, $col[$tag]);
}
}
else if($shape == "circle")
{
$cx = $coords[0];
$cy = $coords[1];
$r = $coords[2];
$d = $r*2;
imagearc($im, $cx, $cy, $d, $d, 0, 360, $col[$tag]);
//$html_map .= "<area shape=\"circle\" coords=\"$cx,$cy,$r\" href=\"".$this->config["base_url"].$tag."\" title=\"$tag\" />";
if($aff == "txt") {
imagestring($im, 2, $cx, $cy, $tag, $col[$tag]);
}
}
else if($shape == "poly")
{
for($n=0; $n<=count($coords)-4; $n++) {
if($n%2 == 0) {
$x1 = $coords[$n];
$y1 = $coords[$n+1];
$x2 = $coords[$n+2];
$y2 = $coords[$n+3];
imageline($im,$x1,$y1,$x2,$y2, $col[$tag]);
}
}
if($aff == "txt") {
imagestring($im, 2, $x1, $y1, $tag, $col[$tag]);
}
}
else if($shape == "label")
{
$x = $coords[0];
$y = $coords[1];
imagestring($im, 5, $x, $y, $tag, $col[$tag]);
}
}
$html_map .= "</map>\r\n";
imagepng($im, $carto_dest_map);
imagedestroy($im);
/*
ELEMENTS DE FORMULAIRES
*/
$url = $this->config["base_url"].$this->getPageTag();
//option lecture / ecriture
$menu_action = "lecture<input type=\"radio\"
name=\"select_action\"
value=\"lecture\"
$checklecture
onclick=\"document.forms['mp'].submit()\"/>
ecriture<input type=\"radio\"
name=\"select_action\"
value=\"ecriture\"
$checkecriture
onclick=\"document.forms['mp'].submit()\"/>";
$menu_affichage_nom = " afficher les noms:<input type=\"checkbox\"
name=\"aff\"
value=\"on\"
$checkaff
onclick=\"document.forms['mp'].submit()\"/>";
// éléments de formulaire en écriture
$menu_nom_zone = " Nom de la zone à créer ou modifier:<input type=\"text\"
name=\"select_tag\"
value=\"$cur_tag\" /> <input type=\"submit\" name=\"delete\" value=\"supprimer\" />";
/* NZ
$menu_type_zone = "selectionnez le type de zone:";
$menu_type_zone .= " <select name=\"select_type\">";
$menu_type_zone .= " <option value=\"plein\"";
if($cur_type == "plein") {
$menu_type_zone .= "selected=\"selected\"";
}
$menu_type_zone .= ">plein</option>";
$menu_type_zone .= " <option value=\"contour\"";
if($cur_type == "contour") {
$menu_type_zone .= "selected=\"selected\"";
}
$menu_type_zone .= ">contour</option>";
$menu_type_zone .= " </select><br />";
*/
$formes = array("point"=>"point","circle"=>"cercle","rect"=>"rectangle","poly"=>"polygone","label"=>"label");
$menu_forme_zone = " Forme:<select name=\"select_shape\">\r\n";
while(list($k,$v) = each($formes)) {
$menu_forme_zone .= "<option value=\"$k\" ";
if($k==$cur_shape) {
$menu_forme_zone .= " selected=\"selected\"";
}
$menu_forme_zone .= ">$v</option>\r\n";
}
$menu_forme_zone .= "</select>\r\n";
$menu_temp_coords = "<input type=\"hidden\" name=\"temp_coords\" value=\"$temp_coords\" />\r\n";
//tableau de couleurs prédéfinies
$color['blanc'] = '255,255,255';
$color['noir'] = '0,0,0';
$color['rouge'] = '255,0,0';
$color['vert'] = '0,255,0';
$color['bleu'] = '0,0,255';
$color['jaune'] = '255,255,0';
$color['cyan'] = '0,255,255';
$color['fushia'] = '255,0,255';
//menu déroulant de couleurs prédéfinies
$menu_couleur_zone = " Couleur:";
$menu_couleur_zone .= "<select name=\"select_color\">\r\n";
$menu_couleur_zone .= "<option value=\"\" style=\"\"></option>\r\n";
while(list($k, $v) = each($color)){
$menu_couleur_zone .= "<option value=\"$v\" style=\"background-color:rgb($v)\"";
if($cur_color == $v) {
$menu_couleur_zone .= " selected=\"selected\"";
}
$menu_couleur_zone .= ">".$k."</option>\r\n";
}
$menu_couleur_zone .= "</select>\r\n";
//BOUTON IMAGE : la carte
$menu_image_carte = "<input type=\"image\"
name=\"carte\"
id=\"carte\"
src=\"$carto_dest_map\"
style=\"cursor:crosshair\" />\r\n";
//<span style=\"background-color:rgb(0,0,0);border:1px #000000 solid;color:#ffffff;\" onclick=\"document.forms['mp'].elements['nom_zone'].value=''\">R</span>
echo "\r\n";
// FORMULAIRE
//echo "<div style=\"background-color:rgb(220,220,220);border:1px #000000 solid;padding:2em;\" >";
echo "<form name=\"mp\" action=\"$url\" method=\"post\">\r\n";
echo $aff_result."<br />";
if($action_courante == "ecriture") { //si option ecriture selectionnée
echo $menu_image_carte;
echo "<br />";
echo $menu_nom_zone;
echo "<br />";
echo $menu_forme_zone;
//echo $menu_type_zone;
echo $menu_couleur_zone;
if($cur_shape == "poly") {
echo $menu_temp_poly;
}
echo $menu_temp_coords;
echo "<br />";
echo "<br />\r\n";
} else { // lecture seule
echo $html_map;
echo "<img src=\"$carto_dest_map\" style=\"border:none;\" alt=\"\" usemap=\"#themap\" />";
echo "<br />\r\n";
}
echo "<br />";
echo $menu_action;
echo $menu_affichage_nom;
echo "<br />";
echo "</form>\r\n";
//echo "</div>";
//$this->WriteLinkTable();
$this->StartLinkTracking();
?>
Discussions
Remarques :
- pourquoi utiliser un paramètre "destmap" ; ne pourrait-il s'agir au moins d'un paramètre optionnel ?
- J'ai des problèmes avec la réecriture d'URL, et sans ce paramètre, il me faut coder en dur le chemin dans l'action.
- pourquoi ne peut-on pointer vers une page existante du Wiki (PagePrincipale par exemple) ?
- bien vu, la v0.5 intègre cette possiblité, et le résultat est globalement plus propre, mieux intégré au wiki. -- YannLeGuennec
- vu : encore mieux, elle devrait permettre les liens interwiki... comme [[WikiNi:ActionCarto]] -- CharlesNepote
- le système permettant d'ouvrir le lien d'un point n'est-il pas perfectible ? l'idéal ne serait-il pas de pouvoir suivre le lien en un seul clic directement depuis la carte
- pas sûr dans la mesure ou actuellement on peut faire des grappes de points dans une même zone. Le curseur de sélection permet alors de sélectionner plusieurs points. on peut ensuite sélectionner la page dans la liste. Sinon, j'aime bien aussi le fait de rester travailler sur une image, puis de choisir de naviguer vers les pages, plutot que d'être envoyer automatiquement sur d'autres pages. Peut-être qu'une autre action, une image en lecture seule, complémentaire de celle-ci serait une solution.
- Ben j'imagine bien cette idée d'avoir une "carte en lecture seule avec ouverture du lien sur simple clic et sans la case de saisie" et une autre "carte en écriture seule avec tout ce qu'il faut pour cela". Passer de l'une à l'autre pourrait se faire par un bouton read/write systématique reporté partout. OlivierAuber
Des titres
Pourquoi ne pas offrir la possibilité d'ajouter des titres seuls (sans point), pour légender une partie de la carte. Cela permettrait par exemple d'offrir à l'utilisateur
WikiNi des graphes vierges dans lesquels il n'aurai plus qu'à ajouter ces titres et ces points. --
CharlesNepote
Exemple

.
- je ne comprends pas bien l'exemple: s'agit-il d'une image de fond de carte, ou d'un exemple d'image potentiellement générée par l'action, ou les deux et dans ce cas, dans quelle mesure ? --YannLeGuennec
- Imagine un diagramme vide comme le diagramme suivant, j'aimerai pouvoir :
- 1. placer des labels sur les axes (non cliquables)
- 2. placer des points sur les axes (cliquables)

On pourrait livrer
WikiNi avec quelques graphiques vierges que les utilisateurs pourraient ainsi remplir à leur guise : pyramydes, cercles, abcisses et ordonnées, cartes géographiques (France, Europe, etc.), etc. Les utilisateurs disposeraient ainsi d'un moyen simple et rapide d'élaborer des graphiques sur inter/intranet.
--
CharlesNepote
> bonne idée, les labels ont été ajoutés à la version 0.8. --
YannLeGuennec
[Note perso : je suis désolé Yann, on n'a pas beaucoup avancé sur tes propositions précédentes mais leur maturité me laisse penser à une éventuelle intégration dans la prochaine version officielle de
WikiNi. Il y a encore un un deux points de détails à voir.]
--
CharlesNepote
> pas de problème là-dessus, pour ce qui fait parti de la distribe ou non, je laisse les
core developpers seuls juges! :) --yann
Projet proche (merci Yann pour les idées) : une carte géographique pour constitution de calendriers ou d'inventaires (naturalistes) coopératifs.
Voir :
http://www.onem-france.org/wakka.php?wiki=CalendrieR
Principe :
- base de données de coordonnées géographiques de communes française
- un fond de carte départemental
- un fond de carte maillage utm 10x10km
- restitution sur la carte des évenements indiqués dans le texte, positionnement par nom de commune, centrage sur maille 10k.
- visualisation des évenements ou informations associés à un point sur la carte lors du passage de la souris.
--
DavidDelon
Super! très adapté au
géopositionnement . Tu mettras les sources de
MapView? à disposition ? --
YannLeGuennec
Oui bien sûr. --
DavidDelon
Totalement débutant en .php et Wikini, je trouve ce projet vraiment super intéressant. J'aimerai l'intégrer à un wiki perso hébergé chez free. Problème, je ne sais pas vraiment quoi faire du code source et ou l'intégrer. Si vous pouviez me filer un coup de main ou me renvoyer vers des tutoriaux ce serait avec plaisir! --
FabienEychenne? (en espérant de ne pas trop vous faire perdre votre temps...)