Procédé pour rechercher un objet au sein d'un espace, procédé et système de cartographie vectorielle intégrant ce procédé de cartographie vectorielle, et appareil électronique mettant en œuvre ce procédé de cartographie vectorielle
La présente invention concerne un procédé pour rechercher un objet au sein d'un espace, ainsi qu'un système de recherche mettant en œuvre ce procédé. Elle vise également un procédé et un système de cartographie vectorielle intégrant ce procédé de recherche, ainsi que des appareils électroniques mettant en œuvre ce procédé de cartographie vectorielle et des supports de données de cartographie vectorielles obtenues avec un tel procédé En cartographie vectorielle, les objets présents dans un domaine sont décrits dans une matrice qui peut être de grande taille et dont le traitement peut être particulièrement consommateur de temps. De plus, lorsqu'il s'agit de rechercher des objets inscrits dans un sous-domaine du domaine principal, on est conduit à construire une extraction de la matrice principale. Plus généralement, le problème posé est la détermination d'un sous- ensemble d'objets contenus dans un sous-domaine d'un domaine contenant un ensemble d'objets sémantiquement homogènes et de géométrie variable, et la construction d'une matrice décrivant les objets appartenant à ce sous- ensemble. Soit un ensemble Ω de N objets sémantiquement homogènes et de géométrie (forme et taille) variable. Ils sont distribués aléatoirement dans l'espace OXYZ où ils occupent un domaine Δ inscrit dans un parallélépipède compris entre (Xmin> Y m, Zmin) et (Xmax, Ymaχ, Zmax), parallélépipède constituant les limites de « l'encombrement » Λ du domaine. En bidimensionnel, on pourrait désigner le domaine par le vocable
« territoire », inscrit dans un rectangle compris entre (Xmin, Ymin) et (Xmax,
' max)-
Les N objets sont décrits par une matrice M qui pour chacun donne la forme par une liste de points (avec coordonnées) et des descriptifs topologiques (arêtes, faces, etc.). En même temps, les coordonnées donnent la position de l'objet dans l'espace. Chaque objet a donc son propre encombrement élémentaire λ représenté par un parallélépipède circonscrit.
On peut naturellement faire les observations suivantes :
- les encombrements élémentaires peuvent s'intersecter,
- (Xmm, Ymin, Zm,n) et (Xmaχ, Ymax, 2maχ) sont respectivement le minimum et le maximum d'au moins un parallélépipède élémentaire. Ceci est vrai s'il n'existe pas de définition géométriquement explicite du domaine Δ.
Il est demandé de déterminer le sous-ensemble ω des v objets contenus dans un sous-domaine δ inscrit dans un parallélépipède compris entre (xminf ymin, zmin) et (xmaχ, Yma , zmaχ) à l'intérieur du parallélépipède circonscrivant Δ, et de construire la matrice μ les décrivant, matrice qui se présentera comme une « extraction » de M.
Selon le problème posé, par objet contenu dans δ on peut entendre objet inclus complètement ou partiellement (objet « touché » par ou intersectant δ).
On va maintenant décrire des méthodes d'accélération existantes : Si l'ordre de la description des objets d'Ω dans la matrice M est aléatoire, pour construire μ il faut parcourir tous les N objets afin de vérifier pour chacun son appartenance à δ et si oui, incrémenter chaque fois v.
Pour accélérer la construction de l'extraction μ, il est nécessaire de transformer M. Une première méthode d'accélération existante est le tri préalable. Trier préalablement les objets de M permet d'accélérer les recherches. La méthode la plus répandue est d'ordonner les objets par rapport au point (xmcn, Ymin, Zmin) de leur parallélépipède élémentaire d'encombrement λ. Ceci permet de diminuer le nombre de vérifications complètes d'appartenance, en éliminant d'emblée tous les objets dont ce point est supérieur au (Xmax, ymax.
Zmax) de δ ; on peut appliquer une deuxième fois le procédé pour l'autre extrémité. L'appartenance est ensuite vérifiée sur les objets restants. Il existe plusieurs variantes de cette approche.
On remarquera que même si l'on diminue la complexité de certaines vérifications (plus δ est petit par rapport à Δ, plus la diminution est significative), tous les N objets de M doivent être parcourus. Afin de l'éviter, il faudrait utiliser une recherche dichotomique.
Un deuxième type de méthodes d'accélération de la construction de l'extraction μ consiste en la décomposition du domaine Δ en Σ sous- domaines Δ, appelés tuiles ou dalles, d'où le nom de tuilage (tiling en anglais). Les objets chevauchant une ou plusieurs tuiles (sous-domaines) seront coupés aux frontières et des informations supplémentaires (de connexion, pour assurer la continuité sémantique) seront enregistrées. La matrice M initiale sera donc décomposée en Σ matrices M, ayant chacune Nj objets. Evidemment,
Le domaine δ recherché couvrira σ tuiles Δj. L'efficacité de la méthode dépendra du nombre Σ de tuiles du domaine Δ initial et du rapport de taille entre δ et les Δi, donc entre σ et Σ. Par contre et malheureusement, plus on augmente Σ, plus on augmente le nombre d'objets coupés et donc la taille de M. A la fin, les objets éventuellement coupés pourront être reconstitués, rendant ainsi le tuilage transparent.
Le tuilage apparaît immédiatement plus intéressant que le tri simple, d'autant plus que ce dernier peut être appliqué à chaque tuile. C'est la raison pour laquelle il est amplement utilisé, par exemple en cartographie.
Il comporte cependant un inconvénient majeur qui réside dans la nécessité de couper des objets, donc d'augmenter le nombre total d'objets traités, et par conséquent de créer et d'utiliser des informations de frontière, tout ceci compliquant les algorithmes de traitement.
L'objectif visé, par rapport à l'état de la technique, est d'accélérer le processus d'obtention de l'extraction sans modifier en aucune façon les objets, afin de ne pas en augmenter le nombre et par conséquent la taille de la matrice M contenant pour chaque objet une liste de points et des descriptifs topologiques.
Pour atteindre cet objectif, on prend en considération l'information d'encombrement élémentaire de chaque objet, qui, soit est contenue initialement dans la matrice M, soit doit être calculée puis enregistrée dans la matrice, et on passe l'ensemble des objets au travers d'une pluralité de « tamis » aux mailles de plus en plus fines, de façon à obtenir des groupes d'objets calibrés.
On propose ainsi un procédé pour rechercher un objet contenu dans un domaine δ au sein d'un espace Δ contenant un ensemble d'objets décrits dans une matrice M initiale, comprenant une construction d'un sous- ensemble ω d'objets contenus dans ledit domaine δ par extraction d'une matrice μ à partir de la matrice M initiale.
Suivant l'invention, le procédé comprend les étapes suivantes :
- on crée un matriçage M de l'espace Δ en superposant une pluralité de matrices géométriques de normes p (tailles des mailles) différentes, représentant une couverture du domaine par un ensemble déterminé et homogène de sous-domaines similaires, chacune des mailles de chaque matrice géométrique étant identifiée par une valeur numérique spécifique et unique appelée code de matrice,
- on détermine pour l'ensemble du matriçage M toutes les mailles incluses dans le domaine δ ou intersectées par le domaine δ, et le nombre d'objets concernés comme la somme des nombres d'objets des mailles concernées,
- on trie la matrice M par codes de matrice selon un ordre prédéterminé, par exemple décroissant, des normes p, et
- on construit la matrice d'extraction μ décrivant les seuls objets concernés par lesdites mailles incluses dans le domaine δ ou intersectées par le domaine δ.
Il est à noter que le document US5030117 décrit un système numérique de génération cartographique, dans lequel les données cartographiques sont organisées selon une hiérarchie d'échelles successives, sous une forme pyramidale avec un faible nombre de tuiles (par exemple 4) au sommet et 416 tuiles à la base d'une pyramide comprenant par exemple 16 niveaux. Même si des figures de ce document, notamment les figures 8 et 13, montrent des superpositions de grilles ou de matrices, il ne s'agit pas pour autant d'un procédé de recherche d'objet selon une technique de « tamis multiples ». On connaît aussi par le document US5694534 un dispositif pour stocker une représentation de structures topologiques et des procédés pour construire et rechercher cette représentation. Le dispositif décrit comprend un support de stockage de données, une base de données stockée sur ce support et contenant des blocs porteurs de données représentant des caractéristiques topologiques de la structure représentée à un niveau donné de détail. Les données de chacun de ces blocs sont une représentation d'un porteur qui est un ensemble fermé incluant un objet topologique donné. Dans le procédé décrit, il s'agit de construire des chaînes connectées de cellules constituant des sous-complexes topologiques. Le concept de tamisage multiple à des fins de construction d'une matrice d'extraction n'est pas divulgué dans ce document.
Dans le procédé de recherche selon l'invention, les objets peuvent par exemple être triés par codes de matrice croissants.
Dans un mode de réalisation avantageux de l'invention, le procédé de recherche comprend en outre un stockage d'une liste des codes de matrice avec un pointeur sur le premier objet de chaque code.
La sélection des objets peut par exemple être effectuée par un curseur qui parcourt la liste des codes de matrices.
Suivant un autre aspect de l'invention, il est proposé un procédé de cartographie vectorielle, pour cartographier un territoire Δ comprenant un ensemble d'objets décrits par une matrice M ; mettant en œuvre le procédé de recherche d'objet selon l'invention, caractérisé en ce qu'il comprend les étapes suivantes :
- une détermination de la liste des mailles actives, comprenant un calcul de l'ensemble des codes de matrice correspondant aux mailles qui intersectent le domaine δ de recherche, et
- une sélection et un traitement éventuel des objets. Lorsque ce procédé est mis en oeuvre dans un domaine bidimensionnel, il comprend alors un matriçage selon une pluralité de matrices géométriques rectangulaires comportant des mailles régulières, chaque matrice géométrique présentant une norme différente incluant la longueur et la largeur des mailles de ladite matrice. Pour une mise en œuvre en cartographie bi-dimensionnelle étendue à niveaux multiples, le procédé de cartographie vectorielle selon l'invention comprend alors les séquences suivantes :
- l'ensemble initial Ω de N objets est décomposé en une pluralité de Z sous-ensembles Ωζ d'objets de même niveau, avec ζ = 1 à Z, - la matrice M initiale est décomposée en Z matrices Mζ,
- on utilise le matriçage d'une façon indépendante pour chaque sous- ensemble.
Suivant encore un autre aspect de l'invention, il est proposé un système de cartographie vectorielle, comprenant des moyens pour traiter des objets contenus dans un domaine δ au sein d'un espace Δ contenant un ensemble d'objets décrits dans une matrice M initiale, comprenant une construction d'un sous-ensemble ω d'objets contenus dans ledit domaine δ par extraction d'une matrice μ à partir de la matrice M initiale, caractérisé en ce qu'il comprend en outre: - des moyens pour créer un matriçage M de l'espace Δ en superposant une pluralité de matrices géométriques de normes p différentes, représentant une couverture du domaine par un ensemble déterminé et homogène de sous- domaines similaires, chacune des mailles de chaque matrice géométrique étant identifiée par un index spécifique et unique appelé code de matrice,
- des moyens pour déterminer pour l'ensemble du matriçage M toutes les mailles incluses dans le domaine δ ou intersectées par le domaine δ, et le nombre d'objets concernés comme la somme des nombres d'objets des mailles concernées, - des moyens pour trier la matrice M par codes de matrice selon un ordre prédéterminé, par exemple décroissant, des normes p, et
- des moyens pour construire la matrice d'extraction μ décrivant les seuls objets concernés par lesdites mailles incluses dans le domaine δ ou intersectées par le domaine δ. D'autres avantages et caractéristiques de l'invention apparaîtront à l'examen de la description détaillée d'un mode de mise en œuvre nullement limitatif, et des dessins annexés sur lesquels :
- la figure 1 représente graphiquement le tamisage progressif effectué dans le procédé de recherche selon l'invention ; et - la figure 2 est un schéma illustrant le tri de la matrice des objets de l'ensemble d'objets par codes de matrice La méthode proposée dans le cadre du procédé de recherche d'objets selon l'invention vise à accélérer le processus d'obtention de l'extraction μ sans modifier en aucune façon les objets, afin de ne pas en augmenter le nombre et par conséquent la taille de la matrice M. Pour cela elle prend en considération l'encombrement élémentaire λ de chaque objet, information contenue dans la matrice M, et l'utilise pour organiser un « tamisage » progressif, à travers des « tamis » aux « mailles » de plus en plus fines.
Comme en granulométrie, on obtient des groupes d'objets calibrés. Ainsi, en référence à la figure 1 , si l'on considère un domaine Δ contenant des objets 1 , 2, 3, ...i, J...N, sur lequel est appliqué un ensemble de grilles de normes p1, p2, p3,... p["l, la grille de norme p1 va « retenir » l'objet 2, la grille suivante de norme p2 les objets j et N, tandis que la grille de norme p3 ne retient aucun des objets considérés, la grille ultime de norme pπ recueillant finalement l'objet i et l'objet ponctuel 3.
Si l'encombrement λ de chaque objet n'existe pas déjà dans la matrice
M, il doit être calculé. Cet encombrement peut d'ailleurs être enregistré dans la matrice M, et dans ce cas, la taille de M augmentera de cette information, mais pas le nombre d'objets. Pour un calibre donné, le « tamis » est une matrice géométrique représentant la couverture du domaine Δ par un ensemble déterminé et homogène de sous-domaines similaires, pas nécessairement égaux mais proches d'un encombrement norme p. Le recouvrement du domaine n'est pas obligatoirement strict dans le sens où si le domaine est effectivement complètement couvert, il peut y avoir par contre des intersections entre des sous-domaines (entre des « mailles »). La matrice géométrique représentant le sous-ensemble décrit est appelée grille de norme p. Chacune des .p mailles de la grille est identifiée par une valeur numérique spécifique et unique appelée code de matrice de norme p, np. En superposant π grilles de normes p différentes on crée le matriçage M de profondeur π du domaine
Δ. Il comprendra au total Y mailles :
Ψ = .Pι + .P2 + ... + .pπ (3.1)
chacune identifiée par son code de matrice npjj, avec i = 1 , π (la profondeur, de 1 à π) et j = 1 , . ι (le nombre de la maille dans la grille de profondeur i, de 1 à .Pi). La première grille est constituée en général d'une seule maille couvrant le domaine complet et recueille tous les objets qui, indépendamment de leur encombrement λ, ne « tombent » jamais dans une maille plus fine, mais toujours « à cheval » à travers tout le tamis ; alors, évidemment, ,pι = 1.
Dans le cadre d'un matriçage M donné, il est possible - et relativement facile - de déterminer pour chaque objet de l'ensemble Ω la
maille de norme p la plus petite qui le contient complètement (la norme sera toujours supérieure ou égale à l'encombrement : p ≥ λ) et lui attribuer donc un code de matrice πPij. On trie ensuite la matrice M des N objets de
l'ensemble Ω par codes de matrice, par exemple dans l'ordre décroissant des normes p. On obtient ainsi une description ordonnée des N objets dans la matrice M triée, allant des plus encombrants vers les « plus petits ». Pour une maille donnée, identifiée par son code de matrice, on aura n objets ;
évidemment, Σ n = N et certains n peuvent être nuls. Le tri peut être illustré par le schéma de la figure 2. Pour la construction du sous-ensemble ω des υ objets contenus dans le domaine δ, et donc de l'extraction μ de la matrice M, on procède en deux étapes :
A. On détermine pour l'ensemble du matriçage M (de profondeur π) toutes les mailles de toutes les grilles incluses dans et intersectées par δ. Pour chaque grille (de norme pi) on aura . i mailles, .pi ≤ .Pi de
(3.1) ; le nombre total de mailles concernées sera ψ = .pi + .P2 + ... + .Pπ (3.2) et donc ψ ≤ Ψ. Le nombre d'objets concernés, /V, est la somme des nombres d'objets des mailles concernées et donc aussi AV ≤ N. Les inégalités sont d'autant plus fortes que δ est petit par rapport à Δ.
B. La matrice étant ordonnée comme dans le schéma ci-dessus (ou tout autre système d'indexation permettant d'accéder directement aux objets d'une maille, donc d'un code de matrice donné), on vérifie directement et seulement les objets concernés par les ψ mailles retenues. Le problème posé initialement, à savoir déterminer le sous- ensemble ω des v objets contenus dans le domaine δ et construire la
matrice μ les décrivant, ne demande plus que l'examen des /V objets
(et non des N initiaux).
Comme pour le tuilage, le tri peut être appliqué dans chaque maille. Le premier avantage majeur du matriçage par rapport au tuilage est qu'aucun des objets d'Ω n'est modifié, la taille de la matrice M de description restant donc inchangée. L'efficacité du matriçage dépend bien sûr de la finesse du maillage, donc de la profondeur π, tout comme l'efficacité du tuilage dépend de Σ, mais il n'y a plus d'obstacle à augmenter la profondeur. La seule condition évidente à respecter est pπ ≡ Pmin > λmin (3.3)
Le choix de la profondeur optimale est fonction de la distribution des encombrements λ des objets d'Ω et de l'encombrement Λ de ce dernier, donc du domaine d'application du problème posé :
- en astrophysique Λ est beaucoup plus grand que λmax et donc dès la deuxième grille on peut avoir une maille très fine ; π sera petit, voire limité à
2 ;
- en cartographie, λmax ≥ Λ et λmaχ » λmin ; tout en respectant (3.3), π peut être important et sera choisi en fonction de la distribution des λ, toute autre contrainte égale par ailleurs. Dans le cas particulier des objets ponctuels, les objets d'encombrement nul (λ = 0) sont des objets réduits à un point par rapport au domaine Δ. Ils sont en nombre variable selon le domaine d'application : très nombreux en astrophysique, moins nombreux en cartographie. Evidemment, la totalité de ces objets ponctuels se situera dans les mailles de la matrice la plus fine, la grille de profondeur π. Il est à noter que si Ω contenait exclusivement de tels objets ponctuels, tuilage et matriçage seraient d'efficacité équivalente. On remarquera que le tri simple associé à une recherche dichotomique serait aussi très efficace.
On donne maintenant un exemple d'implémentation du procédé de cartographie vectorielle bidimensionnelle. Les territoires (les domaines Δ), pour un ensemble donné Ω de N objets, décrits par une matrice M, couvrent en moyenne l'étendue d'une région, voire d'un petit pays. L'encombrement Λ du domaine est la diagonale du rectangle [(X in, Ymin) , (Xmax, Ymax)] le circonscrivant. Les côtés du rectangle sont respectivement ΔX = Xmax - X in e ΔY = Ymax ~ Ymin-
Chaque objet est circonscrit par un rectangle « élémentaire » [(xmin,
Ymin) , ( max, Ymax)], dont la diagonale constitue l'encombrement λ de l'objet. Le matriçage M est constitué par des grilles rectangulaires de mailles régulières assurant un recouvrement strict. La norme pi de la grille de profondeur i est donnée par la longueur (en X) et la largeur (en Y) des mailles : pix = ΔX / >ix et piy = ΔY / )iy (4.1) Pour la grille de profondeur i, on aura donc ,Pi = )ιx * >iy mailles rectangulaires. Une suite de π valeurs pour )ix et pour )y donne le matriçage
M de profondeur π du domaine Δ.
Dans l'exemple d'implémentation présenté, on a imposé, pour des raisons de concision, que tous les codes de matrice npy soient codés sur un seul octet. Pour la simplicité, on a choisi un nombre de mailles égal selon les deux directions } ≈ >(X = ,y avec la suite de valeurs
) = {1 , 2, 3, 7, 13} (4.2) de profondeur π = 5 et qui pour la grille de la première profondeur comporte une seule maille égale au territoire. L'utilisation d'une suite de nombres premiers entre eux garantit que les frontières de deux mailles de profondeurs différentes ne se superposent jamais. Ainsi, un objet dont l'encombrement est inférieur à celui d'une maille de profondeur i mais dont la géométrie ne
permet pas de lui attribuer une maille à cette profondeur (parce qu'il se trouve « à cheval » sur au moins deux mailles de cette profondeur), a toutes les chances de se voir attribuer une maille à la profondeur immédiatement inférieure (i -1). Quel que soit le domaine d'extraction, le nombre de mailles non-actives (i.e. n'intersectant pas le domaine) croît avec la profondeur (cette croissance n'est bien entendu pas nécessairement stricte). Il en résulte qu'un système de maillage est d'autant plus efficace que la proportion d'objets placés dans des mailles des plus grandes profondeurs est importante. Le nombre total de mailles Ψ est
Y = 12 + 22 -t- 32 + 72 + 132 = 232 (4.3) avec des codes de matrice indexables sur un octet, de 0 à 231. La correspondance maille/index se fait de la façon suivante: profondeur 5 : grille 13 x 13 : 0 à 168 profondeur 4 : grille 7 x 7 : 169 à 217 profondeur 3 : grille 3 x 3 : 218 à 226 profondeur 2 : grille 2 x 2 : 227 à 230 profondeur 1 : grille 1 x 1 : 231
A l'intérieur d'une même grille, les mailles sont triées par x croissant puis par y croissant, comme l'illustre le tableau 1 suivant. L'extraction proprement dite se décompose en deux étapes :
- une détermination de la liste des mailles actives.
- une sélection et le traitement éventuel des objets.
La détermination des mailles actives consiste simplement à calculer l'ensemble des codes de matrice correspondant aux mailles qui intersectent le domaine δ de recherche (en l'occurrence un rectangle).
Dans le fichier, les objets sont triés par codes de matrice croissants. Une liste des codes de matrice avec un pointeur sur le premier objet de chaque code est également stockée dans le fichier. La sélection des objets est effectuée par un curseur qui parcourt la liste des codes de matrices.
Profondeur 3: 3x3
Profondeur 2: 2x2
Profondeur 1 : 1x1
231
TABLEAU 1
Lorsque le curseur rencontre un code actif, celui-ci parcourt alors l'ensemble des objets de ce code. Seuls les objets « vus » par le curseur sont « traités ». Le traitement lui-même peut à son tour effectuer un tri car les objets sélectionnés par le curseur n'intersectent pas nécessairement le domaine δ (le fait que la maille à laquelle est associé un objet intersecte le domaine δ est une condition nécessaire mais non suffisante). Ce second tri est, par nature, plus lourd car il nécessite une lecture de chaque objet, puis un calcul d'intersection avec le domaine δ. On comprend alors l'intérêt du tri préalable effectué par le curseur grâce au système de matriçage. On va maintenant décrire un exemple d'application du procédé de cartographie vectorielle en pseudo-tridimensionnel ou bidimensionnel étendu
(dit « à niveaux »).
Dans certains domaines d'application, comme la cartographie
« routière » (à destination des applications d'orientation et navigation routières), il n'est pas nécessaire d'opérer sur un ensemble d'objets en 3D
(avec le Z pour tous les points), dont la matrice M est forcément plus volumineuse que celle de l'ensemble des mêmes objets représentés en plan (en 2D). En effet, pour résoudre par exemple le problème d'une correcte représentation graphique 2D, il suffît de connaître la position verticale relative des objets : il suffit en somme de savoir qui passe par dessus qui (le problème « dessus/dessous »).
On introduit alors la notion de niveau : un niveau est constitué par l'ensemble des objets se situant à une même position verticale relative.
Le procédé de cartographie vectorielle, lorsqu'il est mis en œuvre dans une application pseudo-tridimensionnelle ou bidimensionnelle étendue, comprend alors les séquences suivantes :
- L' ensemble initial Ω de N objets est décomposé en Z (nombre total de niveaux identifiés) sous-ensembles Ωζ d'objets de même niveau, avec ζ = 1 à Z - La matrice M initiale est décomposée en Z matrices Mζ.
- On utilise le matriçage précédemment décrit d'une façon indépendante pour chaque sous-ensemble.
Autrement dit, l'ensemble initial est d'abord trié par niveaux et ensuite par encombrements, avec les grilles correspondantes ; ceci permet d'ailleurs l'utilisation de matriçages différents par niveaux.
L'utilisation du matriçage dans le procédé de recherche d'objets appartenant à un sous-ensemble se fait en deux phases distinctes : - une première phase comprenant :
- une définition du matriçage M même, c'est-à-dire le choix des grilles,
- un tri des objets de l'ensemble par ordre croissant ou décroissant de leur code de matrice npij, avec i = 1 , π (la profondeur, de 1 à π) et j = 1 , .Pi (le nombre de la maille dans la grille de profondeur i, de 1 à .pi). - une seconde phase comprenant :
- une étape A de recherche des mailles « actives », en l'occurrence, des codes de matrice actifs), c'est à dire qui sont concernées par δ,
- pour chaque code de matrice npij actif, une étape B de recherche des objets correspondants et de vérification, pour eux seulement, de l'appartenance à δ. Est donné ci-après un exemple d'implémentation de codes de matrices en langage C++ pour la seconde phase du procédé. Afin de comprendre les extraits de codes qui suivent, on donne ci-dessous la définition de quatre types et structures utilisés :
// Types typedef TGFJNT32 long; typedef TGF_UINT32 unsigned long;
// Structures typedef struct {
TGFJNT32 x;
TGFJNT32 y;
} TGF_LONGPOINT;
typedef struct {
TGF_LONGPOINT min;
TGF .ONGPOINT max;
} TGF.LONGRECT;
La classe CGFMatrixHandler contient toutes les méthodes utiles aux calculs liés aux codes de matrices. La méthode qui suit permet de déterminer la liste des codes de matrice « actifs » (étape A) par rapport à un domaine (ici un rectangle). Le tableau de booléens mMatrixCodesList, donnée membre de la classe, est dimensionné par le nombre total de codes de matrice.
// Given inRect, compute list of "active" matrix codes bool * CGFMatrixHandler::GetMatrixCodesUst(TGF_LONGRECT inRect) {
// Get global territory (domain)
TGF_LONGRECT territory = GetTerritory();
// Reset mMatrixCodesList. GetNbMatrixCodes retums total number of matrix codes memset(mMatrixCodesList, false, GetNbMatrixCodes()*sizeof(bool));
// Now set "active" codes to "true" TGF_LONGRECT current atrixSquare; TGF J1NT32 w, h, col, line, res, currentCode = 0;
// GetCountQ returns matrix's "deepness" (number of levels) for (TGFJJ1NT32 i=0; i<GetCount(); i++) {
// GetLevel(i) returns grid's resolution for level i res = GetLevel(i);
// Compute matrix squares' dimension at level i w = (territory.max.x - territory.min.x + res-1) / res; h = (territory.max.y - territory.min.y + res-1) / res;
// Initialize currentMatrixSquare currentMatrixSquare.min.x = territory.min.x; currentMatrixSquare.max.x = currentMatrixSquare.min.x + w;
// Loop on each matrix square of level i for (col=0; co resol; col++) { currentMatrixSquare.min.y = territory.min.y;
currentMatrixSquare.max.y = currentMatrixSquare.min.y + h; for (line=0; line<resol; line++) {
// Check if currentMatrixSquare intersects inRect. Il Ifso, currentCode is "active" if (RectlntersectsRect(currentMatrixSquare, inRect)) mMatrixCodesList[currentCode] = true;
currentCode++; currentMatrixSquare.min.y += h; currentMatrixSquare.max.y += h;
) currentMatrixSquare.min.x += w; currentMatrixSquare.max.x += w;
} }
return mMatrixCodesList; }
La classe CGFCursor permet d'accéder aux objets- concernés
(première partie de l'étape B), en utilisant un filtre sur les codes de matrices. La méthode Next() permet d'accéder à l'objet suivant dans le fichier compte tenu de ce filtre.
CGFCursor::CGFCursor(bool * inMatrixValues)
: mMatrixCodes(inMatrixValues)
{ mCurMatrixCode = GetMatrixHandler()->GetNbMatrixCodes()-1; mCurMatrixCodelndex = (TGF.UINT32) -1; mCurMatrixCodeObjectsCount = (TGFJJINT32) -1 ; mCurObjectlnMatrixCode = (TGF_U!NT32) -1 ; mCurObjectOffset = (TGFJJINT32) -1 ; mCurObjectSize = 0; mlnitialized = false; }
// Return offset of next object in file or (TGF_UINT32) - 1 if none TGF_UINT32 CGFCursor::Next()
{ for (;;) {
// Move on to the next object for (;;) {
// Calculate the offset of this object. If current object's Il offset is -1, then we are at the beginning of a matrix code II and we don't need to incrément the previous offset to get to Il the current one. if (mCurObjectOffset != (TGF_U!NT32) -1) {
// Next object in current matrix code if (++mCurObjectlnMatrixCode >= mCurMatrixCodeObjectsCount) break; Il Compute the next object's position mCurObjectOffset += mCurObjectSize;
else { mCurObjectlnMatrixCode = 0; mCurObjectOffset =
GetFirstObjectlnNthMatrixCode(mCurMatrixCodelndex);
} return mCurObjectOffset;
} // Move on to the next matrix code
NextMatrixCodeO; } }
bool CGFCursor::NextMatrixCode()
{
// Reset the current object offset so that the NextQ method Il knows that it should start at the beginning of the matrix code. mCurObjectOffset = (TGF JINT32) -1 ; mCurObjectSize = 0; mCurObjectlnMatrixCode = (TGF JINT32) -1 ; mCurMatrixCodeObjectsCount = (TGFJJINT32) -1; // Handle the case where we are filtering on a matrix codes' list if (mMatrixCodes) { for (;;) {
// Get the next code if (++mCurMatrixCodelndex >= GetMatrixCodesCount()) { mCurMatrixCodelndex = (TGF_UINT32) -1 ; mCυrMatrixCode = GetMatrixHandler()-> GetNbMatrixCodesO-1; return false;
}
TGF_UINT32 code = GetNthMatrixCode(mCurMatrixCodelndex);
// If this code is activated in the array, update variables
if (mMatrixCodes[code]) ( mCurMatrixCode = code; mCurMatrixCodeObjectsCount =
GetObjectCountlnNthMatrixCode(mCurMatrixCodelndex); return true; } } ) // Not filtering on matrix codes: get the next code if (++mCurMatrixCodelndex >= GetMatrixCodesCount()) { // Does not exist mCurMatrixCodelndex = (TGF_U!NT32) -1 ; mCurMatrixCode = GetMatrixHandler()->GetNbMatrixCodes()-1 ; return false;
} mCurMatrixCode = GetNthMatrixCode(mCurMatrιxCodelndex); mCurMatrixCodeObjectsCount =
GetObjectCountlnNthMatrixCode(mCurMatrixCodelndex); return true;
}
L'accès aux objets intersectant un rectangle rect (deuxième partie de l'étape B), s'effectue alors de la façon suivante : {
TGF_LONGRECT rect, domain; TGF_UINT32 * matπxlevelList; // Set rect and get file's domain and matrixLevelList
CGFMatrixHandler * mtxHdl = new(CGFMatrixHandler(domain, matrixLevelList));
CGFCursor * iter = new(CGFCursor(mtxHdl->GetMatrixCodesList(rect)));
while (iter->Next() != (TGF_UINT32) -1) {
// Read current object at offset iter->GetCurObjectOffset() // Check if object intersects rect (its matrix code does but not
Il necesseraly the object itself). Il Ifso, process object
)
}
Une mise en œuvre pratique du procédé de recherche selon l'invention peut être de réaliser la première phase une fois pour toutes pour
un domaine donné, avant de le charger dans un appareil ou équipement de lecture, surtout si l'on envisage une exploitation suivie du domaine.
La seconde phase est toujours exécutable chaque fois qu'une recherche est demandée et peut donc être de préférence installée de façon permanente dans le terminal d'exploitation.
Les extractions μ ainsi obtenues par mise en œuvre du procédé de cartographie vectorielle selon l'invention peuvent être stockées dans tout type de supports d'information et intégrées dans des appareils électroniques, tels que des équipements de communication et/ou de navigation. Bien sûr, l'invention n'est pas limitée aux exemples qui viennent d'être décrits et de nombreux aménagements peuvent être apportés à ces exemples sans sortir du cadre de l'invention.