Spanish Geolocalización con Google Maps + GPS

Noize

Member
Licensed User
Longtime User
Hola coders,

Estoy intentando mostrar mi posición en un mapa de google, tengo la app donde el mapa se carga dentro de un panel, pero no consigo que muestre mi posición actual.

Tengo implementado el código de GPS y parece que funciona, pero tampoco estoy seguro de que esté cogiendo las coordenadas.

El mapa se muestra no da error, os paso el código por si alguien sabe que puede estar pasando , o que puedo estar olvidando , gracias de antemano.

B4X:
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>MAPA GOOGLE Y ZOOM<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Sub OnMyLocationChangeListener1_MyLocationChange(Location1 As Location)
    GoogleMapsExtras1.SetOnMyLocationChangeListener(goglgmap, OnMyLocationChangeListener1)
End Sub

Sub Map_Ready
    Log("mapa habilitado")
    goglgmap = mFragment.GetMap
    If goglgmap.IsInitialized = False Then
           ToastMessageShow("Error iniciando el mapa.", True)
    Else
           goglgmap.AddMarker(36, 15, "Hola!!!")    
           Log("Mapa funcionando")
           cp.Initialize(360, 150, goglgmap.CameraPosition.Zoom)
          goglgmap.AnimateCamera(cp)
    End If
End Sub

'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>GPS<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Sub GPS_LocationChanged (Location1 As Location)
    lblLat.Text = "Lat = " & Location1.ConvertToMinutes(Location1.Latitude)
    lblLon.Text = "Lon = " & Location1.ConvertToMinutes(Location1.Longitude)
    lblSpeed.Text = "Speed = " & Location1.Speed
End Sub

Sub GPS_UserEnabled (Enabled As Boolean)
    Log("GPS Habilitado")
End Sub

Sub GPS_GpsStatus (Satellites As List)
    lblSatellites.Text = "Satelites:" & CRLF
    For i = 0 To Satellites.Size - 1
        Dim Satellite As GPSSatellite
        Satellite = Satellites.Get(i)
        lblSatellites.Text = lblSatellites.Text & CRLF & Satellite.Prn & _
            " " & Satellite.Snr & " " & Satellite.UsedInFix & " " & Satellite.Azimuth _
            & " " & Satellite.Elevation
    Next
End Sub

Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        GPS1.Initialize("GPS")                                            ' Initialize GPS
        lblLon.Initialize("")
        lblLat.Initialize("")
        lblSpeed.Initialize("")
        lblSatellites.Initialize("")
    End If
    Activity.LoadLayout("main")                                            ' Carga la interfaz principal
    Activity.AddMenuItem("Mostrar/Ocultar Paneles", "ToggleTabs")        ' Crea el menu para tabs
    Dim height As Int = CalculateHeight(True, True)
    vpViewPager.Initialize("vp", 3, 100%x, height)
    Activity.AddView(vpViewPager.AsView, 0, 0, 100%x, height)             'load the pages layouts
    vpViewPager.Panels(0).LoadLayout("pnlPage1")
    vpViewPager.Panels(1).LoadLayout("pnlPage2")
    vpViewPager.Panels(2).LoadLayout("pnlPage3")
    stdbar.Initialize("bar")
    stdbar.NavigationMode = stdbar.NAVIGATION_MODE_TABS
    stdbar.AddTab("Principal").Tag = pnlPage1
    stdbar.AddTab("Petfriends").Tag = pnlPage2
    stdbar.AddTab("Social").Tag = pnlPage3
    stdbar.ShowUpIndicator = True
    stdbar.SelectedIndex = intcurrentPage
    Activity.Title = "Petpopular"
    stdbar.Subtitle = "Find your petfriends easy"
    OnMyLocationChangeListener1.Initialize("OnMyLocationChangeListener1")
    If mFragment.IsGooglePlayServicesAvailable = False Then
        ToastMessageShow("Google Play services not available.", True)
    Else
          mFragment.Initialize("Map", pnlPage2)
       End If
End Sub

Sub Activity_Resume
    If GPS1.GPSEnabled = False Then
        ToastMessageShow("Por favor habilite el GPS para una mejor localización.", True)
        StartActivity(GPS1.LocationSettingsIntent)             'Will open the relevant settings screen.
    Else
        GPS1.Start(0, 0)                                     'Listen to GPS with no filters.
    End If
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    GPS1.Stop
    intcurrentPage = stdbar.SelectedIndex
End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Noize

Para poder ver tu posición en el mapa tienes que crear un marcador.
Si la versión del SDK es menor de tres (API 11-) tendras que emplear el WebView como contenedor del mapa, y si es versión superior a 2.3 (API 11+) puedes emplear la libreria de GoogleMap.

Te pongo un ejemplo rapìdo Versiones de Android superiores a 2.3 - API 11+ (usando la librería GoogleMap)
B4X:
  Dim Marcadores(1) As GMarker
  Marcadores(0).Id = 1
  Marcadores(0).Name = "Nombre del marcador"
  Marcadores(0).Lat = 41.38640
  Marcadores(0).Lng = 1.931530


  Dim GoogleMapsExtras1 As GoogleMapsExtras
  Dim MapFragment1 As MapFragment
  Dim GoogleMap1 As GoogleMap

  Dim MarkerOptions1 As MarkerOptions
  MarkerOptions1.Initialize
  Dim BitmapDescriptor1 As BitmapDescriptor
  Dim BitmapDescriptorFactory1 As BitmapDescriptorFactory

  BitmapDescriptor1=BitmapDescriptorFactory1.FromAsset("icono.png") ' tu icono

  ' si quieres poner el globo típico naranja descomenta la linea de abajo y comenta la de arriba
  'BitmapDescriptor1=BitmapDescriptorFactory1.DefaultMarker2(BitmapDescriptorFactory1.HUE_ORANGE)

  MarkerOptions1.Icon(BitmapDescriptor1)
  MarkerOptions1.Position2(Marcadores(0).Lat, Marcadores(0).Lng)
  MarkerOptions1.Title("Mi Marcador: " & Marcadores(n).Id & " " & Marcadores(n).Name) ' ejemplo del texto, el Id es por si empleas mas de un marcador para saber cual es

  MarkerOptions1.Snippet("Segunda linea de comentarios")
  MarkerOptions1.visible(True)
  Dim MyMarker As Marker=GoogleMapsExtras1.AddMarker(GoogMaps, MarkerOptions1)

Saludos
 

Noize

Member
Licensed User
Longtime User
Gracias #bgsoft lo probaré, lo que pasa es que, si mi posición cambia, entonces cuando abra la app se irá a unas coordenadas concretas y no a la posición que tengo actualmente, con este código estoy consiguiendo esto, pero ahora el problema que tengo es que al detectar mi posición, no amplía el zoom, se te ocurre a que puede ser debido?

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
        Dim LastMapCenter As LatLng
    Dim LastMapZoom As Int
End Sub

Sub Globals
    Dim mFragment As MapFragment                            ' Variable para gmaps
       Dim goglgmap As GoogleMap                               
    Dim cp As CameraPosition
    Dim OnMyLocationChangeListener1 As OnMyLocationChangeListener
    GoogleMapsExtras1.SetOnMyLocationChangeListener(goglgmap, OnMyLocationChangeListener1)
    Dim GoogleMapsExtras1 As GoogleMapsExtras
    Dim r As Reflector
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("main")   
    LastMapCenter.Initialize(40.6443475,2.6305006)
        LastMapZoom=0
    End If
    OnMyLocationChangeListener1.Initialize("OnMyLocationChangeListener1")   
    Activity.AddMenuItem("Mostrar/Ocultar Paneles", "ToggleTabs")        ' Crea el menu para tabs
    If mFragment.IsGooglePlayServicesAvailable = False Then
        ToastMessageShow("Google Play services not available.", True)
    Else
        mFragment.Initialize("Map", pnlPage2)
    End If
End Sub

Sub Activity_Resume
    If GPS1.GPSEnabled = False Then
        ToastMessageShow("Por favor habilite el GPS para una mejor localización.", True)
        StartActivity(GPS1.LocationSettingsIntent)             'Will open the relevant settings screen.
    Else
        GPS1.Start(0, 0)                                     'Listen to GPS with no filters.
    End If
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    LastMapCenter=mFragment.GetMap.CameraPosition.Target
    LastMapZoom=mFragment.GetMap.CameraPosition.Zoom
End Sub

B4X:
Sub Map_Ready
    Log("mapa habilitado")
    goglgmap = mFragment.GetMap
    Dim LatLngBoundsBuilder1 As LatLngBoundsBuilder
    LatLngBoundsBuilder1.Initialize
    If goglgmap.IsInitialized = False Then
           ToastMessageShow("Error iniciando el mapa.", True)
    Else
        goglgmap.MapType=goglgmap.MAP_TYPE_HYBRID
        Dim GoogleMapsExtras1 As GoogleMapsExtras
        Dim CameraPosition1 As CameraPosition
        CameraPosition1.Initialize(LastMapCenter.Latitude, LastMapCenter.Longitude, LastMapZoom)
        goglgmap.MyLocationEnabled=True
        goglgmap.GetUiSettings.CompassEnabled=True
        goglgmap.AnimateCamera(CameraPosition1)
        goglgmap.MoveCamera(CameraPosition1)
    End If
End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

el problema que tengo es que al detectar mi posición, no amplía el zoom, se te ocurre a que puede ser debido?

En las nuevas actualizaciones de KitKat, he comprobado que si no tienes activada la Ubicación (antes llamado GPS) no hace zoom, raro, pero es asi, tengo un dispositivo que no lo habia actualizado y funcionaba, y en otro actualizado si no activaba la Ubicación no hacia zoom, será otra política de seguridad de Google? :D .
Hasta que me di cuenta de que la App funcionaba y que era esto, perdi un montón de horas mirando por que no hacia zoom, y suerte de tener otro dispositivo sin actualizar y al probar la App y ver que funcionaba por ahi me dio la pista.

Por otro lado veo que inicializas el Zoom con 0 (cero)
B4X:
Sub Activity_Create(FirstTime AsBoolean)
 Activity.LoadLayout("main") 
 LastMapCenter.Initialize(40.6443475,2.6305006)
 LastMapZoom=0

y luego en el Map_Ready lo pones:

B4X:
CameraPosition1.Initialize(LastMapCenter.Latitude, LastMapCenter.Longitude, LastMapZoom)

Si lo pones a 0 está claro que no te hará zoom. Dale un valor cualquiera, por ejemplo 20, y prueba.

Saludos
 

Cristhiam Silva

Member
Licensed User
Longtime User
buen dia, mira ya me muestra muy bien el mapa, pero al darle zoom ejemplo de 20, queda descentrado, no queda centrado el punto en la ventana se descuadra, como poder hacer que el punto quede centrado en la ventana ?
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Cristhian

Supongamos que has nombrado esto asi:

B4X:
Dim lm As LocationManager

Y que después donde pones los puntos has puesto esto:

B4X:
lm.Initialize("EventoAlMoverMapa")
lm.requestMobileLocation

Luego pon esto en el Evento:
B4X:
Sub EventoAlMoverMapa_LocationChanged (Longitude As Double, Latitude As Double, Altitude As Double, Accuracy As Float, Bearing As Float, Provider As String, Speed As Float, Time As Long) 

CameraPosition1.Initialize(Latitude,Longitude,NivelZoomMapa)
GoogMaps.AnimateCamera(CameraPosition1)

Saludos
 

Cristhiam Silva

Member
Licensed User
Longtime User
Disculpa BgSoft, podrias ayudarme, necesito saber como hacer para que al darle click en un mapa con libreria GoogleMaps, conocer la direccion de la ubicación, no ubicar un marcador, sino conocer la direccion del lugar donde doy click dentro del mapa
 

Heppy

Active Member
Licensed User
Longtime User

Cristhiam Silva

Member
Licensed User
Longtime User
Buen dia BgSoft, estoy tratando de ingresar un punto en mi mapa y me genera un error, me puedes dar una luz, para saber que puede ser.

Dim GoogleMapsExtras1 As GoogleMapsExtras
Dim MarkerOptions1 As MarkerOptions
Dim BitmapDescriptor1 As BitmapDescriptor
Dim BitmapDescriptorFactory1 As BitmapDescriptorFactory
Dim MyMarker As Marker

iMarcaId = 1
sMarcaName = "Casa"
sMarcaLat = "3.985780"
sMarcaLng = "-73.758260"

MarkerOptions1.Initialize

BitmapDescriptor1=BitmapDescriptorFactory1.FromAsset("icono.png") ' tu icono

MarkerOptions1.Icon(BitmapDescriptor1)
MarkerOptions1.Position2(sMarcaLat, sMarcaLng)

'ejemplo del texto, el Id es por si empleas mas de un marcador para saber cual es
MarkerOptions1.Title("Mi Marcador: " & iMarcaId & " " & sMarcaName)
MarkerOptions1.Snippet("Segunda linea de comentarios")

MarkerOptions1.visible(True)

goglgmap = mFragment.GetMap
MyMarker = GoogleMapsExtras1.AddMarker(goglgmap, MarkerOptions1)
 

Cristhiam Silva

Member
Licensed User
Longtime User
BgSoft,El error dice:

java.lang.NullPointerException
at com.google.k.a.cl.a(Unknown Source)
at com.google.maps.api.android.lib6.c.dc.<init>(Unknown Source)
at com.google.maps.api.android.lib6.c.db.a(Unknown Source)
at com.google.maps.api.android.lib6.c.aj.<init>(Unknown Source)
at com.google.maps.api.android.lib6.c.al.a(Unknown Source)
at com.google.maps.api.android.lib6.c.el.a(Unknown Source)
at com.google.android.gms.maps.internal.l.onTransact(SourceFile:167)
at android.os.Binder.transact(Binder.java:347)
at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addMarker(Unknown Source)
at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source)
at uk.co.martinpearman.b4a.googlemapsextras.GoogleMapsExtras.AddMarker(GoogleMapsExtras.java:48)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:636)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:302)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:238)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:121)
at anywheresoftware.b4a.BA$3.run(BA.java:320)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:177)
at android.app.ActivityThread.main(ActivityThread.java:5493)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1225)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1041)
at dalvik.system.NativeStart.main(Native Method)
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Cristhiam

A mi el error me suena tanto a chino como a ti :D , pero las coordenadas pásalas a Float y seguro que te irá, no puedes pasarlas como un string.

Y cuando definas GMarker (Type GMarker (Id As Int, etc) hazlo como Float

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola de nuevo Cristhiam

necesito saber como hacer para que al darle click en un mapa con libreria GoogleMaps, conocer la direccion de la ubicación, no ubicar un marcador, sino conocer la direccion del lugar donde doy click dentro del mapa

Se me olvidó responder a tu anterior pregunta sobre el click en el mapa

B4X:
  Dim OnMyLocationButtonClick1 As OnMyLocationButtonClickListener
  OnMyLocationButtonClick1.Initialize("BotonGoogleMap")

  If OnMyLocationButtonClick1.IsInitialized Then
    GoogleMapsExtras1.SetOnMyLocationButtonClickListener(GoogMaps,OnMyLocationButtonClick1)
  Else   
      Log("OnMyLocationButtonClick no inicializada")
  End If

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User

Heppy

Active Member
Licensed User
Longtime User
Gracias bgsoft, el tema está añadido hace un tiempo.

Estoy liado de narices hace unas semanas y me he desconectado bastante del foro, aunque entro para ir actualizando el post.

Y por din un tiempecito de vacaciones.
 
Top