Le 2 décembre 2012 19:47, Pierre Béland <infosbelas-...@yahoo.fr> a écrit :

> >Je ne suis pas très fan de cette couche. Ce qui à mon avis doit définir
> une way comme limite administrative est son >appartenance à une relation de
> limites administrative. Pour moi les tags sur les ways sont désuets.
>
> Frédéric, le but d'utiliser cette couche est justement pour repérer les
> chemins de limites admistratives sans relation et corriger en conséquence.
>
> Voir cet exemple où des chemins de limites se chevauchent dont certains ne
> sont pas définis dans une relation
>
> http://layers.openstreetmap.fr/?zoom=12&lat=45.41025&lon=-73.41898&layers=B00FFFFFFFFFFFFTFFFFFFT&item=xxxx&level=1
>

Et voilà une démonstration évidente que cette dénormalisation des données,
où les chemins indiquent par eux même pourquoi ils ont été créés,
indépendemment des relations qui les utilisent ou non, aide à solidifier le
schéma.

Et même si en fin de compte un moteur de rendu ou de recherche des surfaces
ne tiendra pas compte des attributs de ces chemins mais uniquement des
relations, c'est une grande aide pour les utilisateurs des éditeurs, car on
a sans arrêt des relations brisées : si on n'a plus que des chemins
totalement anonymes et sans aucun attribut, comment distinguer dans cet
écheveau de traits ce qui devait être une frontière et à quoi servait tel
ou tel trait ?

Je suis favorable à la conservation de cette dénormalisation des relations
vers les chemins, et même à la correction systématique de ces attributs
selon quelques règles :

- tout chemin utilisé par une ou plusieurs relations de frontière doit
porter un attribut "boundary=*"

- cet atttribut doit être "boundary=administrative" si parmi ces relations
il y en a au moins une ayant cet attribut

- sinon cet atttribut doit être "boundary=political" si parmi ces relations
il y en a au moins une ayant cet attribut

- si ce chemin porte "boundary=administrative" alors ce chemin doit porter
un attribut "admin_level=*". Cet attribut doit être la plus petite valeur
parmi les "admin_level" des relations de frontières administratives
utilisant ce chemin.

- sinon si ce chemin porte "boundary=political" alors ce chemin doit porter
un attribut "political_division=*". Cet attribut doit être une des valeurs
du même attribut parmi les relations boundary=political utilisant ce chemin
; la plupart du temp on n'aura qu'une seule valeur (canton...), mais on
peut aussi les énumérer en séparant par des point-virgules.

- ce chemin devrait aussi porter un nom. Mais ce nom dépend du fait qu'il
soit ou non lié à un autre usage physique qu'une simple frontière
"virtuelle", donc si ce chemin est un waterway=* ou highway=* ou railway=*
ou landuse=* ou natural=* ou building=* ou man_made=* non n'y touche pas
car le nom désigne autre chose que la frontière elle-même ; pour cela on
regarde dans ce chemin la liste des autres attributs qui ne sont pas
utilisés spécifiquement pour les frontières  (boundary, admin_level,
political_division, ...) ou qui ne sont pas génériques pour n'importe quel
objet (name:*, *_name:*, ref:*, source:*, url:*, website:*, note:*,
comment:*, fixme:*, FIXME:*), ou si c'est un attribut privé (les CLC:* de
Corine par exemple) et s'il reste des attributs hors de cet ensemble, ce
chemin sert aussi à autre chose, on ne touchera donc pas à ce nom Sinon on
pourra le nommer de façon systématique en tant que frontière uniquement.

- le nom à donner (name=*) pour ce chemin est le formé par la juxtaposition
des noms par défaut (name=*) des deux entités ayant l'admin_level déterminé
précédemment (l'ordre importe peu, mais on peut aussi choisir d'unformiser
en les mettant dans un ordre alphabétique, ou si les relations adjascentes
se partageant le chemin ont des populations connues, mettre en premier la
relation la plus peuplée, ou encore celle dont la surface est la plus
grande ; ce critère doit être stable, ce qui n'est pas le cas d'un tri en
fonction du nombre de chemins découpant une frontière) ; on sépare par un
caractère bien distinctif les noms des deux entités : le tiret cadratin
convient très bien pour ça. Contrairement à ce qui a été prétendu ici par
certains, on a bien un critère déterministe permettant de choisir le niveau
à retenir parmi les paires de relations adjascentes qui se partagent le
chemin.

Résultat : plus aucun chemin anonyme dont on se demande ensuite à quoi il
sert. Le schéma reste utilisable pour une utilisation en mode "filaire" (en
ignorant les surfaces, les collections donc toutes les relations), ce qui
facilite aussi la réutilisation de la base de données (alors qu'en voulant
tout normaliser, il est IMPOSSIBLE d'utiliser la base de données sans avoir
à charger TOUTES les relations dépendantes, partout, sans même avoir la
possibilité de faire une requête géométrique sur elles puisque les
relations n'ont aucune géométrie par elles-mêmes, mais seulement
indirectement par leur liste de membres et uniquement quand ils ont chacun
une géométrie propre, donc quand ces membres ne sont QUE des noeuds et des
chemins).

----

C'est le défaut actuel du schéma OSM de ne pas pouvoir représenter les
surfaces avec des objets bien spécifiques, mais uniquement comme des
relations-collections "fourre-tout" (alors que si on avait de VRAIS
multipolygones et multilinestrings, leurs membres ne seraient JAMAIS vides,
mais ne serait QUE des chemins, et les VRAIS multiplygones seraient
TOUJOURS fermés (sinon erreur de violation d'intégrité référencielle dans
la base OSM, y compris si quelqu'un essaye de supprimer un chemin utilisé
par des multipolygones, sans d'abord supprimer ces mutlipolygones ou les
modifier en en supprimant un des "anneaux" fermés utilisant ce chemin).

TANT QUE la base OSM n'aura pas ces vrais objets OpenGIS en tant que
primitives géométriques, mais seulement de vagues "relations", et ne
permettra donc pas d'assurer l'intégrité référencielle, une dénormalisation
de certains attributs des relations vers les chemins RESTERA indispensable,
pour en assurer la solidité.

Noter alors que les VRAIS multilinestrings et multipolygones (pas les
relations actuelles) n'ont que des membres homogènes, tous des chemins, et
qui n'ont aucun "rôle" (ou plutôt c'est nécessairement le même pour tous).

Les rôles "inner" et "outer" n'ont aucun sens dans un multilinestring ;
cesrôles n'en ont pas plus non plus au niveau de chaque chemin membre (le
sens "inner" ou "outer" est un attribut des seuls anneaux, en fonction de
leur inclusion mutuelle au sein de la relation mutilipolygone, et qui
permet de savoir de quel côté de l'anneau se trouve la surface que délimite
l'anneau).

Il ne resterait alors des relations que pour les collections (et non
listes) de membres non homogènes, sans plus AUCUNE notion d'ordre pour les
relations, mais avec pour chaque membre un rôle unique pour toute la
collection : pour garantir cette unicité, la base devrait aussi avoir un
objet homogène "multipoint" (ne contenant QUE des noeuds, sans aucun ordre
parmi eux).

On peut aller plus loin pour encore simplifier, en créant un objet
intermédiaire "ring" (anneau) pour rassembler dans un même objet une liste
de chemins formant un unique anneau fermé et sans aucune intersection, le
multipolygone devenant une collection non ordonnée de "rings" (eux aussi
toujours sans aucun rôle, sauf que les anneaux inclus peuvent se toucher, y
compris le long d'un chemin de longueur non nulle, mais PAS se croiser).
Les actuels chemins fermés seraient automatiquement dans un "ring" ne
comportant qu'un seul chemin membre.

Les chemins aussi devraient être distingués dans la base parmi ceux qui
sont orientés ou non : les chemins orientés ne peuvent PAS être membres
d'un anneau (réservé à la description de limites de surfaces). Plus besoin
alors de l'attribut "area=yes/no".

Et plus besoin non plus d'inclure le même nœud deux fois dans un chemin qui
est un anneau, il n'y a plus de notion de "premier" ou "dernier" noeud dans
un anneau qui est forcément fermé, la base supprime automatiquement ce
doublon inutile dès qu'un chemin fermé est défini en tant qu'anneau non
orienté (cette normalisation forcée va plus loin que ce qu'impose OpenGIS)
: la liste des noeuds d'un anneau reste ordonnée cependant mais n'admet
aucune intersection ni aucun noeud en doublon. L'anneau devient une
sous-classe particulière parmi les chemins, et reste topologiquement un
chemin même si la liste des membres d'un anneau est faite SOIT d'une liste
ordonnée (et sans doublons) de plusieurs chemin non fermés (et uniquement
de chemins), SOIT d'un d'unique chemin implicite (lui-même) avec pour
membre une liste ordonnée de noeuds (eux ausi sans aucun doublon).

Ce qui veut dire que la base OSM pourrait même réduire largement le volume
nécessaire en réduisant le volume nécessaire pour les relations. Et on ne
passerait plus son temps à corriger les trous dans les frontières ou
surfaces. Et ce serait SEULEMENT dans ce cas, que les dénormalisations
d'attributs seraient alors inutiles et même indésirables.

De plus la base OSM serait alors automatiquement conforme OpenGIS, en
simplifiant énormément les utitlisations puisqu'on n'aurait plus à les
convertir lors des exports.

Une telle base pourrait encore présenter une "vue" compatible avec le
schéma actuel pour les outils OSM qui ne reconnaîtraient pas ces nouvelles
primitives, en transformant automatiquement les VRAIS multipoints,
multilinestrings, rings, et multipolygones en "relations" dans les
résultats des requêtes utilisant une API compatible, mais PAS avec l'API
normalisée. Une telle vue peut tout à fait permettre une compatibilité
totale (en gardant aussi, de façon transitoire, et en tant que
pseudo-primitives, les actuelles "relations" qui ne sont pas représentables
selon ces nouvelles contraintes).

La base serait alors nativement dans un schéma OpenGIS, avec toute une
série de possibilités nouvelles pour effectuer des requêtes géométriques
(notamment recherche d'objets dans une zone géométrique délimitée, ce que
la base ne sait faire QUE sur les seuls noeuds, et au prix du stockage
dénormalisé, dans ses index, d'objets "bounding box" approximatifs pour
tenter de rechercher des chemins, et aucun autre support pour les relations
que les listes de membres hétérogènes), comme dans les bases
OpenSQL+OpenGIS qu'on doit construire avec les trop lourds outils
d'exports. Les fichiers d'exports/imports seraient aussi beaucoup plus
légers, de même que les imports et requêtes d'ajout/modifications faites
par les éditeurs .avec la nouvelle API normalisée

Mais on n'a toujours pas tout ça ! Résultat : des dénormalisations sont
indispensables, sinon plus moyen d'assurer une intégrité stable des données
permettant de réparer les trous laissés par les éditeurs et que la base est
incapable de vérifier.
_______________________________________________
dev-fr mailing list
dev-fr@openstreetmap.org
http://lists.openstreetmap.org/listinfo/dev-fr

Répondre à