#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
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
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
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
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
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