retour page d'accueil    
    La cartographie intuitive et intelligente

 Prestations
    Produits
Galerie
Réalisations
Projet type
Services

 À vous de jouer
    France découverte
Collez vos données
Conservez vos projets
Echangez : TJS/WMS
 
 Caractéristiques
    Géoclip, c'est quoi ?
Fluidité de l'interface
Richesse du contenu
Variété des thèmes
 Le dessous
 des cartes
    Du SIG vers le web
Zooms, sélections...
Accès bases de données
Modes de représentation
Flash, SVG et les autres

 Ressources
    Sites et forums
Référents

 Qui sommes-nous ?
    Équipe
Partenaires
Clients
 


Le dessous des cartes > Zooms et sélections

Comment programmer les fonctions de navigation de base ?
 

A l'affichage d'une carte, une envie naît chez la plupart des utilisateurs d'aller voir de plus près autour du village de leurs grands-parents, dans leur région d'origine ou dans leur pays natal, pas vous ? Cela suffirait à rendre la fonction de zoom indispensable. Cela consiste en se rapprocher ou s'éloigner au-dessus du territoire représenté, pour une vue soit plus détaillée, soit plus globale de celui-ci.
Après avoir vu de plus près, les utilisateurs seront immanquablement tentés de cliquer sur leur village, leur région ou leur pays, pour tenter d'en savoir plus. C'est à cela que sert la fonction de sélection : repérer une partie du territoire représenté, afin d'accéder à d'autres informations ; cela peut être une unité géographique, ou bien plusieurs, définies à la souris ou par lien géographique, par exemple toutes les communes situées dans un rayon de 15 km autour d'un point donné.

  Fonction de zoom
L'usage, dans le monde des SIG, a fait émerger une technique simple : le dessin du rectangle de zoom sur la carte à la souris. Comment met-on cela en œuvre dans Géoclip ?

Tout d'abord un petit dessin :

lc et hc sont la largeur et la hauteur du cadre de la carte, lz et hz sont la largeur et la hauteur de la zone de zoom. Le facteur de zoom se déduit de la valeur minimale entre hc/hz et lc/lz. C'est le facteur d'agrandissement qu'on appliquera globalement à la carte.

Mais après cette mise à l'échelle, rien n'oblige a priori le centre du zoom à coïncider avec le centre de la fenêtre carte. Il faut donc déplacer la carte (opérer une translation), de telle sorte que le centre du rectangle de zoom soit situé au centre de la fenêtre carte. Or on a affaire à deux systèmes de coordonnées différents : celui de l'écran, au sein duquel la fenêtre carte et son centre ont toujours les même coordonnées, et celui de la carte elle-même, qui subit homothéties et translations.




On veut donc faire coïncider deux points : le centre de la fenêtre carte dont les coordonnées écran sont (CX,CY) et le centre du zoom dont les coordonnées dans le système de la carte sont (zcx,zcy). La correction à opérer se déduit de la distance des deux points dans l'un ou l'autre des systèmes de coordonnées, l'essentiel étant qu'elle soit mesurée dans le même système pour les deux points. Choisissons par exemple de tout ramener au système écran. Il s'agit donc de calculer les coordonnées du centre du zoom dans ce système, donc de passer de (zcx,zcy) à (ZCX,ZCY) et d'opérer la translation (CX-ZCX,CY-ZCY). Pour plus d'explication sur les calculs de changement de coordonnées, voir Conversion de coordonnées. Mais comme Flash intègre des fonctions de changement de système de coordonnées, autant les utiliser. On se servira de la fonction LocalToGlobal(), qui permet de passer du système de coordonnées d'un objet quelconque (ici un objet dénommé "carte" contenant la carte) au système écran :

centre_zoom = [ { x : zcx , y : zcy } ] ;
carte.localToGlobal(centre_zoom);
ZCX=centre_zoom.x; ZCY=centre_zoom.y;


la translation correctrice (CX-ZCX,CY-ZCY) devra se faire dans le système de coordonnées de l'écran.


Fonction de sélection

Les sélections géographiques les plus simples permettent à l'utilisateur de sélectionner des unités géographiques en dessinant à la souris un cercle ou un rectangle de sélection. Comment ça marche dans Géoclip ? Elles s'appuient sur un mécanisme de base : détecter qu'un point est ou non à l'intérieur d'un polygone donné. Une méthode consiste à tracer un rayon à partir du point considéré dans une direction quelconque et à compter le nombre d'intersections avec le polygone cible. Si ce nombre est impair, le point est à l'intérieur, s'il est pair, le point est à l'extérieur.

Flash propose une fonction de test automatique. Soit un polygone pg et un point de coordonnées x,y:
pg.hitTest(x,y,1) vaut true (1) si le point est à l'intérieur, false (0) si le point est à l'extérieur.
La même fonction possède une variante permettant de comparer deux formes quelconques :
test=forme1.hitTest(forme2);

Voici un exemple (au format Flash), de mise en oeuvre de cette fonction :

Appliquée aux sélections géographiques, cette fonction permet de déterminer par exemple les objets du fond de carte dont le centre géométrique ou la position du chef lieu est à l'intérieur de la zone de sélection.










Astuce d'optimisation : la foncton hitTest, dans son écriture pg.hitTest(x,y,1), possède un troisième paramètre qui peut être mis à 0. Dans ce cas, c'est la présence du point de coordonnées (x,y) à l'intérieur du rectangle de délimitation de la forme qui est évaluée, comme dans l'exemple ci-dessous, où le rectangle de délimitation est figuré en pointillés :

Ce test est imprécis mais il a le mérite de s'exécuter beaucoup plus rapidement que le premier : il peut jouer un rôle de premier filtrage des objets candidats à la sélection, le test précis intervenant en second lieu.



contact version française english version russian intro