Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Google maps y for PHP

Estas en el tema de Google maps y for PHP en el foro de PHP en Foros del Web. Buenas, Vuelvo a las andadas. Despues de un tiempo sin errores me encuentro con esto: este es mi código: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original ...
  #1 (permalink)  
Antiguo 03/07/2013, 11:34
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 10 meses
Puntos: 5
Exclamación Google maps y for PHP

Buenas,

Vuelvo a las andadas. Despues de un tiempo sin errores me encuentro con esto:

este es mi código:

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

Lo que pasa es que no me muestra las polilyne . Al pulsar en el marker que se abra una red de polylines hacia otros marker. Los marker se muestran sin problemas pero al pulsar en ellos los polylines no aparecen.

La idea es hacer algo como este mapa: http://www.ibe-va.com/index.php?opti...mid=90&lang=en
  #2 (permalink)  
Antiguo 03/07/2013, 11:43
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Google maps y for PHP

Holas, carlosuc99.

¿Esta consulta no debiera ir en Javascript? Parece más una duda sobre el uso de la API de Google Maps que sobre PHP...

Como sea, ¿has intentado probar generar las polylines desde un inicio? Me refiero a si en verdad están las líneas ahí, ocultas, o tal vez no hay nada, y por eso al hacer click efectivamente no muestra nada. Me entró la duda cuando vi tu query, donde dice "WHERE icao='$destiantion'", siendo que la variable es $destination...

Saludos!
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #3 (permalink)  
Antiguo 03/07/2013, 11:50
 
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
Holas, carlosuc99.

¿Esta consulta no debiera ir en Javascript? Parece más una duda sobre el uso de la API de Google Maps que sobre PHP...

Como sea, ¿has intentado probar generar las polylines desde un inicio? Me refiero a si en verdad están las líneas ahí, ocultas, o tal vez no hay nada, y por eso al hacer click efectivamente no muestra nada. Me entró la duda cuando vi tu query, donde dice "WHERE icao='$destiantion'", siendo que la variable es $destination...

Saludos!
Gracias por el error de la variable pero no es eso. El tema es el for. Si lo pongo sin el for, todo OK. Pero con el for para que me ponga todo lo de la DB nada. Así que por eso lo pongo aquí y no en JS.
  #4 (permalink)  
Antiguo 03/07/2013, 13:03
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Google maps y for PHP

Mmh... será entonces que estás pisando el objeto polyline javascript por cada iteración del ciclo php? En javascript, declara una variable tipo Array(), y luego, en el ciclo php, agrega a ese array un nuevo elemento, que será tu objeto polyline, por cada iteración del ciclo :o Lo mismo con cualquier otra cosa que deba ser única.

Saludos!
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #5 (permalink)  
Antiguo 03/07/2013, 14:12
 
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... será entonces que estás pisando el objeto polyline javascript por cada iteración del ciclo php? En javascript, declara una variable tipo Array(), y luego, en el ciclo php, agrega a ese array un nuevo elemento, que será tu objeto polyline, por cada iteración del ciclo :o Lo mismo con cualquier otra cosa que deba ser única.

Saludos!
Ok, pero se puede declarar en Javascript y luego con el PHP añadirle contendio?? Lo que puedo hacer es declaralo en PHP pero antes del bucle y en el bucle añadirle el contenido. Pero luego como el añado el Polilyne? Que partes del polyline?? Luego dónde reproduzco ese array?? Porque si lo reproduzco fuera del bucle tengo que saber el número exacto de objetos y eso es algo que no se.

Si tienes un código de ejemplo te lo agradezco.
  #6 (permalink)  
Antiguo 03/07/2013, 14:17
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Google maps y for PHP

Yo te sugiero que primero construyas la fuente de datos y te concentres en resolver el problema únicamente con Javascript.

Con PHP sólo debes crear una estructura iterable y luego pasarla a Javascript usando json_encode(), así únicamente te dedicas a procesar dicha estructura que en Javascript es nativa.

Código PHP:
Ver original
  1. <?php
  2. $datos = array();
  3.  
  4. while (/* ... */) {
  5.   $datos []= array(/* ... */);
  6. }
  7. ?>
  8.  
  9. <script>var datos = <?php echo json_encode($datos); ?>;
  10. console.log(datos);</script>

Combinar ambos lenguajes para producir el Javascript correspondiente es complejo si no dominas ambos lenguajes, y ese es tu principal problema.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 03/07/2013, 14:28
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 10 meses
Puntos: 5
Respuesta: Google maps y for PHP

Cita:
Iniciado por pateketrueke Ver Mensaje
Yo te sugiero que primero construyas la fuente de datos y te concentres en resolver el problema únicamente con Javascript.

Con PHP sólo debes crear una estructura iterable y luego pasarla a Javascript usando json_encode(), así únicamente te dedicas a procesar dicha estructura que en Javascript es nativa.

Código PHP:
Ver original
  1. <?php
  2. $datos = array();
  3.  
  4. while (/* ... */) {
  5.   $datos []= array(/* ... */);
  6. }
  7. ?>
  8.  
  9. <script>var datos = <?php echo json_encode($datos); ?>;
  10. console.log(datos);</script>

Combinar ambos lenguajes para producir el Javascript correspondiente es complejo si no dominas ambos lenguajes, y ese es tu principal problema.
Ummm, interesante.

Lo que no entiendo es el contenido del array. Se supone que es lo que genera la polyline, pero todo??? Habría que poner todo esto:

Código Javascript:
Ver original
  1. var PolyLine = new google.maps.Polyline({
  2.         strokeColor: "#FF0000",
  3.         strokeOpacity: 2.0,
  4.         strokeWeight: 2
  5.     });
  6.  
  7.     var polyCords = [
  8.     new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>),
  9.     new google.maps.LatLng(<?php echo $latitudeD; ?>, <?php echo $longitudeD; ?>)
  10.     ];
  11.    
  12.  
  13.     google.maps.event.addListener(marker, 'click', function() {
  14.  
  15.  
  16.     PolyLine.setPath(polyCords);
  17.  
  18.     PolyLine.setMap(map);
  19.     });

Me da a mi que no. Y luego si los datos los proceso fuera del bucle se verá todo??

PD: Esto último es una estupidez mía. Claro que si los procesas fuera se verán porque va todo en el array.
  #8 (permalink)  
Antiguo 03/07/2013, 14:43
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Google maps y for PHP

Observa bien el fragmento de código que requiere los datos:
Cita:
new google.maps.LatLng(lat, lng)
Ahora, suponiendo que ya tienes un array así:
Código Javascript:
Ver original
  1. var coords = [{ lat: 123, lng: 456 }, { lat: 789, lng: 654 }];
  2.  
  3. var poly = [];
  4.  
  5. for (var i in coords) {
  6.   var d = coords[i];
  7.   poly.push(new google.maps.LatLng(d.lat, d.lng));
  8. }

Eso debería proveer la funcionalidad que necesitas, sin embargo, necesitas crear tu estructura de datos para que así sea.

Código PHP:
Ver original
  1. $datos = array();
  2.  
  3. while (/* ... */) {
  4.   $datos []= array('lat' => $x, 'lng' => $y);
  5. }

Pero vuelvo a lo mismo, si no dominas ambos lenguajes mezclarlos de cualquier modo es demasiado oscuro y por ende no comprendes lo que debes hacer.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 03/07/2013, 14:54
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Google maps y for PHP

Estoy confundida, porque como dice pateketrueke, parece que todavía no tienes muy claro cómo trabajar con los lenguajes combinados, aunque en tu código pareciera que sí lo tienes claro... Como sea, la idea en realidad es sencilla: lo que hacemos es escribir código javascript, pero en vez de hacerlo a mano, lo hacemos con php: no es que php entre a trabajar con javascript, sino que nos ayuda a automizar el llenado de las variables que usaremos en javascript.

Acá te dejo un ejemplo, basado en tu código, para que veas la lógica que te señalé en mi primer post:
Código PHP:
// en javascript, debes declarar arreglos javascript para almacenar tus lineas y puntos del mapa
var markers   = new Array();
var PolyLines = new Array();

<?php
// con php, obtienes los datos de coordenadas
$query mysql_query("SELECT * FROM routes WHERE from='$icao'");

// acá recorres los datos con php      
for ($i 0$i mysql_num_rows($query); $i++)
{
  
$destination mysql_result($query$i'to');
  
$query mysql_query("SELECT * FROM airports WHERE icao='$destiantion'");
  
$latitudeD mysql_result($query0'latitude');
  
$longitudeD mysql_result($query0'longitude');
  
?>
  
  // en javascript, imprimes el código que corresponde a la creación de cada línea del mapa:
  // en vez de hacerlo en una misma línea todo el tiempo, lo debes hacer en un elemento
  // del array javascript:
  var linea = new google.maps.Polyline({
        strokeColor: "#FF0000",
        strokeOpacity: 2.0,
        strokeWeight: 2
    });
 
  PolyLines[<?php print $i?>] = linea;

  google.maps.event.addListener(markers[<?php print $i?>], 'click', function() 
  {
    PolyLines[<?php print $i?>].setPath(polyCords);
    PolyLines[<?php print $i?>].setMap(map);
  });

 <?php
}
?>
Ahora bien, cuando trabajas con la API de Google Maps, si vas a tener muchos puntos y datos en el mapa, se recomienda trabajar con XML, de modo que con php, en vez de escribir el código javascript directo, lo que haces es llenar un XML con los datos que el mapa puede entender (tiene sus propias tags y todo, lo ves en la referencia de la API), y luego con javascript creas un par de funciones que permitan leer este XML y traducirlo en el mapa.

Saludos!
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #10 (permalink)  
Antiguo 03/07/2013, 15:13
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 10 meses
Puntos: 5
Respuesta: Google maps y for PHP

@quinqui Gracias, pero no funciona. Fijate "marker" no lo puedes pasar a markers porque es algo que ya viene de arriba. Se genera de manera parecida, pero este al contrario no da ningún problema. Falta la var polyCords donde se generan las cordenadas para hacer la línea, lo puse así:

Código Javascript:
Ver original
  1. var poly = [
  2.     new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>),
  3.     new google.maps.LatLng(<?php echo $latitudeD; ?>, <?php echo $longitudeD; ?>)
  4.     ];
  5.    
  6.     polyCords[<?php print $i; ?>] = poly;

Pero nada, sigue sin funcionar.
  #11 (permalink)  
Antiguo 03/07/2013, 15:48
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Google maps y for PHP

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!
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #12 (permalink)  
Antiguo 03/07/2013, 16:30
 
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.
  #13 (permalink)  
Antiguo 03/07/2013, 16:52
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Google maps y for PHP

Entonces sí era lo que te decía yo. Está bien trabajar todo en arrays, pero valida que todos tengan el índice correspondiente.

Te sugiero que, en tu nuevo código, cambies esto:
Código PHP:
marker = new google.maps.Marker({
    position: latLonCenter,
    map: map,
    draggable: false,
    icon: image,
    title: '<?php echo $icao?> - <?php echo $city?>',
    Airport1: Airport1
  });
 
  markers[<?php print $i?>] = marker;
Por esto:
Código PHP:
markers[<?php print $i?>] = new google.maps.Marker({
    position: latLonCenter,
    map: map,
    draggable: false,
    icon: image,
    title: '<?php echo $icao?> - <?php echo $city?>',
    Airport1: Airport1
  });
Ya que reviendo el código, me parece ahora innecesario esa asignación, si se puede hacer del principio, teniendo bien definido el índice en el array (el $i php).

Mi duda, ahora, es si al crear el nuevo objeto tipo marker de google maps, ¿estás efectivamente mostrándolo en el mapa? Yo recordaba que luego de crear el objeto había que asociarlo al objeto mapa, en algo como esto (favor obviar errores de sintaxis, que es sólo como referencia):
Código javascript:
Ver original
  1. // * esto no es código googlemaps, es sólo ejemplo de la lógica en cuestión *
  2. var miMapa = new mapaGoogle(bla bla bla);
  3. var miMarker = new markerGoogle(bla bla bla);
  4. miMapa.add(miMarker);
Como no alcanzo a ver algo así en tu código, pues lo pregunto (igual lo estoy viendo por encimita no más).

Saludos!
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #14 (permalink)  
Antiguo 04/07/2013, 04:18
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 10 meses
Puntos: 5
Exclamación Respuesta: Google maps y for PHP

Creo que he descubierto algo importante. Yo aseguraría que esto me funcionaba, por lo menos hasta las infowindow en otro proyecto. Rebusqué el archivo y vi que la única diferencia entre los dos era el query. Fijaos esto funciona:

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. $query = mysql_query("SELECT * FROM airports2");
  14.  
  15. ?>
  16.     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
  17. <style type="text/css">
  18.   html { height: 100% }
  19.   body { height: 100%; margin: 0px; padding: 0px }
  20.   #map_canvas { height: 100% }
  21. </style>
  22. <script type="text/javascript"
  23.     src="http://maps.google.com/maps/api/js?sensor=false&amp;language=es">
  24. </script>
  25. <script type="text/javascript">
  26.  
  27.  
  28. window.onload = function () {
  29.   var options = {
  30.     zoom: 5,
  31.     center: new google.maps.LatLng(40.84706, -2.944336),
  32.     mapTypeId: google.maps.MapTypeId.ROADMAP
  33.   };
  34.  
  35.   map = new google.maps.Map(document.getElementById('map_canvas'), options);
  36.  
  37.  
  38.   <?php
  39.         for($i = 0; $i < mysql_num_rows($query); $i++){
  40.             $icao = mysql_result($query, $i, 'icao');
  41.             $lat = mysql_result($query, $i, 'latitude');
  42.             $lon = mysql_result($query, $i, 'longitude');
  43.             $city = mysql_result($query, $i, 'city');
  44.         ?>
  45.   var image = 'http://mapicons.nicolasmollet.com/wp-content/uploads/mapicons/shape-default/color-d22328/shapecolor-color/shadow-1/border-dark/symbolstyle-white/symbolshadowstyle-dark/gradient-no/airport.png';
  46.   var latLonCenter = new google.maps.LatLng(<?php echo $lat; ?>, <?php echo $lon; ?>);
  47.   var Airport1 = '<h3 align="center" style="font-family:Arial, Helvetica, sans-serif"><?php echo $icao; ?> - <?php echo $city; ?></h3>';
  48.   marker = new google.maps.Marker({
  49.     position: latLonCenter,
  50.     map: map,
  51.     draggable: false,
  52.     icon: image,
  53.     title: '<?php echo $icao; ?> - <?php echo $city; ?>',
  54.     Airport1: Airport1
  55.   });
  56.  
  57.     var infowindow = new google.maps.InfoWindow({
  58.     content: Airport1
  59.     });
  60.  
  61.  
  62.     google.maps.event.addListener(marker, 'click', function () {
  63.       var n = 1;
  64.       var infowindow = new google.maps.InfoWindow({
  65.         content: '<h3 align="center" style="font-family:Arial, Helvetica, sans-serif"><?php echo $icao; ?> - <?php echo $city; ?></h3>',
  66.         maxWidth: 320,  //Ancho de ventana infowindows en px
  67.         zIndex: n // para que el último infowindows se superponga
  68.       });
  69.      
  70.       infowindow.setContent(this.Airport1);
  71.       infowindow.setZIndex(n++);  // superpone el último infowindows
  72.       infowindow.open(map, this);
  73.     });
  74.  
  75. <?php } ?>
  76.  
  77. }
  78. </script>
  79.   </head>
  80.  
  81.   <body>
  82.     <center><div id="map_canvas" style="width:650px; height:360px;"></div></center>
  83.   </body>

Pero si uso el query de este proyecto:

Código PHP:
Ver original
  1. $query = mysql_query("SELECT * FROM routes");
  2. //Codigo que no varia y ...
  3. //Comienza el for y a continuación:
  4. $icao = mysql_result($query, $i, 'from');
  5.             $query = mysql_query("SELECT * FROM airports WHERE icao='$icao'");
  6.             $latitude = mysql_result($query, 0, 'latitude');
  7.             $longitude = mysql_result($query, 0, 'longitude');
  8.             $city = mysql_result($query, 0, 'city');

La diferencia es clara. En el primero obtengo todos los datos de una tabla y en la segunda cojo un dato de una y me busco más información de este dato en otra.

Pues bien, en el primero todo OK, pero en el segundo sólo se me muestra la primera entrada en la tabla. POR QUÉ?????

PD: He hecho una prueba. Puse un echo al final del for para ver cual era el último icao que cogía y para mi sorpresa solo coge el primero. Así que no llega al segundo por eso no lo muestra. Puede que no repita el for, pero es algo que no entiendo. Por qué la primera funciona y la segunda no??

PD II:Soy estúpido????? El error está claro dos querys con el mismo nombre. Voy a ver si con esto se solucionan las polylines.

Última edición por carlosuc99; 04/07/2013 a las 04:33
  #15 (permalink)  
Antiguo 04/07/2013, 05:13
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 10 meses
Puntos: 5
Respuesta: Google maps y for PHP

Vale, las polylines de momento no funcionan pero se la causa o una de las causas.

Fijaos en el query del segundo for:

Código PHP:
Ver original
  1. $query5 = mysql_query("SELECT * FROM routes WHERE from='$icao'");

Originalmente se llamaba $query pero lo cambié por los problemas que daba.

Ese query no funciona. Puedo buscarlo de cualquier manera menos donde WHERE from o to. Con esas dos columnas siempre falla el query. Lo puedo buscar por flight... y no fallará. Pero por from o to que son las que me hacen falta falla.

Os dejo una exportacion MySQL de la tabla:

Código:
-- phpMyAdmin SQL Dump
-- version 3.5.8.1
-- http://www.phpmyadmin.net
--
-- Host: 10.246.16.183:3306
-- Generation Time: Jul 04, 2013 at 11:16 AM
-- Server version: 5.1.66-0+squeeze1
-- PHP Version: 5.3.3-7+squeeze15

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Database: `americanairline`
--

-- --------------------------------------------------------

--
-- Table structure for table `routes`
--

CREATE TABLE IF NOT EXISTS `routes` (
  `route_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `flight` varchar(7) NOT NULL,
  `from` varchar(4) NOT NULL,
  `to` varchar(4) NOT NULL,
  `alternative` varchar(4) DEFAULT NULL,
  `etd` varchar(4) DEFAULT NULL,
  `eta` varchar(4) DEFAULT NULL,
  `fleettype_id` int(10) DEFAULT NULL,
  `pax` int(11) DEFAULT NULL,
  `price` int(11) DEFAULT NULL,
  `flproute` varchar(500) NOT NULL,
  `comments` varchar(500) DEFAULT NULL,
  `booked` tinyint(4) NOT NULL,
  `cargo` varchar(10) NOT NULL,
  `fuel` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`route_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=31 ;

--
-- Dumping data for table `routes`
--

INSERT INTO `routes` (`route_id`, `flight`, `from`, `to`, `alternative`, `etd`, `eta`, `fleettype_id`, `pax`, `price`, `flproute`, `comments`, `booked`, `cargo`, `fuel`) VALUES
(29, 'AAL1123', 'LEVX', 'KLAX', NULL, NULL, NULL, NULL, NULL, NULL, '', '', 0, '', 0),
(30, 'ALL1236', 'KLAX', 'LEMD', NULL, NULL, NULL, NULL, NULL, NULL, '', '', 0, '', 0);
PD: Si le hago
Código PHP:
Ver original
  1. echo mysql_num_rows($query5);
y esta en from o to. No da resultado y si esta en otro te dará como mínimo 0. De la otra manera no pone nada.
  #16 (permalink)  
Antiguo 04/07/2013, 06:58
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Google maps y for PHP

¿Tienes un campo llamado from? Uhm, cuando nombras tablas y campos con palabras reservadas de lenguaje, tienes que invocarlos entrecomillados. Algo así:

Código sql:
Ver original
  1. SELECT * FROM routes WHERE `from` = '$icao'

Ojalá sea ese no más el error, así podrás avanzar :)
Saludos!
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #17 (permalink)  
Antiguo 04/07/2013, 07:50
 
Fecha de Ingreso: junio-2011
Mensajes: 342
Antigüedad: 12 años, 10 meses
Puntos: 5
Exclamación Respuesta: Google maps y for PHP

Bueno, bueno... Muchas gracias a todos!!! Especialmente a @quinqui por su incondicional ayuda.

Ya lo he arragleda. Parte de los problemas eran los query. Pero las polyline tampoco estaban bien. Al tener el mismo nombre sólo quedaba la última polyline para el último marker así que les he dado un nombre único. No me ha hecho falta dárselos mediante un array. Si no que simplemente les añadí el contenido de una variable.

Este es el código final de mi mapa:

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.  
  38.  
  39.   <?php
  40.         for($i = 0; $i < mysql_num_rows($query); $i++){
  41.             $icao = mysql_result($query, $i, 'from');
  42.             $query2 = mysql_query("SELECT * FROM airports WHERE icao='$icao'");
  43.             $latitude = mysql_result($query2, 0, 'latitude');
  44.             $longitude = mysql_result($query2, 0, 'longitude');
  45.             $city = mysql_result($query2, 0, 'city');
  46.         ?>
  47.   var Airport1 = '<h3 align="center" style="font-family:Arial, Helvetica, sans-serif"><?php echo $icao; ?> - <?php echo $city; ?></h3>';
  48.   var image = 'http://i46.tinypic.com/33zbm09.png';
  49.   var latLonCenter = new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>);
  50.   marker<?php echo $icao; ?> = new google.maps.Marker({
  51.     position: latLonCenter,
  52.     map: map,
  53.     draggable: false,
  54.     icon: image,
  55.     title: '<?php echo $icao; ?> - <?php echo $city; ?>',
  56.     Airport1: Airport1
  57.   });
  58.  
  59.     var infowindow<?php echo $icao; ?> = new google.maps.InfoWindow({
  60.     content: Airport1
  61.     });
  62.    
  63.     <?php
  64.     $query4 = mysql_query("SELECT * FROM routes WHERE `from`='$icao'");
  65.    
  66.    
  67.     for($y = 0; $y < mysql_num_rows($query4); $y++){
  68.     $destination = mysql_result($query4, $y, 'to');
  69.     $query5 = mysql_query("SELECT * FROM airports WHERE icao='$destination'");
  70.     $latitude_destination = mysql_result($query5, 0, 'latitude');
  71.     $longitude_destination = mysql_result($query5, 0, 'longitude');
  72.     ?>
  73.    
  74.     var PolyLine<?php echo $destination;?> = new google.maps.Polyline({
  75.         strokeColor: "#FF0000",
  76.         strokeOpacity: 2.0,
  77.         strokeWeight: 2
  78.     });
  79.  
  80.     var polyCords<?php echo $destination;?> = [
  81.     new google.maps.LatLng(<?php echo $latitude; ?>, <?php echo $longitude; ?>),
  82.     new google.maps.LatLng(<?php echo $latitude_destination; ?>, <?php echo $longitude_destination; ?>)
  83.     ];
  84.    
  85.  
  86.     google.maps.event.addListener(marker<?php echo $icao; ?>, 'click', function() {
  87.     <?php for($z = 0; $z < mysql_num_rows($query); $z++){
  88.     $destination_delete = mysql_result($query, $z, 'to');?>
  89.    
  90.     PolyLine<?php echo $destination_delete;?>.setMap(null);
  91.    
  92.     <?php } ?>
  93.  
  94.     PolyLine<?php echo $destination;?>.setPath(polyCords<?php echo $destination;?>);
  95.  
  96.     PolyLine<?php echo $destination;?>.setMap(map);
  97.     });
  98.    
  99.     google.maps.event.addListener(marker<?php echo $icao; ?>, 'click', function () {
  100.       var n = 1;
  101.       var infowindow<?php echo $icao; ?> = new google.maps.InfoWindow({
  102.         content: "",
  103.         maxWidth: 320,  
  104.         zIndex: n
  105.       });
  106.      
  107.       infowindow<?php echo $icao; ?>.setContent(this.Airport1);
  108.       infowindow<?php echo $icao; ?>.setZIndex(n++);
  109.       infowindow<?php echo $icao; ?>.open(map, marker<?php echo $icao; ?>);
  110.     });
  111.  
  112. <?php } } ?>
  113.  
  114.  
  115.  
  116. }
  117. </script>
  118. </head>  
  119. <body>
  120. <center><div id="map_canvas" style="width:850px; height:560px;"></div></center>
  121. </body>
  #18 (permalink)  
Antiguo 04/07/2013, 08:10
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Respuesta: Google maps y for PHP

Ah, pues perfecto! Efectivamente, siendo php el que escribe el código JS, pues no tenía que ser necesariamente un array, sino también variables independientes. Qué bueno que te haya resultado, cuando trabajé con esta api me divertí muchísimo, aunque fue hace muchos años ^^...........

Saludos!
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*

Etiquetas: google, html, maps, mysql, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:00.