ThinkGeo.com    |     Documentation    |     Premium Support

NOAA radar layer and updating/threading

Hello,



I am playing around with the NoaaRadarRasterLayer.  It is a great addition, and I look forward to adding it to our project.  I do have a question about updating the map:



I have added a handler for the .RadarUpdated event



AddHandler NoaaRadarMonitor.RadarUpdated, AddressOf Me.NOAAMonitor_RadarUpdated



but, due to my lack of treading knowledge, I’m not sure how to get the map to draw the new radar image when this event fires.  If I try to .Refresh the layer, there are errors about not being on the same thread.  I’m sure the answer is simple, just not sure what it is.



Thanks,

Dib


Also, I can get the radar to show just fine, but similar code to show the NOAA warnings and the weather stations is not working.  The layers are added internally, but nothing is showing up on the map. 
  
 Here is the NOAA warnings code: 
  
         Dim layerNOAAAdvisories As New NoaaWeatherWarningsFeatureLayer 
  
         If Me._NOAALayer Is Nothing Then 
             Me._NOAALayer = New LayerOverlay 
             Me._NOAALayer.Name = "NOAAOverlayLayer" 
         End If 
  
         NoaaWeatherWarningsMonitor.StartMonitoring() 
  
         Me._NOAALayer.Layers.Add(layerName, layerNOAAAdvisories) 
         If Not Me.Map.Overlays.Contains("NOAAOverlayLayer") Then Me.Map.Overlays.Add("NOAAOverlayLayer", Me._NOAALayer) 
         Me.Map.Refresh() 
  


Hi Dib, 
  
 Thanks for let us know your question. 
  
 In fact the NOAA layers haven’t been supportted so well for DesktopEdition, it designed for WPF edition now, so it have some issues like cross thread exception. 
  
 Because the sturcture is not the same, I think we will keep optimize that to make it work well for DesktopEdition, but for now, please choose the workaround like this: 
  
  
 private delegate void CrossThreadOperationControl();
        CrossThreadOperationControl CrossDelete;

        private void DisplayMap_Load(object sender, EventArgs e)
        {
            CrossDelete = delegate()
            {
                winformsMap1.Refresh(winformsMap1.Overlays[“NOAAOverlay”]);
            };

            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
            winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);

            WorldMapKitWmsDesktopOverlay worldMapKitDesktopOverlay = new WorldMapKitWmsDesktopOverlay();
            winformsMap1.Overlays.Add(worldMapKitDesktopOverlay);

            NoaaRadarRasterLayer noaaRasterLayer = new NoaaRadarRasterLayer();
            //NoaaWeatherWarningsFeatureLayer noaaRasterLayer = new NoaaWeatherWarningsFeatureLayer();
            //NoaaWeatherStationFeatureLayer noaaRasterLayer = new NoaaWeatherStationFeatureLayer();
            noaaRasterLayer.Open();
            LayerOverlay weatherOverlay = new LayerOverlay();
            weatherOverlay.Layers.Add(noaaRasterLayer);

            NoaaRadarMonitor.RadarUpdated += Monitor_Updated;
            //NoaaWeatherWarningsMonitor.WarningsUpdated += Monitor_Updated;            
            //NoaaWeatherStationMonitor.StationsUpdated += Monitor_Updated;            

            winformsMap1.Overlays.Add(“NOAAOverlay”, weatherOverlay);
            winformsMap1.CurrentExtent = new RectangleShape(-139.2, 92.4, 120.9, -93.2);
            winformsMap1.Refresh();
        }

        void Monitor_Updated(object sender, EventArgs e)
        {
            winformsMap1.Invoke(CrossDelete);
        }
 
  
 BTW, I found today the NoaaWeatherWarningsFeatureLayer and NoaaWeatherStationFeatureLayer don’t work correct, I have let our developer knows that. I think they will solve it. 
  
 Regards, 
  
 Don

Don, 
  
 Tweaked the code above, and the update is working as expected.  Thanks. 
  
 Looking forward to the other two layers working.  I played with the warnings layer a few months ago and had it displaying, so I surprised it isn’t now.  Never could get the weather stations to work properly yet. 
  
 Thanks, 
 Dib

Hi Dib, 
  
 I am glad to hear that works for you. 
  
 For the other two layers, I think some API should changed, because they works well before. 
  
 I will let you know if developer fixed that. 
  
 Regards, 
  
 Don

We do have a request for the radar layer: can you add a timestamp of when the radar image was taken, most likely in the NoaaRadarMonitor object?  We would like to be able to display the time of the radar snapshot.

Hi Dib, 
  
 Do you meant you want to record when we start download radar image? 
  
 I think use the event RadarUpdating and RadarUpdated can implement that. 
  
 Regards, 
  
 Don

What we are looking for is a little different.  When you loop the radar on weather.com, or on your phone or tablet, at the bottom of the radar there is a timestamp for when the that radar image was taken.  They usually loop in 5 minute increments.  It would be helpful to have the timestamp of when the radar image was taken somewhere with the image.  It seems like something you will need once you implement the looping feature.

Hi Dib, 
  
 I view the weather.com(weather.com/weather/map/CHXX0016) and it looks the timestamp should be the black text block on the bottom of the map for example: “1:00 pm Local Oct 24”. Is that what you want to be get from our NoaaRadarMonitor? If so, I will let our developer knows that, but it maybe related with public API change and I think it won’t be enhancement quickly. 
  
 If you need that now, you should want to request this information from NOOA server now. 
  
 And I maybe misunderstand about NoaaWeatherWarningsFeatureLayer and NoaaWeatherStationFeatureLayer, one of our developer mentioned that both layers need to cache more than 10 MB data to local when you first run it, you need to wait around several minutes, based on your internet. So could you wait for some minitues and try them again? 
  
 Regards, 
  
 Don

So if I have users turning those layers on, they will need to wait for everything to download?  That might make it impractical for our application.  Thanks for the info. 


And yes, that is the timestamp we would like to have.  We can just use the RadarUpdated event to timestamp it for now, but having the ‘official’ time would be helpful, especially when the looping is in place.  
  
 Thanks

Don, 
  
   We have the official time stamp based on the where we pull the files and process them.  I’ll look and send you over where it might be. 
  
 David

Dib, 
  
   I added the timestamp to the RadarUpdatedNoaaRadarMonitorEventArgs event so when we get done fetching the image we raise the event and in the event we have a new property celled ImageData you can get.  This corresponds to the create date of the image file from NOAA.  You can get this in the next build tomorrow or Monday.  Note that there is a little change to the way the weather radar looks and it has to do with some raster library changes we made.  If it looks funky just hold on while we fix it.  It doesn’t look terrible but not exactly what it used to. 
  
 David

Thanks guys, I look forward to checking it out.

Downloaded 8.0.162.0, here is what I’m seeing 
  
 The .RadarUpdated event doesn’t seem to be firing.  It fires with 8.0.0.162, and also in 8.0.0.136, which is what I had been running up to today.  Since it does not fire, I cannot access the .ImageDate value.  In contrast, the .RadarUpdating event fires off at 3 second intervals in all 3 builds. 
  
 If you need anything else, let me know. 
  
 Thanks 


Hi Dib,



I guess we are unable to reproduce the problem on our end,with several versions you mentioned,here as following are the code we tried, please take a look at it and see if it works on your end:




public DisplayShapeMap()
{
    InitializeComponent();
}
 
private delegate void CrossThreadOperationControl();
CrossThreadOperationControl CrossDelete;
 
private void DisplayMap_Load(object sender, EventArgs e)
{
    CrossDelete = delegate()
    {
        winformsMap1.Refresh(winformsMap1.Overlays["NOAAOverlay"]);
    };
 
    winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
    winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
 
    WorldMapKitWmsDesktopOverlay worldMapKitDesktopOverlay = new WorldMapKitWmsDesktopOverlay();
    winformsMap1.Overlays.Add(worldMapKitDesktopOverlay);
 
    NoaaRadarRasterLayer noaaRasterLayer = new NoaaRadarRasterLayer();
    noaaRasterLayer.Open();
    LayerOverlay weatherOverlay = new LayerOverlay();
    weatherOverlay.Layers.Add(noaaRasterLayer);
 
    NoaaRadarMonitor.RadarUpdated += Monitor_Updated;           
 
    winformsMap1.Overlays.Add("NOAAOverlay", weatherOverlay);
    winformsMap1.CurrentExtent = new RectangleShape(-139.2, 92.4, 120.9, -93.2);
    winformsMap1.Refresh();
}
 
void Monitor_Updated(object sender, EventArgs e)
{
    winformsMap1.Invoke(CrossDelete);
}

Thanks,

Johnny

I’m still seeing the same thing.  In 8.0.0.162, the NoaaRadarMonitor.RadarUpdated event fires off.  However, the e (as RadarUpdatedNoaaRadarMonitorEventArgs) object is empty.   Using 8.0.162.0, the updated event never fires. 



One difference in your posted code: 



The line NoaaRadarMonitor.RadarUpdated += Monitor_Updated; produces an error about calling an event.  Not sure how you get this to run, as it won’t let me compile with that line. 



Here is the code that I’m using to put the radar in place: 



'added for ThinkGeo layers for radar, NOAA weather warnings, and weather stations updating 

Private Delegate Sub CrossThreadOperationControl() 

Private CrossDelete As CrossThreadOperationControl 

Private _radarOn As Boolean = False 

Private _radarDownloadTime As Date 

Private _NOAAOverlay As LayerOverlay = Nothing 



Public Sub ShowRadarLayer() 



Dim layerName As String = “NOAARadarLayer” 



If Me.Map.Overlays.Contains(OVERLAY_NOAA) Then 



If Me._NOAAOverlay.Layers.Contains(layerName) Then 



Me._NOAAOverlay.Layers(layerName).IsVisible = Not Me._NOAAOverlay.Layers(layerName).IsVisible 



If Me._NOAAOverlay.Layers(layerName).IsVisible Then 

NoaaRadarMonitor.StartMonitoring() 

Me._radarOn = True 

Me._radarDownloadTime = Now 

Else 

NoaaRadarMonitor.StopMonitoring() 

Me._radarOn = False 

End If 



Return 



End If 

End If 



Dim layerNOAARadar As New NoaaRadarRasterLayer 

layerNOAARadar.Open() 

layerNOAARadar.Transparency = 150 



Me._NOAAOverlay.Layers.Add(layerName, layerNOAARadar) 

If Not Me.Map.Overlays.Contains(OVERLAY_NOAA) Then Me.Map.Overlays.Add(OVERLAY_NOAA, Me._NOAAOverlay) 

Me._radarOn = True 

Me._radarDownloadTime = Now 



End Sub 



Private Sub UpdateRadarInformation() 



Select Case True 

Case activeStorms.Display AndAlso activeStorms.HasSelectedStorm AndAlso Not activeStorms.SelectedStorm.SelectedAdvisory Is Nothing 

Me.ShowLegends(activeStorms.SelectedStorm.SelectedAdvisory, True) 

Case activeStorms.Display AndAlso activeStorms.HasSelectedStorm AndAlso activeStorms.SelectedStorm.SelectedAdvisory Is Nothing 

Me.ShowLegends(Nothing, True) 

Case activeStorms.Display AndAlso Not activeStorms.HasSelectedStorm 

Me.ShowLegends(Nothing, True) 

End Select 



Me.Map.Refresh(Me.Map.Overlays(OVERLAY_NOAA)) 

Me.Map.Refresh(Me.Map.AdornmentOverlay) 



End Sub 



Private Sub HookUpRadarRefresh(ByVal sender As Object, ByVal e As EventArgs) 



CrossDelete = Sub() Me.UpdateRadarInformation() 

AddHandler NoaaRadarMonitor.RadarUpdated, AddressOf Monitor_Updated 

AddHandler NoaaRadarMonitor.RadarUpdating, AddressOf Moniter_Updating 



End Sub 



Private Sub Monitor_Updated(ByVal sender As Object, ByVal e As RadarUpdatedNoaaRadarMonitorEventArgs) 

Me._radarDownloadTime = Now 'e.ImageDate 

Me.Map.Invoke(CrossDelete) 

End Sub 



Private Sub Moniter_Updating(ByVal sender As Object, ByVal e As RadarUpdatingNoaaRadarMonitorEventArgs) 



End Sub

Actually, when using 8.0.162.0, I am no longer seeing the radar image on the map.  When I’m switching back and forth between the two builds, I am referencing different versions of DesktopEdition and MapSuiteCore.

Hi Dib,



Thanks for the further information and it is bug in development version. Now, we have fixed it in 8.0.168.0.

But I checked the dailybuild, looks like our daily build server have some issues and results to the latest dll packages are not visible, would you please wait a day so that we can restart our server and rebuild them?



Thanks,

Troy

Troy, 
  
 Using 8.0.173.0, the radar image and timestamp look good.  Thanks! 
  
 When will this be incorporated into the production build?