ThinkGeo.com    |     Documentation    |     Premium Support

Working with multiple image formats like .jpeg, .bmp,.png

Hi am trying to do something like below to work with different image formats, say bmp as shown below:  



 private void wpfMap1_Loaded(object sender, RoutedEventArgs e)


 {


                GdiPlusRasterLayer gdiPlusRasterLayer = new GdiPlusRasterLayer(@"..\..\Data\Sunset.bmp");


                LayerOverlay overlay = new LayerOverlay();


                overlay.Layers.Add(gdiPlusRasterLayer);


                overlay.Refresh();


                wpfMap1.Overlays.Add(overlay);


                wpfMap1.Refresh();


 }


but the map does not get loaded with the prescribed image. 


Please suggest me how should i work with multiple image formats ( any image format for that matter) using WPF desktop edition.




Hi Prasanna,



Recently, we have several raster layers to support several kinds of raster files. For example, we have GdiPlusRasterLayer to support Bmp just like you are showing here. Also JpegRasterLayer supports jpeg2000 raster file; EcwRasterLayer supports Ecw file etc. 



We also have FdoRasterLayer extension which supports popular raster formats such as Mr. Sid, ECW, JPEG 2000 etc as we tested. Here is a related post:

gis.thinkgeo.com/tabid/143/a...fault.aspx



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



Thanks,

Howard



 



 Hi Howard,


Thanks for the reply.


I am using GDIPlusRasterLayer as in my code but i am not able to get the image. Am using WPFDesktopEdiiton. Please let me know if am missing anything in my code.


Thanks, 


Prasanna



Hi Prasanna, 
  
 Could you please show us your data and code? I think it’s some slim things missing caused this issue. Here is the code to new a GdiPlusRasterLayer: 
 GdiPlusRasterLayer gdiLayer = new GdiPlusRasterLayer(“filePath”); 
 gdiLayer.UpperThreshold = double.MaxValue; 
 gdiLayer.LowerThreshold = 1; 
  
 Then, add it to the LayerOverlay. If it doesn’t help, please send us the code and data; we’ll check for you. 
  
 Thanks, 
 Howard

Hi Howard,


Please find my code below. File Path is perfect. Gdi Layer is created properly. But i cannot see the image on map.


 


  private void Window_Loaded(object sender, RoutedEventArgs e)


{GdiPlusRasterLayer gdiLayer = new GdiPlusRasterLayer(@"D:\Old machine\DownLoads\ShowBitMap\ShowBitMap\Data\Sunset.bmp");


gdiLayer.UpperThreshold =double.MaxValue; gdiLayer.LowerThreshold = 1;


LayerOverlay overlay = new LayerOverlay();


overlay.Layers.Add(gdiLayer);


myMap.Overlays.Add(overlay);


myMap.Refresh();


}



Hi Prasanna, 
  
 It seems that the bmp file does not have a world file with it. Please check the constructor of the GdiPlusRasterLayer and it has 4 overload methods. The last two methods need indicate a world extent for the raster source or a world file which contains the world extent of it. Without this world extent, our control cannot know where to paste the raster on the map. This might be the reason that you cannot see the image. 
  
 Could you check if there is some information like the world extent of the bmp file? Or you can also send the file to us and we will check for you. 
  
 Thanks, 
 Howard

Hi Howard,


I am trying to develop an application wherein the user can choose any of the image formats like bmp, jpg or png. Here, am not sure whether the user actually has a world file along with his image. So please let me know,


1. Is it such a necessity that without the so said world file, we cannot proceed showing the specified image as  a map.


2. Am attaching a sample application which i had downloaded from thinkgeo site. The example actually tries to show the map with bit map image using desktop edition dll. I found it quite simple to implement that way. And all i have tried in my previous mails/replies is to implement it that way. Please read all my approaches i have tried from top and let me know, is there a simple way of implementing maps with various image formats without having to bother about world file.


Thanks and Regards,


Prasanna


 



ShowBitMap.zip (81.1 KB)

Hi Prasanna,
 
Here is the code to show a bmp file in Wpf Map:
 

private void map_Loaded(object sender, RoutedEventArgs e)
        {
            map.MapUnit = GeographyUnit.Meter;

            GdiPlusRasterLayer gdiPlusRasterLayer = new GdiPlusRasterLayer(@"Data\Sunset.bmp");

            ThinkGeo.MapSuite.WpfDesktopEdition.LayerOverlay layerOverlay = new ThinkGeo.MapSuite.WpfDesktopEdition.LayerOverlay();
            layerOverlay.Layers.Add(gdiPlusRasterLayer);

            gdiPlusRasterLayer.Open();
            map.CurrentExtent = gdiPlusRasterLayer.GetBoundingBox();
            gdiPlusRasterLayer.Close();

            map.Overlays.Add(new WorldMapKitWmsWpfOverlay { Projection = WorldMapKitProjection.SphericalMercator });
            map.Overlays.Add(layerOverlay);
            map.Refresh();
        }

 
The Sunset.bmp file is the one you zipped in the attached sample.
 
Please notice that we set the MapUnit property of WpfMap before we set the CurrentExtent property, this is very important for WpfMap to show the image correctly.
Setting CurrentExtent before MapUnit works for WinForm edition, but not for Wpf Edition.
 
When we set the CurrentExtent property of WpfMap, WpfMap changes current scale and current center based on the new extent and current MapUnit.
WpfMap.MapUnit has a default value as DecimalDegree, so if we set the CurrentExtent before we set the MapUnit to Meter, then WpfMap would calculates its scale and center based on DecimalDegree(the default value), not meter(the value we need). 
And that is why the sample you attached works for WinForm map but not for Wpf map.
 
And the world file is necessary for showing images. You can run the code snippet I pasted above, and you’ll see the sunset image is in the Mediterranean Sea. We couldn’t possibly know where to put the image without the world file which defines the location of the image.
 
Please feel free to let us know if you have any other questions.
 
Thanks,
Tsui
 

Hi Tsui,

The bitmap is loading fine. Thanks.


I have few doubts:

1. since the loading of the image is dependent on world file and world file will have specified co-ordinates, I will not be able to use the same image for different maps. This is a limitation and let me know if its possible to overcome this limitation.


2. Is it not possible that i place markers onto the map that uses the bitmap image?

Am trying to place a marker onto the map after map_Loaded event as below:

 private void map_MapClick(object sender, MapClickWpfMapEventArgs e)

{

 SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay();

 Marker obj = new Marker();

 obj.ImageSource = new BitmapImage(new Uri(@"D:\Old     machine\DownLoads\ShowBitMap\ShowBitMap\Data\AQUA.png",     UriKind.RelativeOrAbsolute));

 obj.Width = 20;

 obj.Height = 34;

 markerOverlay.Markers.Add(obj);

        map.Overlays.Add(markerOverlay);

        map.Refresh();

}


But i am not able to see the marker.

My overall purpose is to place any image as a map and place marker over it. Please let me know if am missing anything.


3. Am naive to world file. Please let me know how to create a world file for any image.




Thanks and Regards,

Prasanna



 Hi Prasanna,


 


These are the suggestions to your doubts:


 


1.     Sorry, we didn’t understand the question. Please express it more precisely.


 


2.     Sure we can place markers on map using bitmaps. The cause of your problem is similar to the last one. We have to specify a location for the marker, elsewise the map wouldn’t know where to place the marker.


Please try the code below:


 SimpleMarkerOverlay markerOverlay = new SimpleMarkerOverlay();

 

            Marker marker = new Marker(-74.002533, 40.734771);

            marker.ImageSource = new BitmapImage(new Uri(@"C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\Water lilies.jpg", UriKind.RelativeOrAbsolute));

            marker.Width = 20;

            marker.Height = 34;

 

            markerOverlay.Markers.Add(marker);

 

            map.Overlays.Add(new WorldMapKitWmsWpfOverlay());

            map.Overlays.Add(markerOverlay);

            map.Refresh();


It’s very similar to the code you posted, we just specified a location for the marker and added world map kit as a base map so that we can see the marker is shown somewhere near New York City (which has a position of [-74.002533, 40.734771]).


 


3.     The world file should by shipped with the image file by your data vendor.


And if you are intended to use regular image files which have no world files associated with, of course you can also make world files of your own. Here is some links about the world file format:


kralidis.ca/gis/worldfile.htm


en.wikipedia.org/wiki/World_file


And you can use the WorldFile class we provided in the name space: ThinkGeo.MapSuite.Core to do the work for you, here is some sample code:


WorldFile worldFile = new WorldFile(new RectangleShape(-74, 45, -70, 40), 800, 600);

            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());

            sb.ToString();


You can save the result of sb.ToString() to a file and associate it with an image file(sized 800x600) will make it show up near <st1:state w:st="on"><st1:place w:st="on">New York</st1:place></st1:state>.


Please let us know if you have any other questions.


Thanks,


Tsui