Eu estava procurando por uma solução sólida que me permitisse criar um mapa da Web e sobrepor polígonos vetoriais sem levar uma eternidade para carregar esses dados, com o objetivo de permitir que cada polígono exiba uma cor diferente em um evento de foco.
Tanto quanto sei, existem 3 opções específicas para conseguir isso através do canvas, SVG, Flash.
Parece que o Flash seria a melhor solução se funcionasse em iphones / ipads da apple, pois parece fornecer a renderização mais rápida e a exibição mais limpa. O Canvas parece ser a segunda melhor opção, mas leva MUITO tempo se você tiver centenas de polígonos sendo exibidos em um mapa, enquanto o SVG leva mais tempo para renderizar.
Eu quase perdi a esperança em encontrar uma solução para este problema , mas hoje me deparei com uma empresa chamada GISCloud http://www.giscloud.com (atualmente em beta com inscrição gratuita).
Em alguns casos, essa empresa conseguiu descobrir uma maneira incrível de renderizar centenas de vetores em um mapa quase em tempo real. Fiquei impressionado com a abordagem deles e minha pergunta para a comunidade diz respeito a como podemos replicar sua abordagem para uso com as tecnologias existentes, como folheto, camada aberta, cera ...
Dê uma olhada em si mesmo, assistindo a esta incrível demonstração: http://www.giscloud.com/map/284/africa
Passe o mouse sobre qualquer um dos polígonos da página e teste os controles de zoom para ver se esses polígonos são realmente vetores.
O que eu notei examinando solicitações com o firebug é que o mapa está solicitando arquivos json específicos. Parece que, dependendo do nível / área de zoom, vários arquivos json estão sendo solicitados.
Também devo mencionar aqui que, uma vez que o giscloud carrega os dados na página, passar o mouse sobre um vetor muda imediatamente a cor sem criar uma nova solicitação.
EXEMPLOS:
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/3/3.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/5/3.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/4/4.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/3/4.json
- http://cft1.giscloud.com/t/1316509973/map284/layer1156/3/5/4.json
Estou assumindo que a estrutura do URL segue a lógica do serviço de ladrilhos padrão (por exemplo, a terceira a última pasta é o nível de zoom ...).
De qualquer forma, analisei os dados reais desses arquivos json e parece que a lógica que eles estão usando segue algum tipo de lógica pela qual eles criam seus vetores apenas com base nesses valores de dados:
- width / height: eles definem a largura e a altura dos dados servidos em cada solicitação json
- pixels: aqui eles definem valores de pixels que, suponho, se relacionam de alguma forma com algumas coordenadas gerais de pixels x / y para níveis de pontos generalizados? Suponho que, de alguma forma, eles tenham uma maneira de simplificar automaticamente a região, dependendo do nível de zoom. Estou assumindo que eles usam coordenadas de pixels. Acho que eles estão reduzindo drasticamente o tamanho dos dados que precisam ser carregados em comparação com os dados de lat / long.
- styles: aqui eles definem dois valores de CSS RGB. "F" representando a cor do arquivo de polígono e "S" representando a cor da borda do polígono.
- geom: aqui é onde eu suponho que eles estejam de alguma forma definindo especificamente cada polígono dentro do bloco que está sendo carregado, onde esses dados estão sendo definidos com base na janela do contêiner de mapa. O que também é interessante é que cada entrada possui um valor "S" que, suponho, é usado como um atributo opcional ou valor do link do recurso, e no final de cada entrada aqui há uma área que parece definir um ID por vetor específico, juntamente com o ID da camada que, suponho, é utilizado para, de alguma forma, unir os dados de cada solicitação de bloco json que está sendo chamada.
Também estou assumindo que eles de alguma forma descobriram uma maneira de determinar e dividir automaticamente os dados que precisam ser carregados para cada bloco, dependendo do tamanho dos dados que precisariam ser carregados para o bloco solicitado.
Aqui está um detalhamento extraído de uma dessas solicitações:
{"width":256,"height":256,"tile":
{"pixels":
[0,6461,-1,0,5,148,0,509,-1,10715,-1,1,-1,251,-1,1,-1,1,-1,251,-2,3,-1,255,-1,249,-2,5,-2,247,-1,509,-3,251,-1,2,-2,253,-2,252,-2,254,-1,255,-1,254,-1,255,-1,1276,-2,13,-1,233,-1,2,-1,253,-1,1,-1,255,-1,247,-1,1306,-1,1533,-1,1269,-1,1276,-1,2303,-1]},
"styles":
[{"f":"rgb(99,230,101)","s":"rgb(5,148,0)","lw":"0"}],
"geom":
[
{"s":0,"p":[4,143,5,144,3,146,1,146,2,143,4,143],"c":"layer1156_5098"},
{"s":0,"p":[-2,143,0,140,2,141,2,144,1,146,-2,144,-2,143],"c":"layer1156_5067"},
{"s":0,"p":[7,143,5,144,4,143,2,143,2,141,5,138,6,139,5,141,7,143],"c":"layer1156_5051"},
{"s":0,"p":[10,141,11,137,12,137,14,137,12,142,9,143,9,142,10,141],"c":"layer1156_5041"},
{"s":0,"p":[1,136,0,140,-2,143,-2,136,1,136],"c":"layer1156_5038"},
{"s":0,"p":[8,143,5,141,5,137,8,136,10,137,10,141,8,143],"c":"layer1156_5033"},
{"s":0,"p":[5,137,2,141,0,140,1,136,1,136,2,135,3,136,5,137],"c":"layer1156_5028"},
{"s":0,"p":[10,134,12,136,11,138,8,135,10,134],"c":"layer1156_5020"},
{"s":0,"p":[-2,133,0,136,-2,136,-2,133],"c":"layer1156_5005"},
{...}
...
]
}
Como podemos replicar o mesmo tipo (ou similar) de velocidade usando postgis (que eu também pareço usar)?