Pergunta

Estou interessado em escrever um aplicativo de navegação simplista como um projeto de estimação. Depois de pesquisar em torno de mapa-de dados livre que se instalaram na US Census Bureau TIGER 2007 dados de mapas Line / Shapefile. Os dados são divididos em arquivos zip para países individuais e eu fiz o download um único condados mapear-data para a minha área.

Qual seria a melhor maneira de ler neste mapa-dados em um formato utilizável?

Como deve I:

  • Leia nesses arquivos
  • analisá-los? - Expressão regular ou alguma biblioteca que já pode analisar estes Shapefiles
  • carregar os dados em meu aplicativo - devo carregar os pontos diretamente em alguma estrutura de dados na memória? Use um pequeno banco de dados? Eu não tenho nenhuma necessidade de persistência depois de fechar a aplicação dos dados do mapa. O usuário pode carregar o shapefile novamente.

Qual seria a melhor maneira de tornar o mapa uma vez que tenho ler a nos dados Shapefile?

Idealmente, eu gostaria de ser capaz de ler em um condados mapear shapefile dados e processar todos os poli-linhas na tela e permitir rotação e escala.

Como deve I:

  • Converter latitude / longitude aponta para coordenadas de tela? - Até onde eu sei o Shapefile usa longitude e latitude para os seus pontos. Então, obviamente, eu vou ter que convertê-los de alguma forma a coordenadas de tela para exibir as características do mapa.
  • Render os dados do mapa (série A de polilinhas para estradas, fronteiras, etc.) de uma maneira que eu posso facilmente girar e dimensionar o mapa inteiro?
  • Render todo o meu mapa como uma série de "tiles" para que apenas as características / linhas dentro da área de visualização são prestados?

Ex. de dados TIGER processado como um mapa de exibição:
text alt

Qualquer pessoa com alguma experiência e visão sobre o que a melhor maneira para eu ler nesses arquivos, como eu deveria representá-los (banco de dados, na estrutura de dados de memória) no meu programa, e como eu deveria render (com rotação / escala) a mapa-dados na tela seria apreciada.

EDIT: Para esclarecer, eu não quero usar qualquer Google ou Yahoo Maps API. Da mesma forma, eu não quero usar OpenStreetMap. Eu estou procurando uma abordagem mais a partir do zero do que utilizar essas APIs / programas. Este será um área de trabalho aplicação.

Foi útil?

Solução

Em primeiro lugar, eu recomendo que você use arquivos do 2008 TIGER .

Em segundo lugar, como outros apontam, há uma série de projetos lá fora, agora que já ler, interpretar, converter e usar os dados. Construir seu próprio analisador para esses dados é quase trivial, embora, por isso não há nenhuma razão para ir através do código de outro projeto e tentar extrair o que você precisa a menos que você planeja usar o seu projeto como um todo.

Se você quiser começar a partir do nível mais baixo

Análise

Construir seu próprio parser TIGER (razoavelmente fácil - apenas um DB de segmentos de linha), ea construção de uma simples render em cima do que (linhas, polígonos, letras / nomes) também vai ser bastante fácil. Você vai querer olhar para vários tipos mapa de projeção para o rendem fase. O mais frequentemente utilizado (e, portanto, mais familiar para os utilizadores) é a projecção Mercator - é bastante simples e rápido. Você pode querer jogar com o apoio de outras projeções.

Isto irá fornecer um pouco de 'diversão' em termos de ver como projetar um mapa, e como reverter essa projeção (digamos que um usuário clica no mapa, você quer ver o lat / lon eles clicaram - requer revertendo a equação atual projeção).

Rendering

Quando eu desenvolvi o meu processador eu decidi basear minha janela em um tamanho fixo (dispositivo embutido), e uma ampliação fixa. Isto significava que podia centrar o mapa a uma latitude / longitude, e com o pixel central = centro de latitude / longitude num dado ampliação, e tendo em conta a projecção Mercator I pode calcular que pixels representados cada latitude / longitude, e vice-versa.

Alguns programas em vez permitir que a janela para variar, e em vez de usar a ampliação e um ponto fixo, eles usam dois pontos fixos (muitas vezes o superior esquerdo e inferior direito cantos de um retângulo que definem a janela). Neste caso, torna-se trivial para determinar o pixel para lat / lon transferência - é apenas alguns cálculos de interpolação. Rotação e escala fazer esta função de transferência de um pouco mais complexo, mas não deve ser consideravelmente assim - ainda é uma janela retangular com interpolação, mas os cantos da janela não precisa estar em qualquer orientação particular em relação ao norte. Isso adiciona alguns casos de canto (você pode transformar o mapa de dentro para fora e vê-lo como se de dentro da terra, por exemplo), mas estes não são onerosas, e pode ser tratada como você trabalha nele.

Uma vez que você tem o lat / lon-se a pixel transferência feito, tornando linhas e polígonos é bastante simples, exceto por problemas gráficos normais (tais como bordas de linhas ou polígonos sobrepostos de forma inadequada, anti-aliasing, etc). Mas tornando um mapa feio básica, como o feito por muitos prestadores de código aberto é bastante simples.

Você também será capaz de jogar com cálculos de distância e grande círculo - por exemplo, uma boa regra de ouro é que cada grau de latitude ou longitude no equador é aproximadamente 111.1KM - mas mudanças como você se aproximar de qualquer pólo, enquanto o outro continua a permanecer em 111.1kM.

Armazenamento e Estruturas

Como você armazenar e referem-se a dados, no entanto, depende muito do que você planeja fazer com ele. Um monte de problemas difíceis surgir se você quiser usar a mesma estrutura de banco de dados para a demografia vs roteamento -. Uma determinada estrutura de base de dados e indexação será rápido para um, e lento para o outro

Usando zipcodes e carregando apenas os códigos postais próximas funciona para projectos mapa de renderização pequenos, mas se você precisar de uma rota em todo o país você precisa de uma estrutura diferente. Algumas implementações têm bases de dados 'sobreposição' que só contêm as principais estradas e pressões rotas paraa sobreposição (ou através de múltiplas sobreposições - local, metro, município, estado, país). Isso resulta em rápido, mas às vezes roteamento ineficiente.

Tiling

Tiling seu mapa não é realmente fácil. Em ampliações menores pode processar um mapa inteiro e cortá-la. Com ampliações superiores você não pode tornar a coisa toda de uma vez (devido a restrições de memória / espaço), então você tem que cortá-lo.

Cortar linhas em limites de telhas para que você pode render telhas resultados individuais nos resultados abaixo do esperado - muitas vezes o que é feito é linhas são prestados além do limite de telha (ou, pelo menos, os dados do final de linha é mantida, apesar de renderização pára uma vez que encontra está caído fora da borda.) - isso reduz erro que ocorre com linhas parecendo que eles não combinam muito bem enquanto viajam através telhas

Você vai ver o que eu estou falando sobre como você trabalha sobre este problema.

Não é trivial para encontrar os dados que vai para um determinado azulejo, bem como - uma linha pode ter ambas as extremidades fora de um determinado azulejo, mas a viagem através da telha. Você vai precisar de consultar gráficos livros sobre isso (livro de Michael Abrash é o seminal de referência, disponível gratuitamente agora à ligação anterior). Enquanto ele fala principalmente sobre jogos, o de janelas, recorte, bordas de polígonos, colisão, etc todos se aplicam aqui.

No entanto, você pode querer jogar em um nível superior.

Depois de ter o acima feito (ou adaptando um projeto existente, ou fazer o acima você mesmo) você pode querer jogar com outros cenários e algoritmos.

geocodificação reversa é razoavelmente fácil. Input latitude / longitude (ou clique no mapa) e obter o endereço mais próximo. Isto ensina-lhe como interpretar endereços ao longo de segmentos de linha em dados TIGER.

geocodificação básico é um problema difícil. Escrever um analisador endereço é um projecto útil e interessante, e depois convertê-los em latitude / longitude usando os dados TIGER não é trivial, mas um monte de diversão . Comece simples e pequeno, exigindo exata nome e formato de correspondência, e, em seguida, começar a olhar para 'como' correspondência e correspondência fonética. Há um monte de investigação nesta área -. Olhada projetos de pesquisas para alguma ajuda aqui

Encontrar o caminho mais curto entre dois pontos é um problema não-trivial. Há muitos, muitos algoritmos para fazer isso, a maioria dos quais são patenteados. Eu recomendo que se você tentar este movimento com um algoritmo fácil de seu próprio projeto, e, em seguida, fazer alguma pesquisa e comparar o seu projeto para o estado da arte. É muito divertido se você estiver em teoria dos grafos.

A seguir um caminho e instruções preventivamente dando não é tão fácil quanto parece na primeira vista. Dado um conjunto de instruções com um conjunto associado de pares de lat / lon, 'follow' a rota utilizando a entrada externa (GPS ou GPS simulado) e desenvolver um algoritmo que dá as instruções de utilização que se aproximam cada intersecção real. Observe que há mais lat pares / lon do que instruções devido a estradas curvas, etc, e você vai precisar para detectar direção de viagem e assim por diante. Lotes de casos de canto você não verá até que você tentar implementá-lo.

.

Ponto de interesse de pesquisa Este é interessante - você precisa encontrar o local atual, e todos os pontos de interesse (não faz parte do tigre, fazer o seu próprio ou obter outra fonte) dentro de um certa distância (em linha recta, ou mais difícil - distância de condução) da origem. Este é interessante na medida em que você tem que converter o banco de dados POI em um formato que é fácil de pesquisar nesta circunstância. Você não pode tomar o tempo para passar por milhões de entradas, faça o cálculo da distância (sqrt (x ^ 2 + y ^ 2)), e retornar os resultados. Você precisa ter algum método ou algoritmo para reduzir a quantidade de dados em primeiro lugar.

O caixeiro viajante. Encaminhamento com múltiplos destinções. Apenas uma versão mais difícil de roteamento regular.

Você pode encontrar uma série de links para muitos projetos e fontes de informação sobre este assunto aqui .

Boa sorte, e por favor, publique o que você faz, não importa o quão rudimentar ou feio, para que outros possam beneficiar!

-Adam

Outras dicas

SharpMap é uma .NET 2.0 mecanismo de mapeamento de código aberto para WinForms e ASP.NET. Isto pode fornecer toda a funcionalidade que você precisa. Ele lida com a maioria dos formatos de dados vetoriais e raster SIG mais comuns, incluindo arquivos de forma ESRI.

A solução é:

  • um servidor geoespacial como mapserver, geoserver, grau (opensource).

Eles podem ler e servir shapefiles (e muitas outras coisas). Por exemplo, geoserver (quando instalado) servem dados de shapefiles US Census Bureau tigre como demonstração

  • uma biblioteca cartográfica javascript como openlayers (veja os exemplos em link de texto

Há uma abundância de exemplos na web utilizando esta solução

pergunta engraçada. Aqui está como eu fazê-lo.

Eu recolho o que quer geometria eu preciso em qualquer formatos eles vêm em Fui puxando dados do USGS, para que equivale a um monte de:.

Eu, então, escreveu um programa que "compila" essas definições de forma em uma forma que é eficiente para processar. Isso significa fazer quaisquer projeções e conversões de formato de dados que são necessários para exibir de forma eficiente os dados. Alguns detalhes:

  • Para uma aplicação 2D, você pode usar qualquer projeção que você deseja: Mapa Projeções .
  • Para 3D, que pretende converter aqueles latitude / longitude em coordenadas 3D. Aqui está um pouco de matemática sobre como fazer isso: transformação de coordenadas esféricas para coordenadas retangulares normais .
  • Quebra-se todas as primitivas em uma quadtree / octree (2D / 3D). nós folhas nesta árvore conter referências a toda a geometria que cruza desse nó folha (eixo-alinhados) da caixa envolvente. (Isto significa que um pedaço de geometria podem ser referenciados mais de uma vez.)
  • A geometria é então dividido em uma mesa de vértices e uma tabela de comandos de desenho. Este é um formato ideal para OpenGL. Os comandos podem ser emitidos via glDrawArrays utilizando tampões de vértice ( Vertex Tampão Objectos ).
  • Um padrão geral visitante é usado para andar a quadtree / octree. Andar a pé envolve testar se o visitante cruza os nós dados da árvore até um nó folha é encontrado. Visitantes incluem: desenho, de detecção de colisão, e selecção. (Porque as folhas das árvores podem conter referências duplicadas à geometria, as marcas nós Walker como sendo visitados e ignora-los depois. Estas marcas têm de ser reposto ou não atualizados antes de fazer a próxima caminhada.)
  • Usando um sistema espacial de particionamento (uma das árvores) e uma representação do desenho eficiente é crucial para alcançar altas taxas de quadros. Eu descobri que nestes tipos de aplicações, você quer que sua taxa de quadros mais alto possível 20 fps, no mínimo. Sem mencionar o fato de que muitos desempenho lhe dará muitas oportunidades para criar um mapa com melhor aparência. (Mina está longe de ser bonito, mas vai chegar lá algum dia.)
  • O particionamento espacial ajuda a prestação de desempenho, reduzindo o número de comandos sorteio enviadas para o processador. No entanto, não poderia chegar um momento em que o usuário realmente quer ver todo o conjunto de dados (talvez uma visão arial). Neste caso, você precisa de um nível de sistema de controle de detalhes. Desde que meu aplicativo lida com ruas, eu dou prioridade a rodovias e estradas maiores. Meu código de desenho sabe sobre quantos primitivos que posso tirar antes do meu framerate vai para baixo. As primitivas também são classificadas segundo a esta prioridade. Chamo apenas os primeiros itens x onde x é o número de primitivas posso chamar o meu framerate desejado.

O resto é controle de câmera e animação de todos os dados que você deseja exibir.

Aqui estão alguns exemplos de minha implementação existente:

Imagem http://seabusmap.com/assets/Picture%205.png Imagem http://seabusmap.com/assets/Picture%207.png

para armazenar dados tigre localmente, eu escolhi Postgresql com o PostGIS ferramentas .

têm uma impressionante coleção de ferramentas, para você, especialmente o Tiger Geocoder oferece uma boa maneira de importar e usar os dados tigre.

Você terá que tomar uma olhada nas ferramentas que interagem com postgis, provavelmente algum tipo de mapserver

http://postgis.refractions.net/documentation/ :

Existem hoje várias ferramentas de código aberto que trabalhar com PostGIS. O projeto uDig está trabalhando em um ambiente de trabalho de leitura / gravação completo que pode trabalhar com PostGIS diretamente. Para o mapeamento internet, da Universidade de Minnesota Mapserver pode usar PostGIS como fonte de dados. O GIS kit de ferramentas GeoTools Java tem suporte PostGIS, assim como o recurso de servidor GeoServer Web. GRASS suporta PostGIS como uma fonte de dados. O visualizador de GIS de desktop SALTO Java tem um plugin simples para leitura de dados PostGIS, eo desktop QGIS tem um bom suporte PostGIS. dados PostGIS podem ser exportados para vários formatos GIS saída usando ferramentas de biblioteca e de linha de comando do OGR C ++ (e de cource com o arquivo dumper Forma empacotado). E, claro, qualquer língua que possa trabalhar com PostgreSQL pode trabalhar com PostGIS - a lista inclui Perl, PHP, Python, TCL, C, C ++, Java, C #, e muito mais.

edit:. Mapserver depite ter a palavra SERVIDOR em seu nome, este será utilizável em um ambiente de desktop

Embora você já decidiu utilizar os dados tigre, que você pode estar interessado em OSM (Open Street Map) , beacuse OSM tem uma importação completa dos dados TIGER nele, enriquecido com dados fornecidos usuário. Se você ficar com o formato de tigre, seu aplicativo será inútil para usuários internacionais, com OSM você começa TIGER e tudo mais uma vez.

OSM é um projeto aberto que caracteriza um mapa mundo livre editado colaborativamente. Você pode obter todos estes dados bem estruturados XML, ou consulta para uma região, ou baixe o mundo inteiro em um arquivo grande.

Existem algumas mapa representantes para OSM disponíveis em várias linguagens de programação, a maioria deles de código aberto, mas ainda há muito a ser feito.

Há também um href="http://www.openrouteservice.org/" rel="nofollow noreferrer"> serviço de roteamento disponível. Ele tem uma interface web e também pode ser queriable através de uma API de serviços web. Novamente, não está tudo terminado. Usuários definitivamente poderia usar um desktop ou aplicação de roteamento móvel construído em cima disso.

Mesmo se você não decidir ir com esse projeto, você pode obter lotes de inspiração dele. Basta dar uma olhada na projeto wiki e nas fontes dos vários projectos de software que estão envolvidos (você vai encontrar links para eles dentro do wiki).

Você também pode trabalhar com aplicação de mapeamento do Microsoft Visual terra e api ou usar a API do Google. Eu sempre programado comercialmente com os produtos da ESRI e não ter jogado com a API aberta é muito.

Além disso, você pode querer olhar para Criador! e Finder? Eles são relativamente novos programas, mas eu acho que eles são livres. Pode ser limitado sobre a incorporação de dados. Criador pode ser encontrada aqui.

O problema é que o processamento espacial é bastante novo na escala não comercial.

Se você não se importa de pagar por uma solução Safe Software produz um produto chamado FME. Esta ferramenta irá ajudá-lo a traduzir os dados de qualquer formato para apenas sobre qualquer outro. Incluindo KML o formato Google Earth ou tornar-o como um JPEG (ou série de JPEGs). Depois de converter os dados que você pode incorporar o Google Earth em seu aplicativo usando sua API ou exibir apenas as imagens de azulejos.

Como um lado não FME é uma plataforma muito poderosa para que ao fazer suas traduções, você pode adicionar ou remover partes de dados que você não precisa necessariamente. Mesclar fontes se você tiver mais de um. coordenadas Convert (não me lembro o que exatamente o Google Earth usa). backups armazenam em um banco de dados. Mas, falando sério, se o seu dispostos a desembolsar alguns dólares você deve olhar para isso.

Você também pode criar bandeiras (tanto como em seu mapa da amostra) que contêm um local (onde colocá-lo) e outros dados / comentários sobre a localização. Estas bandeiras vêm em muitas formas e tamanhos.

Uma simplificação durante um Mercator ou outra projecção é assumir um factor de conversão constante para a latitude e longitude. Multiplique os graus de latitude por 69.172 milhas; para a longitude, latitude escolher o meio de seu mapa da área e multiplicar (180-longitude) por co-seno (middle_latitude) * 69,172. Uma vez que você convertido em milhas, você pode usar um outro conjunto de conversões para chegar a coordenadas de tela.

Isto é o que funcionou para mim em 1979.

Minha fonte para o número de milhas por grau.

Quando eu deu esta resposta a pergunta foi rotulado

"Qual seria a melhor maneira de prestar um Shapefile (mapa de dados) com polilinhas em .net?"

Agora é uma questão diferente, mas eu deixar a minha resposta à pergunta inicial.

Eu escrevi uma versão .NET que poderia desenhar vetor-dados (tais como a geometria do um arquivo shp) usando simples GDI + em C #. isto foi bastante divertido.

A razão foi que precisávamos lidar com diferentes versões de geometrias e atributos com um monte de informações adicionais para que pudéssemos Não use um componente de mapa comercial ou um aberto fonte.

A principal coisa quando está fazendo isso é estabelecer uma janela de visualização e traduzir / transformar coordenadas WGIS84 a uma escala inferior e GDI + x, y coordenadas e espera com projecção Se você ainda precisa reprojetar a todos.

Uma solução é usar MapXtreme. Eles têm de API para Java e C #. A API é capaz de carregar esses arquivos e torná-los.

Para Java:

http: //www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-java

Para NET:

http: //www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-2008

Eu usei esta solução em um aplicativo de desktop e funcionou bem. Ele oferece muito mais do que apenas informações de renderização.

Agora, fazer isso a partir do zero pode demorar um pouco. Eles têm uma versão de avaliação que você pode baixar. Eu acho que ele só imprime "MapXtreme" sobre o mapa como uma marca d'água, mas é completamente usável caso contrário

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top