Rendu des lignes qui se chevauchent

24

Je fais une carte contenant des informations sur les transports en commun: bus, tramways, etc. La carte aura une couche contenant par exemple les lignes de tramway. Chaque ligne a sa propre couleur et est représentée par une géométrie de chaîne de lignes.

Le problème est que de nombreuses lignes ont des parties qui se chevauchent, où plus d'une ligne de tramway couvre la même section. Pour montrer cela à l'utilisateur, je préfère que les lignes soient parallèles les unes aux autres au lieu d'être tracées les unes sur les autres. Pour un exemple, voyez comment Google Maps affiche les lignes du métro de New York.

Je soupçonne que c'est un problème assez courant en cartographie, mais je ne sais pas quelle terminologie je dois rechercher.

J'utilise PostGIS / GeoServer / OpenLayers comme pile, mais toute solution open source serait acceptable.

Liedman
la source
Avoir le même problème avec les lignes de métro. Avez-vous trouvé / mis en œuvre une solution acceptable?
Geert-Jan
Malheureusement non. Le client n'a pas priorisé cela, et nous avons fait un hack assez méchant pour éviter les chevauchements.
Liedman

Réponses:

7

Si vous souhaitez en savoir plus sur ce domaine, le problème s'appelle le déplacement cartographique et son seul aspect de la généralisation cartographique .

Quelques articles sur le déplacement et les approches pour gérer le problème:

scw
la source
"Déplacement"! C'était l'autre terme dont j'essayais de me souvenir. Nous avons un outil dans FME (désolé - pas open source) qui "résout les conflits de proximité entre les fonctionnalités en utilisant une variante de l'algorithme de déplacement de Nickerson" - alors peut-être faire un Google de Nickerson pour voir ce qui se passe?
Mark Ireland
scholar.google.com/… jette un lien vers l'article d'origine (malheureusement payant) et beaucoup de gens y font référence. Certains articles connexes sont gratuits et semblent intéressants.
Ian Turton
4

Ce problème est très typique de la généralisation cartographique. Des méthodes automatisées existent pour cela, mais aucune implémentation n'est encore disponible.

Les méthodes basées sur " Beams " et " Snakes " donnent des résultats efficaces pour résoudre ces conflits cartographiques de données réseau (voir aussi les références données par scw ). Voici quelques résultats des algorithmes des poutres sur les données routières:

Avant:

texte alternatif

Après:

texte alternatif

Voir également cet article et cette présentation qui expliquent comment effectuer cette transformation .

EDIT: Je ne l'ai jamais testé, mais il semble qu'il y ait quelque chose en rapport avec les serpents dans GRASS. Voyez ici .

julien
la source
1
Est-ce que cela fonctionne si deux segments de ligne (voies de bus) ont exactement la même géométrie?
underdark
1
Il s'applique aux lignes trop fermées et ne devrait pas fonctionner aussi bien pour les lignes qui se chevauchent exactement. Une adaptation est nécessaire.
julien
1

Je ne connais pas de solution, mais je pense que le terme que vous recherchez est "résolution de conflits" - un sujet de généralisation de la carte. Une recherche Google sur les "conflits de généralisation de carte" montre des informations intéressantes - mais je ne sais pas qu'elles sont très utiles.

Mark Ireland
la source
1

Dans les implémentations actuelles, vous pouvez souvent trouver "Offset" ou "Dislocation". En utilisant votre pile actuelle, il semble un peu difficile de réaliser automatiquement des lignes parallèles:

Pour résumer: La façon la plus simple que je connaisse serait d'utiliser UMN Mapserver et la valeur Offset là-bas. Exemple de style pour votre mapfile:

STYLE
 SYMBOL 7
 OUTLINECOLOR 160 160 160
 SIZE 5
 OFFSET 2 -99 # <-- This will offset the line to the right.
 ANTIALIAS FALSE
END # STYLE
obscur
la source
0

Si vous dessinez des calques de lignes qui se chevauchent, vous disposez de plusieurs options pour permettre au visualiseur de voir toutes les lignes.

  1. Largeur - vous modifiez la largeur de ligne entre les couches et placez les lignes plus larges en bas.
  2. Opacité / Transparence - vous pouvez rendre les calques de ligne individuels partiellement opaques, de sorte que vous pouvez «voir à travers» les calques individuels.
  3. Décalage - vous pouvez décaler le symbole de ligne représentant l'entité linéaire réelle d'un côté de la géométrie réelle de la ligne. Les couches individuelles peuvent être décalées de différentes quantités et dans différentes directions pour permettre à toutes les couches d'être vues.
  4. Les lignes peuvent être représentées par une série de symboles ponctuels avec un espace défini entre les symboles. En variant le symbole, la couleur du symbole, la taille du symbole et l'écart entre les différents calques de ligne, vous devez rendre chaque calque de ligne distincte.

Je n'utilise pas GeoServer, mais je sais que MapServer a la fonctionnalité pour faire toutes ces choses. Il est probable que GeoServer le fasse également.

DavidF
la source
On dirait que nous voulons # 3, mais uniquement pour les fonctionnalités qui se chevauchent. Est-ce possible?
mwalker
2
MapServer et d'autres serveurs de cartes Web et SIG résolvent les conflits pour les étiquettes, mais je ne connais pas de fonctionnalité qui vous permettrait de le faire à la volée. Bien sûr, si vos données étaient assez statiques, vous pouvez prétraiter vos données pour identifier où les lignes de différentes couches se croisent (ou se trouvent dans une tolérance) et classer les données en fonction de cela. Votre moteur de rendu de carte pourrait alors appliquer la symbologie de «déplacement» basée sur un attribut dans vos données.
DavidF