Spanish [SOLUCIONADO] Duda marcas maps

TheFalcon

Active Member
Licensed User
Longtime User
Buenas, ya conseguí que me funcionara googlemaps. ahora tengo una duda, e conseguido obtener y guardar las coordenadas en un documento de texto por si quiero usarlas mas tardes, etc pero tengo 2 dudas.

1º Conforme me abre el mapa dentro de casa y pongo centrar, me dice donde estoy , pero coordenadas me marca 0. Ahora salgo de casa y me dice las coordenadas correctas, si el mapa al abrirse sabe donde estoy por que no me da coordenadas? y si no, como podría obtener la coordenada de ubicación actual en el mapa aunque no haya sincronizado los satelites.

2º E estado mirando algunos post en ingles de posición en el mapa creo
B4X:
      Point1.Initialize(52.756, 0.400)
      Points.Add(Point1)
supongo que eso es para mostrar una ubicación en el mapa, pero no encuentro un tutorial aunque sea en ingles que lo explique, agradecería si alguien lo tiene ubicado, me pusiera el enlace. si es en español mejor, mi idea " " La cual no se si es la correcta"" , es guardar Latitud, longitud, y un titulo en un TXT, y luego recogerlos y mostrarlo en el mapa, el texto seria el titulo de la chincheta.

UN saludo
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

Si quieres que siempre te de ubicacion, con LocationManager tienes que te puede dar la localización tanto por gps como por triangulación de wifi, gprs, gsm... y es muy precisa, y lo mejor es que si estas en un edificio cubierto vas a tener ubicación por que la cogerá como te he dicho del resto que no es gps

Con respecto a lo de posicionar, la libreria Googlesmaps tiene una clase que se llama LatLng , con esta clase al inicializarla puedes decirle que Latitud y Longitud quieres


Saludos
 

TheFalcon

Active Member
Licensed User
Longtime User
gracias , voy a probar lo de latlng a ver que tal va y comento. Supongo que eso me vale para cargar ubicaciones guardadas
 

TheFalcon

Active Member
Licensed User
Longtime User
mas o menos mirando algun post estoy probando y no me da, algo hago mal.
Yo estoy probando a lo sencillo 1º es decir a mano meto las coordenadas y en un boton le doy para que vaya a esas coordenadas.

declaro esta variable
B4X:
Dim coordenada As LatLng

luego en un botón meto el siguiente código, pero no me hace nada, no se si lo planteo bien

B4X:
Dim milat As Double
    Dim milong As Double
   
    milat = 36.69274218
    milong = -4.45530604
    coordenada.Initialize(milat,milong)

Las variables double probé también a declararlas como String, y las coordenadas a meterlas entre Comillas

no obstante seguiré probando
 

TheFalcon

Active Member
Licensed User
Longtime User
Vale ya encontre exactamente lo que busc aba, lo que queria era que al arrancar el Mapa me pusiera marcas en localizaciones que yo quiero, lo que vienen siendo marker.

mi duda viene en que yo tengo en un txt 4 coordenadas:

latitud_longitud_titulo1
latitud_longitud_titulo2
latitud_longitud_titulo3
latitud_longitud_titulo4

quiero sacar esas variables y separarlas pero me estoy haciendo un lio.

quiero sacar la 1º en una variable latitud_longitud_titulo1 y luego separarla en tres distintas

latidud
longitud
titulo.

y vuelta a empezar con

latitud_longitud_titulo2

no se si lo mejor es con un type, con map o con array agradeceria cualquier orientacion.

un saludo
 

Descartex

Well-Known Member
Licensed User
Longtime User
Una vez tengas las líneas puedes usar String.IndexOf y String.LastIndexOf para detectar la ubicación de los caracteres "_" y así poder separar cada uno de los datos.
Saludos.
Buenas
Si haces esto:
B4X:
 Dim Datos() as String = Regex.Split("_",CadenaDatos)
Teniendo en CadenaDatos los datos a trocear, en Datos() tendrías los valores separados.

Un saludo.
 

TheFalcon

Active Member
Licensed User
Longtime User
Bueno gracias a los 2 ya me funciona. Yo usaba el filereader pero mas rudimentario aun, tipo VB.net y estaba montando un cacao de código bárbaro jaja.
Al final me funciona lo mas pulido que lo he podido dejar es así.
Yo estoy ahora mismo probando con un TXT con 5 lineas de coordenadas.

B4X:
    Dim L_coord1,L_coord2,L_coord3,L_coord4,L_coord5 As String

'CON ESTO SACAMOS LOS 5 VALORES QUE TENGO EN EL TXT Y LOS MUESTRO EN LOS MSGBOX. EMPIEZA LIST(0) POR QUE ESE ES EL CAMPO 1.
    Dim List1 As List
    
    List1 = File.ReadList(File.DirDefaultExternal, "coordenadas.txt")


'EMPIEZO CON IF  A LEER EL LIST , SACAR LAS LINEAS Y SEPARARLAS SIN EL _
    If List1.get(0) = "" Then     ' 1 linea del TXT
    Else
        L_coord1 = List1.Get(0)  ' metemos el primer dato de la lista en l_coord
            Dim l_Datos1() As String = Regex.Split("_",L_coord1) ' aqui sacamos todas las palabras separadas por   _
                                                                ' y las metemos en variables dentro de () , si so
    End If
    '------------------------            2 linea del TXT
    If List1.get(1) = "" Then   
    Else
        L_coord2 = List1.Get(1)  '
        Dim l_Datos2() As String = Regex.Split("_",L_coord2)
                                                            
    End If
    
    '------------------------            3 linea del TXT
    If List1.get(2) = "" Then
    Else
        L_coord3 = List1.Get(2) 
        Dim L_Datos3() As String = Regex.Split("_",L_coord3)
    End If
    
    '------------------------------------  4 LINEA DEL TXT
    If List1.get(3) = "" Then ' 4 linea del TXT
    Else
        L_coord4 = List1.Get(3)
        Dim L_Datos4() As String = Regex.Split("_",L_coord4)
    End If
    
    '------------------------------------  5 LINEA DEL TXT
    If List1.get(4) = "" Then ' 5 linea del TXT
        
    Else
        L_coord5 = List1.Get(4)
        Dim L_Datos5() As String = Regex.Split("_",L_coord5)
    End If


Luego añado en el mapa las chinchetas con las coordenadas separadas.

Muchas Gracias a Todos :D, cuando acabe entero el proyecto lo pondré todo despiezado para el que luego le haga falta.
Una duda, seria mejor meter las coordenadas en una base de datos SQL , o en el TXT mejor, mas que nada para ver si luego se ha de borrar o modificar algo, que sea mas accesible.
 

TheFalcon

Active Member
Licensed User
Longtime User
Luego para poner las marcas en el mapa

B4X:
'(LATITUD,LONGITUD, TITULO CHINCHETA) 
    Dim m1 As Marker = gmap.AddMarker(l_Datos1(0),l_Datos1(1),l_Datos1(2))
    'SNIPPET(TEXTO DEBAJO DEL TITULO
    m1.Snippet = "This is the snippet"
    
    Dim m2 As Marker = gmap.AddMarker(l_Datos2(0),l_Datos2(1),l_Datos2(2))
    'SNIPPET(TEXTO DEBAJO DEL TITULO
    m2.Snippet = "This is the snippet"
    
    Dim m3 As Marker = gmap.AddMarker(L_Datos3(0),L_Datos3(1),L_Datos3(2))
    'SNIPPET(TEXTO DEBAJO DEL TITULO
    m3.Snippet = "This is the snippet"
    
    Dim m4 As Marker = gmap.AddMarker(L_Datos4(0),L_Datos4(1),L_Datos4(2))
    'SNIPPET(TEXTO DEBAJO DEL TITULO
    m4.Snippet = "This is the snippet"
'   
    Dim m5 As Marker = gmap.AddMarker(L_Datos5(0),L_Datos5(1),L_Datos5(2))
    'SNIPPET(TEXTO DEBAJO DEL TITULO
    m5.Snippet = "This is the snippet"
 

Descartex

Well-Known Member
Licensed User
Longtime User
Una duda, seria mejor meter las coordenadas en una base de datos SQL , o en el TXT mejor, mas que nada para ver si luego se ha de borrar o modificar algo, que sea mas accesible.
Mi consejo es que siempre que tengas que andar borrando y añadiendo, uses una base de datos.
Un saludo.
 

Seneca

Active Member
Licensed User
Hola.

Yo te quería comentar varias cosas:

B4X:
If List1.get(0) = "" Then     ' 1 linea del TXT
Else
        L_coord1 = List1.Get(0)  ' metemos el primer dato de la lista en l_coord
            Dim l_Datos1() As String = Regex.Split("_",L_coord1) ' aqui sacamos todas las palabras separadas por   _
                                                               ' y las metemos en variables dentro de () , si so
End If

El IF anterior anterior lo simplificaría a:

B4X:
If List1.get(0) <> "" Then     ' 1 linea del TXT
        L_coord1 = List1.Get(0)  ' metemos el primer dato de la lista en l_coord
        Dim l_Datos1() As String = Regex.Split("_",L_coord1) ' aqui sacamos todas las palabras separadas por   _
                                                               ' y las metemos en variables dentro de () , si so
End If

Por otro lado, repites el mismo código (IF....ENDIF) cinco veces, una por cada elemento del List que contiene las coordenadas. ¿Y si en algún momento tienes 10 coordenadas en vez de 5? Yo lo dejaría en un solo IF...ENDIF dentro de un bucle FOR...EACH, que iteraría cada elemento del List.

Por el mismo motivo anterior, yo guardaría las coordenadas, ya separadas, en un List. De esta forma no tienes que DIMensionar una matriz para cada una de ellas.

Todo lo anterior quedaría de esta forma:

B4X:
Sub Activity_Create(FirstTime As Boolean)
    Dim List1 As List
    Dim linea As String   
    Dim lstCoordenadas As List
    Dim Coordenadas () As String
    
    lstCoordenadas.Initialize
    
    List1 = File.ReadList(File.DirAssets, "coordenadas.txt")

    For Each linea As String In List1
        Log (linea)
        If linea <> "" Then
            lstCoordenadas.Add (Regex.Split("_",linea) )
        End If'
    Next

For Each Coordenadas() As String In lstCoordenadas
        Log (Coordenadas(0) & " - " & Coordenadas(1) & " - "  & Coordenadas(2))
Next

End Sub

Por último, coincido en que guardar las coordenadas en una BD tiene muchas ventajas. Incluso así podrías separar en campos distintos LAT, LONG y TITULO y no tienes que andar después separando.

Saludos.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola , ya que decias que ibas a utilizar marker, lo mas intuitivo para cuando algun dia tengas que modificar codigo, es trabajar con variables tipo TYPE, tu ten los datos en el archivo de texto o base de datos que quieras, cuando haces la carga, en vez de hacerla a esa matriz, la haces a una variable que como sabras la longitud de registros por el list1.size puedes dimensionarla de nuevo.

B4X:
' por ejemplo
Type GMarker (Id As Int, Cabecera As String, Texto As String, Direccion As String,NombreIcono As String, Lng As Float, Lat As Float)    'Tipo con los datos de los marcadores de mapa de GoogleMaps
Public Marcadores(5) As GMarker
Public TotalMarcadores = 5 as int

' Si la cantidad de marcadores no la sabes por que viene en un fichero, como te he dicho la puedes redimensionar
TotalMarcadores = list1.size
Dim Marcadores(TotalMarcadores) As GMarker

'Despues la consulta o la asignación es como cualquier otra variable
       Marcadores(0).Id = 0
       Marcadores(0).Cabecera = TextoCabecera
       Marcadores(0).Texto = Texto
       Marcadores(0).Lat = 41.387943156307
       Marcadores(0).Lng = 1.9318351061515
       Marcadores(0).NombreIcono = IconoMapas

'En la carga cambias el 0 por la variable que emplees en el bucle y listo

' Despues en la asignación tambien puedes poner un blucle
   For n = 0 to TotalMarcadores-1
    Dim LTB As LatLng
    LTB.Initialize(Marcadores(n).Lat,Marcadores(n).Lng)
    LatLngBoundsBuilder1.Include(LTB)
    ' ..........
    ' ..........  
    ' ..........


' El ID lo puedes emplear luego para saber que market te han pulsado, y abrir la etiqueta

Saludos
 
Last edited:

TheFalcon

Active Member
Licensed User
Longtime User
Voy a probar las 2 cosas, estoy haciéndolo en SQL por que tenéis razón luego a la hora de modificar algo en un txt es un engorro, mirare bien lo de el tipo TYPE que no lo controlo mucho, y pondré en practicas ambas cosas a ver que tal sale, y os cuento.
 

TheFalcon

Active Member
Licensed User
Longtime User
Seneca, me funciona bien lo que me comentas y me acorta mucho código, BGSOFT lo de los TYPE aun se me traba no los comprendo bien pero lo seguiré intentando.

Al final lo e echo en SQL y me es mas fácil, lo que no se es como hacer lo de acortar código para mostrar los Marker desde SQL reduciendo código.

Yo ahora mismo lo saco así;

B4X:
Dim TituloSql(20) As String
    Dim LongitudSql(20) As String
    Dim LatitudSql(20) As String
    Dim SpinerSql(20) As String  ' es el texto que va debajo del titulo en gmaps
    Dim Marker_Sql(20) As Marker

    


If File.Exists(File.DirDefaultExternal,"cetreros.sql") = False Then
        File.Copy(File.DirAssets,"cetreros.sql",File.DirDefaultExternal,"cetreros.sql")
    End If
    
    If SQL1.IsInitialized = False Then
        SQL1.Initialize(File.DirDefaultExternal, "cetreros.sql", False)
    End If


cursor1 = SQL1.ExecQuery("SELECT * FROM coordenadas")
    For i = 0 To cursor1.RowCount - 1
        cursor1.Position = i
        'ListView1.AddSingleLine(cursor1.GetString("Nombre")& "|" &cursor1.GetString("Username")& " | " & cursor1.GetString("Password"))
        TituloSql(i+1) = cursor1.GetString("titulo")
    
        LongitudSql(i+1) = cursor1.GetString("longitud")
        
        LatitudSql(i+1) = cursor1.GetString("latitud")
        
        SpinerSql(i+1) = cursor1.GetString("titulo2")
        
    Next

* La única manera que veo para cargar los marker es 1 a 1 , es decir linea a linea como hice con los txt. No se como usar una única variable de MArker para añadirlos todos.

* E de declarar las variables con la cantidad Dim LongitudSql(20) As String , por que si lo hago abierto () me da error al intentar meter los datos.
 

Seneca

Active Member
Licensed User
Hola.

Me alegra que mis muy básicos conocimientos te hayan ayudado.

Lo que comentas de acortar código, y que te sirva para cualquier número de marcadores sin tener problema en el dimensionamiento de matrices, yo lo hago guardando en una Lista los datos extraídos de la BD usando DBUtils. El método ExecuteMemoryTable hace una consulta a la BD y guarda los resultados en una Lista. Cada elemento de la lista corresponde a un registro de la BD, y contiene una matriz. A su vez, cada elemento de la matriz es un campo del registro en cuestión.

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

lstMarcadores = DBUtils.ExecuteMemoryTable(Starter.sql, "SELECT lat, long, info FROM cetreros, Null,0)

For intMarcador = 0 To lstMarcadores.Size - 1 'Recorre cada elemento de la Lista
       Unmarcador = lstMarcadores.Get(intMarcador) 'Extrae un marcador de la Lista
       Dim m1 As Marker = gmap.AddMarker2(Unmarcador(0), Unmarcador(1), Unmarcador(2), gmap.HUE_ORANGE)
Next

DBUTILS es un módulo de código que has de añadir a tu proyecto. En el enlace tienes tanto el módulo como ejemplo de uso.

Saludos.
 

TheFalcon

Active Member
Licensed User
Longtime User
Gracias lo probare, no sabia de ese servicio esta interesante, lo único que la linea que dice starter.sql , no se que he de poner hay , por que me da error que no reconoce SQL, no se si e de poner hay otra variable mía.
 

Seneca

Active Member
Licensed User
Hola.

Lo de "Starter.sql" ha de ir tal cual. Quizás te falte una de estas dos cosas:

  • Añadir a tu proyecto el módulo de código DBUtils.bas que puedes descargar en el mensaje @#1 de este hilo. Para añadirlo guarda el archivo en tu carpeta de proyecto y luego incorpóralo a través del menú Project del B4A

  • Declarar el SQL en el módulo Starter. Tal como sigue:

B4X:
Sub Process_Globals

    Public sql As SQL

End Sub

Saludos.
 

TheFalcon

Active Member
Licensed User
Longtime User
Vale era lo de declarar en starter, funciona perfecto muchísimas gracias, me viene muy bien el servicio dbutils, por que yo añado tablas etc a la vieja usanza, y con este servicio es mas cómodo y limpio :). Muchísimas gracias
 

Seneca

Active Member
Licensed User
De nada. Un placer poder ayudar a resolver las mismas dudas que yo tuve, en las que otros usuarios más veteranos me echaron una mano.
 
Top