Problema con marcadores y adjuntar direccion

amigos tengo un problema, estoy coocando unos marcadores traidos de la base d edatos con google maps,

tambien quiero q a su vez en el tooltip me coloque la direccion de cada uno, si coloco el geocoder solo me muestra un marcador, el ultimo y con la ultima direccion en el tooltip, si se lo quito me coloca los 3 marcadores, no se q es lo q pasa




<div id="mapholder"></div>

<script src="http://maps.google.com/maps/api/js?sensor=false"></script>

<script type="text/javascript">


function cargarmap(){

    

    navigator.geolocation.getCurrentPosition(showPosition,showError);

    function showPosition(position){

        mapholder=document.getElementById('mapholder')

        mapholder.style.height='500px';

        mapholder.style.width='900px';

        latlon=new google.maps.LatLng(7.122980000000001, -73.12817999999999);

        

        var marcadores= <?php echo json_encode($model->ListaUbicaciones);  ?>;

        var myOptions={

        center:latlon,

        zoom:15,

        mapTypeId:google.maps.MapTypeId.ROADMAP,

        mapTypeControl:false,

        disableDoubleClickZoom:false,

        navigationControlOptions:{style:google.maps.NavigationControlStyle.SMALL}

        };

        var map=new google.maps.Map(document.getElementById("mapholder"),myOptions);

        var marker,i;

        var geocoder = new google.maps.Geocoder();

        var titulo;

        for( i=0;i<marcadores.length;i++)

        {

            

            lat=marcadores[i][0];

            lon=marcadores[i][1];

            latlon=new google.maps.LatLng(lat, lon);

            

            geocoder.geocode({'latLng': latlon},  function (results, status) {

                

                if (status == google.maps.GeocoderStatus.OK) {

                    

                    if (results[1]) {

                        var map=new google.maps.Map(document.getElementById("mapholder"),myOptions);

                        marker=new google.maps.Marker({position:new google.maps.LatLng(lat,lon),map:map,title:results[0].formatted_address});

                        marker.setMap(map);

                        

                    }

                } else {

                    alert("Geocoder failed due to: " + status);

                }

            });

            

        }

}

      

        function showError(error){

            switch(error.code){

                case error.PERMISSION_DENIED:

                  x.innerHTML="Denegada la peticion de Geolocalización en el navegador."

                  break;

                case error.POSITION_UNAVAILABLE:

                  x.innerHTML="La información de la localización no esta disponible."

                  break;

                case error.TIMEOUT:

                  x.innerHTML="El tiempo de petición ha expirado."

                  break;

                case error.UNKNOWN_ERROR:

                  x.innerHTML="Ha ocurrido un error desconocido."

                  break;

        }

    }   

}  

</script>

si yo coloco un alert con la variable ‘lat’ antes dle geocoder me muestra todas las coordenadas, si lo coloco dentro del geocoder solo me muestra la ultima, no se porq ocurre, gracias

Buenas.

Y si comentas esto, anda.




...

if (results[1]) {

//var map=new google.maps.Map(document.getElementById("mapholder"),myOptions);

marker=new google.maps.Marker({position:new google.maps.LatLng(lat,lon),map:map,title:results[0].formatted_address});

marker.setMap(map);

}


...



Es q no le veo mucho sentido que vuelvas a declarar un nuevo mapa que ya tienes cargado en la página y con el mismo id!!!! Cada vez que creas un mapa con el mismo id, cascas el anterior, por eso sólo te sale el último.

El problema en mi opinión es que te cargas el mapa al completo, no tiene que ver con coordenadas.

Un saludo.

amigo nada q soy capaz, pero tengo este problema tengo esta consulta q lo q hace es traerme de la tabla ubicacionLideres la ultima ubicacion guardada, esto se hace por fecha, entonces mi search esta asi:


public function search()

	{

            $criteria=new CDbCriteria;

            //aca traemos la relacion tercero con usuarios

            $criteria->with = array('idUsuario.idTercero');

            //alias tabla ubicacionLideres

            $criteria->alias='t1';

            $criteria->select=array('t1.id_ubicacion','t1.id_usuario','t1.latitud','t1.longitud','t2.fecha');

            //inner join con la misma para sacar la ultima fecha de cada ubicacion

            $criteria->join='inner join(

                            SELECT id_ubicacion,id_usuario, MAX(fecha) AS fecha

                            FROM ubicacion_lideres

                            GROUP BY id_usuario

                            ) t2  ON T1.id_usuario= t2.id_usuario

                            AND t1.fecha = t2.fecha';

            $criteria->compare('t2.fecha',$this->fecha,true);

            $criteria->compare('idTercero.nombre',$this->nombre,true);


            return new CActiveDataProvider($this, array(

                            'criteria'=>$criteria,

            ));

	}

Este Search lo utilizo en en mi vista ‘admin’ donde muestro los resultados en un cGridview y al dar click en alguna fila me muestre en el mapa su ubicacion, esto lo realiza bien, pero necesito ahora mostrarlos todas las ultimas ubicaciones en el mapa a la vez, tenia esto en el modelo


 public function getListaUbicaciones(){


        $ubicaciones =  UbicacionLideres::model()->findAll();

        $lista = array();

        foreach($ubicaciones as $v)

            $lista[] = array($v->latitud, $v->longitud);

          

        return $lista;

    }  

pero me muestra es todos mas no las ultimas ubicaciones guardadas (es decir si un usuario guardo 10 veces en el dia la ubicacion, necesito es la ultima), lo que quisiera es como encapsular el seach en mi funcion getListaUbicaciones pero no se como, gracias

Buenas.

Tendrías que darme más datos.

¿Cuál es la estructura de la tabla en donde guardas las coordenadas?

Una de 2:

  • O guardas la fecha con la hora en el momento de insertar coordenadas, con lo cual en la consulta debes coger sólo los datos de las fechas mayores agrupando los registros.

  • O añades a tu tabla un campo llamado por ejemplo ‘ultima’ que indique la última ubicación.

Un saludo.

vale voy a comentar lo q quiero hacer, tengo unas tablas,

tercero donde guardo los nombres de los usuarios (id_tercero,documento,nombre…)

usuarios donde guardo los usuarios del sistema (id_usuario,user,password,id_tercero) relacionada con tercero, para luego traer el nombre y mostrarlo en pantalla

ubicacion_liderdonde voy guardando la ubicacion de la persona cada vez q entre a la aplicacion o de click en un boton, eso lo estoy definiendo todavia, porq es para ver como es el funcionamiento en un dispositivo movil, la idea es q lo haga cada vez q abra la aplicacion sin q la persona se de cuenta, pero ps como hasta ahora lo estoy haciendo, todavia no e hecho pruebas de si se puede cuando la abra o toca obligatoriamente colocar un boton. (id_ubicacion,id_usuario,latitud,longitud,fecha) la fecha se guarda con hora

asi es la estructura de las tablas(la de terceros es mas campos pero nos interesa solo esos para no entrar en detalle)

entonces la idea es registrar el tercero, luego guardar usuarios, despues cuando el usuario haga login, entre a UbicacionLideres y guarde automaticamente o dando en el boton(cuando se defina como podria ser mejor) la ubicacion de donde este la persona y la fecha/hora, si el usuario vuelve a entrar ps guarda de nuevo la ubicacion, fecha/hora.

Luego en otra pesataña deseo mostrar la ubicacion de los usuarios de dos formas:

  1. Un cgridview con todos los usuarios y su ultima fecha/hora y ubicacion,para al dar click en una fila del usuario q quiero ver, me muestre en el mapa en donde estuvo.

  2. En un mapa grande me muestre todos los usuarios,salgan todos los marcadores y aca es donde no se q podria ser mejor

*Al dar click en el marcador salga un infodWinwows donde muestre nombre, direccion donde estuvo y fecha.

*Salgan los marcadores con los infowindow abiertos, pero se veria como feo.

*Mostrar los marcadores y al lado del mapa una lista con los nombres, de manera q al dar click en uno me abra el infowindow con la informacion.

Modelo


<?php

class UbicacionLideres extends CActiveRecord

{

        public $nombre;

    

	public function tableName()

	{

		return 'ubicacion_lideres';

	}


        public function rules()

	{

		return array(

			array('id_usuario, latitud, longitud, fecha', 'required'),

			array('id_usuario', 'numerical', 'integerOnly'=>true),

			array('latitud, longitud', 'numerical'),

			array('id_ubicacion, id_usuario,nombre latitud, longitud, fecha', 'safe', 'on'=>'search'),

		);

	}


        public function relations()

	{

		return array(

			'idUsuario' => array(self::BELONGS_TO, 'Usuarios', 'id_usuario'),

		);

	}


	public function attributeLabels()

	{

		return array(

			'id_ubicacion' => 'Id Ubicacion',

			'id_usuario' => 'Id Usuario',

			'latitud' => 'Latitud',

			'longitud' => 'Longitud',

			'fecha' => 'Fecha',

                        'nombre'=>'nombre',

		);

	}


	public function search()

	{

            $criteria=new CDbCriteria;

            //aca traemos la relacion tercero con usuarios

            $criteria->with = array('idUsuario.idTercero');

            //alias tabla ubicacionLideres

            $criteria->alias='t1';

            $criteria->select=array('t1.id_ubicacion','t1.id_usuario','t1.latitud','t1.longitud','t2.fecha');

            //inner join con la misma para sacar la ultima fecha de cada ubicacion

            $criteria->join='inner join(

                            SELECT id_ubicacion,id_usuario, MAX(fecha) AS fecha

                            FROM ubicacion_lideres

                            GROUP BY id_usuario

                            ) t2  ON T1.id_usuario= t2.id_usuario

                            AND t1.fecha = t2.fecha';

            $criteria->compare('t2.fecha',$this->fecha,true);

            $criteria->compare('idTercero.nombre',$this->nombre,true);


            return new CActiveDataProvider($this, array(

                            'criteria'=>$criteria,

            ));

	}


//funcion para recoger todas las ubicaciones de los lideres

    public function getListaUbicaciones()

    {

//aca es donde quiero tomar la lista de todas las ultimas ubicaciones

//para mostrar en el mapa grande, todos los marcadores

        $ubicaciones =  UbicacionLideres::model()->findAll();

        $lista = array();

        foreach($ubicaciones as $v)

            $lista[] = array($v->latitud, $v->longitud,$v->id_usuario);

        return $lista;

    } 

    

    public static function model($className=__CLASS__)

    {

        return parent::model($className);

    }

}



Controlador, solo coloco las dos acciones q modifique, el resto es como lo arroja el gii


public function actionCreate()

	{

            $model=new UbicacionLideres;

            $model->id_usuario=Yii::app()->user->id;

            date_default_timezone_set('America/Bogota');

            $model->fecha= date("Y-m-d h:i:s");

            if(isset($_POST['UbicacionLideres']))

                {

                     $model->attributes=$_POST['UbicacionLideres'];

                    if($model->save())  

                        $this->redirect(array('admin'));

                    else

                        Yii::app()->end();

                }

                $this->render('create',array(

                    'model'=>$model,

                ));

	}

        

        public function actionPrueba()

	{

           

                  echo $_POST['latitud'];


	}

//aca cree en la vista un php llamado view para mostrar el mapa grande del q hablo q lleva todos los marcadores

public function actionIndex()

	{

            

                $model=new UbicacionLideres('search');

		$model->unsetAttributes();  // clear any default values

		if(isset($_GET['UbicacionLideres']))

			$model->attributes=$_GET['UbicacionLideres'];


		$this->render('view',array(

			'model'=>$model,

		



Vistas admin, donde muestro el cgridView con el listado para mostrar mapa individual


<?php

$this->breadcrumbs=array(

	'Ubicacion Lideres'=>array('admin'),

);

$this->menu=array(

	array('label'=>'Mirar todos los Lideres', 'url'=>array('index')),

);


?>

<h1>Ultima Ubicacion Lideres</h1>


<?php $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'ubicacion-lideres-grid',

	'dataProvider'=>$model->search(),

	'filter'=>$model,

	'columns'=>array(

            array(

                   'name'=>'id_usuario', 

                   'header'=>'Nombre del Lider',

                   'value'=>'$data->idUsuario->idTercero->nombre',

                   'htmlOptions'=>array('style'=>'width:400px;'),

                   'filter' => CHtml::activeTextField($model,'nombre'),

		),

            array(

            'name'=>'fecha',

            'filter' => false, // para que no se muestre el campo de filtrar para el atributo direccion

            ),

            array(

                'header' => '',

                'type' => 'raw',

                'value' => 'CHtml::link("Ver Ubicacion", null, array("onclick" => "javascript:cargarmap($data->id_ubicacion, \"$data->latitud\", \"$data->longitud\")", "class" => "btn"))',

                'htmlOptions' => array('style'=>'cursor: pointer;','width'=>'75px')

        ),

		

)));?>


<div id="mapholder"></div>

<script src="http://maps.google.com/maps/api/js?sensor=false"></script>

<script type="text/javascript">

function cargarmap(id_ubicacion,latitud,longitud){

    

    navigator.geolocation.getCurrentPosition(showPosition,showError);

    function showPosition(position){

        lat=latitud;

        lon=longitud;

        latlon=new google.maps.LatLng(lat, lon)

        mapholder=document.getElementById('mapholder')

        mapholder.style.height='500px';

        mapholder.style.width='900px';

        var myOptions={

            center:latlon,zoom:17,

            mapTypeId:google.maps.MapTypeId.ROADMAP,

            mapTypeControl:false,

            disableDoubleClickZoom:false,

            navigationControlOptions:{style:google.maps.NavigationControlStyle.SMALL}

        };

        var geocoder = new google.maps.Geocoder();

        geocoder.geocode({ 'latLng': latlon },function(results, status) {

            if (status == google.maps.GeocoderStatus.OK) {

                if (results[1]) {

                    var map=new google.maps.Map(document.getElementById("mapholder"),myOptions);

                    var marker=new google.maps.Marker({position:latlon,map:map,title:results[0].formatted_address});

                }

            }else {

                alert("Geocoder failed due to: " + status);

                }       

            });

        }

        function showError(error){

            switch(error.code){

                case error.PERMISSION_DENIED:

                  x.innerHTML="Denegada la peticion de Geolocalización en el navegador."

                  break;

                case error.POSITION_UNAVAILABLE:

                  x.innerHTML="La información de la localización no esta disponible."

                  break;

                case error.TIMEOUT:

                  x.innerHTML="El tiempo de petición ha expirado."

                  break;

                case error.UNKNOWN_ERROR:

                  x.innerHTML="Ha ocurrido un error desconocido."

                  break;

        }

    }   

}  

</script>

vista _form es donde el usuario debe entrar y guardar la ubicacion automaticamente o dando en el boton guardar


<div class="form">

  

<?php   $form=$this->beginWidget('CActiveForm', array(

	'id'=>'ubicacion-lideres-form',

	'enableAjaxValidation'=>true,

));  ?>

	<p class="note">Fields with <span class="required">*</span> are required.</p>


	<?php echo $form->errorSummary($model); ?>


	<div class="row">

		<?php echo $form->labelEx($model,'id_usuario'); ?>

		<?php echo $form->textField($model,'id_usuario',array('visible'=>'true')); ?>

		<?php echo $form->error($model,'id_usuario'); ?>

	</div>


        <div class="row">

            

		<?php echo $form->labelEx($model,'latitud'); ?>

		<?php echo $form->textField($model,'latitud',array('id'=>'latitud')); ?>

		<?php echo $form->error($model,'latitud'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'longitud'); ?>

		<?php echo $form->textField($model,'longitud',array('id'=>'longitud')); ?>

		<?php echo $form->error($model,'longitud'); ?>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'fecha'); ?>

		<?php echo $form->textField($model,'fecha'); ?>

		<?php echo $form->error($model,'fecha'); ?>

	</div>


	<div class="row buttons">

		<?php echo CHtml::submitButton($model->isNewRecord ? 'Guardar' : 'Guardar',array('id'=>'guardar')); ?>

	</div>


<?php $this->endWidget(); ?>


</div><!-- form -->

<div id='ubicacion'></div>

<script type="text/javascript">

    if (navigator.geolocation) {

        navigator.geolocation.getCurrentPosition(mostrarUbicacion);

    }else {alert("¡Error! Este navegador no soporta la Geolocalización.");}

    function mostrarUbicacion(position) {

        var latitud = position.coords.latitude;

	var longitud = position.coords.longitude;

        var exactitud = position.coords.accuracy;	

        $('#latitud').val(latitud); 

        $('#longitud').val(longitud);

        //$('#longitud').hide();

    }

    function refrescarUbicacion() {	

	navigator.geolocation.watchPosition(mostrarUbicacion);

        //$('#guardar').click();

    }

        //setInterval("refrescarUbicacion()",4000);

</script>

vista view es donde estoy perdido por ahora,


<?php

$this->breadcrumbs=array(

	'Ubicacion Lideres'=>array('admin'),

);

?>


<h1>Ultima Ubicacion Todos los Lideres</h1>

<div id="mapholder"></div>

<script src="http://maps.google.com/maps/api/js?sensor=false"></script>

<script type="text/javascript">


 cargarmap();


function cargarmap(){

            

    navigator.geolocation.getCurrentPosition(showPosition,showError);

    function showPosition(position){

        mapholder=document.getElementById('mapholder')

        mapholder.style.height='500px';

        mapholder.style.width='900px';

        latlon=new google.maps.LatLng(7.122980000000001, -73.12817999999999);

        var marcadores= <?php echo json_encode($model->ListaUbicaciones);  ?>;

        var myOptions={

        center:latlon,

        zoom:15,

        mapTypeId:google.maps.MapTypeId.ROADMAP,

        mapTypeControl:false,

        disableDoubleClickZoom:false,

        navigationControlOptions:{style:google.maps.NavigationControlStyle.SMALL}

        };

        var map=new google.maps.Map(document.getElementById("mapholder"),myOptions);

        var marker,i;

        var geocoder = new google.maps.Geocoder();

        var titulo;

        for( i=0;i<marcadores.length;i++)

        {

            

            lat=marcadores[i][0];

            lon=marcadores[i][1];

            latlon=new google.maps.LatLng(lat, lon);

            marker=new google.maps.Marker({position:new google.maps.LatLng(lat,lon),map:map});

            marker.setMap(map);

            var infowindow = new google.maps.InfoWindow({

                content: 'lathola'});

              

var usuario;

usuario= marcadores[i][2];

(function(marker, latlon,usuario){  

    google.maps.event.addListener(marker, 'click', function() {

        geocoder.geocode({'latLng': latlon},  function (results, status) {

            if (status == google.maps.GeocoderStatus.OK) {

                if (results[1]) {

                    infowindow.setContent('Lider: '+usuario+', ' +results[0].formatted_address);

                    infowindow.open(map, marker);

                }

            } else {

                alert("Problema al encontrar la dirección: " + status);

            }

        });

    });

})(marker,latlon,usuario);

               /*geocoder.geocode({'latLng': latlon},  function (results, status) {

                

                if (status == google.maps.GeocoderStatus.OK) {

                    

                    if (results[1]) {

                      //  var map=new google.maps.Map(document.getElementById("mapholder"),myOptions);

                        marker=new google.maps.Marker({position:new google.maps.LatLng(lat,lon),map:map,title:results[0].formatted_address});

                        marker.setMap(map);

                    }

                } else {

                    alert("Geocoder failed due to: " + status);

                }

                   

            });*/

        }

} 

        function showError(error){

            switch(error.code){

                case error.PERMISSION_DENIED:

                  x.innerHTML="Denegada la peticion de Geolocalización en el navegador."

                  break;

                case error.POSITION_UNAVAILABLE:

                  x.innerHTML="La información de la localización no esta disponible."

                  break;

                case error.TIMEOUT:

                  x.innerHTML="El tiempo de petición ha expirado."

                  break;

                case error.UNKNOWN_ERROR:

                  x.innerHTML="Ha ocurrido un error desconocido."

                  break;

        }

    }   

}  

</script>

espero haberme hecho entender, un poco largo pero aca explico todo el proceso :)

esta es la imagen donde me toma la ubicacion de los usuarios con fecha/hora cuando ingresan, en la version final no deberia aparecer nada, solo el boton si hay q hacerlo asi o un mensaje de guardado exitosamente si se llega hacer automaticamente

6425

imagen3.png

en esta imagen es donde muestro la ultima ubicacion de cada persona al dar click en el link

6423

imagen1.png

en esta ultima imagen es donde se deben mostrar todos los marcadores, aca es donde estoy perdido pues necesito q me muestre la ultima ubicacion como en el cgridview de la imagen anterior q solo hay 2 usuarios, aca le hice fue findAll entonces me sale de los 2 usuarios las veces q guardo la ubicacion,cuando deberian salir solo 2 marcadores con la ultima ubicacion de cada uno, y al dar click en el marcador me sale es el id de usuario porq no se como sacar el nombre, ni la fecha, gracias6424

imagen2.png

alguien q sepa?