Profundizando en Angular, Firebase y Google Maps para aplicación en tiempo Real
Sebastian Gomez�Technical Manager, Globant
@sebasgojs
Agenda
2
@sebasgojs
1. ¿Como funciona On-Realtime de Uber?
3
@sebasgojs
1. ¿Como funciona On-Realtime de Uber?
4
refreshTime<3s
positionChange> 10mts
notificarUsuario()
Si posición cambió
actualizarMapa()
guardarUltimaPosicion()
@sebasgojs
1. ¿Como funciona On-Realtime de Uber?
5
refreshTime<3s
Si posición Cambió actualizarMapa()
lat: -34.536294,
lng: -58.466651
Estoy Aquí
lat: -34.536294,
lng: -58.466651
El mansito dijo que estaba ahí
notificarUsuario()
@sebasgojs
async function gpsTracking() {
const coords = await getCurrentPosition();
await sendToServer(coords)
// optional delay;
gpsTracking();
}
6
@sebasgojs
¿Qué opciones tenemos?
7
Angular Maps
Google Maps Javascript API
@angular/google-maps
@sebasgojs
2. Empezando con Google Maps en Angular
<script
async defer
src="https://maps.googleapis.com/maps/api/js?
key=<TuSuperKeySeguraYSecreta>"
type="text/javascript"
>
</script>
8
@sebasgojs
2. Empezando con Google Maps en Angular
<script
async defer
src="https://maps.googleapis.com/maps/api/js?
key=<TuSuperKeySeguraYSecreta>"
type="text/javascript"
>
</script>
9
@sebasgojs
10
@sebasgojs
Asyn, defer; ngOnInit y posibles errores con los Mapas
11
Async
Defer
ngOnInit, ngAfterInit,
...
Browser Threat
sync
Browser Threat
ngOnInit, ngAfterInit,
...
@sebasgojs
¿Qué son los ViewChilds?
@ViewChild("map", {static: true}) mapElement: ElementRef;
12
<h1>...</h1>
<div #map id="map"></div>
<otro-componente></otro-componente>
@sebasgojs
¿Qué son los ViewChilds?
@ViewChild("map", {
read: false, static: true
}) mapElement: ElementRef;
13
<h1>...</h1>
<div #map id="map"></div>
<otro-componente></otro-componente>
@sebasgojs
Entendiendo el concepto de ViewChild - Child
14
export class FilterComponent {
@Output() changed: EventEmitter<string>;
filter: string;
clear() {
this.filter = '';
}
// ... other methods
}
Child Component (Componente Hijo)
Método que nos interesa
@sebasgojs
Entendiendo el concepto de ViewChild - Parent
15
export class CharterListComponent {
characters: Character[];
@ViewChild(FilterComponent, {}) filter: FilterComponent;
filtered = this.characters;
getCharacters() {
this._charactersService.getCharacters().subscribe(characters => {
this.characters = this.filtered = characters;
this.filter.clear();
});
}
}
Obtenemos el componente
Método del componente hijo que podemos ejecutar
@sebasgojs
¿Cómo crear tu primer mapa en Angular?
16
let latLng = new google.maps.LatLng(6.236654, -75.580432);
let mapOptions = {
center: latLng,
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
this.map = new google.maps.Map(
this.mapElement.nativeElement, mapOptions);
@sebasgojs
Para personalizar los estilos del mapa
17
let latLng = new google.maps.LatLng(6.236654, -75.580432);
let mapOptions = {
center: latLng,
zoom: 13,
mapTypeId: google.maps.MapTypeId.ROADMAP,
styles: [...],
};
this.map = new google.maps.Map(
this.mapElement.nativeElement, mapOptions);
Array para personalizar los estilos del mapa
@sebasgojs
Proveedores de estilos para Google Maps
18
@sebasgojs
¿Cómo localizarte en el navegador?
19
window.
navigator.
geolocation.
getCurrentPosition(funcionQueLlamoEnCasoDeExito,
functionQueLlamoEnCasoDeFracaso)
@sebasgojs
¿Como encontrarte en Angular?
20
funcionQueLlamoEnCasoDeExito(position)
{...
coords: {
latitude: 6.208488,
longitude: -75.563577
}
...
}
@sebasgojs
¿Como crear y borrar marcadores?
21
let latLng = new google.maps.LatLng(
position.coords.latitude,
position.coords.longitude
);
this.myMarker = new google.maps.Marker({
map: this.map,
animation: google.maps.Animation.cn,
position: latLng,
icon: { url: "assets/photo.jpg" }
});
this.myMarker.setMap(null);
this.myMarker = null;
@sebasgojs
¿Y el tiempo Real?
22
@sebasgojs
23
@sebasgojs
24
Desarrollo
@sebasgojs
25
Crecimiento
@sebasgojs
26
@sebasgojs
27
Optimizada para el uso sin conexión
@sebasgojs
28
Optimizada para el uso sin conexión
Firestore
Modelo de Datos
@sebasgojs
29
Documento�
Colecciones�
@sebasgojs
30
Firebase Database VS Firestore
@sebasgojs
31
Consultas en Firebase Database
@sebasgojs
32
@sebasgojs
33
this.positions = this.positionsCollection
.doc("PUhz5BIUIBMQNayHDWwD")
.valueChanges();
this.positions.subscribe(position => {
this.pintarUnMarcador(position);
}
this.positionsCollection = this.afs.collection("positions",
ref => ref.orderBy("order")
);
1
2
@sebasgojs
Ahora usando Angular-maps
34
@sebasgojs
Implementando angular-maps
35
npm install @agm/core --save
@sebasgojs
Implementando angular-maps
36
import { AgmCoreModule } from "@agm/core";
@NgModule({
declarations: [AppComponent],
imports: [
...
AgmCoreModule.forRoot({
apiKey: "..."
})
],
@sebasgojs
Implementando angular-maps
37
<agm-map [latitude]="lat" [longitude]="lng" [zoom]="13">
<agm-marker [latitude]="mylat" [longitude]="mylng" iconUrl="assets/photo.jpg">
<agm-info-window>
<strong>My Location</strong>
</agm-info-window>
</agm-marker>
</agm-map>
@sebasgojs
Implementando marcadores en angular-maps
38
<agm-marker
*ngIf="tracking" [latitude]="hislat"
[longitude]="hislng" iconUrl="assets/moto.png"
>
<agm-info-window>
<strong>Food Location</strong>
</agm-info-window>
</agm-marker>
@sebasgojs
Ruta usando una polyline angular-maps
39
<agm-map
[latitude]="currentCenter.lat"
[longitude]="currentCenter.lng"
[zoom]="defaultZoom"
*ngIf="currentCenter"
>
<agm-polyline [strokeColor]="'red'" *ngIf="coordinates">
<agm-polyline-point
*ngFor="let coords of coordinates"
[latitude]="coords.lat"
[longitude]="coords.lng"
>
</agm-polyline-point>
</agm-polyline>
</agm-map>
@sebasgojs
40
@sebasgojs
41
Utilizando: Javascript Maps
https://github.com/seagomezar/maps-angular
Utilizando: Angular Maps
https://github.com/seagomezar/Ionic4-Music-Starter
Utilizando: Uber Like App Angular
Dales una estrella!
@sebasgojs
Conclusiones
42
@sebasgojs
www.sebastian-gomez.com
43
Sebastian Gomez�Technical Manager, Globant
@sebasgojs
@sebasgojs