Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 18 December 2012 21:19

heretik
Participant occasionnel
Date d'inscription: 17 Feb 2009
Messages: 13

[OL]Gestion de photos multiples sur un point GPS

Dans le cadre de mon site personnel, je géolocalise mes photos (grâce à l'heure de ces dernières) sur la trace de mon parcours.

Seulement, il arrive parfois que mon algorithme de géolocalisation, attache plusieurs photos sur un même point (normal car souvent, je prends plusieurs photos au même endroit au même moment).

Comment pourrait-on faire pour que sur la carte OpenLayers, l'utilisateur puisse visualiser les n photos disponibles sur ce point ? J'ai pensé à un système de next previous mais est-ce envisageable ?

Ex : http://partir-en-vtt.com/php/articles/i … rticle=408

Sur le sommet du Grand Taureau, il y a deux photos (on pourra le voir en utilisant le KML et google earth) mais ici, seul une photo est visible.

Par avance, merci de vos pistes et de votre aide.


On ne va jamais aussi loin que lorsque l'on ne sait pas où l'on va...

Hors ligne

 

#2 Wed 19 December 2012 14:41

Cornet Jérémie
Participant assidu
Lieu: Nouméa
Date d'inscription: 6 Apr 2008
Messages: 229

Re: [OL]Gestion de photos multiples sur un point GPS

Salut,
Tournes toi vers la stratégie cluster.
Tu aura un seul point réellement affiché et à l'ouverture de la popup tu peux utiliser toutes les entités du cluster pour générer le contenu de ta popup.
tu as un exemple de code sur :
http://www.forumsig.org/showthread.php?t=27040

Hors ligne

 

#3 Thu 20 December 2012 10:15

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1024
Site web

Re: [OL]Gestion de photos multiples sur un point GPS

Salut et merci Jérémie pour le lien,

Au final, j'ai deux problèmes (la carte globale) et les photos qui sont à régler avec la stratégie cluster. Si quelqu'un se sent la force de m'aider à créer ces deux scripts, je l'accueil bien volontiers et lui paie l'apéro dans la foulée :-)

Aujourd'hui, voilà comment je créer ces popup avec l'image : (je mets tout mon script)

Code:

<script type="text/javascript">
    var map; 
        function init() 
        {
            //echelle
            var scale= new OpenLayers.Control.ScaleLine({ topInUnits: 'km', bottomInUnits: 'm'});
            
            map = new OpenLayers.Map ("map", {
                controls:[
                    new OpenLayers.Control.Navigation(),
                    //echelle
                    scale,
                    new OpenLayers.Control.PanZoomBar(),
                    new OpenLayers.Control.LayerSwitcher(),
                    new OpenLayers.Control.Attribution()],
                maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
                maxResolution: 156543.0399,
                numZoomLevels: 19,
                units: 'm',
                projection: new OpenLayers.Projection("EPSG:900913"),
                displayProjection: new OpenLayers.Projection("EPSG:4326")
            } );
                        
            // overview (mini-carte)
            var overview1 = new OpenLayers.Control.OverviewMap();
            map.addControl(overview1);
            
            //OSM
            layerMapnik = new OpenLayers.Layer.OSM.Mapnik("OpenStreetMap");
            map.addLayer(layerMapnik);
            
            //mapquest
            var mapquest = new OpenLayers.Layer.OSM("MapQuest", "http://otile1.mqcdn.com/tiles/1.0.0/osm/${z}/${x}/${y}.png");
            map.addLayer(mapquest);
            //opencyclemap
            layerCycleMap = new OpenLayers.Layer.OSM.CycleMap("OpenCyclemap");
            map.addLayer(layerCycleMap);
            
            // google map
            //googlemap = new OpenLayers.Layer.Google("Google Map", {sphericalMercator:true});//projection 900913
            //map.addLayer(googlemap);
            
            //carte du relief google
            var gphy = new OpenLayers.Layer.Google("Google relief",{sphericalMercator:true, type: G_PHYSICAL_MAP} );
            map.addLayer(gphy);
            
            //Hybride
            var vueaerienne = new OpenLayers.Layer.Google("Gogle Hybride",{sphericalMercator:true, type: G_HYBRID_MAP} );
            map.addLayer(vueaerienne);
            
            //geojson
            var trace_geojson = new OpenLayers.Layer.Vector(
            "Trace GPS",{
                protocol: new OpenLayers.Protocol.HTTP({
                url: "/php/articles/inclusion/gpx/appel_geojson.php?id_article=<?php echo $id_article; ?>",
                format: new OpenLayers.Format.GeoJSON()
                }),
                style: {strokeColor: "red", strokeWidth: 5, strokeOpacity: 0.5},
                projection: new OpenLayers.Projection("EPSG:4326"),
                strategies: [
                    new OpenLayers.Strategy.Fixed() //chargement unique
                    //new OpenLayers.Strategy.Cluster() //regroupe les objets
                    ]
                }
            );
            map.addLayer(trace_geojson);

            <?php 
            if($total_photo > 0)//y a t'il des images géolocalisées ?
            { ?>
                //marker (image géolocalisées                    
                AutoSizeAnchored = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {'autoSize': true});
                markers = new OpenLayers.Layer.Markers("Photos");
                map.addLayer(markers);

                var longlat, popupClass, popupContentHTML, myPopup;
                
                <?php 
                $sql_image_geolocalisee = $bdd->prepare('SELECT coord_gps_lat, coord_gps_lon, photo_gps_nom, photo_gps_url '
                                                         . ' FROM pevtt_photo_gps a'
                                                      . ' LEFT JOIN pevtt_fichier_gps_avec_article b ON a.id_fichier_gps = b.id_fichier_gps'
                                                      . ' LEFT JOIN pevtt_coordonnee_gps c ON b.id_fichier_gps = c.id_fichier_gps AND c.id_coord_gps = a.id_coord_gps'
                                                      . ' WHERE id_article = ?');
                $sql_image_geolocalisee->execute(array($id_article));
            
                while ($tab_image_geolocalisee = $sql_image_geolocalisee->fetch())
                {       
                    $lon = htmlspecialchars($tab_image_geolocalisee['coord_gps_lon']);
                    $lat = htmlspecialchars($tab_image_geolocalisee['coord_gps_lat']);
                    $image = htmlspecialchars($tab_image_geolocalisee['photo_gps_nom']);
                    $photo_gps_url = htmlspecialchars($tab_image_geolocalisee['photo_gps_url']);
                    
                    ?>
                    longlat = new OpenLayers.LonLat(<?php echo $lon.",".$lat ; ?>).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
                    popupClass = AutoSizeAnchored;
                    popupContentHTML = '<img src="<?php echo $photo_gps_url; ?>" width="350"></img>';
                    addMarker(longlat, popupClass, popupContentHTML, true);
                    <?php
                }
                    ?>
                function addMarker(ll, popupClass, popupContentHTML, closeBox, overflow) 
                {
                    var feature = new OpenLayers.Feature(markers, ll); 
                    feature.closeBox = closeBox;
                    feature.popupClass = popupClass;
                    feature.data.popupContentHTML = popupContentHTML;
                    var size = new OpenLayers.Size(28, 30);
                        var offset = new OpenLayers.Pixel(-(size.w / 2), -size.h);
                        var theIcon = theIcon = new OpenLayers.Icon('/php/images/marker.gif',size, offset);
                        feature.data.icon = theIcon;
                        
                    feature.data.overflow = (overflow) ? "auto" : "hidden";
                            
                    var marker = feature.createMarker();
                    var markerClick = function (evt) 
                    {
                        if (this.popup == null) 
                        {
                            if(typeof myPopup!='undefined'){
                                myPopup.destroyPopup();
                            }
                            myPopup = this;
                            this.popup = this.createPopup(this.closeBox);
                            map.addPopup(this.popup);
                            this.popup.show();
                        } 
                        else 
                        {
                            this.popup.toggle();
                        }
                        currentPopup = this.popup;
                        OpenLayers.Event.stop(evt);
                    };
                    marker.events.register("mousedown", feature, markerClick);
                    markers.addMarker(marker);
                }//fin marker
           <?php
           } //fin test image
           ?>
            //zoom automatic à l'extent d'un fichier gpx determiné par son nom
            trace_geojson.events.register('loadend', map, function(){this.zoomToExtent(trace_geojson.getDataExtent())});
            map.setCenter(null, null);
        }
    </script>

Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com

Hors ligne

 

#4 Thu 20 December 2012 16:17

Cornet Jérémie
Participant assidu
Lieu: Nouméa
Date d'inscription: 6 Apr 2008
Messages: 229

Re: [OL]Gestion de photos multiples sur un point GPS

Hello,
Tu remplace tes markers par une couche vector layer GeoJson générée de la même manière que ta trace (un script php génère le geojson). Tu la mets en stratégie cluster.
Tu rajoute un control select sur cette couche.
Tu rajoute une capture d'évènement onfeatureselect sur ta couche.

L'architecture du code :

Code:

var photos_layer = new OpenLayers.Layer.Vector(
    "Photos",
    {
        protocol: new OpenLayers.Protocol.HTTP({
            url: "/php/articles/inclusion/gpx/appel_geojson_photos.php?id_article=<?php echo $id_article; ?>",
            format: new OpenLayers.Format.GeoJSON()
        }),
        style: {strokeColor: "red", strokeWidth: 5, strokeOpacity: 0.5},
        projection: new OpenLayers.Projection("EPSG:4326"),
        strategies: [new OpenLayers.Strategy.Cluster(), new OpenLayers.Strategy.Fixed()]
    }
);
map.addLayer(photos_layer);

var control_select = new OpenLayers.Control.SelectFeature(
    photos_layer, {}
);
map.addControl(control_select);
control_select.activate();
photos_layer.events.on({"featureselected": showPopup});

var showPopup = function(evt){
    var feature = evt.feature;
//Tu es dans un cluster : tu boucles donc sur tes features du cluster (pour récupérer les liens d'images)
    if (feature.cluster) {
        for (var i = 0; i < feature.attributes.count; i++) {
            var feat = feature.cluster[i]; //Une feature du cluster
            //
            //
            //
            //
        }
        //
        //
//Sinon ton feature est normal, tu peux l'utiliser comme avant
    } else {
        //Tu utilises ton feature normal pour générer le contenu HTML
        //
        //
        //
        //
    }
}

Hors ligne

 

#5 Wed 09 January 2013 10:33

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1024
Site web

Re: [OL]Gestion de photos multiples sur un point GPS

Bonjour et merci pour ton exemple, je regarde si j'arrive à mettre ça en œuvre et te tient au courant rapidement.


Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com

Hors ligne

 

#6 Wed 09 January 2013 12:11

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1024
Site web

Re: [OL]Gestion de photos multiples sur un point GPS

Me revoilà, j'ai créé le service web qui génère les ponctuels des photos avec l'url et le nom de l'image

Code:

   //Je créé la structure générale de mon geojson dans un  tableau associatif $Resultat
    $Resultats = array('type'=> 'FeatureCollection', 'features' => array());

    //Je rajoute à chaque boucle un feature point
    while($tab_image_geolocalisee = $sql_image_geolocalisee->fetch())
    {   
        //Creation du feature vierge
        $feature = array('type' => 'feature', 'geometry' => Null, 'properties' => Null);
        //Renseignement de la geometrie
        $feature['geometry'] = array('type' => 'Point', 'coordinates' => array(floatval($tab_image_geolocalisee['coord_gps_lon']), floatval($tab_image_geolocalisee['coord_gps_lat'])));
        
        //Ajout des attributs de mon feature
        $feature['properties']['photo_gps_nom'] = "".htmlspecialchars($tab_image_geolocalisee['photo_gps_nom']).""; //Je rajoute un attribut
        $feature['properties']['photo_gps_url'] = "". htmlspecialchars($tab_image_geolocalisee['photo_gps_url'])."";
             
        //Je rajoute mon feature à mon tableau geojson général
         $Resultats['features'][] = $feature;   
    }
    //Maintenant que j'ai tout mon tableau associatif geojson, j'affiche le résultat
    echo json_encode($Resultats);

Ex : http://www.partir-en-vtt.com/php/articl … rticle=409

J'ai ensuite appelé la couche comme ceci :

Code:

//geojson ponctuels (photos)
                var photos_layer = new OpenLayers.Layer.Vector(
                "Départ des balades",{
                    protocol: new OpenLayers.Protocol.HTTP({
                    url: "/php/articles/inclusion/gpx/appel_geojson_photos.php?id_article=<?php echo $id_article; ?>",
                    format: new OpenLayers.Format.GeoJSON()
                    }),
                    style: {strokeColor: "red", strokeWidth: 5, strokeOpacity: 0.5, pointRadius: 5},
                    projection: new OpenLayers.Projection("EPSG:4326"),
                    strategies: [
                        new OpenLayers.Strategy.Fixed(), //chargement unique
                        ]
                    }
                );
                map.addLayer(photos_layer);

Les points s'affichent sur la carte :

Ex : http://www.partir-en-vtt.com/openlayer_ … rticle=409

Mais je n'arrive pas à déclancher la popup avec l'image à l'intérieur.

Je ne sais pas comment faire ici :

Code:

var control_select = new OpenLayers.Control.SelectFeature(
                    photos_layer, {}
                );
                map.addControl(control_select);
                control_select.activate();
                photos_layer.events.on({"featureselected": showPopup});

                    var showPopup = function(evt){
                    var feature = evt.feature;
                    //Tu es dans un cluster : tu boucles donc sur tes features du cluster (pour récupérer les liens d'images)
                    if (feature.cluster) {
                        for (var i = 0; i < feature.attributes.count; i++) {
                            var feat = feature.cluster['photo_gps_url']; //Une feature du cluster
                            
                            popupContentHTML = feat;
                            feature.data.popupContentHTML = popupContentHTML;
                            //
                        }
                        //
                        //
                    //Sinon ton feature est normal, tu peux l'utiliser comme avant
                    } else {
                        //Tu utilises ton feature normal pour générer le contenu HTML
                        //
                        //
                        //
                        //
                    }
                }

Un petit coup de main ?

Merci smile


Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com

Hors ligne

 

#7 Fri 11 January 2013 08:36

Cornet Jérémie
Participant assidu
Lieu: Nouméa
Date d'inscription: 6 Apr 2008
Messages: 229

Re: [OL]Gestion de photos multiples sur un point GPS

Aucune erreur en console ?

Hors ligne

 

#8 Fri 11 January 2013 10:18

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1024
Site web

Re: [OL]Gestion de photos multiples sur un point GPS

Pas vraiment mais au clic quelque part sur la carte :

Code:

Horodatage : 11/01/2013 10:18:06
Erreur : TypeError: element.ancestors is not a function
Fichier Source : http://www.partir-en-vtt.com/js/prototype.js
Ligne : 3783

faut-il que je garde ma fonction qui créer la popup ou le nouveau suffit de lui même pour ouvrir la popup ?

Dernière modification par heretik25 (Fri 11 January 2013 10:23)


Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com

Hors ligne

 

#9 Sat 12 January 2013 14:14

Cornet Jérémie
Participant assidu
Lieu: Nouméa
Date d'inscription: 6 Apr 2008
Messages: 229

Re: [OL]Gestion de photos multiples sur un point GPS

Salut,
Je suis allé voir le code source de ton lien.
Avant toute chose, corriges la structure de ton code html (les balises body et header).

La fonction showPopup n'est pas finie.
Tu as juste la structure pour différencier le cas où tu as un cluster et celui ou tu as un feature seul.
Dans ces 2 cas, génère un contenu html différent pour ta popup. Il te restera en fin de fonction à afficher la popup.

Tu n'as pas mis la stratégie cluster pour ta couche de photos.

En regardant vite fait dans google, l'erreur que tu mets ci dessus pourrait être due à une collision entre les librairies GoogleMaps et Lightview

PS : rien à voir mais vu que tu as un site tout public, tu as droit d'utiliser l'API Geoportail gratuitement. Une fois que tu as une clé valide, tu pourra rajouter facilement les couches Geoportail comme fond de plan (surtout le Scan25 qui est parfait pour les thématiques rando) en utilisant les couches WMTS; Voir http://www.forumsig.org/showpost.php?p= … stcount=9.
Par contre, il faudrait que tu utilises la dernière version d'Openlayers.

Hors ligne

 

Pied de page des forums

Powered by FluxBB