Renderizando linhas sobrepostas

24

Estou fazendo um mapa contendo informações sobre transporte público: ônibus, bondes, etc. O mapa terá uma camada contendo, por exemplo, as linhas de bonde. Cada linha tem sua própria cor e é representada por uma geometria de sequência de linhas.

O problema é que muitas das linhas têm partes sobrepostas, onde mais de uma linha de bonde cobre a mesma seção. Para mostrar isso ao usuário, eu gostaria que as linhas fossem paralelas umas às outras em vez de serem desenhadas uma sobre a outra. Por exemplo, veja como o Google Maps mostra as linhas do metrô de Nova York.

Suspeito que este seja um problema bastante comum em cartografia, mas não sei que terminologia devo procurar.

Estou usando PostGIS / GeoServer / OpenLayers como minha pilha, mas qualquer solução de código aberto seria aceitável.

Liedman
fonte
Tendo o mesmo problema com as linhas de metrô. Você encontrou / implementou uma solução aceitável?
Geert-Jan
Infelizmente não. O cliente não priorizou isso e fizemos um hack bastante desagradável para evitar a sobreposição.
Liedman

Respostas:

7

Se você estiver interessado em aprender mais sobre essa área, o problema será denominado deslocamento cartográfico e seu aspecto da generalização cartográfica .

Alguns artigos discutindo deslocamento e abordagens para lidar com o problema:

scw
fonte
"Deslocamento"! Esse era o outro termo que eu estava tentando lembrar. Temos uma ferramenta no FME (desculpe - não de código aberto) que "Resolve conflitos de proximidade entre recursos usando uma variante do algoritmo de deslocamento de Nickerson" - então, talvez, faça um Google de Nickerson para ver o que acontece?
Mark Ireland
scholar.google.com/… lança um link para o artigo original (infelizmente pague paredes) e muitas pessoas fazendo referência a ele. Alguns dos artigos relacionados são gratuitos e parecem interessantes.
Ian Turton
4

Esse problema é muito típico na generalização cartográfica. Existem métodos automatizados para isso, mas ainda não há implementações disponíveis.

Métodos baseados em " vigas " e " cobras " fornecem resultados eficientes para resolver esses conflitos cartográficos de dados da rede (consulte também as referências fornecidas pelo scw ). Aqui estão alguns resultados dos algoritmos de vigas nos dados da estrada:

Antes:

texto alternativo

Depois de:

texto alternativo

Veja também este documento e esta apresentação que explicam como fazer essa transformação .

EDIT: Eu nunca testei, mas parece que há algo relacionado a cobras no GRASS. Veja aqui .

julien
fonte
1
Isso funciona se dois segmentos de linha (trilhos de ônibus) tiverem exatamente a mesma geometria?
Underdark
1
Aplica-se a linhas muito fechadas e não deve funcionar tão bem para linhas que se sobrepõem exatamente. É necessária uma adaptação.
julien
1

Não conheço uma solução, mas acho que o termo que você procura é "resolução de conflitos" - um tópico de generalização de mapa. Uma pesquisa no Google em "conflitos de generalização de mapa" mostra algumas informações interessantes - mas não sei se há muito uso prático.

Mark Ireland
fonte
1

Nas implementações atuais, você pode encontrar "Deslocamento" ou "Deslocamento". Usando sua pilha atual, parece um pouco difícil obter linhas paralelas automaticamente:

Para resumir: A maneira mais fácil que eu conheço seria usar o UMN Mapserver e o valor de Offset lá. Exemplo de estilo para seu 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
underdark
fonte
0

Se você estiver desenhando camadas de linhas que se sobrepõem, há várias opções para permitir que o visualizador veja todas as linhas.

  1. Largura - você varia a largura da linha entre as camadas e coloca as linhas mais largas na parte inferior.
  2. Opacidade / transparência - você pode tornar as camadas de linha individuais parcialmente opacas, para poder 'ver através' das camadas individuais.
  3. Deslocamento - você pode deslocar o símbolo da linha que representa o recurso de linha real para um lado da geometria real da linha. Camadas individuais podem ser deslocadas em diferentes quantidades e em direções diferentes para permitir que todas as camadas sejam vistas.
  4. As linhas podem ser representadas por uma série de símbolos de pontos com um intervalo definido entre os símbolos. Ao variar o símbolo, a cor, o tamanho e o espaço do símbolo entre as diferentes camadas de linha, você deve distinguir cada camada de linha individual.

Não uso o GeoServer, mas sei que o MapServer tem a funcionalidade para fazer todas essas coisas. É provável que o GeoServer também o faça.

DavidF
fonte
Parece que queremos o número 3, mas apenas para recursos sobrepostos. Isso é possível?
mwalker
2
O MapServer e outros servidores de mapas da Web e o GIS resolvem conflitos de etiquetas, mas não conheço um recurso que permita fazer isso rapidamente. Obviamente, se seus dados forem razoavelmente estáticos, você poderá pré-processar os dados para identificar onde linhas de diferentes camadas se cruzam (ou estão dentro de uma tolerância) e classificar os dados com base nisso. Seu mecanismo de renderização de mapa pode aplicar a simbologia de 'deslocamento' com base em um atributo em seus dados.
DavidF 26/08/2010