A priori les requêtes Overpass n'ont pas besoin de trier les objets.
Cependant le chargement de données dans un schéma destiné à les lier entre
elles peut nécessiter que les objets dépendants (les noueds d'un way, ou
les membres d'une relation) soient déclarés avant l'objet qui en dépent (le
way ou la relation) sinon ils ne trouvent pas les objets liés et l'objet
dépendant ne peut pas être créé.

Les ids d'objets ne sont pas indispensables partout car on n'a pas
nécessairemetn besoin des objets liés à un objet parent, juste de l'objet
parent lui-même et ses tags. Overpass ne trie pas car le tri a un coût en
mémoire (et certaines requêtes volumineuses ne pourraient pas alors
fonctionner, le serveur ne pouvant allouer la mémoire ou l'espace de
stockage temporaire nécessaire).

L'idée est que si un tri est nécessaire, c'est plutôt au client de le faire
lui-même plutôt que le serveur (qui sert à plein de monde et ne peut pas
allouer beaucoup de mémoire pour un seul utilisateur).

Sinon si un tri est nécessaire, lister tous les noeuds, puis tous les ways
puis tous les membres peut ne pas suffire (les relations peuvent aussi
avoir des relations dépendantes dans leurs membres). Si un tri devait être
fait, ce devrait être un tri "topologique": pas besoin de tri global (les
objets en général n'ont pas d'ordre, surtout pas selon leur id qui a une
valeur arbitraire), mais plutôt envoyer les objets au fil de l'eau, mais si
un objet n'est pas complet (ses membres ne sont pas encore sortis, alors le
mettre en attente d'un autre objet, sortir tout le reste et dès qu'un des
objets de ce reste est sorti qui était marqué comme en attente, sortir
l'objet qui était en attente). A la fin tous les objets en attente
devraient être sortis. Cette approche demandera beaucoup moins de mémoire.

Noter aussi qu'Overpass permet de sélectionner des objets sans faire aucune
récursion sur ses membres. Bref Overpass ne peut pas non plus imposer un
tri topologique, d'autant plus que ses requêtes sont ordonnées et qu'il
peut manipuler et sortir plusieurs "result sets" séparés (rien n'indique
que ces "result sets" multiples sont liés entre eux, et Overpass pourra
même sortir un même objet plusieurs fois (dans des résult sets séparés:
Overpass n'impose pas de calculer l'union des "result sets" dans un nouveau
"result set" unique).

Ceci dit, quand Overpass sort un "result set", autant que possible celui-ci
devrait être sorti dans un ordre topologique (qui n'est pas nécessairement
un tri complet non plus: les objets retournés peuvent être mélangés, mais
il s'assurera que si un objet est lié à un autre dans le même result set,
les objets dépendant liés seront sortis avant les objets liants). Dans un
tri topologique si deux objets A et B ne sont pas liés entre eux (aucun ne
dépend de l'autre), on peut les sortir dans un ordre quelconque (donc A,B
ou B,A, peu importe, un moteur les sortira autant que possible au fil de
l'eau selon sa représentation interne qui lui évite d'avoir à revenir
dessus plus tard et lui évite chaque fois que possible de gérer un espace
temporaire de mise en attente).

Ne pas imposer de tri dans Overpass permet justement des optimisations pour
la représentation interne des result sets, et pour accélérer notamment le
calcul des unions et intersections: plutôt que de faire des fusions par
tri, il utilisera des tables de hachage qui sont beaucoup plus rapides.
Hors les tables de hachage mélangent les objets indexés dans un ordre quasi
aléatoire (c'est une nécessité même de la fonctio nde hachage pour qu'elle
soit la plus efficace possible, avec le moins possible de "collisions" sur
une clé de hachage et une bonne distribution).

Overpass peut aussi trier les objets dans un ordre facilitant le traitement
2D, par exemple avec le tri "quadtile", si on le lui demande: ce tri
facilite, du côté client la division d'une tâche de traitement en
permettant de créer des taches pour des zones rectangulaires avec toutes
les données locales proches dans le jeu de données. Cependant là encore ce
n'est qu'un des critères de tri possible (et cela n'exclue pas en plus de
faire un tri topologique, sanchant que dans un seul "quadtile" il peut y
avoir des données dépendantes qui sont dans un ou plusieurs autres
"quadtiles" voisins): les quadtiles ne trient en fait que les noeuds, les
chemins et relations qui seraient liés à ces noeuds seront sortis après.

Mais d'une façon générale, oui les noeuds peuvent toujours être sortis en
premier (dans un ordre quelconque) car il ne sont liés à rien, puis tous
les chemins dans un ordre quelconque car ils ne sont liés qu'à des noeuds
(et aucun autre chemin), le cas se complique avec les relations à la fin
(qui ont des relations entre elles). Cependant mettre tous les noeuds avant
les chmins et relations n'est pa non plus efficace côté client qui ne peut
par exemple pas commencer à traiter les chemins utilisant les premiers
noeuds avant que la totalité des noeuds soient sortis.

Un tri topologique complet permettrait d'optimiser le travail côté client.
Mais la question est toujours de savoir où placer le curseur entre ce qui
doit être calculé par le serveur et ce que peut faire le client. La logique
d'Overpass (pour permettre à un maximum de monde de l'utiliser) serait de
déporter chez le client tout ce qui peut être fait par le client et ne pas
lui mâcher le travail sur le serveur: les clients d'ailleurs sont souvent
de confortables PC avec bien assez d'espace de stockage qui n'est sollicité
que par ce client


Le 22 juin 2016 à 09:06, Etienne Trimaille <etienne.trimai...@gmail.com> a
écrit :

> Cela vient de ta requête overpass.
> Il y a le même problème dans QuickOSM, il faut que les objets soient dans
> le bon ordre.
> Avec l'assistant par défaut d'Overpass Turbo, on peut obtenir l'ordre
> inverse.  Est-ce que l'on peut voir la requête ?
>
> Le 22 juin 2016 à 08:48, Tony Emery <tony.em...@yahoo.fr> a écrit :
>
>> Je déterre un peu le sujet car il y a un petit truc dans le script que
>> j'ai
>> réalisé qui me chiffonne.
>>
>> Quand la requête est lancée (par exemple, pour importer les voies), le
>> fichier Planet généré contient bien les objets demandé mais il ne sont pas
>> forcément classés (ou alors, je ne sais pas avec quelle ordre de tri).
>>
>> Le fait d'ouvrir le fichier avec JOSM et d'enregistrer à nouveau le
>> fichier
>> fait que les données sont triées. Cela veut dire que JOSM lit le fichier
>> et
>> remet de l'ordre dans tout ça.
>>
>> Or, FME ne sait pas faire ça et, du coup, n'arrive pas a interpréter le
>> fichier Planet brut.
>>
>> Du coup, je me demandais s'il n'y avait pas une option a indiquer dans la
>> requête pour trier les objets (d'abord les nodes, puis les ways et enfin
>> les
>> relations) ?
>>
>>
>>
>> -----
>> Tony EMERY
>> Administrateur OpenStreetMap.fr
>> Mandataire Grand Sud-Est
>> Géomaticien & chef de projets
>> --
>> View this message in context:
>> http://gis.19327.n5.nabble.com/Requete-overpass-api-python-tp5863030p5876134.html
>> Sent from the France mailing list archive at Nabble.com.
>>
>> _______________________________________________
>> Talk-fr mailing list
>> Talk-fr@openstreetmap.org
>> https://lists.openstreetmap.org/listinfo/talk-fr
>>
>
>
> _______________________________________________
> Talk-fr mailing list
> Talk-fr@openstreetmap.org
> https://lists.openstreetmap.org/listinfo/talk-fr
>
>
_______________________________________________
Talk-fr mailing list
Talk-fr@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-fr

Répondre à