Javascript Ionic - Google 地点和自动完成位置
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/42427915/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Ionic - Google places and Autocomplete location
提问by Michael
I have work on the project on Ionic 2 and I have implemented the map so far, but I can not get out of that point. I needed to be shown the way I should go in order to add Google Place and Autocomplete to the project.
我在 Ionic 2 的项目上工作,到目前为止我已经实现了地图,但我无法摆脱这一点。为了将 Google Place 和自动完成功能添加到项目中,我需要向我展示我应该走的路。
What can I do?
我能做什么?
HTML:
HTML:
<ion-row>
<ion-item>
<ion-label>Search</ion-label>
<ion-input id="places" type="text" name="search"></ion-input>
</ion-row>
<div #map id="map"></div>
HOME.ts
主页.ts
export class HomePage {
public latitude: number;
public longitude: number;
@ViewChild('map') mapElement;
map: any;
marker: any;
search: string;
constructor(public navCtrl: NavController, public platform: Platform) {
/*platform.ready().then(() => {
this.InitMap();
});*/
}
ionViewDidLoad(){
this.InitMap();
}
InitMap() {
this.setLocation();
let input = document.getElementById('places');
let autocomplete = new google.maps.places.Autocomplete(input);
google.maps.event.addListener(autocomplete, 'place_changed', () => {
let place = autocomplete.getPlace();
this.latitude = place.geometry.location.lat();
this.longitude = place.geometry.location.lng();
alert(this.latitude + ", " + this.longitude);
console.log(place);
});
}
setLocation() {
let latLng = new google.maps.LatLng(53.550513, 9.994241);
let mapOptions = {
center: latLng,
zoom: 15,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
this.map = new google.maps.Map(this.mapElement.nativeElement, mapOptions);
this.marker = new google.maps.Marker({
position: latLng,
map: this.map,
});
}
}
What is wrong? Thank's
怎么了?谢谢
回答by Michael
SOLVED! After a long time I was able to find a solution to my problem. Here's the solution:
解决了!很长一段时间后,我找到了解决问题的方法。这是解决方案:
Home.html:
主页.html:
<ion-list>
<ion-item>
<ion-input (click)="showAddressModal()" [(ngModel)]="address.place"type="text" placeholder="Pick an address"> </ion-input>
</ion-item>
</ion-list>
Home.ts:
主页.ts:
import {Component} from '@angular/core';
import {NavController, ModalController} from 'ionic-angular';
import {AutocompletePage} from './autocomplete';
@Component({
templateUrl: 'build/pages/home/home.html'
})
export class HomePage {
address;
constructor(
private navCtrl: NavController,
private ModalCtrl:ModalController
) {
this.address = {
place: ''
};
}
showAddressModal () {
let modal = this.modalCtrl.create(AutocompletePage);
let me = this;
modal.onDidDismiss(data => {
this.address.place = data;
});
modal.present();
}
}
AutocompletePage.html:
自动完成页面.html:
<ion-header>
<ion-toolbar>
<ion-title>Enter address</ion-title>
<ion-searchbar [(ngModel)]="autocomplete.query" [showCancelButton]="true" (ionInput)="updateSearch()" (ionCancel)="dismiss()"></ion-searchbar>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-list>
<ion-item *ngFor="let item of autocompleteItems" tappable (click)="chooseItem(item)">
{{ item }}
</ion-item>
</ion-list>
</ion-content>
AutocompletePage.ts:
自动完成页面.ts:
import {Component, NgZone} from '@angular/core';
import {ViewController} from 'ionic-angular';
@Component({
templateUrl: 'build/pages/home/autocomplete.html'
})
export class AutocompletePage {
autocompleteItems;
autocomplete;
latitude: number = 0;
longitude: number = 0;
geo: any
service = new google.maps.places.AutocompleteService();
constructor (public viewCtrl: ViewController, private zone: NgZone) {
this.autocompleteItems = [];
this.autocomplete = {
query: ''
};
}
dismiss() {
this.viewCtrl.dismiss();
}
chooseItem(item: any) {
this.viewCtrl.dismiss(item);
this.geo = item;
this.geoCode(this.geo);//convert Address to lat and long
}
updateSearch() {
if (this.autocomplete.query == '') {
this.autocompleteItems = [];
return;
}
let me = this;
this.service.getPlacePredictions({
input: this.autocomplete.query,
componentRestrictions: {
country: 'de'
}
}, (predictions, status) => {
me.autocompleteItems = [];
me.zone.run(() => {
if (predictions != null) {
predictions.forEach((prediction) => {
me.autocompleteItems.push(prediction.description);
});
}
});
});
}
//convert Address string to lat and long
geoCode(address:any) {
let geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': address }, (results, status) => {
this.latitude = results[0].geometry.location.lat();
this.longitude = results[0].geometry.location.lng();
alert("lat: " + this.latitude + ", long: " + this.longitude);
});
}
}
回答by Suraj Rao
Use elementref for accessing the ion input used instead of document.getElementByIdTry:
使用 elementref 来访问使用的离子输入而不是document.getElementByIdTry:
<ion-input #places type="text" name="search"></ion-input>
In your component class,
在您的组件类中,
import {Elementref } from '@angular/core';
@ViewChild("places")
public places: ElementRef;
InitMap(){
this.setLocation();
let autocomplete = new google.maps.places.Autocomplete(this.places.nativeElement);
google.maps.event.addListener(autocomplete, 'place_changed', () => {
let place = autocomplete.getPlace();
this.latitude = place.geometry.location.lat();
this.longitude = place.geometry.location.lng();
alert(this.latitude + ", " + this.longitude);
console.log(place);
});
}
Check angular docs here
在此处检查角度文档
回答by Neo Split
If all you need is "google places object", then your code can be very simple like so:
如果您只需要“谷歌地点对象”,那么您的代码可以非常简单,如下所示:
<ion-item>
<ion-label>Search your city</ion-label>
<ion-input formControlName="placeAutofill" id="googlePlaces" required></ion-input>
</ion-item>
And in my code:
在我的代码中:
ionViewWillEnter() {
// Google Places API auto complete
let input = document.getElementById('googlePlaces').getElementsByTagName('input')[0];
let autocomplete = new google.maps.places.Autocomplete(input, {types: ['geocode']});
google.maps.event.addListener(autocomplete, 'place_changed', () => {
// retrieve the place object for your use
let place = autocomplete.getPlace();
});
}

