@@ -273,6 +273,20 @@ class ProjectionBase(Formatoption):
273273 #'vertical_perspective', # not available for cartopy
274274 ]
275275
276+ def transform_lonlatbox (self , value ):
277+ """Transform a lon-lat-box to the specific projection"""
278+ value = np .asarray (value )
279+ transformed = self .projection .transform_points (
280+ ccrs .PlateCarree (), value [:2 ], value [2 :]
281+ )[..., :2 ]
282+ value [:2 ] = transformed [..., 0 ]
283+ value [2 :] = transformed [..., 1 ]
284+ if value [0 ] == value [1 ] and isinstance (
285+ self .projection , ccrs .PlateCarree
286+ ):
287+ value [1 ] += 360
288+ return value
289+
276290 @property
277291 def cf_projection (self ):
278292 data = next (self .iter_data )
@@ -514,12 +528,17 @@ class Projection(ProjectionBase):
514528
515529 dependencies = ['clon' , 'clat' ]
516530
517- connections = ['transform' ]
531+ connections = ['transform' , 'lonlatbox' ]
518532
519533 def __init__ (self , * args , ** kwargs ):
520534 super (Projection , self ).__init__ (* args , ** kwargs )
521535 self .projection = None
522536
537+ @property
538+ def lonlatbox_transformed (self ):
539+ """Transform the lonlatbox according to the projection"""
540+ return self .transform_lonlatbox (self .lonlatbox .lonlatbox )
541+
523542 def initialize_plot (self , value , clear = True ):
524543 """Initialize the plot and set the projection for the axes
525544 """
@@ -715,15 +734,7 @@ class LonLatBox(BoxBase):
715734
716735 @property
717736 def lonlatbox_transformed (self ):
718- value = np .asarray (self .lonlatbox )
719- transformed = self .transform .projection .transform_points (
720- ccrs .PlateCarree (), value [:2 ], value [2 :])[..., :2 ]
721- value [:2 ] = transformed [..., 0 ]
722- value [2 :] = transformed [..., 1 ]
723- if value [0 ] == value [1 ] and isinstance (self .transform .projection ,
724- ccrs .PlateCarree ):
725- value [1 ] += 360
726- return value
737+ return self .transform .transform_lonlatbox (self .lonlatbox )
727738
728739 def data_dependent (self , data , set_data = True ):
729740 if isinstance (data , InteractiveList ):
@@ -1927,9 +1938,12 @@ class MapDensity(psyps.Density):
19271938 --------------
19281939 %(Density.possible_types)s"""
19291940
1941+ dependencies = psyps .Density .dependencies + ["projection" ]
1942+
19301943 def _set_quiver_density (self , value ):
19311944 if all (val == 1.0 for val in value ):
19321945 self .plot ._kwargs .pop ('regrid_shape' , None )
1946+ self .plot ._kwargs .pop ('target_extent' , None )
19331947 elif self .decoder .is_unstructured (self .raw_data ):
19341948 warnings .warn ("Quiver plot of unstructered data does not support "
19351949 "the density keyword!" , RuntimeWarning )
@@ -1940,6 +1954,8 @@ def _set_quiver_density(self, value):
19401954 shape = self .data .shape [- 2 :]
19411955 value = map (int , [value [0 ]* shape [0 ], value [1 ]* shape [1 ]])
19421956 self .plot ._kwargs ['regrid_shape' ] = tuple (value )
1957+ lonlatbox = self .projection .lonlatbox_transformed
1958+ self .plot ._kwargs ["target_extent" ] = lonlatbox
19431959
19441960 def _unset_quiver_density (self ):
19451961 self .plot ._kwargs .pop ('regrid_shape' , None )
0 commit comments