J'utilise leaflet.js pour permettre aux internautes de sélectionner une région. Les régions valides sont les États américains, les provinces canadiennes et les pays du monde (à l'exception des États-Unis et du Canada). J'ai moi-même construit un fichier de formes à l'aide de Qgis et l'ai enregistré en tant que geojson. J'ai simplifié autant que possible les géométries.
Le fichier de formes résultant est de 400 Ko, mais le geojson dépasse un mégaoctet. C'est plus grand que je ne le souhaiterais. J'ai besoin de réduire les frais généraux du réseau impliqués dans le transfert de ces informations.
Quel est le bon moyen de le faire? Les options que je peux imaginer sont:
- Servir le fichier geojson compressé, décompresser sur le client.
- Analyser le fichier de formes sur le client pour geojson
- Générer mes propres tuiles à partir du fichier de formes et servir celles
Si quelqu'un pouvait me dire quelle option est la meilleure (ou rien de ce qui précède), je l'apprécierais!
Réponses:
Avant de descendre des chemins plus laborieux, l'option la plus simple est de réduire la géométrie. Quels sont vos jeux de données source? Comment les avez-vous simplifiés? Dans quelle mesure cela a-t-il réduit la taille du fichier geojson?
Si vous êtes sûr d'avoir fait tout ce que vous pouvez sur ce qui précède, alors le fruit le plus bas de vos options est
Tous les navigateurs modernes effectuent le déballage automatique des données compressées, il s'agit donc simplement de configurer votre serveur Web pour emballer les données avant l'envoi. Ceci est normalement relativement simple, avec beaucoup de matériel pour Apache , IIS ou Nginx
Mon conseil serait d'essayer d'abord, de tester, puis si la latence / réponse / taille des données n'est pas acceptable, passer à d'autres options. Je me méfierais également d'essayer d'optimiser prématurément, je chercherais à déterminer pourquoi vous devez réduire la taille des données, et une fois que vous avez des raisons (et des chiffres) difficiles à le faire, puis à mettre en œuvre de manière itérative des changements et à refaire des tests pour voir ce que les gains que vous obtenez.
la source
Mapshaper.org est un outil en ligne gratuit et pratique qui vous permet de télécharger un fichier geojson, de l'afficher sous forme de carte, puis de choisir l'une des trois alogrithims de simplification dont vous pouvez ajuster la force avec un curseur.
Il met à jour la carte et met en évidence en rouge tous les endroits où il y a une perte d'intégrité comme un chevauchement entre deux régions. Il y a un bouton «corriger» qui résout généralement (mais pas toujours) ces problèmes.
Vous pouvez trouver un niveau de simplification acceptable et exporter le fichier geojson nouvellement simplifié.
Évidemment, cela dépend du niveau de détail dont vous avez besoin, mais les résultats peuvent être impressionnants. Par exemple, voici la carte de l'Écosse à partir d'un fichier geojson de 40 Mo:
Une application à 99% le réduit à un fichier de 441 ko sans chevauchements et perte de détails invisible à ce niveau de zoom:
Une application à 99,95% (jusqu'à 29 Ko) montre quel type de simplification de chemin est appliqué (et parvient toujours à éviter les chevauchements, et convient parfaitement à des utilisations comme le chloroplèth au niveau national):
la source
Je me demande si vous pourriez utiliser la compression trouvée dans cette réponse qui parle de compresser le GeoJSON avec topojson .
Je ne sais pas si Leaflet pourra toujours lire le GeoJSON - quelque chose à essayer =)
En savoir plus sur topojson: https://github.com/mbostock/topojson/
la source
Je suis d'accord avec @Kelso ci-dessus sur la simplification de votre géométrie.
Si vous n'avez pas accès à votre serveur pour dégonfler facilement les données avec gzip, vous pouvez jeter un œil à la bibliothèque MessagePack pour sérialiser votre geoJSON en données binaires
(je crois que c'est une implémentation de la spécification BSON qui est utilisée par des choses comme MongoDB pour stocker des données, mais je peux me tromper). Il existe des bibliothèques en Python et javascript (entre autres) que vous pouvez utiliser pour sérialiser / désérialiser les données.la source
Je suggérerais simplement de créer votre propre tableau procédural d'objets Leaflet Polygon. Je suis d'accord avec GeoJSON étant trop grand. Les noms de clé d'objet sont très descriptifs mais peuvent aussi être inutilement longs. Je fais ce genre de chose:
C'est simple. Il est beaucoup plus léger que GeoJSON comme ceci:
Et répétez pour chaque polygone ... ugh ... trop gonflé imo. Ajoute beaucoup d'octets à votre JS. Comme je l'ai dit, les noms des clés sont agréables et descriptifs ... mais ils sont longs et ajoutent beaucoup de byes inutiles à votre JS.
la source