Renderizar líneas superpuestas


24

Estoy haciendo un mapa que contiene información sobre el transporte público: autobuses, tranvías, etc. El mapa tendrá una capa que contiene, por ejemplo, las líneas de tranvía. Cada línea tiene su propio color y está representada por una geometría de cadena de línea.

El problema es que muchas de las líneas tienen partes superpuestas, donde más de una línea de tranvía cubren la misma sección. Para mostrar esto al usuario, prefiero que las líneas se ejecuten paralelas entre sí en lugar de dibujarse una encima de la otra. Por ejemplo, vea cómo Google Maps muestra las líneas de metro de Nueva York.

Sospecho que este es un problema bastante común en la cartografía, pero no sé qué terminología debería buscar.

Estoy usando PostGIS / GeoServer / OpenLayers como mi pila, pero cualquier solución de código abierto sería aceptable.


Tener el mismo problema con las líneas de metro. ¿Has encontrado / implementado una solución aceptable?
Geert-Jan

Lamentablemente no. El cliente no priorizó esto, e hicimos un truco bastante desagradable para evitar la superposición.
Liedman

Respuestas:


7

Si está interesado en aprender más sobre esta área, el problema se denomina desplazamiento cartográfico y es un aspecto de la generalización cartográfica .

Un par de artículos que discuten el desplazamiento y los enfoques para manejar el problema:


"Desplazamiento"! Ese era el otro término que estaba tratando de recordar. Tenemos una herramienta en FME (lo siento, no es de código abierto) que "resuelve los conflictos de proximidad entre las características utilizando una variante del algoritmo de desplazamiento de Nickerson", así que ¿tal vez un Google de Nickerson para ver qué ocurre?
Mark Ireland

scholar.google.com/… lanza un enlace al artículo original (lamentablemente, con paredes de pago) y mucha gente hace referencia a él. Algunos de los artículos relacionados son gratuitos y parecen interesantes.
Ian Turton

4

Este problema es muy típico en la generalización cartográfica. Existen métodos automatizados para eso, pero todavía no hay implementaciones disponibles.

Los métodos basados ​​en " Beams " y " Snakes " dan resultados eficientes para resolver estos conflictos cartográficos de datos de red (ver también las referencias dadas por scw ). Estos son algunos resultados de los algoritmos de vigas en datos de carreteras:

Antes de:

texto alternativo

Después:

texto alternativo

Vea también este documento y esta presentación que explican cómo hacer esta transformación .

EDITAR: Nunca lo he probado, pero parece que hay algo relacionado con las serpientes en GRASS. Ver aquí .


1
¿Funciona esto si dos segmentos de línea (pistas de bus) tienen exactamente la misma geometría?
oscuro

1
Se aplica a líneas demasiado cerradas, y no debería funcionar tan bien para líneas que se superponen exactamente. Se necesita una adaptación.
julien

1

No conozco una solución, pero creo que el término que está buscando es "resolución de conflictos", un tema de generalización de mapas. Una búsqueda en Google sobre "conflictos de generalización de mapas" muestra información interesante, pero no sé si hay mucho uso práctico.


1

En las implementaciones actuales, a menudo puede encontrar "Offset" o "Dislocation". Usando su pila actual, parece un poco difícil lograr líneas paralelas automáticamente:

Para resumir: la forma más fácil que conozco sería usar UMN Mapserver y el valor de Offset allí. Estilo de ejemplo para su archivo de mapa:

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

0

Si está dibujando capas de líneas que se superponen, tiene varias opciones para permitir que el espectador vea todas las líneas.

  1. Ancho: puede variar el ancho de línea entre las capas y colocar las líneas más anchas en la parte inferior.
  2. Opacidad / Transparencia: puede hacer que las capas de línea individuales sean parcialmente opacas, por lo que puede 'ver a través' de capas individuales.
  3. Desplazamiento: puede desplazar el símbolo de línea que representa la entidad de línea real a un lado de la geometría real de la línea. Las capas individuales se pueden compensar en diferentes cantidades y en diferentes direcciones para permitir que se vean todas las capas.
  4. Las líneas se pueden representar mediante una serie de símbolos de puntos con un espacio definido entre los símbolos. Al variar el símbolo, el color del símbolo, el tamaño del símbolo y el espacio entre las diferentes capas de línea, debe hacer que cada capa de línea individual sea distinguible.

No uso GeoServer, pero sé que MapServer tiene la funcionalidad para hacer todas estas cosas. Es probable que GeoServer también lo haga.


Parece que queremos # 3, pero solo para características superpuestas. ¿Es eso posible?
mwalker

2
MapServer y otros servidores de mapas web y SIG hacen resolución de conflictos para etiquetas, pero no conozco una característica que le permita hacer esto sobre la marcha. Por supuesto, si sus datos eran bastante estáticos, podría preprocesar sus datos para identificar dónde se cruzan las líneas de diferentes capas (o están dentro de una tolerancia) y clasificar los datos en función de esto. Su motor de representación de mapas podría aplicar la simbología de 'desplazamiento' en función de un atributo en sus datos.
DavidF
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.