ThinkGeo.com    |     Documentation    |     Premium Support

Using StreamLoading

Hello,


I seem to be having an issue with using the StreamLoading event.  I have successfully implemented the event as it is in the HowDoI examples, such as for the .shp file:


e.AlternateStream = Application.GetResourceStream(new Uri("MyMap.shp", UriKind.RelativeOrAbsolute)).Stream;


The problem I'm running into is when using a global Stream object that I have assigned the same stream as used in the above example to. I'll try to illustrate this here.



private Stream _shpStream = Application.GetResourceStream(new Uri("MyMap.shp", UriKind.RelativeOrAbsolute)).Stream;

...

public void StreamedShapeFileFeatureLayer_StreamLoading(object sender, StreamLoadingEventArgs e){
switch (System.IO.Path.GetExtension(e.AlternateStreamName).ToLower())
         {
          case ".shp":
     e.AlternateStream = _shpStream;
     break;
...



I repeatedly get an error that states 'Cannot access a disposed object'.  I'm not really sure how this method changes anything.  Would you have any input on what I'm doing wrong?  Thanks very much for your continued support.
-Dustin

Hi again,


I figured out a solution to my problem.   Instead of storing the files as  streams, I have stored them as a byte arrays and create a new instance of a memory stream on the fly.  This seems to work fantasticallly.


EDIT: While this works, it seems its very slow, since the  map hits the streamloading event every time it moves and I'm creating a new MemoryStream each time.  I still haven't figured out why the map disposes of the memory stream. Back to the drawing board...


Thanks again,


-Dustin





 


Hi, Dustin
We are very sorry so late to reply your post. We were busy with the stuff of the new release these days. For your first question, I think it’s caused by that you try to use a global stream object to store the stream of shape files.  Internally, we will raise the StreamLoading event when opening the layer, and after the rendering of layers finished, and then we will close the layer, that means the resources related with the shape file will be disposed including the Stream, so that you will get the exception when you try to use it again.
 
The same as you have stated in the last reply that the solution for that is to use local stream object or byte array.
 
Yes, you are right, it maybe render the map very slow, and the Streamloading event will triggered every time you move, zoom in or zoom out the map.
 
I suggest that you try to use the server rendering instead of it and then you can separate the map generation away from your business logic and get the server-side cache capabilities.  If you are not familiar with how server rendering works, please refer to the samples reside in the “ServerRendering” folder in our installed samples.
 
Thanks,
 
Khalil

Thanks Khalil, 
 I’m currently using server rendered layers, but they are significantly more ‘clunky’ than client side layers, it seems. 
  
 Over the weekend I have devised a new layer type that takes in a zip file containing the files needed for a layer from server side, and throwing an event when the file is loaded so I can process the layer accordingly. I use the stream loading event to obtain the files from inside the zip file, which gives me a constant local resource to create streams from. I have a few more things to iron out, but so far it seems to be significantly faster at loading and maneuvering the map than the current ServerOverlay implementation. 
  
 I appreciate you explaining the course of events behind the scenes for me.  Thanks very much! 
 -Dustin

Dustin, 
  
 Thanks for your quick feedback. Please let us konw if you still have any other questions. 
  
 Thanks, 
  
 Khalil