ThinkGeo.com    |     Documentation    |     Premium Support

Questions on Open() method and TileMatrix

Hello ThinkGeo-Team,


I have several questions relative to my current development.


1.)

I use custom layer class inherited from ThinkGeo layer class. To improve the performance I use LayerOverlay and FileBitmapTile cache with my custom layer. I have mentioned that the DrawCore() method of my custom layer is not be called if the drawing extent data exist in the FileBitmapTile cache. But I can see the OpenCore() method is called every time also when the data exists in the FileBitmapTile cache.

As ThinkGeo suggested I have implemented many of my initialization code in OpenCore(). This means the layer is allways initialized and my code in OpenCore is allways called although this has only to be done if the data do not exist in the cache.


Due to the fact the code mentioned above is working in an webservice (gis.thinkgeo.com/Support/Dis...fault.aspx) i have to close the layer after returning the drawn image to the client so I can leave the layer open to avoid calling the OpenCore() again.


To improve the performance I think the OpenCore() method needs only to be called if the drawing extent is not in FileBitmapCache before the Draw() and DrawCore() will be called.


2.)

If I want the FileBitmapTile cache to use .PNG tiles so I must use the constructor where I have to pass in a TileMatrix object.  The MapUnit of the data we display is meter and decimal degree.


- Do I have to set the TileMatrix.GeopraphyUnit according to the MapUnit that is used by the map?


- What does the BoundingBox property of TileMatrix specify?


- Can you give me some default values for tilewidth/height according to the MapUnit?


Thanks Thomas


 



Thomas,


Thanks for your post and questions.


1) I cannot agree with you somehow for the first issue, maybe I was mistaken.

The Open is a bit different with the Draw, in the Draw, we know the extent to be drawn, and this extent can be achieved from the CurrentWorldExtent in the parameter GeoCanvas, while for the Open, we have no idea about the extent. Let us say an extreme case: we open the layer just for some queries, and then we have no way to check the extent like done in the Draw API.


2) Yes, the TileMatrix MapUnit will determine its bounding box , so we have to keep it the same with MapUnit for the map control.


The BoundingBox is the tile matrix grid extent, we will calculate the origin from one of its corners.


I am sorry to say that maybe we are not make it clear, the tilewidth/ tileheight are in screen coordinate pixel, for example 256 * 256, or 512 * 512.


Any more questions just feel free to let me know.


Thanks.


Yale

 



Yale, 
  
   What the customer is saying is that when he uses the tile cache with his layer when the draw happens but all the tiles are there the DrawCore never gets called but the OpenCore does.  What this means is that even when we have all the tiles in the cache the OpenCore is called and since the layer was closed before it causes all of his initialization code to run again even through he doesn’t need to do any drawing.  We need to review the concrete draw and make sure that if we find all of the tiles that we do not try and call the OpenCore method.  We can work on this in the afternoon… 
  
 Thomas - I get exactly what is going on and I think we have a way to fix this. 
  
 David

Hallo David, 
  
 are there any new results on my request? 
  
 Thomas

Thomas, 
  
   What we have found is the following. 
  
 Setup: 
  
 Create a LayerOverlay 
 Add some Layers 
 Assign a FileBitmapTileCache to the LayerOverlay 
  
 We found that if the tile cache has ALL of the tiles then then the Layer.Open is never called.  If any of the tiles are missing then the open will be called.  We followed this down in the debugger.  In the concrete Draw method of the Overlay class we check the tile cache and if we have all of the tiles then the DrawCore method for the Overlay is never called.  This means the LayerOverlay.DrawCore is not called which in turn means the Layer.Open is not called. 
  
 I hope our setup is similar to what you have.  One thing that is critical is that all of the tiles need to be there to bypass the DrawCore and IsOpen from being called.  I looked at the code you have on the other post and it seems that there you have the cache in the Layer itself.  Are you using the tile cache at the Layer or Overlay level?  I am a bit confused by parts of your post. 
  
 For the TileMatrix you do not need to use the constructor.  You can just use the property to set the ImageFormat if you want to use PNG.  I suggest that you do not change the bounding box or the tile size and leave the defaults. 
  
 David 
  
  
  
 David

Hello David, 



your Information on setting the ImageFormat for TileMatrix helped me very much to simplify my code. Also I checked the calling of the open() method and it is exactly how you said. 



About your question I have to say that we use the cache at the overlay level. The code I posted is part of our server side implementation of the layer class where we render and cache the data via webservice on our application server. 



Thanks Thomas



Thomas, 
  
   Good new.  Does this answer all your questions related to this thread? 
  
 David

Hello David/Yale, 
  
 thanks for answering all my questions. 
  
 Thomas

Thomas, 
  
   Glad we could help.  Let us know is you have any other issues. 
  
 David