ThinkGeo.com    |     Documentation    |     Premium Support

Stream loading of GdiResterLayer

 Hi, i write the following code for stream loading GdiPlusRasterLayer


but, no image is being drawn. Am i missing anything?


 


void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
wpfMap.MapUnit = GeographyUnit.DecimalDegree;

LayerOverlay rootOverlay = new LayerOverlay();


GdiPlusRasterLayer rootImageLayer = new GdiPlusRasterLayer(@"Images\root1.jpg", new RectangleShape(-122, 74, 106, -62));
((GdiPlusRasterSource)rootImageLayer.ImageSource).StreamLoading += new EventHandler<StreamLoadingEventArgs>(MainWindow_StreamLoading);
rootImageLayer.UpperThreshold = double.MaxValue;
rootImageLayer.LowerThreshold = 0;

rootOverlay.Layers.Add(rootImageLayer);
wpfMap.Overlays.Add(rootOverlay);

wpfMap.CurrentExtent = new RectangleShape(-122, 74, 106, -62);
wpfMap.Refresh();

}

void MainWindow_StreamLoading(object sender, StreamLoadingEventArgs e)
{
e.AlternateStream = new FileStream(@"Images\root1.jpg", FileMode.Open, FileAccess.Read);
}


 Hi Raquibur,


 
I tried the code below and it works fine. When using StreamLoading, the world file needs to be passed into the event too. I'm not sure how is your root1.jpg like, so please try to create the JGW file to work with the JPG.

private void WpfMap_Loaded(object sender, RoutedEventArgs e)
{
    Map1.MapUnit = GeographyUnit.DecimalDegree;
    Map1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9);

    GdiPlusRasterLayer rasterLayer = new GdiPlusRasterLayer(@"d:\worldmap.jpg", new RectangleShape(-180, 90, 180, -90));
    ((GdiPlusRasterSource)rasterLayer.ImageSource).StreamLoading += new System.EventHandler<StreamLoadingEventArgs>(DisplayASimpleMap_StreamLoading);
    rasterLayer.UpperThreshold = double.MaxValue;
    rasterLayer.LowerThreshold = 1;

    LayerOverlay layerOverlay = new LayerOverlay();
    layerOverlay.Layers.Add(rasterLayer);
    Map1.Overlays.Add(layerOverlay);

    Map1.Refresh();
}

private void DisplayASimpleMap_StreamLoading(object sender, StreamLoadingEventArgs e)
{
    if (e.AlternateStreamName.Contains(".JPG"))
    {
        e.AlternateStream = File.OpenRead(@"d:\worldmap.jpg");
        e.AlternateStreamName = "worldmap.jpg";
    }
    else if(e.AlternateStreamName.Contains(".JGW"))
    {
        e.AlternateStream = File.OpenRead(@"d:\worldmap.jgw");
        e.AlternateStreamName = "worldmap.jgw";
    }
}

 
Please have a try and let me know if you have more queries.
 
Thanks,
Howard

Thanks Howard for your quick reply. But, the problem is, i am not using world file to load the image. 
 i am using the following code to load the GdiPlusRasterLayer 
 GdiPlusRasterLayer rootImageLayer = new GdiPlusRasterLayer(@"Images\root1.jpg", new RectangleShape(-122, 74, 106, -62));  
 So, there is no way for me to pass the world file during the stream loading. Is there any way to solve it? 
  
 Regards, 
 Raquib

Hi Raquibur,  
  
 I think this API might not very intelligent. Would you mind to send us the root1.jpg file and we will try to make a world for you; or you can also check the format of the jgw file and create it, it’s not quite complicate. On the other hand, I’ll confirm with our core team if there is a simpler way to do it with the StreamLoading event. 
  
 Thanks, 
 Howard

Dear Howard, 
  
 In our application user can select any rectangular area and upload a image for that region.  So, creating one jgw file will not solve our problem. I know the format of the world file. But, if the user select a  rectangle area that has some rotation then it can be hard to construct the world file. is there any api to construct the world file from a rectangle shape. 
  
 Regards, 
 Raquib

Hi Raquibur, 
  
 I understand. Please give us sometime to confirm with our core team. We will let you know as soon as possible when we get a solution for you.  
  
 Sorry for the inconvenience and thanks for reporting.  
 Howard

Raquibur,


Thanks for your post and questions.
Hope following code snippet can give you some hints how to construct a world file string with the extent and with & height of the image.

 

WorldFile worldFile = new WorldFile(worldImageExtent, width, height);
 
StringBuilder sb = new StringBuilder();
sb.AppendLine(worldFile.HorizontalResolution.ToString());
sb.AppendLine(worldFile.RotationRow.ToString());
sb.AppendLine(worldFile.RotationColumn.ToString());
sb.AppendLine(worldFile.VerticalResolution.ToString());
sb.AppendLine(worldFile.UpperLeftX.ToString());
sb.AppendLine(worldFile.UpperLeftY.ToString());
string worldString = sb.ToString();


Any more questions please feel free to let me know.
Thanks.
Yang

Thanks Howard for your support. 
 Thanks Yang for the code.

Hi Raquibur, 
  
 You are welcome; just feel free to let us know if you have more queries. 
  
 Thanks, 
 Howard

Hi, 
  
 I am using the following to stream loading  
  
  void WpfMapExtended_StreamLoading(object sender, StreamLoadingEventArgs e)
{
if (e.AlternateStreamName.Contains(".JPG")) {
byte[] byteArray = Encoding.ASCII.GetBytes(_imageStream);
MemoryStream stream = new MemoryStream(byteArray);
e.AlternateStream = stream;
e.AlternateStreamName = "map.jpg";

} else if (e.AlternateStreamName.Contains(".JGW")) {

WorldFile worldFile = new WorldFile(_fullExtend, 1030, 606);
StringBuilder sb = new StringBuilder();
sb.AppendLine(worldFile.HorizontalResolution.ToString());
sb.AppendLine(worldFile.RotationRow.ToString());
sb.AppendLine(worldFile.RotationColumn.ToString());
sb.AppendLine(worldFile.VerticalResolution.ToString());
sb.AppendLine(worldFile.UpperLeftX.ToString());
sb.AppendLine(worldFile.UpperLeftY.ToString());

byte[] byteArray = Encoding.ASCII.GetBytes(sb.ToString());
MemoryStream stream = new MemoryStream(byteArray);

e.AlternateStream = stream;
e.AlternateStreamName = "map.jgw";
}

}
 
  
 But, it never goes to the else if condition. Always validate the if condition.  
  
 Regards, 
 Raquib

Hi Raquibur, 
  
 The code Howard posted works fine, and it does go to the else if condition. 
 Would you please let us know how to reproduce the problem more precisely? Like letting us know what the _imageStream variable stands for, etc.  
 And of course, it would be even better if you can send us your sample code and data. 
  
 Regards, 
 Tsui 


Hi Tsui, 
  
 Thanks for the reply. Actually, the problem was in my side. I was sending invalid image data. That’s why it was not loading 
  
 Regards, 
 Raquib

Hi Raquibur,  
  
 Glad to know that your problem is solved. 
 Please feel free to let us know if you have any other questions. 
  
 Regards, 
 Tsui