Spanish (SOLUCIONADO)Duda tonta resetear ubicaciones

TheFalcon

Active Member
Licensed User
Longtime User
Buenas, termine la aplicación de google maps, pero me di cuenta una cosa, yo aparte de guardar ubicaciones, tengo un Botón que te guarda en una linea de SQL la ubicación de tu coche y te muestra un icono del coche.

Cuando vuelvo a guardar la ubicación del coche actualizo la que ya tengo, es decir siempre sobre escribo la que ya existía, cual es mi problema.

Si muestro todas las ubicaciones, digamos que me muestra que mi coche se guardo en Madrid, si luego voy a Sevilla y le digo guardar ubicación del coche, me añade la actual pero me deja en el mapa la de Madrid, e de cerrar el programa y abrirlo para que refresque,

E mirado y probado 5000 cosas y no consigo que cuando le de a guardar Ubicación del coche me resetee todas y me vuelva a cargar después de guardar la nueva.

Este codigo es el boton de guardar y mostrar el coche .
B4X:
sql1.ExecNonQuery("UPDATE coche set latitud ='"& latitud &"', longitud = '" & Longitud & "' WHERE id = 1")
    
Dim cursor1 As Cursor
Dim value As String = "1"

'saco los datos donde id = 1
cursor1 = sql1.ExecQuery("SELECT latitud,longitud FROM coche WHERE id='" & value & "'")
For i = 0 To cursor1.RowCount - 1
    cursor1.Position = i
Next
    

gmap.AddMarker3(cursor1.GetString("latitud"),cursor1.GetString("longitud"),"COCHE",LoadBitmap(File.DirAssets, "4X4.png"))

Con este boton muestro todas las Ubicaciones, y la del coche.

B4X:
Dim lstMarcadores As List
    Dim Unmarcador () As String

    lstMarcadores = DBUtils.ExecuteMemoryTable(Starter.sql, "SELECT * FROM coordenadas", Null,0) ' Asi coje todas las columnas de coordenadas y mete la 1º en (0) , la 2º en (1) , etc.

    
        For intMarcador = 0 To lstMarcadores.Size -1'Recorre cada elemento de la Lista
        Unmarcador = lstMarcadores.Get(intMarcador) 'Extrae un marcador de la Lista
        
        
        If intMarcador < "5" Then ' v.7.9   con esto hago que solo muestre el numero de ubicaciones que digo en la linea.
            
            
        'con esto añado todos los marcadores en el mapa. addmarker2 , me permite añadir el color de la chincheta
        Dim m1 As Marker = gmap.AddMarker2(Unmarcador(0), Unmarcador(1), Unmarcador(2), gmap.HUE_ORANGE)
        
        m1.Snippet = Unmarcador(3) ' con esto añado texto bajo el nombre de la chincheta, que lo guardo en la variable (3)
        
    
        Else
        
            
        End If
    Next


    
'----------------------------------------- ahora mostramos coche

'7.8
    'con esto volvemos a mostrar el coche en la ubicacion que guardamos .

    
    Dim cursor1 As Cursor
    Dim value As String = "1"

    'saco los datos donde id = 1
    cursor1 = sql1.ExecQuery("SELECT latitud,longitud FROM coche WHERE id='" & value & "'")
    For i = 0 To cursor1.RowCount - 1
        cursor1.Position = i
    Next
    
    gmap.AddMarker3(cursor1.GetString("latitud"),cursor1.GetString("longitud"),"COCHE",LoadBitmap(File.DirAssets, "4X4.png"))
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Perdona si no me he parado a mirar todo el código, yo empleo MarkerOptions por lo que llamo a un sub donde pinto todas las ubicaciones, asi que si las quiero resetear lo hago volviendo a llamar a este sub, ya que el inicio del código tengo esto:
B4X:
Dim MarkerOptions1 As MarkerOptions
MarkerOptions1.Initialize

De esta forma cada vez que lo llamo pinta bien.
Por otro lado tienes la opcion de visible

B4X:
MarkerOptions1.Visible = True

Saludos
 

TheFalcon

Active Member
Licensed User
Longtime User
Gracias por tu pronta respuesta como siempre Bgsoft, e pasado mi modo al que me comentas , y me ha costado menos de lo que pensaba, pero cada vez que le doy al botón me sigue poniendo un icono sin quitar le anterior. te pego solo el código del botón que muestra el icono

B4X:
'Con esto leemos la tabla y añadimos el dibujo del coche
Dim cursor1 As Cursor
Dim value As String = "1"

'saco los datos donde id = 1
cursor1 = sql1.ExecQuery("SELECT latitud,longitud FROM coche WHERE id='" & value & "'")
For i = 0 To cursor1.RowCount - 1
    cursor1.Position = i
Next

    
    
    
        'MODO 2 PARA PODER RESETEAR POSICIONES
        
        
        Dim BitmapDesctiptor1 As BitmapDescriptor
        Dim BitmapDescriptorFactory1 As BitmapDescriptorFactory
        BitmapDesctiptor1 = BitmapDescriptorFactory1.FromAsset("4x4.png")
    
    
        Dim GoogleMapsExtras1 As GoogleMapsExtras
        Dim MarkerOptions1 As MarkerOptions
        MarkerOptions1.Initialize
        
        MarkerOptions1.Position2(cursor1.GetString("latitud"),cursor1.GetString("longitud")).Snippet("").Title("Hello World").Visible(True)
        
        MarkerOptions1.Icon(BitmapDesctiptor1)
        MarkerOptions1.Anchor(0.5,0.5)
        Dim Marker1 As Marker=GoogleMapsExtras1.AddMarker(gmap, MarkerOptions1)
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola TheFalcon:

Quizas a mi me funciona por que vuelvo a inicializar el mapa :rolleyes: , supongo que lo inicializas asi:

B4X:
    If M_Fragment.IsGooglePlayServicesAvailable Then M_Fragment.Initialize("Map", MapPanel)

Y luego en el Map_Ready llamo a pintar los marcadores

B4X:
Sub Map_Ready
     
   Try
     GoogMaps = M_Fragment.GetMap
   Catch
     Log("Error inicializando el mapa GoogMaps = M_Fragment.GetMap")
   End Try
   
   'Si el mapa no se inicializa correctamente...
   If GoogMaps.IsInitialized = False Then
     ' error inicializando el mapa dar mensaje     
   Else
      ' el mapa se inicializa correctamente, cargo en él los marcadores       
   End If
  
End Sub

Saludos
 

TheFalcon

Active Member
Licensed User
Longtime User
Yo no uso Map_ready, ni Paneles, uso el modo del tutorial del Foro.

al arrancar la app incializo el GPS
B4X:
    If MapFragment1.IsGooglePlayServicesAvailable = False Then
        ToastMessageShow("Por Favor instala los Servicios de Google Play.", True)
    End If
   
    GPS.Initialize("GPS")

Luego uso el mapfragment_ready
B4X:
Sub MapFragment1_Ready
    gmap = MapFragment1.GetMap
 
    Dim JavaMapsObject As JavaObject
    JavaMapsObject = gmap.GetUiSettings
    JavaMapsObject.RunMethod("setMapToolbarEnabled", Array As Object(True))   

    Dim cp As CameraPosition
    cp.Initialize(40.416660 , -3.703770, 5) ' le pongo el kilometro cero de madrid, me da error si lodesactivo.
    
gmap.AnimateCamera(cp)

E intentado probar las lineas de tu código pero no me va, no se si es que han de sustituir lo que yo tengo o solo implementarlas.
 

Seneca

Active Member
Licensed User
Hola.

Yo tengo el caso de que he de dibujar en el mapa un grupo de marcadores. El usuario tiene seguidamente la posibilidad para establecer filtros de manera que solo vea determinados marcadores del grupo inicial. En ese caso lo que yo hago es retirar del mapa solo aquellos que el usuario ha elegido no ver.

Para poder hacer esto lo que hago es que conforme voy dibujando marcadores, los voy guardando en un Map. Para ello solo necesito asignar un código identificador a cada marcador. Esta identificación es la que luego me permite recuperar del Map los marcadores que me interesen y eliminarlos del mapa.


B4X:
Dim Marcadores As Map 'Map que guarda los marcadores a visualizar en el Mapa
Marcadores.Initialize
.......
.......
Dim m1 As Marker = gmap.AddMarker3(Lati, Longi, Nombre, LoadBitmap(File.DirAssets, subcategoria.icono))
Marcadores.Put(IDMarc,m1) 'Key = ID del marcador

.......
.......

'Para remover del mapa un marcador:

Dim marcador As Marker = Marcadores.Get(ID) 'ID = Identificador del marcador que quiero borrar
marcador.remove 'Borra el marcador del mapa
Marcadores.Remove(ID) 'Elimina el marcador del MAP

Esto es práctico para el caso de querer retirar determinados marcadores, no todos de golpe. Si lo que necesitas es borrarlos todos de golpe, seguramente habrá mejor soluciones, como la que te propone el compañero @bgsoft. Aún así, también puedes usar este método. Si optas por lo que te indico para borrar todos los marcadores de una vez, puedes guardarlos en un List en vez de en un Map, con la ventaja de que no has de añadir una clave de identificación a cada marcador guardado.

Para retirarlos del Mapa te bastaría con recorrer todo el List, recuperando cada marcador.

B4X:
Dim Marcadores As List 'Lista que guarda los marcadores a visualizar en el Mapa
Marcadores.Initialize
.......
.......
Dim m1 As Marker = gmap.AddMarker3(Lati, Longi, Nombre, LoadBitmap(File.DirAssets, subcategoria.icono))
Marcadores.Add(m1)

.......
.......

'Para borrar todos
For Each marcador As Marker In Marcadores
marcador.remove
Next

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
E intentado probar las lineas de tu código pero no me va, no se si es que han de sustituir lo que yo tengo o solo implementarlas.


Hola :

Tu Sub MapFragment1_Ready es el mismo que el mio Sub Map_Ready , pero con distinto nombre.

Una vez en ese sub llamo a cargar los marcadores, antes he cargado la matriz

B4X:
       Marcadores(0).Id = 0
       Marcadores(0).Cabecera = texto para la cabecera de la etiqueta
       Marcadores(0).Texto = Texto
       Marcadores(0).Lat = 41.nnnnnn
       Marcadores(0).Lng = 1.nnnnnnn
       Marcadores(0).NombreIcono = IconoMapas

Empleo una matriz asi:

B4X:
Sub Process_Globals
Type GMarker (Id As Int, Cabecera As String, Texto As String, Direccion As String,NombreIcono As String, Lng As Float, Lat As Float)
Public Marcadores(33) As GMarker

B4X:
         Dim MarkerOptions1 As MarkerOptions
         MarkerOptions1.Initialize
       
         Dim BitmapDescriptor1 As BitmapDescriptor
         Dim BitmapDescriptorFactory1 As BitmapDescriptorFactory
        
          Dim AndroidResources1 As AndroidResources
        Dim GIcon As ImageView
            GIcon.Initialize("")
            Dim object1 As Object
        Dim BitmapDrawable1 As BitmapDrawable
        object1=AndroidResources1.GetApplicationDrawable(Marcadores(n).NombreIcono)
        If object1=Null Then
           Log("Icono Mapas no encontrado: " & Marcadores(n).NombreIcono)
           GIcon.Bitmap=Null
        Else
           BitmapDrawable1=object1
           GIcon.Bitmap=BitmapDrawable1.Bitmap
        End If
                     
         BitmapDescriptor1 = BitmapDescriptorFactory1.FromBitmap(GIcon.Bitmap)
       
         MarkerOptions1.Icon(BitmapDescriptor1)        
         MarkerOptions1.Position2(Marcadores(n).Lat,Marcadores(n).Lng)
         ' para identificar que etiqueta pintar en el evento InfoWindowAdapter1
         MarkerOptions1.Title(n)
         Dim LTB As LatLng
         LTB.Initialize(Marcadores(n).Lat,Marcadores(n).Lng)
         LatLngBoundsBuilder1.Include(LTB)    

         Dim MyMarker As Marker=GoogleMapsExtras1.AddMarker(GoogMaps, MarkerOptions1)

Esta es mi solución, aunque Seneca te ha dado otra valida, espero que alguna de las dos te funcione.

Saludos
 

TheFalcon

Active Member
Licensed User
Longtime User
Solucionado, e probado los 2 modos, y me funciono con el de Seneca, el tuyo Bgsoft no consegui echarlo a andar, soy un poco torpe aun en B4 , pero me lo apunto para probarlo mas tranquilo. Creo que lo complejo de mi codigo es que yo Guardo las Ubicaciones en una Tabla y la Ubicacion del coche en otra distinta.
Y luego uso un boton para mostrar UBICACIONES + UBICACIón del coche y otro para GUARDAR y MOSTRAR la UBICACION DEL COCHE.

por si a alguien le vale pongo como lo finalize:

En process globals
B4X:
Dim Marcadores_4x4 As List 'Lista que guarda los marcadores a visualizar en el Mapa


Botón que Guarda el Coche en SQL y lo muestra al mismo tiempo.
B4X:
    For Each marcador As Marker In Marcadores_4x4
            marcador.remove
        Next
        'Aqui añadiria la ubicacion nueva.
        Dim m1 As Marker = gmap.AddMarker3(cursor1.GetString("latitud"),cursor1.GetString("longitud"),"COCHE",LoadBitmap(File.DirAssets, "4X4.png"))
        Marcadores_4x4.Add(m1)


Botón que muestra TODAS UBICACIONES + COCHE. meto el siguiente
B4X:
Dim m1 As Marker = gmap.AddMarker3(cursor1.GetString("latitud"),cursor1.GetString("longitud"),"COCHE",LoadBitmap(File.DirAssets, "4X4.png"))
    Marcadores_4x4.Add(m1

Mapfragment_ready inicializo los marcadores.
B4X:
Marcadores_4x4.Initialize


MUCHAS GRACIAS A TODOS . :D
 
Top