Índice:
- Suprimentos
- Etapa 1: Definindo o Processo I: Baixando o Arquivo OSM
- Etapa 2: Definindo o Processo II: Compreendendo os Dados
- Etapa 3: Definição do Processo III: Digestão dos Dados
- Etapa 4: implementação do estilizador de mapa Python
- Etapa 5: Implementação Drawback + Solução
- Etapa 6: Áreas para Melhoria
- Etapa 7: Reflexões finais
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:36
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
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
"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:
- Nós
- Maneiras
- 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
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
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
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
Depois de refletir sobre a implementação do meu software, identifiquei várias áreas que seriam melhorias úteis para usuários avançados.
- 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.
- 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.
- 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
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!
Vice-campeão no Desafio de Mapas
Recomendado:
Crie mapas personalizados para seu GPS Garmin: 8 etapas (com imagens)
Crie mapas personalizados para seu GPS Garmin: Se você tem um GPS Garmin projetado para caminhadas e outras atividades ao ar livre (incluindo as séries GPSMAP, eTrex, Colorado, Dakota, Oregon e Montana, entre alguns outros), você não precisa contentar-se com os mapas básicos que vieram pré-carregados nele. E
Faça um livro de mapas usando o Google Maps: 17 etapas (com imagens)
Faça um livro de mapas usando o Google Maps: Outro dia, eu estava procurando na livraria um Guia de ruas para o condado de DuPage, IL, pois minha namorada mora lá e precisa de um mapa de ruas detalhado. Infelizmente, o único que eles tinham perto era um do Condado de Cook (como este o
Fazendo mapas Garmin com o Openstreetmap: 4 etapas
Fazendo mapas Garmin com o Openstreetmap: Eu adoro caminhadas, mas não estou acostumado a ler mapas. Portanto, comprei um GPS Garmin GPSMAP64. No desafio de mapas eu vi um instrutivo de como fazer mapas para um GPS Garmin. Este é um instrutivo muito bem escrito e me fez pensar em escrever meu
Como construir alto-falantes personalizados: 25 etapas (com imagens)
Como construir alto-falantes personalizados: Construir seus próprios alto-falantes personalizados deve ser uma das atividades DIY mais gratificantes, diretas e econômicas que já conheci. Estou absolutamente chocado por não ter tido uma presença maior no Instructables e na comunidade … bem
Como fazer um arcade de Bartop DIY de 2 jogadores com slots de moeda personalizados para marquee, usando uma caixa de Pandora: 17 etapas (com imagens)
Como fazer uma arcada DIY Bartop para 2 jogadores com slots de moeda personalizados para letreiro, usando uma caixa de Pandora: Este é um tutorial passo a passo sobre como construir uma máquina de arcade com barra superior para 2 jogadores com slots de moedas personalizados integrados ao letreiro. As ranhuras para moedas serão feitas de forma que só aceitem moedas do tamanho de quartos ou maiores. Este fliperama é alimentado