ThinkGeo.com    |     Documentation    |     Premium Support

Redraw during Popup?

I have a problem with intermintent redraw of the map during a MapClick event that generates a popup.


it is pretty disturbing for the viewer, is there a way to get rid of it?


 


 




    Protected Sub Map1_Click(ByVal sender As Object, ByVal e As ThinkGeo.MapSuite.WebEdition.MapClickedEventArgs) Handles Map1.Click
        ' get the click position.

        Dim clickWorldPosition As PointShape = e.Position
        ' convert to screen point.
        Dim clickScreenPoint As ScreenPointF = Map1.ToScreenCoordinate(clickWorldPosition)

.
.
.
.
.
.


                Dim popup As CloudPopup
                If Map1.Popups.Count = 0 Then
            popup = New CloudPopup("Popup", e.Position, String.Empty, 200, 80, True, True)
                    popup.IsVisible = True
                    Map1.Popups.Add(popup)
                Else
                    popup = DirectCast(Map1.Popups("Popup"), CloudPopup)
            popup.Position = e.Position
            popup.IsVisible = True
                End If

                popup.ContentHtml = GetPopupContent(selectedFeatures)


    End Sub




Jakub, 
  
 Did you put the map within an UpdatePanel? It will not have any flicker if it is in. Please have a look at the sample GettingStarted->AddAMarker for detail. 
  
 Thanks, 
  
 Bai

Yes I have it in Update Panel. 
 It still redraws the map. 
 Could it be because I am using the GoogleMapsLayer? 
  
 Also, the Popup takes quite a while to render (>2seconds). The contents of the popup displays immediatelly, but on trasparent background and then the popup draws around it 2 seconds later. Looks wierd. Any way to prevent that? 


Jakub,


It should work fine even with GoogleMapLayer. Please have a look at the attached sample where you can find after putting the map within an undate panel, the map doesn't have any flicker when adding a popup.


Let me know if you have more issues.


Thanks,


Ben



1025-TestGoogleMap.zip (17.6 KB)

Yes, it works fine like that with no data. but when there are two shapefiles (50 polygons each) and several thousand markers on InMemoryFeatureLayer the map redraws on the first Map_Click event.  
 Also, as mentioned the Popup takes a  long time to render, any way to speed it up? 


Jakub, 
  
 Could you provide us what’s the content html of popup did you add? Is it Iframe or something? 
  
 Thanks, 
 Howard 


No iframe. The contents is pretty simple just three rows.


But it is not the content. That shows up immediatelly, it is the popup backround (yellow box) that takes forever to draw.


 



  Private Shared Function GetPopupContentPlume(ByVal features As Collection(Of Feature)) As String
        Dim content As String = ""
        Dim message As New StringBuilder()
        Dim messageInPopup As String = ""
        
        message.AppendFormat("Plume
")
        message.AppendFormat("<li>Plume ID : {0}</li>", features(0).ColumnValues("GWTPLU_ID").Trim())
        message.AppendFormat("<li>Haz Site : {0}</li>", features(0).ColumnValues("HAZSITE_ID").Trim())
        message.AppendFormat("<li>Plume : {0}</li>", features(0).ColumnValues("PLUME_D").Trim())

        messageInPopup = [String].Format("{0}", message.ToString())
        content = messageInPopup
       
        Return content
    End Function



Jakub,



The code is exactly right, but I cannot figure out the problem. 

Sorry, I need more information about this. 



1, What type of GeoPopup do you use?

2, How many Popups in your map in one viewport?

3, Could you send me some screenshot about the yellow box?

4, If it's possible, please send me a quick sample for me to recreate it.



We have an online sample which shows the popup background and content at the same time:

websamples.thinkgeo.com/webe...icked.aspx



Looking forward your feedback.



Thanks,

Howard



Hi,


here are your answers


1. Not sure what type of popup. I just took your sample code and used it. I guess it is a cloud popup. are there any other? This is the declaration: Dim popup as CloudPopup


2. I always have only one popup in the viewport. the redraw and slowness manifests only on the first popup anyway.


3. Screenshot below - the left screen was captured about a second after the shapefile was clicked. You can see that the data from the shapefile is already retrieved and displayed, but the map is redrawing and then the popup background will come another second after the redraw completed. Way too long.


4. not sure if i can condense it into a short sample. It is hooked up the SQL and shapefile data.


I started from the sample that you mentioned.


 




Hi Jakub, 
  
 I already know what you exactly mean. You are using CloudPopup. We also have CustomPopup which background can be transparent and its border is rectangle. You can make your own graphic as its background. But the disadvantage is that we don’t response for the style any more. For example the arrow and the round corner. It’s not easy to implement a popup like our current CloudPopup. 
  
 I think the popup shows slow because your web browser is busy on requesting images and delay the background of the popup. My solution is make the background image file length smaller so that the browser can download it fastly. The method is lower quality of the file which you can find at “[Installed Sample]\theme\default\img\cloud_popup_relative.gif”. Currently it’s 16.2K. 
  
 Another solution is more advanced. To show the popup without content html first. Use JavaScript to fill the html content asynchronizely. Hope you understand what I mean. 
  
 Any questions please let me know. 
  
 Thanks, 
 Howard

But that is what i am trying to prevent in the first place. The refresh of the base map (and reloading the images). The map is completely loaded before the Map_Click event and and it reloads on the first click ONLY, although it is in the update panel.  
 On the mapclick it should only load the data (which it does fast) and a simple popup background image (much smaller size that the data retrieved), yet it takes long time. 


Jakub, 
  
 I agree with you that 2 seconds takes too much time on the popup. I think your situation is general from the code you send to me. How do you think the speed in our online sample? Is it fast or not? If your situation is special, could you send me a sample to see how it works. Because as I tested, the popup is just a little slow (0.5 second delay) than the text loading. 
  
 Our map control mains many client states which needs to be synchronize to the server side. Even if you put it in the update panel, it only reduces the size to transfer which is outside the update panel but it cannot reduce the map control’s it self. 
  
 So if you can answer me the question above and send me some sample which 2 seconds delay. It will be great for me the figure out this issue. 
  
 Any questions please let me know. 
  
 Thanks, 
 Howard

Your sample deals with the static layers and GoogleOverlay map. My app is working with the Google map in the LayerOverlay, because you told me that is the only way to get it printed in the PDF. 
 that is where the speed problem is in my opinion. The map was not redrawing during MapClick until i switched it to the LayerOverlay. 
  
  


Jakub, 
  
 I see. So you change the GoogleOverlay to GoogleMapsLayer for printing into PDF. Now I have another idea for you that you can change back using GoogleOverlay and also can be printed. I think it’s just a trick which is maintaining a LayerOverlay that contains the googleMapsLayer and the other layers. But it doesn’t actually draw on the map. When click to print the map to PDF, we use the temporary LayerOverlay to print instead of the GoogleOverlay. 
  
 Hope it makes sense. Please let me know if there is any misunderstanding. 
  
 Thanks, 
 Howard

Does not make sense :) 
 Can you elaborate. 
 My understanding was that I can either load the base layer into a GoogleOvelray (does not print to PDF) or Layer overlay (prints to PDF)  
 As I need to be able to print to PDf I recoded everything to work with layer overlays. 
 what is the trick? 


Jakub, 
  
 Let me clarify this.  
 1. If you don’t need print, does GoogleOverlay satisfy your requirement? 
 2. If you don’t display the map, does GoogleMapsLayer satisfy your print requirement? 
  
 If both of the conditions are fine, my trick can implement your requirement by the following steps. 
 1. Add GoogleOverlay for displaying on the map as our normal use. 
 2. Click print button.  
 3. Create a new GoogleMapsLayer and a LayerOverlay 
 4. Remove the GoogleOverlay from map. 
 5. Add the new LayerOverlay into the map. 
 6. Print. 
 7. After print completed, re-add the GoogleOverlay back and remove the LayerOverlay. 
  
 In my option, GoogleOverlay is faster than GoogleMapsLayer and there is only one logo. 
  
 If there is any misunderstanding please point out. 
  
 Thanks, 
 Howard 


That could work. 
 Lots of swapping of overlays. I’ll see how fast it is. 
 thanks

Jakub, 
  
 Yes, I think it may confuse many people. And we are lacking of documentations of these APIs. Currently, we have code community which may add more and more customize projects; it’ll be easier for us to find our solutions in the future. 
  
 Thanks. Please let me know if you have more questions. 
 Howard

It worked, kind of. 
 Since I added just the Google LayerOverlay to existing overlays in the PDF_ButtonClick it ended up on top of all other overlays, covering them. 
 Is there a way to add it to the bottom? Or restack the ovelays. I would hate to have to remove all of them and re-add them as they are loaded from the database and shapefiles so performane would suffer. 
 thanks 
 jakub 


Hi Jakub, 
  
 LayerOverlay.Layers and Map.CustomOverlays are both collections. I think you can try to use Insert method to insert the layer or overlay in the bottom. For example: 
 Map1.CustomOverlays.Insert(0, overlay); 
  
 Please let me know if you have any questions. 
  
 Thanks, 
 Howard