feat(maps): add google map with access search location dropdown

This commit is contained in:
dimaatkaev 2018-02-19 20:17:38 +03:00 committed by Dmitry Nehaychik
parent cb5795b52f
commit 97c7134c77
13 changed files with 151 additions and 3 deletions

10
package-lock.json generated
View file

@ -357,6 +357,12 @@
"integrity": "sha512-lbWmXFxIpEzpH7OprsCRvxj7kie+248Y2ItjeVsF+0+IqvwG+R+0xgZmxq1ofYNTszvuihDahas7O5dscfxTsw==", "integrity": "sha512-lbWmXFxIpEzpH7OprsCRvxj7kie+248Y2ItjeVsF+0+IqvwG+R+0xgZmxq1ofYNTszvuihDahas7O5dscfxTsw==",
"dev": true "dev": true
}, },
"@types/googlemaps": {
"version": "3.30.4",
"resolved": "https://registry.npmjs.org/@types/googlemaps/-/googlemaps-3.30.4.tgz",
"integrity": "sha512-S5Bzg+vlguaIhJa20V+QmetQqoAHAtpy+tAsv7ayps3Vsu0sU1QAEqHrV3KdBb7qy/tq9m4qDs1wQws0gm5Vpg==",
"dev": true
},
"@types/jasmine": { "@types/jasmine": {
"version": "2.5.54", "version": "2.5.54",
"resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz",
@ -6431,7 +6437,7 @@
"opn": { "opn": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz",
"integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", "integrity": "sha1-cs4jBqF9vqWP8QQYUzUrSo/HdRk=",
"dev": true, "dev": true,
"requires": { "requires": {
"is-wsl": "1.1.0" "is-wsl": "1.1.0"
@ -6440,7 +6446,7 @@
"send": { "send": {
"version": "0.16.1", "version": "0.16.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
"integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", "integrity": "sha1-pw4coh0TgsEdDZ9iMd6ygQgNerM=",
"dev": true, "dev": true,
"requires": { "requires": {
"debug": "2.6.9", "debug": "2.6.9",

View file

@ -75,6 +75,7 @@
"@angular/compiler-cli": "~5.1.0", "@angular/compiler-cli": "~5.1.0",
"@angular/language-service": "~5.1.0", "@angular/language-service": "~5.1.0",
"@compodoc/compodoc": "1.0.1", "@compodoc/compodoc": "1.0.1",
"@types/googlemaps": "3.30.4",
"@types/d3-color": "1.0.5", "@types/d3-color": "1.0.5",
"@types/jasmine": "2.5.54", "@types/jasmine": "2.5.54",
"@types/jasminewd2": "2.0.3", "@types/jasminewd2": "2.0.3",

View file

@ -5,6 +5,9 @@ import { MapsComponent } from './maps.component';
import { GmapsComponent } from './gmaps/gmaps.component'; import { GmapsComponent } from './gmaps/gmaps.component';
import { LeafletComponent } from './leaflet/leaflet.component'; import { LeafletComponent } from './leaflet/leaflet.component';
import { BubbleMapComponent } from './bubble/bubble-map.component'; import { BubbleMapComponent } from './bubble/bubble-map.component';
import { SearchMapComponent } from './search-map/search-map.component';
import { MapComponent } from './search-map/map/map.component';
import { SearchComponent } from './search-map/search/search.component';
const routes: Routes = [{ const routes: Routes = [{
path: '', path: '',
@ -18,6 +21,9 @@ const routes: Routes = [{
}, { }, {
path: 'bubble', path: 'bubble',
component: BubbleMapComponent, component: BubbleMapComponent,
}, {
path: 'searchmap',
component: SearchMapComponent,
}], }],
}]; }];
@ -32,4 +38,7 @@ export const routedComponents = [
GmapsComponent, GmapsComponent,
LeafletComponent, LeafletComponent,
BubbleMapComponent, BubbleMapComponent,
SearchMapComponent,
MapComponent,
SearchComponent,
]; ];

View file

@ -9,7 +9,10 @@ import { MapsRoutingModule, routedComponents } from './maps-routing.module';
@NgModule({ @NgModule({
imports: [ imports: [
ThemeModule, ThemeModule,
AgmCoreModule.forRoot(), AgmCoreModule.forRoot({
apiKey: 'AIzaSyCpVhQiwAllg1RAFaxMWSpQruuGARy0Y1k',
libraries: ['places'],
}),
LeafletModule.forRoot(), LeafletModule.forRoot(),
MapsRoutingModule, MapsRoutingModule,
NgxEchartsModule, NgxEchartsModule,

View file

@ -0,0 +1,4 @@
export class Location {
constructor(public latitude: number = 54, public longitude: number = 33) {
}
}

View file

@ -0,0 +1,7 @@
<agm-map [latitude]="latitude"
[longitude]="longitude"
[scrollwheel]="false"
[zoom]="zoom">
<agm-marker [latitude]="latitude"
[longitude]="longitude"></agm-marker>
</agm-map>

View file

@ -0,0 +1,13 @@
@import '../../../../@theme/styles/themes';
@include nb-install-component() {
nb-card-body {
padding: 0;
}
/deep/ agm-map {
width: 100%;
height: nb-theme(card-height-large);
}
}

View file

@ -0,0 +1,31 @@
import { Component, Input, OnInit } from '@angular/core';
import { Location } from '../entity/Location';
@Component({
selector: 'ngx-map',
templateUrl: './map.component.html',
styleUrls: ['./map.component.scss'],
})
export class MapComponent implements OnInit {
latitude: number;
longitude: number;
zoom: number;
@Input()
public set searchedLocation(searchedLocation: Location) {
this.latitude = searchedLocation.latitude;
this.longitude = searchedLocation.longitude;
this.zoom = 12;
}
ngOnInit(): void {
// set up current location
if ('geolocation' in navigator) {
navigator.geolocation.getCurrentPosition((position) => {
this.searchedLocation = new Location(
position.coords.latitude, position.coords.longitude,
);
});
}
}
}

View file

@ -0,0 +1,7 @@
<nb-card>
<nb-card-header>Google Maps with search</nb-card-header>
<nb-card-body>
<ngx-search (positionChanged)="updateLocation($event)"></ngx-search>
<ngx-map [searchedLocation]="searchedLocation"></ngx-map>
</nb-card-body>
</nb-card>

View file

@ -0,0 +1,15 @@
import { Component } from '@angular/core';
import { Location } from './entity/Location';
@Component({
selector: 'ngx-search-map',
templateUrl: './search-map.component.html',
})
export class SearchMapComponent {
searchedLocation: Location = new Location();
updateLocation(event: Location) {
this.searchedLocation = new Location(event.latitude, event.longitude);
}
}

View file

@ -0,0 +1,4 @@
<div class="form-group">
<input placeholder="search for location" autocorrect="off" autocapitalize="off" spellcheck="off" type="text"
class="form-control search-location" #search>
</div>

View file

@ -0,0 +1,44 @@
import { Component, ElementRef, EventEmitter, NgZone, OnInit, Output, ViewChild } from '@angular/core';
import { MapsAPILoader } from '@agm/core';
import { Location } from '../entity/Location';
import {} from 'googlemaps';
@Component({
selector: 'ngx-search',
templateUrl: './search.component.html',
})
export class SearchComponent implements OnInit {
@Output() positionChanged = new EventEmitter<Location>();
@ViewChild('search')
public searchElementRef: ElementRef;
constructor(private mapsAPILoader: MapsAPILoader,
private ngZone: NgZone) {
}
ngOnInit() {
// load Places Autocomplete
this.mapsAPILoader.load().then(() => {
const autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement, {
types: ['address'],
});
autocomplete.addListener('place_changed', () => {
this.ngZone.run(() => {
// get the place result
const place: google.maps.places.PlaceResult = autocomplete.getPlace();
// verify result
if (place.geometry === undefined || place.geometry === null) {
return;
}
this.positionChanged.emit(
new Location(place.geometry.location.lat(),
place.geometry.location.lng()));
});
});
});
}
}

View file

@ -89,6 +89,10 @@ export const MENU_ITEMS: NbMenuItem[] = [
title: 'Bubble Maps', title: 'Bubble Maps',
link: '/pages/maps/bubble', link: '/pages/maps/bubble',
}, },
{
title: 'Search Maps',
link: '/pages/maps/searchmap',
},
], ],
}, },
{ {