ThinkGeo.com    |     Documentation    |     Premium Support

Zooming Twice loses stretch effect

Hi,


We are seeing an issue where sometimes when you are zooming, you lose the entire "zoomed in" image, so it just displays the background color (in our case blue).  I am able to recreate this almost everytime if you use the scroll wheel to zoom in one click, wait for it to start loading, then zoom in another click before the first is done loading.  It would be preferable if it kept the same image it currently had and zoomed it in rather than just displaying blue.  Is there any way I can achieve this?


Just for reference, I'm using all shapefiles with caching on (although it occurs when I'm in areas where there is no cached ares) using the tiling method of displaying.


Thanks,


.Ryan.



Ryan, are you using World Map Kit?  If so, Howard has come up with a solution that prevents this.  Tiles are being cleared before map gets a chance to render new tiles when you zoom between levels quickly.  Howard's solution keeps stretching the existing image till new ones are filled in and it works well.


If you are using World Map Kit, I will post this custom overlay here for your use.



Hi Klaus, 
  
 Thanks for your response.  Unfortunately we are using our own shapefiles… although it may be possible to adapt your code to work on a custom LayerOverlay that would fit my needs. 
  
 .Ryan.

Ryan, 
  
 We are trying to find the Howard’s solution, it works for World Map Kit, so it should be working with shapefiles. 
  
 I will let you know if we find it. 
  
 Btw, there is another thread might post the same problem with you, please keep an eye on it as well 
 gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/39/aft/8680/afv/topic/Default.aspx 
  
 Thanks, 
 James

 James, please confirm with Howard if it is OK for me to post his solution to this problem here.  Looking at the code further, it is a generic solution to this problem and not specifically for the World Map Kit. so Ryan can use it.  The related ticket number is 3192.


 



Ryan,


The attachment is the sample application that can be resolved your problem correctly, please check the solution also before you run the sample please reference the necessary dlls.


Thanks,


Scott,



CSharpSample.zip (19 KB)

Hi, 
  
 I’ve tried out your solution and it seems to mostly work.  You have the following line: 
  
 while (tempZoomLevelIndex > 0 && zoomLevelIndex - tempZoomLevelIndex < 5) 
  
 I believe this is saying if you’ve only zoomed in by 5 zoom levels… is there a reason that you limited it to 5? 
  
 Also, I ran into a case just once (haven’t been able to reproduce) where the stretched image didn’t get cleared… I don’t know if you have ran into this issue at all… I’ll do some more testing to see if I can reproduce and get a definite case. 
  
  
 Thanks for the help on this one! 
  
 .Ryan.

It is probably important to note that I changed that line I mentioned before to be 25 rather than 5 as I always want it to stretch.  I can definitely reproduce the stretched image not being removed, but I still haven’t figured out a way to reproduce it every time. 
  
 .Ryan.

Ryan, 
 I answered your questions one by one below: 
  
 1, The reason for the zoomlevel limitation:  
 while (tempZoomLevelIndex > 0 && zoomLevelIndex - tempZoomLevelIndex < 5 
 I think maybe you misunderstand the code above, that is not the limitation for zoomlevels, we just set the difference value for zoomlevel when drawing images for the current zoomlevel, it always gets the bitmap tiles for the up 5 zoomlevels so that the problem can be resolved correctly.  
  
 2, The stretched image clear problem: 
 In the sample what I sent to you works fine, I still cannot reproduce your problem exactly, are there any new changes in the sample? If not can you do a detailed test for this problem and give us your test steps so that we can reproduce the problem exactly? 
  
 Thanks, 
  
 Scott, 


Hi Scott,


In response:


1) I changed the code to say 


while (tempZoomLevelIndex > 0 && zoomLevelIndex - tempZoomLevelIndex < 25)


Because if you zoom in more than 5 zoom levels, you get your base background color (in my case blue) whereas I would still like to zoom in to my current image.  I've added some custom zoom levels so I have 25 different zoom levels.  Once I put it at 25, my image always stretched.


2) The only changes I did was extend from LayerOverlay rather than the WorldMapKitOverlay.  I've been able to get the stretched image to stay on my map with both that value set to 5 and 25... I get it most when I zoom box then while its loading zoom box again.  Other than extending from LayerOverlay, I made no other changes.  Just in case it helps, they only layers I'm using in the LayerOverlay is ShapeFileFeatureLayers.


 


.Ryan.



Ryan,


According to our investigations, we thought maybe the real problem is from the render time, when you were zooming twice, the drawing operation is timeout and the exception was not threw, so you always saw the stretched images, please add the following code to your sample application below:

 



   yourLayerOverlay.DrawingExceptionMode = DrawingExceptionMode.ThrowException;
            yourLayerOverlay.TimeoutInSeconds = 600;
As so far we still cannot reproduce your problem either used the WorldMapKitWmsWpfOverlay or LayerOverlay. So we thought this is the reason why your always encounter the streched images in your application, please add the code above to your application and try again, if there are not any exceptions throw out, please make a simple sample to us and it can reproduce your problem smoothly.


Thanks,


Scott,



I’ve downloaded the latest development build and can no longer reproduce the issue.  Thanks for your help!

Ryan, 
  
 You’re welcome, thanks for you mention that. 
  
 Let us know if you have more questions. 
  
 Thanks, 
 James

Hi guys, 
  
 I was wondering if this issue was resolved in the 5.0 release.  I just ran into an exception in the StretchingOverlay code you posted (I can’t recreate it)… so if I can use something built in, that’d be nice. 
  
 Exception info: 
 Object is currently in use elsewhere. 
  
  
    at System.Drawing.Image.Clone() 
    at ThinkGeo.MapSuite.Core.InMemoryBitmapTileCache.GetTileCore(Int64 row, Int64 column) 
    at ThinkGeo.MapSuite.Core.BitmapTileCache.GetTiles(RectangleShape worldExtent) 
    at FutureConcepts.GIS.MIM.Layers.BaseData.StretchingOverlay.CustomWorldMapKitOverlay_DrawnTile(Object sender, DrawnTileTileOverlayEventArgs e) in C:\Projects20\GIS\MIM\MIM\Layers\BaseData\StretchingOverlay.cs:line 100 
    at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.OnDrawnTile(DrawnTileTileOverlayEventArgs args) 
    at ThinkGeo.MapSuite.WpfDesktopEdition.TileOverlay.rhQ=(Object rxQ=, DrawnTileEventArgs sBQ=) 
    at ThinkGeo.MapSuite.WpfDesktopEdition.Tile.OnDrawn(DrawnTileEventArgs args) 
    at ThinkGeo.MapSuite.WpfDesktopEdition.Tile.Draw(GeoCanvas geoCanvas) 
  
  
 It was on this line of code: 
  
  
 if (TemporaryCache.GetTiles(e.DrawnTile.TargetExtent).Where(t => { return t.Bitmap != null; }).Count() == 0) 
  
  
  
  
 Thanks, 
 .Ryan.

Ryan, 
  
 Thanks for your post and question. 
  
 I take a try against the latest version to use FileBitmapTileCache in WpfDesktopEdition and it works fine, please feel free to try it. 
  
 If you still have problem, please feel free to let me know. It definitely would be great if a sample to recreate this issue could be provided. 
  
 Thanks. 
  
 Yale