Créez une carte interactive sans serveur


8

J'ai réussi à créer une excellente application de cartographie Web à l'aide de tuiles créées à partir de GeoWebCache et d'un ensemble de grilles personnalisé, mais je dois maintenant ajouter une superposition aux cartes de base. La seule interactivité dont j'ai besoin est une simple fenêtre d'information contextuelle qui provient d'un seul des attributs.

Par défaut, le jeu de données de superposition est un fichier de formes ESRI de 180 Mo. J'ai depuis réussi à simplifier le jeu de données à l'aide de ST_SimplifyPreserverTopology, qui a réduit la taille du fichier de formes ESRI à 28 Mo. Cependant, en tant que fichier GeoJSON, il s'agit toujours de 78 Mo, ce qui est tout simplement trop gros.

J'ai ensuite essayé CartoDB et chargé les données dans une table, puis ajouté la couche vectorielle dans les couches ouvertes, mais le volume de données est toujours trop important et la page HTML se bloque.

J'ai ensuite essayé GIS Cloud et un WMS externe mais qui est limité au WGS84 et n'a pas d'option info getfeature.

J'ai ensuite commencé à regarder Topojson qui, je pense, fonctionnerait très bien sur mon jeu de données, mais je ne pense pas qu'il existe un moyen de charger un topojson sur une carte dans OpenLayers 2.12 que je dois utiliser.

Mon autre option était UTF-Grid, j'ai donc chargé les données dans tilemill et exporté un MbTiles que je peux extraire en utilisant mbutil. Mais bien sûr, UTF-Grid ne prend en charge que EPSG: 3857 (web mercator), ce qui est différent de ma projection, EPSG: 27700. Ainsi, tous les fichiers .json sont nommés différemment de mes tuiles en cache sous-jacentes de geowebcache.

Existe-t-il un moyen de créer une grille UTF mais dans une projection différente?

C'est donc le contexte et je pense que j'ai essayé la plupart des options que je connais.

Donc, j'ai simplement besoin d'une couche de superposition interactive dans une carte OpenLayers 2.12 mais je ne peux pas utiliser de serveur comme GeoServer / Mapserver ou TileStache etc. et je ne peux pas avoir de script côté serveur comme PHP.

Quelqu'un peut-il offrir d'autres conseils ??

Merci


topojson fonctionnerait très bien avec openlayers 2.10 (vous convertissez réellement topojson en geojson avant de l'utiliser). Mais cela ne résoudrait pas votre problème car il serait encore trop gros pour être traité dans la plupart des navigateurs.
johanvdw

essayez d3js bl.ocks.org/mbostock/4965422 797M shapefile pour les zones nationales de tabulation de code postal. Simplifié avec TopoJSON (avec -q 1e5 -s 3e-7)
Mapperz

@Mapperz, une réduction de taille impressionnante. Topojson peut-il être dans une projection différente de celle du mercator sphérique?
tjmgis

@johanvdw avez-vous un exemple de topojson chargé dans openlayers?
tjmgis

Projection TopoJSON bl.ocks.org/mbostock/5557726
Mapperz

Réponses:


3

Développer mon commentaire d'origine:

Topojson peut fonctionner correctement avec openlayers 2.10 (vous convertissez réellement topojson en geojson avant de l'utiliser). Mais je ne suis pas sûr que cela résoudrait votre problème car il peut être encore trop gros pour être traité dans la plupart des navigateurs. Un exemple sur l'utilisation de topojson dans openlayers 2, basé sur l' exemple de geojson openlayers et certaines données que j'ai utilisées dans un article de blog .

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

Le bit réel qui est important n'est que la deuxième ligne:

    $.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));
    });

Cette ligne crée un objet geojson (fusiegem) à partir de l'objet de données qui est topojson.


@johanvwd n'ayant pas réussi à utiliser D3 et topojson va essayer votre exemple. Merci d'avoir ajouté le code
tjmgis

@johanvwd J'ai modifié votre code et j'ai réussi à le faire fonctionner, mais il est terriblement lent, même sur un topojson de 1,4 Mo, sans parler de celui que vous devez utiliser, soit 8 Mo. D'autres pensées ??
tjmgis

Je suppose que la seule chose qui reste à faire est de faire plus de généralisation sur les échelles de vue d'ensemble et de travailler avec des tuiles pour les échelles inférieures. Cependant, je ne connais aucun outil pour faire ce travail. Je suis sûr qu'ils apparaîtront dans un proche avenir ou qu'ils existent peut-être déjà.
johanvdw

1

Cela ressemble à un travail pour D3 - http://bl.ocks.org/mbertrand/5218300


Comment D3 aiderait-il à résoudre le problème?
johanvdw

@ChrisInCambo - merci beaucoup pour l'exemple qui fait exactement ce que je recherche mais qui a eu du mal à faire fonctionner D3 et mon topojson, donc j'ai posté une question différente
tjmgis

L'erreur courante avec TopoJSON est de ne pas regarder à l'intérieur du JSON et de comprendre sa structure lors de son utilisation avec D3. Si vous copiez l'exemple de code et remplacez leur TopoJSON par le vôtre, vous devez vous assurer que les objets référencés dans le TopoJSON existent également dans votre JSON.
ChrisInCambo

1

Vous pouvez diviser les données en fichiers GeoJSON et les nommer en fonction de la tuile. Une fois la carte chargée, vous pouvez rechercher les tuiles visibles et utiliser leurs noms / URL / coordonnées pour demander les fichiers GeoJSON appropriés, correspondant à un fichier par tuile.

La partie difficile est de créer les fichiers. Pour cela, vous devez absolument utiliser un outil. Une fois les fichiers créés, ils sont chargés selon leurs besoins et en si petits morceaux qu'ils ne submergeront pas le navigateur. Une autre douleur ici concerne les niveaux de zoom. Vous devrez décider quelles fonctionnalités sont visibles à partir de quels niveaux et créer vos fichiers en conséquence.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.