私はangular2-google-maps
とAngular2の最新バージョンを使用しています。ローカルマップコンポーネント関数のいくつかを、独自のファイルmaps.service.ts
のサービスに変換しようとしています。例えば:
map.component.ts
getGeoLocation(lat: number, lng: number) {
if (navigator.geolocation) {
let geocoder = new google.maps.Geocoder();
let latlng = new google.maps.LatLng(lat, lng);
let request = { latLng: latlng };
geocoder.geocode(request, (results, status) => {
if (status == google.maps.GeocoderStatus.OK) {
let result = results[0];
if (result != null) {
this.fillInputs(result.formatted_address);
} else {
alert("No address available!");
}
}
});
}
}
次のようなものに:maps.service.ts
getGeoLocation(lat: number, lng: number): Observable<google.maps.GeocoderResult[]> {
let geocoder = new google.maps.Geocoder();
let latlng = new google.maps.LatLng(lat, lng);
let request = { latLng: latlng };
return new Observable((observer: Observer<google.maps.GeocoderResult[]>) => {
geocoder.geocode({ request }, (
(results: google.maps.GeocoderResult[], status: google.maps.GeocoderStatus) => {
if (status == google.maps.GeocoderStatus.OK) {
observer.next(results);
observer.complete();
} else {
console.log('Geocoding service failed due to: ' +status);
observer.error(status);
}
}
));
});
}
私が得ている問題は、Observer<google.maps.GeocoderResult[]>
を使用しようとすると、google
変数が認識されないことです。サービスクラス以外にもdeclare var google: any;
があります。
google
変数はmap.componenet.ts
で機能しますが、maps.service.ts
で認識されません。
私はついに問題を理解しましたが、それが問題だとは知りませんでした。サービスを参照していたコンポーネントの名前はmap.component.ts
サービスファイルの名前はmaps.service.ts
の末尾にs
が付いたmap
。ファイルとimport
ステートメントを変更した後、すべてが正常に機能しました。
私が試したのと同じ問題に直面していました:
declare var google: any;
しかし、私にはうまくいきませんでした。
これを見つけました answer そしてそれは私のために働きました。
最初に、Googleマップのタイピングをインストールしたことを確認してくださいnpm install @types/googlemaps --save --dev
--devフラグは非推奨です。つかいます
npm install @types/googlemaps --save-dev
そして、あなたのコントローラーで
import {} from '@types/googlemaps';
npm install @types/googlemaps --save-dev
tsconfig.app.json
のtsconfig.spec.json
の型配列にそれぞれgooglemapsを追加します最終的には次のようになります。
コンポーネントから両方の宣言タイプを削除できます。
import {} from '@types/googlemaps';
declare var google: any;
これらのいずれも含める必要はありません。
PS:agm-s GoogleMapsAPIWrapper.getNativeMap()を使用している場合、使用する前にマップオブジェクトを変換する必要があります。たとえば、トラフィックレイヤーをオンにする:
this.apiWrapper.getNativeMap().then(map => {
this.trafficLayer = new google.maps.TrafficLayer();
const gMap: any = map;
this.trafficLayer.setMap(gMap as google.maps.Map);
});
追加
declare var google: any;
typeScriptインポート後
こちらもご覧ください https://github.com/SebastianM/angular2-google-maps/issues/689
この問題で他の誰かの苦しみを防ぐため。
npm install @google/maps
https://www.npmjs.com/package/@google/maps
その後:
import { google } from '@google/maps';
基本的に、パッケージ@google/maps
からgoogleオブジェクトをインポートしています。
@types/googlemaps
が機能しなくなった後、2018年にテストされました。
それも私のために働いています:
まず、プロジェクトのルートにあるcmdでgoogleマップのtypings
をインストールします
npm install @types/googlemaps --save --dev
そして、.ts
以下のコンポーネントファイル:
import {} from '@types/googlemaps';
Angular 6と同様の問題があり、上記のすべての可能な解決策を実行しましたが、運はありません。最後に、googlemaps
をtypes
内部tsconfig.app
およびtsconfig.spec
ファイル。他の人に役立つことを願っています.
私の場合、2種類のエラーが発生していました。
私のコードでは私が使用しているので:
let autocomplete = new google.maps.places.Autocomplete(...)
let place: google.maps.places.PlaceResult = autocomplete.getPlace();
これを追加して修正しました:
declare var google: any;
declare namespace google.maps.places {
export interface PlaceResult { geometry }
}
私の場合、次のようにマップコンポーネントを定義しました。
map: google.maps.Map;
infoWindow: google.maps.InfoWindow = new google.maps.InfoWindow();
marker: google.maps.Marker;
autocomplete: google.maps.places.Autocomplete;
panaroma: google.maps.StreetViewPanorama;
以下のように、すべてのコンポーネントタイプをany
に変更することで問題を解決しました。
map: any;
infoWindow = new google.maps.InfoWindow();
marker: any;
autocomplete: any;
panaroma: any;
`
import { Observable } from 'rxjs';
import { GoogleMapsAPIWrapper, MapsAPILoader } from '@agm/core';
import { Injectable, NgZone } from '@angular/core';
declare var google: any;
@Injectable({
providedIn: 'root'
})
export class MapService extends GoogleMapsAPIWrapper {
geocoder: Promise<any>;
constructor(private __loader: MapsAPILoader, private __zone: NgZone) {
super(__loader, __zone);
this.geocoder = this.__loader.load().then(() => new google.maps.Geocoder());
}
getLatLan(address: string): Observable<any> {
return Observable.create(observer => {
this.geocoder.then((geocoder) => {
geocoder.geocode({ 'address': address }, (results, status) => {
if (status === google.maps.GeocoderStatus.OK) {
observer.next(results[0].geometry.location);
observer.complete();
} else {
console.error('Error - ', results, ' & Status - ', status);
observer.next({});
observer.complete();
}
});
});
});
}
}`
これは、アドレスを取得し、lanとlatを返すメソッドを持つサービスです。