O formato de armazenamento espacial mais rápido?

8

Gostaria de saber qual método de armazenamento resultará na leitura mais rápida dos vetores de mapa para renderização. SHP? PostGres? SQLite? (Eles não mudam frequentemente e eu não preciso de funções espaciais para esses vetores).

Nate
fonte
1
Quantos recursos você está falando?
Roger D.
2
Sua pergunta parece sugerir que o gargalo é o processo de leitura de dados. Minha experiência é que a carga real está no próprio processo de renderização, pelo menos com o MapServer. Ou seja, não vejo que o uso de shapefiles ou de um banco de dados espacial faça uma grande diferença.
dariapra
@ Roger - Não tenho certeza. É um mapa dos EUA usando a mais alta resolução (estados, condados, estradas, rios). Eu obtive os dados de naturalearthdata.com
Nate
@Nate, sendo esse o caso, por que ler o OSM ou o Google para o seu mapa? Sobrepor em cima deles? Dar vida a todos os EUA sempre é um grande processo. Então você precisa considerar o desempenho da rede, desempenho do disco io, CPU. Há muitas coisas que podem e afetarão o desempenho.
11117 DEWright

Respostas:

12

Testes de velocidade

Existem alguns testes rápidos de shapefiles versus banco de dados (PostGIS) para o MapServer nesta apresentação (de 2007).

Em suma:

  • Para um conjunto de dados de 3 milhões de recursos, a execução de solicitações para 30 recursos, um após o outro, o PostGIS foi mais rápido que o shapefile (embora isso possa ter sido alterado por uma correção na leitura do índice shapefile)
  • Para um conjunto de dados de 10.000 recursos, o shapefile foi um pouco mais rápido.
  • Para solicitações simultâneas, o shapfile foi mais rápido

E os tempos em detalhes, que também podem ajudar a decidir se o formato de armazenamento é um fator importante.

                       PostGIS   Shapefile 
Start mapserv process  15ms      15ms
Load mapfile           3ms       3ms
Connect to DB          14ms      n/a
Query                  20ms      n/a
Fetch                  7ms       n/a
Draw                   11ms      28ms
Write Image            8ms       8ms
Network Delay          3ms       3ms

Sempre use o FastCGI no MapServer se estiver usando um banco de dados, pois as conexões com o banco de dados podem ser reutilizadas; caso contrário, uma nova conexão deve ser criada em cada solicitação.

Implementações para leitores de shapefile

A velocidade de leitura de um shapefile (e dados de um banco de dados) depende da implementação de codificação específica.

O código fonte do MapServer que abre um shapefile pode ser visto aqui . Após os comentários, você pode ver como é importante ter um índice. Normalmente, você só pode ler um arquivo em uma direção para obter um registro, mas com um índice, você pode ler em duas direções.

345   /*    Read the .shx file to get the offsets to each record in             */
346   /*    the .shp file.   

Outro exemplo de abertura de um shapefile pode ser visto na fonte Python para PyShp . Novamente, você pode ver como um índice é usado para encontrar formas específicas diretamente.

Outros fatores a serem conduzidos

As limitações do formato DBF (limites no tamanho do campo, sem suporte nulo, limites no armazenamento de texto) também devem ser levadas em consideração ao decidir sobre o uso ou não de um banco de dados.

Um banco de dados também oferece meios de proteção de dados, junção e criação de visualizações mais fáceis, registro e muitos outros recursos que você não obterá com um arquivo independente.

geographika
fonte
10

Ao contrário do que diz dariapra, minha experiência no desenvolvimento do Maperitive me diz que o maior gargalo está no carregamento real dos dados antes da renderização. Tudo depende muito do tamanho do conjunto de dados geral armazenado e do tamanho do conjunto de dados que você está tentando processar de uma só vez. Se você pode carregar tudo na memória, os shapefiles provavelmente são melhores do que usar um mecanismo de banco de dados.

Igor Brejc
fonte
4
+1 por apontar que a forma do gargalo é importante e fornecer informações da experiência real. Coisa boa.
whuber
Onde está o gargalo parece uma pergunta interessante e aberta que depende de várias variáveis, talvez o tipo de carga de trabalho seja importante. Lembro que, depois de indexar alguns shapefiles com shapetree para obter uma renderização mais rápida de algumas camadas vetoriais com o MapServer, não obtive um ganho significativo de desempenho.
dariapra
2
@dariapra É verdade que depende muito do caso de uso. Se ele é capaz de carregar todos os dados de uma só vez, o índice espacial não é realmente necessário, mas o carregamento de dados de um shapefile deve ser muito mais rápido do que a execução de consultas SQL. Por outro lado, se houver uma enorme quantidade de dados que precisam ser filtrados, eu apostaria em um banco de dados e não em shapefiles.
Igor Brejc
4

Qual programa você usará para renderizar? Isso pode influenciar os resultados. De qualquer forma, ter um shapefile com um índice espacial (por exemplo, http://mapserver.org/utilities/shptree.html ) usado frequentemente é a técnica mais rápida. Além disso: depende da sua aplicação, mas o cache dos resultados renderizados geralmente é muito mais útil para melhorar o desempenho.

johanvdw
fonte
Obrigado. Estou usando o MapGuide no momento (ainda meio que explorando nossas opções), e tenho visto o Mapserver.
Nate
2

O Shapefile será o mais rápido e provavelmente a sua melhor aposta. Existe sobrecarga para qualquer banco de dados SQL e, em seguida, é gerenciado o retorno de grandes conjuntos de resultados (a conversão de tipos de dados do banco de dados para tipos de dados nativos também reduzirá a velocidade).

Tente usar um pacote de código aberto do maptools.org para fazer suas leituras. As ferramentas do ArcGIS, apesar de construídas especificamente, têm um pouco de sobrecarga para começar e são caras.

Espero que isto ajude

OptimizePrime
fonte