@@ -166,11 +166,15 @@ class TileLayer extends Layer {
166
166
* @return {Size }
167
167
*/
168
168
getTileSize ( ) {
169
+ if ( this . _tileSize ) {
170
+ return this . _tileSize ;
171
+ }
169
172
let size = this . options [ 'tileSize' ] ;
170
173
if ( isNumber ( size ) ) {
171
174
size = [ size , size ] ;
172
175
}
173
- return new Size ( size ) ;
176
+ this . _tileSize = new Size ( size ) ;
177
+ return this . _tileSize ;
174
178
}
175
179
176
180
/**
@@ -430,7 +434,7 @@ class TileLayer extends Layer {
430
434
return result ;
431
435
} ) ;
432
436
// const innerExtent2D = this._getInnerExtent(z, containerExtent, extent2d)._add(offset);
433
- extent2d . _add ( offset ) ;
437
+ // extent2d._add(offset);
434
438
435
439
const maskExtent = this . _getMask2DExtent ( ) ;
436
440
if ( maskExtent ) {
@@ -442,20 +446,21 @@ class TileLayer extends Layer {
442
446
}
443
447
//Get description of center tile including left and top offset
444
448
const prjCenter = map . _containerPointToPrj ( containerExtent . getCenter ( ) , TEMP_POINT0 ) ;
445
- const centerPoint = map . _prjToPoint ( prjCenter , undefined , TEMP_POINT1 ) ;
449
+ const centerPoint = map . _prjToPoint ( prjCenter , zoom , TEMP_POINT1 ) ;
446
450
let c ;
447
451
if ( hasOffset ) {
448
- c = this . _project ( map . _pointToPrj ( centerPoint . _add ( offset ) , undefined , TEMP_POINT1 ) , TEMP_POINT1 ) ;
452
+ c = this . _project ( map . _pointToPrj ( centerPoint . _add ( offset ) , zoom , TEMP_POINT1 ) , TEMP_POINT1 ) ;
449
453
} else {
450
454
c = this . _project ( prjCenter , TEMP_POINT1 ) ;
451
455
}
452
456
453
- TEMP_POINT2 . x = extent2d . xmin ;
454
- TEMP_POINT2 . y = extent2d . ymax ;
455
- TEMP_POINT3 . x = extent2d . xmax ;
456
- TEMP_POINT3 . y = extent2d . ymin ;
457
- const pmin = this . _project ( map . _pointToPrj ( TEMP_POINT2 , undefined , TEMP_POINT2 ) , TEMP_POINT2 ) ;
458
- const pmax = this . _project ( map . _pointToPrj ( TEMP_POINT3 , undefined , TEMP_POINT3 ) , TEMP_POINT3 ) ;
457
+ const extentScale = map . getGLScale ( ) / map . getGLScale ( zoom ) ;
458
+ TEMP_POINT2 . x = extent2d . xmin * extentScale ;
459
+ TEMP_POINT2 . y = extent2d . ymax * extentScale ;
460
+ TEMP_POINT3 . x = extent2d . xmax * extentScale ;
461
+ TEMP_POINT3 . y = extent2d . ymin * extentScale ;
462
+ const pmin = this . _project ( map . _pointToPrj ( TEMP_POINT2 . _add ( offset ) , zoom , TEMP_POINT2 ) , TEMP_POINT2 ) ;
463
+ const pmax = this . _project ( map . _pointToPrj ( TEMP_POINT3 . _add ( offset ) , zoom , TEMP_POINT3 ) , TEMP_POINT3 ) ;
459
464
460
465
const centerTile = tileConfig . getTileIndex ( c , res , repeatWorld ) ;
461
466
const ltTile = tileConfig . getTileIndex ( pmin , res , repeatWorld ) ;
@@ -471,6 +476,7 @@ class TileLayer extends Layer {
471
476
const renderer = this . getRenderer ( ) || parentRenderer ,
472
477
scale = this . _getTileConfig ( ) . tileSystem . scale ;
473
478
const tiles = [ ] , extent = new PointExtent ( ) ;
479
+ const tilePoint = new Point ( 0 , 0 ) ;
474
480
for ( let i = - top ; i <= bottom ; i ++ ) {
475
481
let j = - left ;
476
482
let leftVisitEnd = - Infinity ;
@@ -496,8 +502,9 @@ class TileLayer extends Layer {
496
502
497
503
let p ;
498
504
if ( tileInfo ) {
499
- const { point } = tileInfo ;
500
- p = point ;
505
+ const { extent2d } = tileInfo ;
506
+ tilePoint . set ( extent2d . xmin , extent2d . ymax ) ;
507
+ p = tilePoint ;
501
508
} else if ( ! this . _hasOwnSR ) {
502
509
p = tileConfig . getTilePointNW ( idx . x , idx . y , res ) ;
503
510
// const pnw = tileConfig.getTilePrjNW(idx.x, idx.y, res);
@@ -530,35 +537,35 @@ class TileLayer extends Layer {
530
537
531
538
532
539
const tileExtent = tileInfo && tileInfo . extent2d || new PointExtent ( p . x , p . y - height , p . x + width , p . y ) ;
533
- if ( hasOffset ) {
534
- tileExtent . set ( p . x , p . y - height , p . x + width , p . y ) ;
535
- tileExtent . _sub ( offset ) ;
536
- }
537
- if ( allCount <= 4 || rightVisitEnd || this . _isTileInExtent ( frustumMatrix , tileExtent , glScale ) ) {
540
+ // if (hasOffset) {
541
+ // tileExtent.set(p.x, p.y - height, p.x + width, p.y);
542
+ // }
543
+ if ( allCount <= 4 || rightVisitEnd || this . _isTileInExtent ( frustumMatrix , tileExtent , offset , glScale ) ) {
538
544
if ( this . _visitedTiles && cascadeLevel === 0 ) {
539
545
this . _visitedTiles . add ( tileId ) ;
540
546
}
541
547
if ( cascadeLevel === 0 ) {
542
- tileExtent . _add ( offset ) ;
543
- this . _splitTiles ( frustumMatrix , tiles , renderer , idx , z + 1 , tileExtent , dx , dy , tileOffsets ) ;
544
- tileExtent . _sub ( offset ) ;
548
+ this . _splitTiles ( frustumMatrix , tiles , renderer , idx , z + 1 , tileExtent , dx , dy , tileOffsets , parentRenderer ) ;
545
549
extent . _combine ( tileExtent ) ;
546
550
} else {
547
551
if ( ! tileInfo ) {
548
552
tileInfo = {
549
553
//reserve point caculated by tileConfig
550
554
//so add offset because we have p._sub(offset) and p._add(dx, dy) if hasOffset
551
- 'point' : p ,
552
555
'z' : z ,
553
556
'x' : idx . x ,
554
557
'y' : idx . y ,
555
- 'extent2d' : tileExtent ,
556
- 'mask' : cascadeLevel ,
557
- 'size' : [ width , height ] ,
558
+ 'extent2d' : tileExtent ,
559
+ 'offset' : offset ,
558
560
'id' : tileId ,
559
- 'layer' : this . getId ( ) ,
560
- 'url' : this . getTileUrl ( idx . x , idx . y , zoom )
561
+ 'url' : this . getTileUrl ( idx . x , idx . y , z )
561
562
} ;
563
+ if ( parentRenderer ) {
564
+ tileInfo [ 'layer' ] = this . getId ( ) ;
565
+ }
566
+ } else {
567
+ tileInfo . offset [ 0 ] = offset [ 0 ] ;
568
+ tileInfo . offset [ 1 ] = offset [ 1 ] ;
562
569
}
563
570
tiles . push ( tileInfo ) ;
564
571
extent . _combine ( tileExtent ) ;
@@ -579,19 +586,23 @@ class TileLayer extends Layer {
579
586
if ( tiles . length ) {
580
587
//sort tiles according to tile's distance to center
581
588
const center = map . _containerPointToPoint ( containerExtent . getCenter ( ) , z , TEMP_POINT ) . _add ( offset ) ;
589
+ const point0 = new Point ( 0 , 0 ) ;
590
+ const point1 = new Point ( 0 , 0 ) ;
582
591
tiles . sort ( function ( a , b ) {
583
- return a . point . distanceTo ( center ) - b . point . distanceTo ( center ) ;
592
+ point0 . set ( ( a . extent2d . xmin + a . extent2d . xmax ) / 2 , ( a . extent2d . ymin + a . extent2d . ymax ) / 2 ) ;
593
+ point1 . set ( ( b . extent2d . xmin + b . extent2d . xmax ) / 2 , ( b . extent2d . ymin + b . extent2d . ymax ) / 2 ) ;
594
+ return point0 . distanceTo ( center ) - point1 . distanceTo ( center ) ;
584
595
} ) ;
585
596
}
586
597
return {
587
- 'offset' : offset ,
598
+ 'offset' : offset ,
588
599
'zoom' : tileZoom ,
589
- 'extent' : extent ,
600
+ 'extent' : extent ,
590
601
'tiles' : tiles
591
602
} ;
592
603
}
593
604
594
- _splitTiles ( frustumMatrix , tiles , renderer , tileIdx , z , tileExtent , dx , dy , tileOffsets ) {
605
+ _splitTiles ( frustumMatrix , tiles , renderer , tileIdx , z , tileExtent , dx , dy , tileOffsets , parentRenderer ) {
595
606
// const hasOffset = offset[0] || offset[1];
596
607
const yOrder = this . _getTileConfig ( ) . tileSystem . scale . y ;
597
608
const glScale = this . getMap ( ) . getGLScale ( z ) ;
@@ -604,17 +615,17 @@ class TileLayer extends Layer {
604
615
const x = tileIdx . x * 2 ;
605
616
const y = tileIdx . y * 2 ;
606
617
607
- let tile = this . _checkAndAddTile ( frustumMatrix , renderer , idx , idy , x , y , z , 0 , 0 , w , h , corner , glScale , tileOffsets ) ;
618
+ let tile = this . _checkAndAddTile ( frustumMatrix , renderer , idx , idy , x , y , z , 0 , 0 , w , h , corner , glScale , tileOffsets , parentRenderer ) ;
608
619
if ( tile ) tiles . push ( tile ) ;
609
- tile = this . _checkAndAddTile ( frustumMatrix , renderer , idx , idy , x , y , z , 0 , 1 , w , h , corner , glScale , tileOffsets ) ;
620
+ tile = this . _checkAndAddTile ( frustumMatrix , renderer , idx , idy , x , y , z , 0 , 1 , w , h , corner , glScale , tileOffsets , parentRenderer ) ;
610
621
if ( tile ) tiles . push ( tile ) ;
611
- tile = this . _checkAndAddTile ( frustumMatrix , renderer , idx , idy , x , y , z , 1 , 0 , w , h , corner , glScale , tileOffsets ) ;
622
+ tile = this . _checkAndAddTile ( frustumMatrix , renderer , idx , idy , x , y , z , 1 , 0 , w , h , corner , glScale , tileOffsets , parentRenderer ) ;
612
623
if ( tile ) tiles . push ( tile ) ;
613
- tile = this . _checkAndAddTile ( frustumMatrix , renderer , idx , idy , x , y , z , 1 , 1 , w , h , corner , glScale , tileOffsets ) ;
624
+ tile = this . _checkAndAddTile ( frustumMatrix , renderer , idx , idy , x , y , z , 1 , 1 , w , h , corner , glScale , tileOffsets , parentRenderer ) ;
614
625
if ( tile ) tiles . push ( tile ) ;
615
626
}
616
627
617
- _checkAndAddTile ( frustumMatrix , renderer , idx , idy , x , y , z , i , j , w , h , corner , glScale , tileOffsets ) {
628
+ _checkAndAddTile ( frustumMatrix , renderer , idx , idy , x , y , z , i , j , w , h , corner , glScale , tileOffsets , parentRenderer ) {
618
629
const tileId = this . _getTileId ( idx + i , idy + j , z ) ;
619
630
if ( this . _visitedTiles && this . _visitedTiles . has ( tileId ) ) {
620
631
return null ;
@@ -625,27 +636,26 @@ class TileLayer extends Layer {
625
636
}
626
637
const yOrder = this . _getTileConfig ( ) . tileSystem . scale . y ;
627
638
const childExtent = new PointExtent ( corner . x + i * w , corner . y + yOrder * j * h , corner . x + ( i + 1 ) * w , corner . y + yOrder * ( j + 1 ) * h ) ;
628
- childExtent . _sub ( offset ) ;
629
639
if ( /*!rightVisitEnd && */
630
- ! this . _isSplittedTileInExtent ( frustumMatrix , childExtent , glScale ) ) {
640
+ ! this . _isSplittedTileInExtent ( frustumMatrix , childExtent , offset , glScale ) ) {
631
641
return null ;
632
642
}
633
- childExtent . _add ( offset ) ;
634
643
let tileInfo = renderer && renderer . isTileCachedOrLoading ( tileId ) ;
635
644
if ( ! tileInfo ) {
636
645
//reserve point caculated by tileConfig
637
646
//so add offset because we have p._sub(offset) and p._add(dx, dy) if hasOffset
638
647
tileInfo = {
639
- 'point' : new Point ( childExtent . xmin , childExtent . ymax ) ,
640
648
'z' : z ,
641
- 'x' : x + i ,
642
- 'y' : y + j ,
649
+ 'x' : x + i ,
650
+ 'y' : y + j ,
643
651
'extent2d' : childExtent ,
644
- 'size' : [ w , h ] ,
645
652
'id' : tileId ,
646
- 'layer ' : this . getId ( ) ,
653
+ 'offset ' : offset ,
647
654
'url' : this . getTileUrl ( x + i , y + j , z + this . options [ 'zoomOffset' ] )
648
655
} ;
656
+ if ( parentRenderer ) {
657
+ tileInfo [ 'layer' ] = this . getId ( ) ;
658
+ }
649
659
} else {
650
660
tileInfo = tileInfo . info ;
651
661
}
@@ -735,12 +745,12 @@ class TileLayer extends Layer {
735
745
return super . _bindMap . apply ( this , arguments ) ;
736
746
}
737
747
738
- _isTileInExtent ( frustumMatrix , tileExtent , glScale ) {
748
+ _isTileInExtent ( frustumMatrix , tileExtent , offset , glScale ) {
739
749
const map = this . getMap ( ) ;
740
750
741
751
let matrix ;
742
752
if ( frustumMatrix !== map . projViewMatrix ) {
743
- const tileCenter = tileExtent . getCenter ( TEMP_POINT6 ) . _multi ( glScale ) ;
753
+ const tileCenter = tileExtent . getCenter ( TEMP_POINT6 ) . _sub ( offset [ 0 ] , offset [ 1 ] ) . _multi ( glScale ) ;
744
754
vec3 . set ( ARR3 , tileCenter . x , tileCenter . y , 0 ) ;
745
755
const ndc = vec3 . transformMat4 ( ARR3 , ARR3 , map . projViewMatrix ) ;
746
756
//地图中心下方的瓦片与 map.projViewMatrix 比较
@@ -750,19 +760,19 @@ class TileLayer extends Layer {
750
760
matrix = map . projViewMatrix ;
751
761
}
752
762
753
- TILE_BOX [ 0 ] [ 0 ] = tileExtent . xmin * glScale ;
754
- TILE_BOX [ 0 ] [ 1 ] = tileExtent . ymin * glScale ;
755
- TILE_BOX [ 1 ] [ 0 ] = tileExtent . xmax * glScale ;
756
- TILE_BOX [ 1 ] [ 1 ] = tileExtent . ymax * glScale ;
763
+ TILE_BOX [ 0 ] [ 0 ] = ( tileExtent . xmin - offset [ 0 ] ) * glScale ;
764
+ TILE_BOX [ 0 ] [ 1 ] = ( tileExtent . ymin - offset [ 1 ] ) * glScale ;
765
+ TILE_BOX [ 1 ] [ 0 ] = ( tileExtent . xmax - offset [ 0 ] ) * glScale ;
766
+ TILE_BOX [ 1 ] [ 1 ] = ( tileExtent . ymax - offset [ 1 ] ) * glScale ;
757
767
return intersectsBox ( matrix , TILE_BOX ) ;
758
768
}
759
769
760
- _isSplittedTileInExtent ( frustumMatrix , tileExtent , glScale ) {
770
+ _isSplittedTileInExtent ( frustumMatrix , tileExtent , offset , glScale ) {
761
771
const map = this . getMap ( ) ;
762
- TILE_BOX [ 0 ] [ 0 ] = tileExtent . xmin * glScale ;
763
- TILE_BOX [ 0 ] [ 1 ] = tileExtent . ymin * glScale ;
764
- TILE_BOX [ 1 ] [ 0 ] = tileExtent . xmax * glScale ;
765
- TILE_BOX [ 1 ] [ 1 ] = tileExtent . ymax * glScale ;
772
+ TILE_BOX [ 0 ] [ 0 ] = ( tileExtent . xmin - offset [ 0 ] ) * glScale ;
773
+ TILE_BOX [ 0 ] [ 1 ] = ( tileExtent . ymin - offset [ 1 ] ) * glScale ;
774
+ TILE_BOX [ 1 ] [ 0 ] = ( tileExtent . xmax - offset [ 0 ] ) * glScale ;
775
+ TILE_BOX [ 1 ] [ 1 ] = ( tileExtent . ymax - offset [ 1 ] ) * glScale ;
766
776
return intersectsBox ( map . projViewMatrix , TILE_BOX ) ;
767
777
}
768
778
0 commit comments