Crie mapa interativo sem servidor

8

Consegui criar um ótimo aplicativo de mapeamento da web usando blocos criados a partir do GeoWebCache e um conjunto de grades personalizado, mas agora preciso adicionar uma sobreposição aos mapas base. A única interatividade necessária é uma janela de informações pop-up simples, proveniente de apenas um dos atributos.

Por padrão, o conjunto de dados de sobreposição é um ESRI Shapefile de 180Mb, desde então eu consegui simplificar o conjunto de dados usando ST_SimplifyPreserverTopology, que reduziu o tamanho do ESRI Shapefile para 28Mb. No entanto, como um arquivo GeoJSON, ele ainda tem 78Mb, o que é muito grande.

Tentei o CartoDB, carreguei os dados em uma tabela e adicionei a camada de vetor nos openlayers, mas o volume de dados ainda é muito grande e a página HTML falha.

Eu tentei o GIS Cloud e um WMS externo, mas isso é restrito ao WGS84 e não tem opção de informações de recurso.

Comecei então a olhar para o Topojson, que acho que funcionaria muito bem no meu conjunto de dados, mas não acho que exista uma maneira de carregar um topojson em um mapa do OpenLayers 2.12 que preciso usar.

Como minha outra opção era UTF-Grid, carreguei os dados no tilemill e exportei um MbTiles que posso extrair usando o mbutil. Mas é claro que o UTF-Grid suporta apenas o EPSG: 3857 (web mercator), que é diferente da minha projeção, EPSG: 27700. Portanto, todos os arquivos .json são nomeados de maneira diferente dos meus blocos em cache subjacentes do geowebcache.

Existe uma maneira de criar uma grade UTF, mas em uma projeção diferente?

Esse é o pano de fundo e sinto que tentei a maioria das opções que conheço.

Então, simplesmente preciso de uma camada de sobreposição interativa em um mapa do OpenLayers 2.12, mas não posso usar nenhum servidor como GeoServer / Mapserver ou TileStache etc. e não posso ter nenhum script no lado do servidor como PHP.

Alguém pode oferecer algum outro conselho?

obrigado

tjmgis
fonte
O topojson funcionaria bem com o openlayers 2.10 (você realmente converte o topojson em geojson antes de usá-lo). Mas isso não resolveria o seu problema, pois ainda seria muito grande para processar na maioria dos navegadores.
johanvdw
tente o arquivo de shapefile d3js bl.ocks.org/mbostock/4965422 797M para áreas de tabulação nacionais de códigos postais. Simplificado usando o TopoJSON (com -q 1e5 -s 3e-7)
Mapperz
@Mapperz, que é uma redução impressionante de tamanho. O topojson pode estar em uma projeção diferente da do mercator esférico?
tjmgis
@johanvdw você tem um exemplo de topojson carregado em openlayers?
precisa saber é
Projeção TopoJSON bl.ocks.org/mbostock/5557726
Mapperz

Respostas:

3

Expandindo meu comentário original:

O Topojson pode funcionar bem com os openlayers 2.10 (você realmente converte o topojson em geojson antes de usá-lo). Mas não tenho certeza se isso resolveria o seu problema, pois ainda pode ser muito grande para processar na maioria dos navegadores. Um exemplo de uso do topojson nos openlayers 2, com base no exemplo geojson dos openlayers e em alguns dados que usei em uma postagem do blog .

http://www.gisky.be/cyclists/ol-topojson.html

O bit real que é importante é apenas a segunda linha:

    $.getJSON('http://www.gisky.be/cyclists/f.json', function (data) {
        fusiegem = topojson.feature(data, data.objects.fusie);
        var geojson_format = new OpenLayers.Format.GeoJSON();
        var vector_layer = new OpenLayers.Layer.Vector();
        map.addLayer(vector_layer);
        vector_layer.addFeatures(geojson_format.read(fusiegem));
    });

Essa linha cria um objeto geojson (fusiegem) a partir do objeto de dados que é topojson.

johanvdw
fonte
@johanvwd, que falhou em usar o D3 e o topojson, vou dar o seu exemplo. Muito obrigado por adicionar o código
tjmgis 13/11/2013
@johanvwd Alterei seu código e consegui fazê-lo funcionar com êxito, mas é muito lento mesmo em um topojson de 1,4 Mb, sem falar no que é necessário usar, que é de 8 Mb. Quaisquer outros pensamentos?
tjmgis
Eu acho que as únicas coisas a fazer é generalizar as escalas de visão geral e trabalhar com blocos para escalas inferiores. No entanto, não conheço ferramentas para fazer esse trabalho. Tenho certeza que eles aparecerão em um futuro próximo ou talvez já existam.
johanvdw
1

Parece um trabalho para o D3 - http://bl.ocks.org/mbertrand/5218300

ChrisInCambo
fonte
Como o D3 ajudaria a resolver o problema?
johanvdw
@ChrisInCambo - muitos agradecimentos para o exemplo que faz exatamente o que eu sou depois, mas têm lutado para obter D3 e meu trabalho topojson, então colocaram uma pergunta diferente
tjmgis
O erro comum com o TopoJSON é não olhar dentro do JSON e entender sua estrutura ao usá-lo com o D3. Se você copiar o código de exemplo e substituir o TopoJSON deles pelo seu, precisará garantir que os objetos mencionados no TopoJSON também existam no JSON.
ChrisInCambo
1

Você pode dividir os dados em arquivos GeoJSON e nomeá-los de acordo com o bloco. Depois que o mapa carregar, você poderá consultar os blocos visíveis e usar seus nomes / urls / coordenadas para solicitar os arquivos GeoJSON apropriados, correspondendo a um arquivo por bloco.

A parte difícil é criar os arquivos. Para isso, você definitivamente precisa usar uma ferramenta. Depois que os arquivos são criados, eles são carregados conforme necessário e em pedaços tão pequenos que não sobrecarregam o navegador. Outra dor aqui é lidar com os níveis de zoom. Você terá que decidir quais recursos são visíveis em quais níveis e criar seus arquivos de acordo.

bstempi
fonte