-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Expand file tree
/
Copy pathgoogle-maps-component.tsx
More file actions
94 lines (85 loc) · 2.72 KB
/
Copy pathgoogle-maps-component.tsx
File metadata and controls
94 lines (85 loc) · 2.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// deck.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import React, {useEffect, useMemo} from 'react';
import {APIProvider, Map as GoogleMap, useMap} from '@vis.gl/react-google-maps';
import {GoogleMapsOverlay} from '@deck.gl/google-maps';
import type {Config, InitialViewState} from '../../types';
import {getBaseMapViewState} from '../../config';
// Google Maps DeckGL Overlay
function GoogleMapsDeckOverlay({
layers,
interleaved,
useDevicePixels,
onViewStateChange
}: {
layers: any[];
interleaved: boolean;
useDevicePixels?: boolean | number;
onViewStateChange?: (vs: InitialViewState) => void;
}) {
const map = useMap();
const overlay = useMemo(
() => new GoogleMapsOverlay({interleaved, useDevicePixels}),
[interleaved, useDevicePixels]
);
useEffect(() => {
if (map) {
overlay.setMap(map);
// Listen to camera changes
if (onViewStateChange) {
const listener = map.addListener('bounds_changed', () => {
const center = map.getCenter();
if (center) {
onViewStateChange({
latitude: center.lat(),
longitude: center.lng(),
zoom: map.getZoom() || 0,
bearing: map.getHeading() || 0,
pitch: map.getTilt() || 0
});
}
});
return () => {
google.maps.event.removeListener(listener);
overlay.finalize();
};
}
}
return () => overlay.finalize();
}, [map, overlay, onViewStateChange]);
overlay.setProps({layers});
return null;
}
type GoogleMapsComponentProps = {
config: Config;
};
export default function GoogleMapsComponent({config}: GoogleMapsComponentProps) {
// eslint-disable-next-line no-process-env
const apiKey = process.env.GoogleMapsAPIKey!;
// eslint-disable-next-line no-process-env
const mapId = process.env.GoogleMapsMapId || 'DEMO_MAP_ID';
const {initialViewState, layers, interleaved, useDevicePixels, onViewStateChange} = config;
const viewState = getBaseMapViewState(initialViewState);
return (
<div style={{width: '100%', height: '100%'}}>
<APIProvider apiKey={apiKey} version="weekly">
<GoogleMap
defaultCenter={{lat: viewState.latitude, lng: viewState.longitude}}
defaultZoom={viewState.zoom}
defaultHeading={viewState.bearing || 0}
defaultTilt={viewState.pitch || 0}
mapId={mapId}
style={{width: '100%', height: '100%'}}
>
<GoogleMapsDeckOverlay
layers={layers}
interleaved={interleaved}
useDevicePixels={useDevicePixels}
onViewStateChange={onViewStateChange}
/>
</GoogleMap>
</APIProvider>
</div>
);
}