Índice:

Como criar mapas estilizados personalizados usando OpenStreetMap: 7 etapas (com imagens)
Como criar mapas estilizados personalizados usando OpenStreetMap: 7 etapas (com imagens)
Anonim
Como criar mapas estilizados personalizados usando o OpenStreetMap
Como criar mapas estilizados personalizados usando o OpenStreetMap

Neste instrutível, descreverei um processo pelo qual você pode gerar seus próprios mapas estilizados personalizados. Um mapa estilizado é um mapa onde o usuário pode especificar quais camadas de dados são visualizadas, bem como definir o estilo com que cada camada é visualizada. Descreverei primeiro o processo pelo qual você pode escrever software para estilizar mapas, seguido por um exemplo do software Python que escrevi para realizar essa tarefa.

O vídeo a seguir destaca como eu pessoalmente gero mapas estilizados, mas continuo lendo para os detalhes íntimos. Estou muito animado para ver o que a comunidade cria!

Qual é a minha motivação por trás deste projeto?

Francamente, comecei este projeto porque achei que seria divertido. Essa ideia tem estado martelando em minha mente durante o ano passado, e eu finalmente tirei o tempo que precisava para colocá-la em prática. Após um dia de prototipagem com alguns scripts básicos, fui capaz de gerar resultados extremamente promissores - tão promissores que sabia que precisava formalizar meus scripts para que outros pudessem facilmente fazer suas próprias criações.

Minha motivação ao escrever este instrutível é devido ao fato de que encontrei informações mínimas sobre como criar seus próprios mapas estilizados do zero. Espero compartilhar o que aprendi com a comunidade.

Recursos / Links:

  • OpenStreetMap
  • OpenStreetMap Legalese
  • Repositório Github

Suprimentos

  • Uma distribuição Python (usei Anaconda e Python 3.6)
  • PyQt5 (para as dependências da GUI)

Etapa 1: Definindo o Processo I: Baixando o Arquivo OSM

Definindo o Processo I: Baixando o Arquivo OSM
Definindo o Processo I: Baixando o Arquivo OSM

Quando comecei este projeto, a pergunta mais gritante era: "onde posso obter dados de mapas." Naturalmente, como você esperava, pensei imediatamente no Google Maps. Depois de uma pesquisa significativa, descobri que o Google realmente não quer que as pessoas brinquem com seus dados, no sentido criativo ou não. Na verdade, eles proíbem explicitamente o web scraping do Google Maps.

Felizmente, meu desespero durou pouco após minha descoberta do OpenStreetMap (OSM). OSM é um projeto colaborativo envolvendo pessoas de todo o mundo que contribuem com dados. OSM permite explicitamente o uso aberto de seus dados em nome de software de código aberto. Como tal, visitando a página da web do OSM é onde a jornada de estilização do mapa começa.

Depois de chegar ao site do OSM, clique na guia "Exportar" para mostrar as ferramentas de exportação de mapas. Agora, aumente o zoom para visualizar a região com a qual você está interessado em coletar dados do mapa. Selecione o link "Selecionar manualmente uma área diferente", que abrirá uma caixa na tela. Molde e coloque esta caixa sobre a região de interesse. Quando estiver satisfeito, clique no botão "Exportar" para baixar seu arquivo de dados OSM.

Nota # 1: Se a região selecionada contiver muitos dados, você receberá um erro informando que selecionou muitos nós. Se isso acontecer com você, clique no botão "Overpass API" para baixar o arquivo maior.

Observação # 2: se o arquivo OSM baixado tiver mais de 30 MB, o programa Python que escrevi ficará visivelmente lento. Se você estiver determinado a usar uma grande região, considere escrever um script para jogar fora os dados supérfluos que você não planeja desenhar.

Etapa 2: Definindo o Processo II: Compreendendo os Dados

Definindo o Processo II: Compreendendo os Dados
Definindo o Processo II: Compreendendo os Dados
Definindo o Processo II: Compreendendo os Dados
Definindo o Processo II: Compreendendo os Dados
Definindo o Processo II: Compreendendo os Dados
Definindo o Processo II: Compreendendo os Dados
Definindo o Processo II: Compreendendo os Dados
Definindo o Processo II: Compreendendo os Dados

"Eu tenho os dados … e agora?"

Comece abrindo o arquivo OSM baixado em seu software de edição de texto favorito. Você notará primeiro que este é um arquivo XML, o que é ótimo! XML é fácil de analisar. O início de seu arquivo deve parecer quase idêntico à primeira imagem desta etapa - alguns metadados básicos e limites geográficos serão listados.

Conforme você rola o arquivo, você notará três elementos de dados usados em todo:

  1. Nós
  2. Maneiras
  3. Relações

O elemento de dados mais básico, um nó simplesmente tem um identificador, latitude e longitude exclusivos associados a ele. Claro, existem metadados adicionais, mas podemos descartá-los com segurança.

Os caminhos são coleções de nós. Uma forma pode ser renderizada como uma forma fechada ou como uma linha aberta. Os caminhos consistem em uma coleção de nós identificados por seu identificador exclusivo. Eles são marcados com chaves que definem o grupo de dados ao qual pertencem. Por exemplo, a forma representada na terceira imagem acima pertence ao grupo de dados "lugar" e seu subgrupo, "ilha". Em outras palavras, esta forma particular pertence à camada "ilha" sob o grupo "lugar". As maneiras também têm identificadores exclusivos.

Por fim, as relações são coleções de maneiras. Uma relação pode representar uma forma complexa com orifícios ou com várias regiões. As relações também terão um identificador exclusivo e serão marcadas de maneira semelhante.

Você pode ler mais sobre esses elementos de dados no wiki do OSM:

  • Nós
  • Maneiras
  • Relações

Etapa 3: Definição do Processo III: Digestão dos Dados

Definindo o Processo III: Digestão dos Dados
Definindo o Processo III: Digestão dos Dados

Agora você deve ter pelo menos um conhecimento superficial dos elementos de dados que compõem um arquivo OSM. Neste ponto, estamos interessados em ler os dados OSM usando o idioma de sua escolha. Embora esta etapa seja centrada em Python, se você não quiser usar Python, você ainda deve ler esta parte, pois contém algumas dicas e truques.

O pacote xml é incluído por padrão com a maioria das distribuições Python padrão. Usaremos este pacote para analisar facilmente nosso arquivo OSM, conforme mostrado na primeira imagem. Em um único loop for, você pode processar a manipulação de dados OSM para cada elemento de dados específico.

Na linha final da imagem, você notará que verifiquei a tag 'limites'. Esta etapa é de vital importância na conversão dos valores de latitude e longitude em pixels na tela. Eu recomendo fortemente executar esta conversão no momento em que você carrega o arquivo OSM, pois a conversão em massa de dados é um processo intensivo.

Falando em converter latitudes e longitudes em coordenadas de tela, aqui está um link para a função de computação que escrevi. Você provavelmente notará algo um pouco estranho ao converter latitude em coordenadas de tela. Há uma etapa extra envolvida em comparação com a longitude! Acontece que os dados OSM são modelados usando o método de projeção Pseudo-Mercator. Felizmente, o OSM tem uma documentação fantástica sobre este tópico aqui, e eles fornecem as funções de conversão de latitude para um número significativo de idiomas. Incrível!

Nota: No meu código, a coordenada da tela (0, 0) é o canto superior esquerdo da tela.

Etapa 4: implementação do estilizador de mapa Python

Implementação do Python Map Stylizer
Implementação do Python Map Stylizer
Implementação do Python Map Stylizer
Implementação do Python Map Stylizer
Implementação do Python Map Stylizer
Implementação do Python Map Stylizer

Até este ponto, discuti o arquivo de dados OSM - o que é, como lê-lo e o que fazer com ele. Agora discutirei o software que escrevi para lidar com a visualização de mapas estilísticos (repositório GitHub fornecido na introdução).

Minha implementação específica se concentra no controle do usuário do pipeline de renderização. Especificamente, eu permito que o usuário selecione as camadas que deseja ver e como deseja que essa camada seja visualizada. Como mencionei brevemente antes, existem duas classes de elementos renderizados: itens de preenchimento e itens de linha. Preenchimentos são definidos apenas por uma cor, enquanto as linhas são definidas por cor, largura de linha, estilo de linha, estilo de limite de linha e estilo de junção de linha.

Conforme o usuário faz modificações nos estilos de camada e visibilidade, as alterações são refletidas no widget de mapa à direita. Depois que um usuário modifica a aparência do mapa de acordo com sua preferência, ele pode ajustar a dimensão máxima do mapa e salvá-lo como uma imagem em seu computador. Ao salvar uma imagem, um arquivo de configuração do usuário também será salvo. Isso garante que um usuário possa recuperar e reutilizar a configuração que ele usou para gerar uma imagem específica a qualquer momento.

Etapa 5: Implementação Drawback + Solução

Implementação Drawback + Solução
Implementação Drawback + Solução
Implementação Drawback + Solução
Implementação Drawback + Solução

Quando comecei a estilizar um mapa manualmente, descobri que esse era um processo tedioso. Oferecer ao usuário o máximo controle pode ser simplesmente opressor devido ao grande número de "botões" disponíveis. No entanto, existe uma solução simples, que envolve um pouco de script extra.

Comecei identificando em quais camadas estou particularmente interessado. Para o propósito deste instrutível, digamos que estou mais interessado em edifícios (todos eles), rios, rodovias principais e ruas de superfície. Eu escreveria um script onde crio uma instância de Configuration, alterno os estados da camada de maneira apropriada usando a função setItemState () e constantes definidas, e define as cores com base em como gostaria que minhas camadas aparecessem usando setValue (). O arquivo de configuração resultante que é salvo pode ser copiado para a pasta configs e carregado pelo usuário.

Um exemplo de script está na imagem acima. A segunda imagem é uma amostra da aparência das funções auxiliares e, como são basicamente todas idênticas, apenas com constantes variáveis, incluí apenas a imagem de um exemplo.

Etapa 6: Áreas para Melhoria

Áreas para melhoria
Áreas para melhoria

Depois de refletir sobre a implementação do meu software, identifiquei várias áreas que seriam melhorias úteis para usuários avançados.

  1. Renderização de camada dinâmica. Atualmente, tenho uma lista predefinida de camadas que serão renderizadas, é isso. Parte da justificativa era a dificuldade em determinar se uma camada deveria ser uma linha ou um preenchimento. Como resultado, com quase todos os arquivos OSM que você abrir, você será saudado com uma série de avisos sobre camadas que não serão renderizadas. Freqüentemente, eles são tão mínimos que não são um problema, mas com certeza faltam camadas críticas. A renderização dinâmica da camada eliminaria essas preocupações.
  2. Atribuição de camada dinâmica. Isso anda de mãos dadas com o # 1; se quiser renderização de camada dinâmica, você precisa de atribuição de camada dinâmica (ou seja, identificar uma camada de preenchimento versus uma camada de linha). Isso poderia ser razoavelmente realizado, como aprendi, porque Caminhos cujo primeiro e último nó são iguais serão caminhos fechados e, portanto, preenchidos.
  3. Grupos de cores. Um mapa estilizado geralmente tem várias camadas com o mesmo estilo, e permitir que o usuário modifique o estilo de um grupo ao mesmo tempo diminuiria muito o tempo gasto pelo usuário na edição das camadas uma a uma.

Etapa 7: Reflexões finais

Reflexões finais
Reflexões finais
Reflexões finais
Reflexões finais
Reflexões finais
Reflexões finais

Obrigado a todos por lerem meu Instructable. Este projeto representa o culminar de muitas horas de pesquisa, design, programação e depuração. Espero ter sido capaz de fornecer uma plataforma de lançamento a partir da qual você possa construir seu próprio projeto ou construir sobre o que já escrevi. Também espero que minhas deficiências e dicas forneçam muitos pontos a serem considerados em seu projeto. Se você está menos inclinado a programar e mais inclinado a criar obras de arte, adoraria ver o que você faz nos comentários! As possibilidades são infinitas!

Agradecimentos especiais aos contribuidores do OpenStreetMap! Projetos como este não seriam possíveis sem seus esforços significativos.

Por favor, deixe-me saber se você tiver alguma dúvida nos comentários!

Desafio de mapas
Desafio de mapas
Desafio de mapas
Desafio de mapas

Vice-campeão no Desafio de Mapas

Recomendado: