ThinkGeo.com    |     Documentation    |     Premium Support

Write Shapefile to memory stream

I have a project requirement to create a shapefile for a web user, but I need to take the 5 files created as files and get the memorystream of each so that I can write them straight to a zip file and send that to the user.


I realize I could write them to disk and zip them up, but interacting with the filesystem from our website is a no no in my company, so I need to be able to zip the individual files up in memory before they ever get written to disk.


How can this be accomplished?  I was looking through the events I could intercept but have had no luck thus far.


Thanks!


 



Tim,
 
You can use the GZipStream class to zip your files into the memory, you can refer to following web page: msdn.microsoft.com/en-us/lib…tream.aspx
 
Regards,
Edgar

Yes, I am aware that I can use that class to zip things but I am trying to avoid having to write the shapefile out to disk before zipping it.

Tim, 
  
 Creating a shape file needs to write the files out to disk, so we suggest you to use InMemoryFeatureLayer to store your data and serialize them with GeoSerializer, the serializer can serialize it to a string or stream or a xml file, you can pass the string or stream to the user and deserialize them on the client side to get the InMemoryFeatureLayer. 
  
 Thanks, 
 Edgar

Ok… This is a web application, the user’s client is a web browser.  It is particularly less than useful to have to write out to the hard drive a set of files that ultimately will be transmitted to the user’s browser as a single zip file.  It is a requirement that it be a shape file as it will ultimately be consumed by a piece of farming equipment so in other way of serializing (xml, csv, whatever) is not workable. 
  
 Ultimately, what I am suggesting here is that the actual writing to the disk of the file be an event that I can tap into that I can intercept the data that is about to be written to the disk and do whatever I as a developer need to do with it, similar to the ability to tap into the StreamLoading event available to the ShapeFileFeature source.  There should be a writing event that passes the filename that would be written to and the data that would be written then I could do what I needed to repackage it and send it to the client. 
  
 ALSO, I am finding the creation of shapefiles themselves to be unreasonably slow.  If I simply add 5000 points to a shapefile and have it render it, it takes somewhere in the order of 3 seconds.  I have shapefiles that are 100,000 points and in a web environment that is just an unacceptable wait time for the user.  Why is this such a slow process?

Tim, 
  
 Sorry to say our product have no such function to meet your requirements currently, the disk i/o is needed. 
  
 And for you second question, I tested with two point shape files one with 5700 points and the other with 150,000 points they only took less than 1 second and 6 seconds to render. can you get the latest version and have a try? 
  
 Regards, 
 Edgar 
  


hmm, that is certainly not indicative of what I am experiencing.  I am using the latest build as of a few days ago. 
  
 The code below when passing in the results of an interpolation of about 130k records takes well over a minute.  While working on my project today I currently have it in a state that it won’t compile but I will get it back working tomorrow and see if I can duplicate again. 
  
 While we are discussing performance, as I think these two may be related, while rendering the results of that GridCells[,] when it is around 130k features also takes over 30 seconds.  I was able to step outside of ThinkGeo and render the equivalent manually by drawing straight to a bitmap canvas in less than a second, so I’m not sure what is going on here. 
  
  
         private static void CreateShapeFile2(GridCell[,] cells) 
         { 
  
             string shapeFilePath = “c:\temp\points.shp”; 
  
             DbfColumn NameColumn = new DbfColumn(“Name”, DbfColumnType.String, 30, 0); 
             DbfColumn PopulationColumn = new DbfColumn(“Population”, DbfColumnType.Integer, 10, 0); 
  
             var cellArray = (from GridCell c in cells select c).ToArray(); 
  
             ShapeFileFeatureSource.CreateShapeFile(ShapeFileType.Point, shapeFilePath, new DbfColumn[] { NameColumn, PopulationColumn }, Encoding.Default, OverwriteMode.Overwrite); 
             ShapeFileFeatureSource citiesShapeFile = new ShapeFileFeatureSource(shapeFilePath, ShapeFileReadWriteMode.ReadWrite); 
             citiesShapeFile.Open(); 
             citiesShapeFile.BeginTransaction(); 
  
             foreach (GridCell cell in cellArray) 
             { 
                 citiesShapeFile.AddFeature(new PointShape(cell.CenterX, cell.CenterY)); 
             } 
  
             citiesShapeFile.CommitTransaction(); 
             citiesShapeFile.Close(); 
  
         } 


Tim, 
  
 Could you please provide the code that you initialize the ShapeFileLayer? Maybe our style settings are not the same. 
  
 Thanks, 
 Edgar