Google maps cerco un aiuto per infowindow

di il
4 risposte

Google maps cerco un aiuto per infowindow

Salve, sto cercando di fare una mappa personalizzata , sul click nella posizione si apre un popup con le informazioni .

Cerco di spiegarmi meglio.

Da php leggo da una tabella del db un elenco di immobili, carico in array  con nome locations, poi devo spostarmi in JS e trasferirla su tabella per poterla dare a googlemaps.

Effettivamente mi dà un marker personalizzato su ogni posizione correttamente, ma il mio problema è la correttezza delle info : una foto , la via e la tipologia dell'immobile sono sempre quelle dell'ultimo indice e non quello di ogni singolo elemento.

Non riesco ad uscirne, qualche aiuto ?  ve ne sarei molto grato.

Posto il codice :

    <?php  
                 
                 /*  questi sono i dati principali dell' agenzia  che posiziono nell'array in indice 0 */
      
                $lat_centro = '40.723688497591';
                $lng_centro = '8.561205504964734';
                $foto       = "immagini/ufficio.jpg";
                $localita   = "Sassari";
                $via        = "Piazza Emiciclo Garibaldi, 11";
                $des        = "I Nostri uffici, vi aspettiamo per conoscerci.";
                $tipologia  = "Appartamento";
                
                $card = array (
                    'tipologia'  => $tipologia,
                    'foto'       => $foto,
                    'lat'        => $lat_centro,
                    'lng'        => $lng_centro,
                    'localita'   => $localita,
                    'via'        => $via,
                    'des'        => $des
                   );
               
            
            /*  qui inizio a leggere la tabella immobili  ho provato con 7 records */    
                
            if ($tabella) : 
                
                foreach ($tabella as $row) : 
                        
                        $foto       = primafoto($row['codice']);
            
                        $arr_lat    = explode(',', $row['latlng'] );
                         
                        $lat = $arr_lat['0'];
                        $lng = $arr_lat['1'];
                      
                        $localita  = $row['localita'];
                        $via =  $row['indirizzo'];
                        $des =  $row['descrizione'];

                        $locations[]= array(
                                'tipologia' => $tipologia,
                                'foto'      => $foto,
                                'lat'       => $lat,
                                'lng'       => $lng,
                                'localita'  => $localita,
                                'via'       => $via,
                                'des'       => $des 
                                );
 
                           // echo $locations[0]['foto'].": In stock: ".$locations[0]['lat'].", sold: ".$locations[0]['lng'].".<br>";
                           // echo $locations[1]['foto'].": In stock: ".$locations[1]['lat'].", sold: ".$locations[1]['lng'].".<br>";
                endforeach;
            endif;  
            
            // inserisco in arry in posizione 0 i dati dell'array card ufficio
                 array_unshift($locations, $card );
            
            

       echo ' <div id="map"></div>';    
            
    ?>

    

Poi la parte js per googlemaps che funziona nei markers ma con informazioni dell'ultimo indice per tutti e 7 i records

<script type="text/javascript">
     const punto = 'assets/icon/marker.png';
     var map;
     var Markers = {};
     var infowindow;
     var locations = [
         <?php 
              for($i=0;$i<sizeof($locations);$i++){ $j=$i+1;?>
                    [
                        '<?php echo $locations[$i]['tipologia'];?>',
                        '<?php echo $locations[$i]['foto'];?>',
                         <?php echo $locations[$i]['lat'];?>,
                         <?php echo $locations[$i]['lng'];?>,
                        '<?php echo $locations[$i]['localita'];?>'
   
                         ]  
                        <?php if($j!=sizeof($locations))echo ","; 
              }
              
          ?>
        ];
        
     
     var origin = new google.maps.LatLng(<?=$lat_centro.','.$lng_centro?>);     /*  info per uffio  */
        
     function initialize() {
          
            var mapOptions = {
                zoom: 11,
                center: origin,
                map : map,
                
            };

        map = new google.maps.Map(document.getElementById('map'), mapOptions);

       
        // ciclo per il numero di elementi nell array locations
 

        for(i=0; i<locations.length; i++) {
            
            var position = new google.maps.LatLng(locations[i][2], locations[i][3]);
            var marker = new google.maps.Marker({
                position: position,
                icon :punto,
                zoom :10,
                map: map,
            });
              
             var contentString =
                '<div class="card">' +
                '<img class="card-img-top" src=" ' + locations[i][1] + '">' +
                '<div class="info-content">' +
                '<h2>' + locations[i][0] + '</h2>' +
                '<h2>' + locations[i][4] + '</h2>' +
              
               '<p> numero ind = '+ i + '</p><br><br>' + 
                '</div>'+ 
                '</div>';
        
            infowindow = new google.maps.InfoWindow();
        
             
            google.maps.event.addListener(marker, 'click', (function(marker, i) {
                return function() {
                    infowindow.setContent(contentString);
                    infowindow.setOptions({maxWidth: 250});
                    infowindow.open(map, marker);
                }
            }) (marker, i));
            
           
           // Markers[locations[i][4]] = marker;
        }

        locate(0);

    }

    function locate(marker_id) {
        var myMarker = Markers[marker_id];
        var markerPosition = myMarker.getPosition();
        map.setCenter(markerPosition);
        google.maps.event.trigger(myMarker, 'click');
    }

    google.maps.event.addDomListener(window, 'load', initialize);
 
 </script>
 

4 Risposte

  • Re: Google maps cerco un aiuto per infowindow

    15/05/2023 - marcopa ha scritto:


    Effettivamente mi dà un marker personalizzato su ogni posizione correttamente, ma il mio problema è la correttezza delle info : una foto , la via e la tipologia dell'immobile sono sempre quelle dell'ultimo indice e non quello di ogni singolo elemento.

    Verifica il codice che finisce sul client mostrando il sorgente della pagina originale nel browser.

    Secondo me, stai trasformando “locations” in un “array di array”, invece che usare un array semplice.

    Vedi anche i messaggi che sono mostrati nella Console di sviluppo (tasto F12).

  • Re: Google maps cerco un aiuto per infowindow

    Grazie Alka , come vedi trasformo locations da php in array per js, prima non mi funzionava, creando un array in array funziona, non ho capito perchè,
    stasera al rientro provo a controllare, ho provato solo mettendo un alert dopo  la creazione della var contentString e mi elenca 7 elementi ma stampa solo l'ultimo. Non so se devo portare in array anche questa. 
    Mi sto sbattendo, ma il problema non capisco dove nasce.
    Vediamo cosa mi dirà il tasto 12 di Firefox developer. 
    Ti aggiorno in serata, grazie per ora.

  • Re: Google maps cerco un aiuto per infowindow

    Salve, dopo aver fatto altre prove seguendo i consigli di Alka sono nuovamente qui, sempre più sbalordito dal pessimo risultato, non riesco proprio ad uscirne!!  Dopo aver creato l'array, che come ha notato Alka è uno dentro l'altro ottengo questo risultato estrapolato dalla
    console 

    var locations = [
          
                                [
                           'Appartamento',
                           'immagini/ufficio.jpg',
                            40.723688497591,
                            8.561205504964734,
                           'Sassari'
      
                            ]  
                           ,                    [
                           'Appartamento',
                           'immagini/23004/foto103.jpg',
                            40.656371509346485,
                             8.6822149651401,
                           'codrongianos'
      
                            ]  
                           ,                    [
                           'Appartamento',
                           'immagini/23007/IMG70905.jpg',
                            40.6580582645566,
                             8.6810482549992,
                           'codrongianos'
      
                            ]  
                           ,                    [
                           'Appartamento',
                           'immagini/230018/IMG83908.jpg',
                            40.74279424641764,
                             8.672897419761327,
                           'osilo'
       
      
                            ]  
                                   ];
        questo è corretto, per tutti i 7 records i dati corrispondono.  Sulla mappa ho i 7 marker nella giusta posizione ma i dati e l'immagine sono quelli dell'ultimo indice , sembra che contentString non esca subito nel ciclo ma aspetti la fine e quindi tiene in memoria solo l'ultimo record.

    provo a ripostare il codice incriminato, non riesco ad uscirne da solo.
    Ringrazio in anticipo  chi puo darmi un aiuto a correggerlo.

    <script type="text/javascript">
         const punto = 'assets/icon/marker.png';
         var map;
         var Markers = {};
         var infowindow;
                       
        /*   locations è un array in array,  evito di splittare il primo dando una sorta di indice doppio */
        /*  questo mi evita di dover splittare poi i dati separati da virgola.  
        /*   locations[0][0]  contiene la tipologia  
        /*   locations[0][1]  contiene l'immagine
        /*   locations[0][2]  contiene la latitudine  
        */
       
         var locations = [
           
             <?php 
                  for($i=0;$i<sizeof($locations);$i++){ $j=$i+1;?>
                        [
                            '<?php echo $locations[$i]['tipologia'];?>',
                            '<?php echo $locations[$i]['foto'];?>',
                             <?php echo $locations[$i]['lat'];?>,
                             <?php echo $locations[$i]['lng'];?>,
                            '<?php echo $locations[$i]['localita'];?>'
       
                             ]  
                            <?php if($j!=sizeof($locations))echo ","; 
                  }
                  
              ?>
            ];
         
         
         var origin = new google.maps.LatLng(<?=$lat_centro.','.$lng_centro?>);     /*  info per uffio  */
            
         function initialize() {
              
                var mapOptions = {
                    zoom: 11,
                    center: origin,
                    map : map,
                 };
    
            map = new google.maps.Map(document.getElementById('map'), mapOptions);
    
           
            // ciclo per il numero di elementi nell array locations
     
        for(i=0; i<locations.length; i++) {
                
                var position = new google.maps.LatLng(locations[i][2], locations[i][3]);
                var marker = new google.maps.Marker({
                    position: position,
                    icon :punto,
                    zoom :10,
                    map: map,
                });
                  
                  
                 var contentString =
                    '<div class="card">' +
                    '<img class="card-img-top" src=" ' + locations[i][1] + '">' +
                    '<div class="info-content">' +
                    '<h2>' + locations[i][0] + '</h2>' +
                    '<h2>' + locations[i][4] + '</h2>' +
                    '<p> numero ind = '+ i + '</p><br><br>' + 
                    '</div>'+ 
                    '</div>';
            
            
            /* invece della console.log attivo alert per leggere meglio l'array creato da php a js  */
            /*   i dati sono tutti esatti ogni ciclo completa correttamente l'array
            /* 
               
               alert(locations[i][0] + 'n ' +         //* tipologia 
                      locations[i][1] + '\n' +         // immagine completa di percorso corretto 
                      locations[i][2] + '\n' +         // lat 
                      locations[i][3] + '\n' +         // lng
                      locations[i][4] + '\n' +         // localita
                       
        /*
                segnala 7 record completi con relativi dati esatti.
              ------------------------------------------------------  */
    
    
                infowindow = new google.maps.InfoWindow();
            
                google.maps.event.addListener(marker, 'click', (function(marker, i) {
                        return function() {
                            infowindow.setContent(contentString);
                            infowindow.setOptions({maxWidth: 280});
                            infowindow.open(map, marker);
                        }
                     }) (marker, i));
                 
             
          } /* ciclo for */
    
                   
                     
        }   /* fine function initilize */
    
        function locate(marker_id) {
            var myMarker = Markers[marker_id];
            var markerPosition = myMarker.getPosition();
            map.setCenter(markerPosition);
            google.maps.event.trigger(myMarker, 'click');
     
        }
    
          google.maps.event.addDomListener(window, 'load', initialize);
     
     </script>
  • Re: Google maps cerco un aiuto per infowindow

    RISOLTO, 
    sempre davanti agli occhi e non vederlo !! 

    google.maps.event.addListener(marker, 'click', (function(marker, i) {
                       return function() {
                           infowindow.setContent(locations[i]);     /*  QUI METTEVO contentString ed era effettivamente l'ultimo record letto. 
                           infowindow.setOptions({maxWidth: 280});
                           infowindow.open(map, marker);
                       }

    grazie comunque, rivolgersi al forum è sempre un'ottima cosa, se programmi da solo ti aiuta a ragionare, anche se magari non hai risposte ti aiuta a riflettere, ma sono sicuro che qualcuno prima poi mi avrebbe aiutato.

    Ciao ragazzi.

Devi accedere o registrarti per scrivere nel forum
4 risposte