Eu tenho um arquivo PBF que contém as seguintes informações sobre um país:
Nós, cada um com sua própria longitude, latitude e propriedades; usado para armazenar pontos em um espaço 2D.
Maneiras, cada uma com suas propriedades, elas são conectadas através de nós; usado para armazenar estradas, limites.
Embora esse arquivo tenha apenas 80 MB no formato compactado, ele tem 592 MB quando descompactado e armazenado em um banco de dados.
Sim, e isso é apenas para um país, a Bélgica. Imagine armazenar França, Alemanha e Itália ao lado.
Vamos pegar uma única estrada, por exemplo, de Antuérpia, passando por Bruxelas até Charleroi. Isso consistiria em uma tonelada de nós para armazenar todas as curvas na estrada, mas eu preciso de todas essas curvas? Eu duvido.
Deixe-me dizer o que eu quero poder fazer:
Quero ver o mapa em diferentes níveis de zoom; cidades principais, cidades menores e nível das ruas, pelo menos.
Quero poder obter informações de roteamento entre dois pontos.
Quero poder calcular a estrada mais próxima da minha localização GPS.
Pesquise um local por meio de um índice no banco de dados.
Mas o mais importante é que o banco de dados não deve ser muito grande, pois será armazenado em um dispositivo móvel .
Então, pensei em uma combinação de duas técnicas:
Blocos de imagem para fins de visualização, para contornar o armazenamento / processamento de todos os nós individuais.
Armazenar os pontos finais das estradas para obter informações de roteamento, juntamente com informações sobre a estrada.
O problema é que não consigo calcular a estrada mais próxima da minha localização GPS apenas com essas informações; imagine que, numa curva em uma rodovia, não consigo determinar se estou na rodovia com apenas os dois pontos finais. Eu estava pensando em armazenar nós intermediários entre os pontos de extremidade, mas seria muito caro gerar, eu acho. Além disso, determinar os pontos finais das estradas (que são como uma divisão em T) provavelmente não é tão fácil, pois eu preciso descobrir se preciso armazenar o ponto médio na parte superior dessa divisão em T ou não.
Portanto, a visualização é fácil usando blocos de imagem; mas não consigo encontrar uma maneira fácil de fazer o roteamento e a localização de GPS, em que tipo de técnica de armazenamento devo procurar? Acho um pouco inconveniente que um 80 MB
arquivo se transforme em um banco de dados 592 MB
. Quero reduzir esse tamanho o máximo possível ...
O que posso fazer para fazer isso da maneira mais eficiente possível? Em termos de disco e CPU. Estou alvejando um WP7 ...
fonte
Respostas:
Parece-me que o problema principal é incluir apenas nós que adicionam informações significativas sobre uma estrada.
ou seja, sem o seu requisito de GPS, você pode simplesmente armazenar nós nas junções e terminações (que eu acho que você chama de nós de início / fim). Obviamente, incluindo peso / custos, etc.
Uma maneira de pensar em abordar isso é primeiro, adicionar todos os nós de início / fim. Este é o mínimo necessário. Obviamente, isso não explica estradas sinuosas.
Em seguida, para cada estrada (definida como terminando em cruzamento ou cruzamento), faça o seguinte:
(some constant threshold * number of intermediate nodes)
que precisamos adicionar nós intermediários. Caso contrário, saia do loop.fonte