@@ -7,6 +7,8 @@ import {Globe as GlobusGlobe, GlobusRgbTerrain, OpenStreetMap, Bing} from "@open
7
7
import { EventCallback } from "@openglobus/og/lib/Events" ;
8
8
import { IGlobeParams } from "@openglobus/og/lib/Globe" ;
9
9
import { Layer , Vector } from "@/layer" ;
10
+ import { Extent , LonLat } from "@openglobus/og" ;
11
+ import type { NumberArray4 } from "@openglobus/og/lib/math/Vec4" ;
10
12
11
13
type LayerChildren = React . ReactElement < { type : typeof Layer | typeof Vector } > ;
12
14
@@ -15,16 +17,33 @@ export interface GlobusProps extends IGlobeParams {
15
17
atmosphereEnabled ?: boolean ,
16
18
sunActive ?: boolean ,
17
19
onDraw ?: EventCallback
20
+ viewExtent ?: Extent | NumberArray4 ;
18
21
}
19
22
20
23
const Globe : React . FC < GlobusProps > = ( { children, onDraw, ...rest } ) => {
21
24
const targetRef = useRef < HTMLDivElement | null > ( null ) ;
22
25
const { setGlobe} = useGlobeContext ( ) ;
23
26
const [ options , setOptions ] = useState < IGlobeParams > ( rest ) ;
24
27
const gRef = useRef < GlobusGlobe | null > ( null ) ;
28
+
29
+ useEffect ( ( ) => {
30
+ if ( gRef && gRef . current && rest . viewExtent !== undefined ) {
31
+ const extent = rest . viewExtent instanceof Extent
32
+ ? rest . viewExtent
33
+ : new Extent (
34
+ new LonLat ( rest . viewExtent [ 0 ] , rest . viewExtent [ 1 ] ) ,
35
+ new LonLat ( rest . viewExtent [ 2 ] , rest . viewExtent [ 3 ] )
36
+ ) ;
37
+ gRef . current . planet . viewExtent ( extent ) ;
38
+ }
39
+ } , [ rest . viewExtent ] ) ;
40
+
25
41
useEffect ( ( ) => {
26
- if ( gRef && gRef . current && rest . atmosphereEnabled !== undefined ) gRef . current . planet . atmosphereEnabled = rest . atmosphereEnabled ;
42
+ if ( gRef && gRef . current && rest . atmosphereEnabled !== undefined ) {
43
+ gRef . current . planet . atmosphereEnabled = rest . atmosphereEnabled ;
44
+ }
27
45
} , [ rest . atmosphereEnabled ] ) ;
46
+
28
47
useEffect ( ( ) => {
29
48
if ( gRef && gRef . current && rest . sunActive !== undefined ) {
30
49
if ( rest . sunActive ) {
@@ -34,29 +53,17 @@ const Globe: React.FC<GlobusProps> = ({children, onDraw, ...rest}) => {
34
53
}
35
54
}
36
55
} , [ rest . sunActive ] ) ;
56
+
37
57
useEffect ( ( ) => {
38
58
if ( ! gRef . current ) {
39
59
const osm = new OpenStreetMap ( "OSM" ) ;
40
-
41
- function toQuadKey ( x : number , y : number , z : number ) : string {
42
- var index = '' ;
43
- for ( var i = z ; i > 0 ; i -- ) {
44
- var b = 0 ;
45
- var mask = 1 << ( i - 1 ) ;
46
- if ( ( x & mask ) !== 0 ) b ++ ;
47
- if ( ( y & mask ) !== 0 ) b += 2 ;
48
- index += b . toString ( ) ;
49
- }
50
- return index ;
51
- }
52
-
53
60
const sat = new Bing ( "Microsoft Bing" ) ;
54
61
55
62
gRef . current = new GlobusGlobe ( {
56
63
target : targetRef . current ! ,
57
64
name : 'Earth' ,
58
65
terrain : new GlobusRgbTerrain ( ) ,
59
- layers : [ osm , sat ] ,
66
+ layers : [ osm , sat ] ,
60
67
autoActivate : true ,
61
68
atmosphereEnabled : true ,
62
69
...options
@@ -70,10 +77,13 @@ const Globe: React.FC<GlobusProps> = ({children, onDraw, ...rest}) => {
70
77
71
78
setGlobe ( gRef . current ) ;
72
79
return ( ) => {
73
- if ( onDraw )
74
- gRef . current ?. planet . events . off ( 'draw' , onDraw )
75
- gRef . current ?. destroy ( ) ;
76
- gRef . current = null ;
80
+ if ( gRef . current ) {
81
+ if ( onDraw ) {
82
+ gRef . current . planet . events . off ( 'draw' , onDraw )
83
+ }
84
+ gRef . current . destroy ( ) ;
85
+ gRef . current = null ;
86
+ }
77
87
} ;
78
88
} , [ options ] ) ;
79
89
0 commit comments