Ver Mensaje Individual
  #12 (permalink)  
Antiguo 03/07/2013, 16:30
carlosuc99
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 10 meses
Puntos: 5
Exclamación Respuesta: Google maps y for PHP

Cita:
Iniciado por quinqui Ver Mensaje
Mmh, ahora que veo con calma tu código, la verdad es que nunca trabajé esta api de esa forma, por eso no resulta muy compatible lo que te digo yo ahora con lo que tú tienes... Pero en fin, igual se puede.

Dices que con los markers no tienes problemas, o sea, que se muestran en el mapa, cierto? Ahora bien, se me ocurre que, e insisto, debes trabajar tanto markers como polylines en arrays javascript.

Me explico. Cuando recorres el ciclo que declara los markers, efectivamente los estás generando uno a uno y a medida que los declaras, aparecen en el mapa, por lo que cuando usas la misma variable javascript para generar otro, no hay peligro que pise los anteriores, porque ya están agregados al mapa, no?

Sin embargo, no ocurre lo mismo con las polylines, ya que no las estás mostrando a medida que las generas, sino que las dejas asociadas al evento click de cada marker. Pero como no hay ningún marker en memoria javascript (salvo el último del ciclo), pues las polilíneas sólo se asocian al último marker. Por eso, te digo trabajar con arrays, porque así la polilínea en la posición 10 va a estar asociada al marker de la posición 10, y así, etc.

En el código de mi último post, sólo tendrías que declarar el array de markers antes del ciclo donde imprimes los mismos.
Código PHP:
// declaras el array de markers javascript
var markers = new Array();
<?php  
// con php llenas este array en el ciclo for
?>

// declaras el array de lineas javascript
var polylines = new Array();
<?php  
// con php llenas este array en el ciclo for
?>
La verdad, es que siguiendo el curso de tu código, en vez de hacer una consulta para obtener las polilíneas, mejor recorres de nuevo el arreglo de markers (o sea, lo generas en javascript, pero también puedes dejar tu copia de seguridad en php en el mismo ciclo), y entonces, por cada marker haces efectivamente la consulta de su polilínea (porque creo que de hecho algo así haces, no?); de este modo, estás seguro que la posición en el array siempre va a ser la correspondiente.

Saludos!
Que va, aquí el error viene de antes los marker tampoco funcionan. Realmente si solo hay una entrada en la tabla si. Pero como haya dos solo muestra la primera.

Llego a este código:

Código PHP:
Ver original
  1. <?php
  2. include('db_login.php');
  3.      
  4.       $connection = mysql_connect($db_host, $db_username, $db_password);
  5.       if (!$connection){
  6.       die ("Eror connecting database: <br/>". mysql_error());
  7.       }
  8.    
  9.       $db_select = mysql_select_db($db_database);
  10.       if (!$db_select){
  11.       die ("Database Error: <br/>". mysql_error());
  12.       }
  13.  
  14. $query = mysql_query("SELECT * FROM routes");
  15.  
  16. ?>
  17. <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
  18. <style type="text/css">
  19.   html { height: 100% }
  20.   body { height: 100%; margin: 0px; padding: 0px }
  21.   #map_canvas { height: 100% }
  22. </style>
  23. <script type="text/javascript"
  24.     src="http://maps.google.com/maps/api/js?sensor=false&amp;language=es">
  25. </script>
  26. <script type="text/javascript">
  27.  
  28.  
  29. window.onload = function () {
  30.   var options = {
  31.     zoom: 5,
  32.     center: new google.maps.LatLng(40.84706, -2.944336),
  33.     mapTypeId: google.maps.MapTypeId.ROADMAP
  34.   };
  35.  
  36.   map = new google.maps.Map(document.getElementById('map_canvas'), options);
  37.   var markers   = new Array();
  38.   var infowindow2   = new Array();
  39.   var PolyLines = new Array();
  40.  
  41.   <?php
  42.         for($i = 0; $i < mysql_num_rows($query); $i++){
  43.             $icao = mysql_result($query, $i, 'from');
  44.             $query = mysql_query("SELECT * FROM airports WHERE icao='$icao'");
  45.             $latitude = mysql_result($query, 0, 'latitude');
  46.             $longitude = mysql_result($query, 0, 'longitude');
  47.             $city = mysql_result($query, 0, 'city');
  48.         ?>
  49.   var Airport1 = '<h3 align="center" style="font-family:Arial, Helvetica, sans-serif"><?php echo $icao; ?> - <?php echo $city; ?></h3>';
  50.   var image = 'http://i46.tinypic.com/33zbm09.png';
  51.   var latLonCenter = new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>);
  52.   marker = new google.maps.Marker({
  53.     position: latLonCenter,
  54.     map: map,
  55.     draggable: false,
  56.     icon: image,
  57.     title: '<?php echo $icao; ?> - <?php echo $city; ?>',
  58.     Airport1: Airport1
  59.   });
  60.  
  61.     markers[<?php print $i; ?>] = marker;
  62.    
  63.     var infowindow = new google.maps.InfoWindow({
  64.     content: Airport1
  65.     });
  66.  
  67.  
  68.     google.maps.event.addListener(marker, 'click', function () {
  69.       var n = 1;
  70.       var infowindow = new google.maps.InfoWindow({
  71.         content: "",
  72.         maxWidth: 320,  
  73.         zIndex: n
  74.       });
  75.      
  76.       infowindow[2<?php print $i; ?>] = infowindow;
  77.      
  78.       infowindow2[<?php print $i; ?>].setContent(this.Airport1);
  79.       infowindow2[<?php print $i; ?>].setZIndex(n++);  // superpone el último infowindows
  80.       infowindow2[<?php print $i; ?>].open(map, this);
  81.     });
  82.    
  83.     <?php
  84.     $query = mysql_query("SELECT * FROM routes WHERE from='$icao'");
  85.    
  86.    
  87.     for($i = 0; $i < mysql_num_rows($query); $i++){
  88.     $destination = mysql_result($query, $i, 'to');
  89.     $query = mysql_query("SELECT * FROM airports WHERE icao='$destiantion'");
  90.     $latitudeD = mysql_result($query, 0, 'latitude');
  91.     $longitudeD = mysql_result($query, 0, 'longitude');
  92.     ?>
  93.    
  94.     var linea = new google.maps.Polyline({
  95.         strokeColor: "#FF0000",
  96.         strokeOpacity: 2.0,
  97.         strokeWeight: 2
  98.     });
  99.  
  100.     PolyLines[<?php print $i; ?>] = linea;
  101.  
  102.     var polyCords = [
  103.     new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>),
  104.     new google.maps.LatLng(<?php echo $latitudeD; ?>, <?php echo $longitudeD; ?>)
  105.     ];
  106.    
  107.  
  108.     google.maps.event.addListener(marker, 'click', function() {
  109.  
  110.  
  111.     PolyLines[<?php print $i; ?>].setPath(polyCords);
  112.  
  113.     PolyLines[<?php print $i; ?>].setMap(map);
  114.     });
  115.  
  116. <?php } } ?>
  117.  
  118.  
  119.  
  120. }
  121. </script>
  122.   </head>
  123.  
  124.   <body>
  125.     <center><div id="map_canvas" style="width:850px; height:560px;"></div></center>
  126.   </body>

El problema de este código es que directamente solo me muestra el marker de la primera entrada de la tabla y que no me muestra el infowindow de ninguna. Además las polyline siguen igual.