angelimad
Messages postés44Date d'inscriptionlundi 26 mai 2008StatutMembreDernière intervention 9 septembre 2009
-
21 juil. 2008 à 21:26
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 2010
-
17 août 2008 à 01:09
bonjour tous,
Je dois effectuer une gestion des régions d’un pays, et j’aimerais vraiment faire quelque chose de luxe, c’est de travailler sur une map qui contienne toutes les régions de ce pays, et a chaque fois l’utilisateur ajoute les équipements UMTS sur les régions de son choix.
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Ma carte sera statique, mais elle joue surtout sur l’aspect affichage, c'est-à-dire que l’utilisateur s’il veut faire une consultation des régions qui sont couvertes par le réseau UMTS, mon site fera un teste dans sa base de données et active sur la map les régions trouvés dans la base de données.
Sa reste une idée pour moi, et je sais pas si c’est réalisable ni comment, si vous avez des suggestions ou des conseils n’hésitez pas.
ofonadroite
Messages postés130Date d'inscriptionmercredi 25 juin 2008StatutMembreDernière intervention13 août 20082 22 juil. 2008 à 09:58
Salut,
L'ImageMap peut aussi être une solution, couplé avec Gimp qui permet de faire un découpage point par point de ta map, ça permet de gérer le clic, d'avoir des infos en survolant la zone. Le lien que t'as donné ggtry en parle à la fin d'ailleurs.
Voici un petit tuto : http://www.infetech.com/article.php3?id_article=159 il te suffit d'adapter ensuite cette ImageMap à celle en asp <asp:ImageMap en récupérant les points des zones et hop le tour est joué.
angelimad
Messages postés44Date d'inscriptionlundi 26 mai 2008StatutMembreDernière intervention 9 septembre 2009 28 juil. 2008 à 20:31
dsl en consultant le lien que vous m'avez donné, j'ai essayé de cherché la propriété HotSpots d'une PictureBox dans visual Studio 2005 mais je la trouve pas
Vous n’avez pas trouvé la réponse que vous recherchez ?
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 29 juil. 2008 à 20:29
Bonsoir,
Oui, désolé. La solution proposée dans mon lien n'est pas applicable sur le web, ou alors difficilement (on ne peut pas non plus transposer en repérant les couleurs avec du javascript, qui ne peut pas faire cela).
Tu peux donc en effet, comme le dit Ofonadroite, passer par ImageMap, qui fonctionne avec des coordonnées. Cela peut être un peu pénible si ta carte et son graphisme sont complexes (il est plus facile de définir un polygone pour un état américain, découpé au cordeau, que pour un département français, ou pour la carte d'Europe, par exemple).
Mais, si ce n'est pas indiscret, ce sera une carte de quoi, avec des sous-cartes (? je veux dire une carte générale, et des cartes plus précises pour les régions ?), et quelle est la manière dont l'utilisateur devra faire son (ou ses) choix ?
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 30 juil. 2008 à 00:33
Mais tes cartes (je veux dire graphiquement) sont déjà faites ou tu dois encore les faire (ou les faire faire ) ? Si elles sont déjà faites (pour les régions sélectionnées), il est aussi simple de les montrer que d'afficher les informations (et a fortiori, d'afficher les deux en même temps).
Cela dépend aussi du nombre de niveaux (i.e. du nombre de cartes et de sous cartes).
Mais s'il n'y a que deux niveaux (une grande carte de toutes les régions, et un nombre x correspondant au nombre de régions), cela peut être relativement simple à faire (du moins en gros, avant de faire les finitions).
Encore une fois, cela peut dépendre de la complexité de ta carte, mais il y aurait des moyens de faciliter l'entrée des coordonnées...
angelimad
Messages postés44Date d'inscriptionlundi 26 mai 2008StatutMembreDernière intervention 9 septembre 2009 30 juil. 2008 à 00:46
Actuellement je vais me contenter d’avoir une seule carte diviser en régions, et a chaque clique sur une région un événement sera déclencher pour collecter des informations de la base de données et juste les afficher.
Ma carte existe déjà, je lai eu d’internent ou les régions sont définis, mais je dois colorié je crois.
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 30 juil. 2008 à 14:40
Bonjour,
J'ai réfléchi aux moyens d'utiliser quand même une différenciation des régions par couleur, plutôt que d'utiliser une imagemap. Ca peut être fait relativement simplement dans une solution pour le web, mais avec un petit défaut : on peut récupérer la couleur du pixel sur lequel la souris est positionnée, mais il n'est pas possible avec cette méthode d'afficher une info-bulle au passage de la souris sur une région.
La solution n'obligerait pas à utiliser deux images superposées (même si on peut utiliser deux images, une pour l'affichage (qui peut donc être graphiquement plus complexe), l'autre pour les couleurs différenciantes).
Il suffirait dans la bdd d'attribuer dans un nouveau champ, à chaque région, une couleur déterminée, puis de faire une requête pour récupérer les informations à afficher. L'image avec les couleurs de régions pourrait soit être l'image affichée, soit ne pas être affichée mais être tout de même utilisée pour récupérer le code de la couleur.
Si ça t'intéresse toujours, je peux te passer un exemple.
angelimad
Messages postés44Date d'inscriptionlundi 26 mai 2008StatutMembreDernière intervention 9 septembre 2009 30 juil. 2008 à 17:18
Je crois que votre solution coïncide avec ce que j’aimerais réaliser.
De ce que j’ai compris j’aurais une image ou les régions serons coloriée, et a chaque clique sur une régions je dois comparer la couleur du pixel cliqué avec les couleurs dont je dispose dans ma BD, et comme sa je pourrais afficher les données relatives.
Pour l’instant ce n’est pas vraiment important d’afficher les infos bull.
Mais tous ce qu’on a dit jusqu'à maintenant sa reste en général, j’aimerais bien avoir une explication technique, avec un exemple de code.
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 30 juil. 2008 à 17:59
L'idée est la suivante :
Quand l'utilisateur clique sur la carte, on récupère d'abord les coordonnées de la souris avec du javascript, et on les place dans deux hiddenfield.
Côté serveur, dans le code behind, on récupère la couleur du pixel sur lequel l'utilisateur a cliqué à l'aide de ces coordonnées.
L'exemple donné ci-dessous suppose que l'image, sur la page, n'a pas été redimensionnée.
Dans cet exemple, j'utilise en fait deux images. Pour mon essai, j'ai pris une carte d'Europe vide avec des frontières. L'image n°1, qui est affichée, est cette carte vide, non coloriée. Dans le code behind, je travaille sur une autre image, identique, à part que j'ai colorié l'intérieur des pays. Comme les coordonnées récupérées sont identiques pour les deux images, je n'ai donc pas besoin d'afficher ma carte coloriée.
Toutefois, il est possible de n'avoir qu'une seule carte, celle qui est coloriée, en mettant la même dans la page et dans le code behind. Mais pour avoir une meilleure présentation de l'image affichée, il peut être préférable d'avoir ces deux images (la couleur, pour chaque pays, doit être unie). A toi de voir.
Mettons que tu crées une page nommée carte.aspx et un fichier de code séparé carte.aspx.vb (l'exemple est en effet en vb, mais si tu travailles en c#, cela ne doit pas être trop difficile à adapter).
pour la page, voici mon exemple, avec la fonction javascript (qui doit être en principe compatible IE, Firefox, Opera et Safari au moins). L'image est placée dans un ImageButton et est positionnée avec du css :
<head runat="server">
<title>Page sans titre</title>
<style type="text/css">
#toto
{
top:60px;left:0px;position:fixed;
}
</style>
<script type="text/javascript">
function pos2(e){
var nav=navigator.appName
if (nav!="Netscape"){
var x=e.offsetX
var y=e.offsetY
}
else
{
var x=e.layerX
var y=e.layerY
}
document.getElementById("HFx").value=x;
document.getElementById("HFy").value=y;
}
</script>
</head>
<form id="form1" runat="server">
</form>
pour carte.aspx.vb :
Imports System.drawing
Partial Class Carte
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ImageButton1.Click
''image seconde, comportant les couleurs
Dim im As Bitmap = New Bitmap(Server.MapPath("europeb1.png"))
''récupération des coordonnées
Dim hfx As Integer = CType(Page.FindControl("HFx"), HiddenField).Value
Dim hfy As Integer = CType(Page.FindControl("HFy"), HiddenField).Value
''récupération de la couleur
Dim ceci As Color
''définitions diverses
Dim toto As Label = CType(Page.FindControl("Label1"), Label)
Dim toto2 As Label = CType(Page.FindControl("Label2"), Label)
Dim coul() As String = {"8000", "FF00", "FFFF0", "0800", "FFFFFF"}
Dim pays As String
Dim test As Boolean = False
''code hex de la couleur
''si clique sur couleur non indexée (p. ex. un contour), recherche de la couleur indexée la plus proche vers la gauche
''ou vers la droite si hfx devient inférieur à 0
Dim direction As Integer = -1
While test = False
''récupération de la couleur
ceci = im.GetPixel(hfx, hfy)
toto.Text = Hex(ceci.R) & Hex(ceci.G) & Hex(ceci.B)
For Each nom As String In coul If nom toto.Text Then test True
Next If test False Then hfx hfx + direction
If hfx < 0 Then direction = 1
End While
''nom du pays selon la couleur
''à remplacer par un appel à la bdd
Select Case toto.Text
Case "8000"
pays = "France"
Case "FF00"
pays = "UK"
Case "FFFF0"
pays = "Espagne"
Case "0800"
pays = "Allemagne"
Case Else
pays = "indéterminé"
End Select
''affichage des coordonnées x/y et du nom de pays
toto2.Text = "x=" & hfx & " ; y=" & hfy & " Pays:" & pays
End Sub
End Class
Cet exemple affiche dans des label les coordonnées de la souris, le code hex de la couleur, et le nom du pays. Le select case et le remplissage des label que j'ai mis sont à remplacer par ta requête et ton appel à la bdd.
J'ai mis des commentaires pour aider.
Dans mon exemple, j'ai aussi ajouté un petit truc (cf. au niveau de la boucle while test=false) : comme ma carte d'Europe a des frontières de couleur noire ou grisâtre, si l'utilisateur clique sur la frontière et pas à l'intérieur du pays, la couleur renvoyée ne pourra pas être interprétée, puisqu'elle ne correspond à aucun pays. J'ai donc mis un tableau avec dedans les couleurs des pays (je n'en ai fait que quatre, pour cet exemple). La couleur du pixel est comparée avec les valeurs du tableau et si elle ne correspond pas à ces valeurs, je recherche la couleur du pixel qui occupe la position x-1 et ainsi de suite, jusqu'à ce que le programme tombe sur une bonne couleur. Autrement dit, si l'utilisateur clique sur une frontière, le programme va chercher sur la gauche une couleur valide, qui correspond à un pays. C'est éventuellement à modifier selon la disposition de ta carte. J'ai fais ça en vitesse...
L'image est un png : je ne sais si cela marchera avec tous les formats images. Mais ça devrait sans doute marcher avec les plus courants. Si tu veux travailler avec une seule image, pour tes tests ou parce que tu préfères, du dois bien entendu mettre la même image dans la page et dans le code behind.
Evidemment, ce n'est qu'une ébauche qu'il faudrait améliorer. Mais ça peut servir de base je pense.
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 30 juil. 2008 à 19:35
Si tu veux voir ce que ça donne, tu peux regarder ici : http://www.placita.org/carte.aspx Note que quatre pays seulement ont été faits : France, Allemagne, UK, Espagne. Si tu cliques ailleurs, tu auras "indéterminé". C'est évidemment assez rudimentaire.
nb. je ne vais pas laisser en ligne très longtemps, ce n'est qu'un exemple.
Le rechargement de l'image est un peu pénible. Il faudrait sans doute penser à un peu d'Ajax (mais je n'y connais rien du tout).
angelimad
Messages postés44Date d'inscriptionlundi 26 mai 2008StatutMembreDernière intervention 9 septembre 2009 31 juil. 2008 à 13:34
merci pour votre réponse.
j'ai essayer le code, je travail avec une seule image colorié, mais a chaque clique sur une regions j essaye d'afficher la veleur de la variable toto.Text, il m'affiche tout le temp "FFFFFF".
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 31 juil. 2008 à 13:57
Bonjour,
A vue de nez, je pense que le problème vient de là :
Dans Dim coul() As String = {"8000", "FF00", "FFFF0", "0800", "FFFFFF"}, il faut que tu mettes la liste de toutes les couleurs de tes régions.
Mais pour le moment, tu peux tout simplement supprimer :
While test = False
''récupération de la couleur
ceci = im.GetPixel(hfx, hfy)
toto.Text = Hex(ceci.R) & Hex(ceci.G) & Hex(ceci.B)
For Each nom As String In coul If nom toto.Text Then test True
Next If test False Then hfx hfx + direction
If hfx < 0 Then direction = 1
End While
et le remplacer seulement par :
ceci = im.GetPixel(hfx, hfy)
toto.Text = Hex(ceci.R) & Hex(ceci.G) & Hex(ceci.B)
(cela te permettra de voir quels sont les codes hex des couleurs de ta carte)
Note que le défaut du code est que toute la carte est cliquable, donc y compris les zones non pertinentes (mers, régions à ne pas traiter, etc.).
angelimad
Messages postés44Date d'inscriptionlundi 26 mai 2008StatutMembreDernière intervention 9 septembre 2009 16 août 2008 à 12:12
j'ai rencontrer un probleme, c'est que j'utilise maintenant une page master, et quand j'ajoute une web form, je ne trouve dans le script que le ContentPlaceHolder, donc je sais plus ou placer le script que vous m avez donnez.
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 17 août 2008 à 01:09
Bonsoir,
Je ne suis pas sûr de bien comprendre de quoi il s'agit.
Si le problème concerne le javascript, tu peux coller simplement le script après la balise content de ta webform (en n'oubliant pas <script type="text/javascript"> ... </script>). Ca devrait marcher.
Sinon, tu peux aussi mettre le script dans le head de ta masterpage (mais c'est bien entendu inutile si ta masterpage te sert aussi à des pages qui n'ont pas besoin de ce script).
Cela dit, le fait d'utiliser une masterpage va modifier les id des éléments contenus dans ta webform. Notamment, la fonction javascript recherche deux hiddenfield nommés Hfx et Hfy : seulement, lorsque ces hiddenfield sont dans le "content", ils vont recevoir un autre id (par exemple : "ctl00_ContentPlaceHolder1_HFx" etc.). La solution la plus immédiate est de modifier la fonction javascript en mettant le bon id, par exemple :
document.getElementById("ctl00_ContentPlaceHolder1_HFx").value=x;
document.getElementById("ctl00_ContentPlaceHolder1_HFy").value=y;
Mais attention, l'id va dépendre de l'organisation de ta page, tu dois donc vérifier quel id est attribué aux hiddenfield dans ta propre page en regardant la source html dans le navigateur (il y aurait plus efficace... mais pour commencer, fait plutôt comme cela).
Sinon, si ton problème ne regarde pas le javascript, mais le visual basic, n'oublie pas que ce que tu mets dans le content d'une webform qui dépend d'une masterpage doit être recherché non plus à l'aide de page.findcontrol, mais en cherchant d'abord le contentplaceholder de la masterpage. Dans le code vb de ta webform, tu dois donc mettre d'abord quelque chose comme :
Dim cph As ContentPlaceHolder = CType(Master.FindControl("ContentPlaceHolder1"), ContentPlaceHolder)
puis remplacer tous les page.findcontrol par cph.findcontrol.
A propos, as-tu essayé d'adapter avec de l'Ajax ? C'est beaucoup mieux.