【问题标题】:Adding night overlay to google maps api将夜间叠加层添加到谷歌地图 api
【发布时间】:2018-12-08 19:28:32
【问题描述】:

我的 Angular 项目中有以下 html

<agm-map ngDraggable [latitude]="latitude" [longitude]="longitude" >
  <agm-marker *ngFor= "let post of locations.results[0].events" [latitude]="post.asnLatitude" [longitude]="post.asnLongitude" [label] ="post"> </agm-marker>
</agm-map>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=013d0299e34c52b6dfb87711021b661295b918ee&callback=initMap"
  type="text/javascript"></script>

这会在谷歌地图上绘制我的经度和纬度点。对此,我希望有一个只使用 html 的日夜行。

可能会添加类似的内容:

<script>nite.init(map)</script>

会成功的

map 以某种方式引用元素的地方。

这会绘制我的谷​​歌地图以及我的纬度和经度点。我希望在地图上添加具有白天和黑夜的叠加层,我尝试使用来自 github here 的 nite-overlay 但这不是用于 html,而是用于 javascript。我的问题是我可以添加一些东西到 html 中,也许是 agm-overlay,以便在地图上显示白天和黑夜的位置。请注意,由于纬度和经度的变化,此 html 将每 15 秒刷新一次。所以更新日值应该不是问题。谢谢

编辑:我可以在 components.ts 中添加一些东西,但我想继续使用 组件来处理具有纬度和经度的地图。

【问题讨论】:

  • 除非我误会了,否则您提到的 github 覆盖似乎就快到了。您是否有理由不能在项目中包含该 javascript?
  • 不,我只是不想改变使用 并且想知道我是否可以在 html 中做到这一点
  • 这个answer 可能会有所帮助。
  • @wiiiiilllllll 所以我将 nite 导入到 component.ts 并将 (mapReady)="mapReady($event)" 添加到 mapReady($event: any){nite.init($event);} 的 html 中,但我收到错误 GooglemapsComponent.html:1 ERROR Error: Nite Overlay: no google .maps 检测到
  • 抱歉,我对 Angular 或 agm-map 一无所知,所以帮不上什么忙。但也许将nite.init($event) 更改为nite.init(this)

标签: javascript html angular google-maps-api-3


【解决方案1】:

您可以使用 nite 包,您必须首先像这样在您的 component.ts 中从 agm 获取本机 google maps 对象:

constructor(private _mapsWrapper:GoogleMapsAPIWrapper){
    _mapsWrapper.getNativeMap().then((map: mapTypes.GoogleMap) => {
      // Here you can use the map object with the nite package
      nite.init(map);
    });
  }

PS:不要忘记导入语句:

import { GoogleMapsAPIWrapper } from '@agm/core';
import * as mapTypes from '@agm/core/services/google-maps-types';

【讨论】:

  • 我相当肯定这个答案只是像夜间一样设置地图的样式。我在问是否要在地球上设置一条昼夜线路,例如 here
  • 这不是我要问的。
  • 哦,好吧,对不起,我误解了你的问题。您仍然可以使用 nite 包,您只需从 agm 库中获取 google 地图对象。我会更新我的答案。
  • 你好。我将从哪里导入 mapTypes。 @MehdiBenmoha
  • 试试这个:import * as mapTypes from '@agm/core/services/google-maps-types'; 我还用来自@agm/core 的所需导入更新了答案
【解决方案2】:

使用您建议的js(即https://github.com/rossengeorgiev/nite-overlay)的nite叠加可以成功地与使用(mapReady)="mapReady($event)"的agm-map一起使用。

除了使用 agm-map 所需的步骤(我假设您可以使用 agm-map 在页面上绘制地图)之外,请确保您已安装 @types/googlemaps

npm install --save @types/googlemaps

而且,您已将 nite-overlay.js 文件复制到 src 文件夹中,并将其包含在您的 .angular-cli.json 文件中,如下所示。

...
"scripts": [
        "nite-overlay.js"
      ],
...

以下是工作代码。

ma​​p.component.ts

import { Component, OnInit, NgZone } from '@angular/core';
import { MapsAPILoader } from '@agm/core';
import {} from '@types/googlemaps';

declare var google: any;
declare var nite: any;

@Component({
  selector: 'app-map',
  templateUrl: './map.component.html',
  styleUrls: ['./map.component.css']
})
export class MapComponent implements OnInit {

  lat: number = 26.288644;
  lng: number = 73.021302;
  zoom = 4;

  m: Marker = {lat:this.lat, lng:this.lng};


  constructor(
    private loader: MapsAPILoader,
    private zone: NgZone
    ) { }

  clickedMarker(label: string, index: number) {
    console.log(`clicked the marker: ${label || index}`)
  }

  mapClicked($event: any) { 
    let m: Marker = {lat:$event.coords.lat, lng:$event.coords.lng};
    this.m = m;
    this.getAddress(m.lat, m.lng, this.setAddress.bind(this));
  }

  markerDragEnd(m: Marker, $event: MouseEvent) {
    console.log('dragEnd', m, $event);
  }

  mapReady($event: any) { 
  nite.init($event);

  }

  ngOnInit() {

  }

}

// just an interface for type safety.
interface Marker {
    lat: number;
    lng: number;
    label?: string;
    draggable?: boolean;
}

ma​​p.component.html

<agm-map [latitude]="lat" [longitude]="lng" [scrollwheel]="false" [zoom]="zoom" (mapClick)="mapClicked($event)" (mapReady)="mapReady($event)">
      <agm-marker *ngIf="m" [latitude]="m.lat" [longitude]="m.lng" ></agm-marker>
    </agm-map>

关于如何在 Angular 6 中导入 js 的更新

我上面的工作示例代码使用的是 Angular 5。但是 Angular 6 以后的 CLI 项目使用 angular.json 而不是 .angular-cli.json 进行构建和项目配置。

Ref - How to use external JS files in Angular 6 了解如何在 Angular 6 中使用外部 js 文件。

【讨论】:

  • 我不明白他为什么要复制src文件夹中的js文件???他可能只是链接到 node_modules 文件夹中的文件。无论如何,此方法已被 OP 标记为无效。
  • @Mehdi Benmoha - 如果该库可作为节点模块使用,并且您可以将其安装为节点模块,那么应该没有任何问题。重要的是您必须能够将其导入到您的组件中,以便您可以在代码中使用它。如果它只是一个文件,那么您也可以将其保存在 src 文件夹或其任何子文件夹中,并且可以将其与 .angular-cli.json 一起使用。主要目标是您应该能够访问组件中的var nitevar google.maps.Map
  • 我在答案中粘贴的代码是我机器上的工作代码。
  • @vsoni 以备将来参考
  • @Vladimir_314159 - 您可以在初始化后在 mapReady($event: any) 函数中使用 setInterval(function, delay); 来重复执行。参考 - stackoverflow.com/questions/3138756/… 了解更多详情。
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多