#1 Tue 14 October 2014 10:17
[GeoJson] Optimisation d'affichage sur Openlayers
Bonjour le forum,
J'ai un script générant du geojson (depuis une base postgis) afin d'afficher un territoire de compétence à l'échelle d'une région sur une carte OpenLayers.
Lorsque le territoire de compétence reste restreint, la carte s'affiche relativement vite mais dès lors que l'on a plus de 500 communes, on a parfois une petite minute à attendre ce qui n'est pas satisfaisant. J'ai essayé de simplifier les communes via st_simplify() mais le changement n'est pas flagrant.
Mon code Openlayers
Code:
var communes = new OpenLayers.Layer.Vector( "Territoire",{ protocol: new OpenLayers.Protocol.HTTP({ url: "/modules/ppn/appel_geojson.php?id=<?php echo $_GET['id']; ?>", format: new OpenLayers.Format.GeoJSON() }), style: {strokeColor: "red", strokeWidth: 2, strokeOpacity: 1, fillColor: "transparent"}, projection: new OpenLayers.Projection("EPSG:900913"), strategies: [ new OpenLayers.Strategy.Fixed() //chargement unique ] } ); map.addLayer(communes); // add a layer switcher map.addControl(new OpenLayers.Control.LayerSwitcher()); communes.events.register('loadend', map, function(){this.zoomToExtent(communes.getDataExtent())}); map.setCenter(null, null);
Ainsi, j'aimerais savoir si vous avez des pistes pour améliorer tout ça ?
Merci :-)
Dernière modification par heretik25 (Tue 14 October 2014 10:19)
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#2 Tue 14 October 2014 11:14
- Cornet Jérémie
- Participant assidu
- Lieu: Nouméa
- Date d'inscription: 6 Apr 2008
- Messages: 229
Re: [GeoJson] Optimisation d'affichage sur Openlayers
Salut,
Pour moi, la solution passe très clairement par du cache.
Tu modifies ton script geojson pour afficher un fichier de cache s'il existe et sinon, le générer puis l'afficher.
Code:
$id = (int) $_GET['id']; $folder="../cache/"; $filepath = $folder.$id.".geojson"; //si le fichier n'existe pas, on le génère if(!file_exists($filepath)){ //on génère le fichier de cache // } //On affiche le fichier de cache header('Content-type: application/json'); readfile($filepath);
Il te restera à réfléchir au système de rafraichissement / mise à jour du cache.
Dernière modification par Cornet Jérémie (Tue 14 October 2014 11:15)
Hors ligne
#3 Tue 14 October 2014 11:20
Re: [GeoJson] Optimisation d'affichage sur Openlayers
Merci Jérémie pour ta proposition. J'essaye de mettre en place tout ça et te tiens au courant des résultats.
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#4 Tue 14 October 2014 11:40
Re: [GeoJson] Optimisation d'affichage sur Openlayers
Bonjour,
Peut-être des pistes à suivre ici : http://makina-corpus.com/blog/metier/20 … un-geojson
Hors ligne
#5 Tue 14 October 2014 12:45
Re: [GeoJson] Optimisation d'affichage sur Openlayers
Bonjour,
Est ce la génération du GeoJson, le dessin ou le transfère des données qui est le plus long?
Petit comparatif de différentes méthodes: http://dogeo.fr/index.php/web-carto/19- … r-de-mysql
Hors ligne
#6 Tue 14 October 2014 15:21
Re: [GeoJson] Optimisation d'affichage sur Openlayers
Bonjour et merci pour vos pistes.
J'avais pensé à la simplification, il faut que j'étudie ça davantage.
Dernière modification par heretik25 (Tue 14 October 2014 15:42)
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#7 Wed 15 October 2014 08:32
Re: [GeoJson] Optimisation d'affichage sur Openlayers
En simplifiant beaucoup, la réponse est plutôt bonne et le cache permet d’accélérer d'environ 1/3 ou 1/4 le temps d'affichage. Dans mon cas ce n'est pas grave de simplifier énormément mais dans un cas ou je souhaiterais afficher la géométrie de façon précise, je ne sais pas comment on pourrait faire pour afficher toutes les communes d'une région en peu de temps.
Sinon, une idée pour arrondir les coordonées via postgres ? Un round() ne semble pas lui plaire.
Ma requête :
Code:
select st_asgeojson(ST_SimplifyPreserveTopology(st_transform(gez_geometry,900913),100)) as geojson FROM public.tv_geom_zonages_commune where gez_id_geom_zonage in(select gez_id_geom_zonage FROM tj_user_a_acces_zonage a JOIN t_authentification b on a.aut_id_utilisateur = b.aut_id_utilisateur WHERE ref_user_module = ?
Merci
Dernière modification par heretik25 (Wed 15 October 2014 08:56)
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#8 Mon 20 October 2014 13:05
Re: [GeoJson] Optimisation d'affichage sur Openlayers
Je cherche à savoir comment faire la màj du fichier en cache en cas de modification du territoire concerné. Une idée ?
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#9 Mon 20 October 2014 13:30
Re: [GeoJson] Optimisation d'affichage sur Openlayers
Peut être en lisant les métadonnées du fichier avec la date de modification, la comparer la date de dernière modification de la données. Mais bien sur, pour cela il faut une colonne qui indique la date de la dernière modification dans la base (mis à jour avec un trigger par exemple) .
exemple : Si date_fichier > date_dernière_modif_bdd => on prend le cache, sinon on le refait
Hors ligne