ThinkGeo.com    |     Blog    |     Wiki    |     Support

Display an Image Layer possible?

We are converting our Windows app to a Silverlight app and all we do is display a jpg as an ImageLayer.  Is that not possible in the Silverlight Edition?



Hello Mark, 
  
 Thanks for your post, when you mean Windows app, is it any our map suite product? If you are using our other map suite product like desktop edition, web edition, it’s easy to convert to silverlight edition. 
  
 Any way, it’s possible to using silverlight to render image, if you are using our product before, you can like the old way, if not, you can refer the HowDoISamples, using InMemoryLayer to show a image. Or if you are using some special image type like tiff, you can using tiffrasterlayer. 
  
 Let me know if you have any queries. 
  
 Regards, 
  
 Gary

Why can't I find any reference to InMemoryLayer in the SilverlightEdition help file?  I can't find any documentation on how this works other than the "How Do I" samples.  Is there better documentation available that I could download?



We are converting from an MFC ThinkGEO project to a Silverlight ThinkGEO one.   



In the MFC version, we would do: 

ImageLayer il = new ImageLayer(path); 

map1.ImageLayers.Add(il); 



It is my understanding that this isn't possible in the Silverlight version.  If it is, could you please explain as that I do not understand how. 



Also, be aware that I am taking over the ThinkGEO development in my office and I am having issues getting up to speed with the library.  It seems that if our development does not fall into one of the Code examples that we need to query you guys as that I can find no PDF nor other documentation on how all the objects in the Silverlight version work together.  (ex, If Feature has 15 overloaded constructors, where is the documentation that describes the uses of each, and not just the parameters, but even then I can't find what 'wellKnownBinary' means ?) The lack of documentation has completely surprised me for what we have paid for the development and run time licenses. Hopefully, you can alleviate my concern.



Do you have a Silverlight example that implements GDIPlusRasterLayer?

 Hello Mark,


 
In sliverlight edition, there is some special, you can call the method in Server side or Client side, I believe the way you tried is try to use it in Client side, so you can't find it.
 
But when we using the way in Server side, we can almost do everything we can do in web edition. Because the server side way is using the map suite core just like other product.
 
Please refer this post: gis.thinkgeo.com/Support/Dis...fault.aspx
and the only thing you need do is replace GeoTiffRasterLayer to GDIPlusRasterLayer.
 
Let met know if you still have queries.
 
Regards,
 
Gary

Thank  you for the link.  I will take a look at it.


Right now I get "The file specified does nont exist." on my map when I attempt the client->server version.  I have verified that I have an Images directory with the refinery.bmp in it inside my VS IDE.  I've verfied the functiionality by using a world map layer (which was deleted in the below version)


 


namespace HelloWorld.Web

{

    public partial class _Default : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            if (!Page.IsPostBack)

            {

              

                GdiPlusRasterLayer gdiPlusRasterLayer = new GdiPlusRasterLayer(MapPath(@"~\Images\refinery.bmp"));



                gdiPlusRasterLayer.UpperThreshold = double.MaxValue;

                gdiPlusRasterLayer.LowerThreshold = 0;



                // Native Server 1

                BackgroundLayer backgroundLayer = new BackgroundLayer(new GeoSolidBrush(GeoColor.FromArgb(255, 156, 187, 216)));

                ServerLayerOverlay layerOverlay = new ServerLayerOverlay("NativeServer");

                layerOverlay.Layers.Add(backgroundLayer);

  

                layerOverlay.Layers.Add("GdiPlusImageLayer", gdiPlusRasterLayer);

                SilverlightMapConnector1.ServerLayerOverlays.Add(layerOverlay);



            }

        }

    }

}



This is the actual location of the file:


C:\Users\b7a8a\Documents\Visual Studio 2010\Projects\ThinkGEO-HelloWorld\HelloWorld.Web\Images\refinery.bmp


and nothing seems to work, even:


GdiPlusRasterLayer gdiPlusRasterLayer = new GdiPlusRasterLayer(@"C:\Users\b7a8a\Documents\Visual Studio 2010\Projects\ThinkGEO-HelloWorld\HelloWorld.Web\Images\refinery.bmp");


 


This is something really stupid....



Hello Mark, 
  
 When you use  
 GdiPlusRasterLayer gdiPlusRasterLayer = new GdiPlusRasterLayer(@“C:\Users\b7a8a\Documents\Visual Studio 2010\Projects\ThinkGEO-HelloWorld\HelloWorld.Web\Images\refinery.bmp”); 
  
 Do you still meet the “The file specified does nont exist.” exception? That’s strange, could you please provide a sample to me? 
  
 Regards, 
  
 Gary

The cleaned project zip file is 6M so I’ve posted what I have here.  Let me know if you want it delivered a different way than uploading on the forum.

Server:


using System;
using System.Web.UI;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.SilverlightEdition;

namespace HelloWorld.Web
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                
                GdiPlusRasterLayer gdiPlusRasterLayer = new GdiPlusRasterLayer(MapPath("~/images/refinery.jpg"));
                
                gdiPlusRasterLayer.UpperThreshold = double.MaxValue;
                gdiPlusRasterLayer.LowerThreshold = 0;

                // Native Server 1
                BackgroundLayer backgroundLayer = new BackgroundLayer(new GeoSolidBrush(GeoColor.FromArgb(255, 156, 187, 216)));
                ServerLayerOverlay layerOverlay = new ServerLayerOverlay(“NativeServer”);
                layerOverlay.Layers.Add(backgroundLayer);
                layerOverlay.Layers.Add(“GdiPlusImageLayer”, gdiPlusRasterLayer);
                SilverlightMapConnector1.ServerLayerOverlays.Add(layerOverlay);

            }
        }
    }
}



Client:



using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Resources;
using ThinkGeo.MapSuite.SilverlightCore;
using ThinkGeo.MapSuite.SilverlightEdition;
using System.Windows.Media;

namespace HelloWorld
{
    public partial class MainPage : UserControl
    {
        InMemoryFeatureLayer nodeLayer = new InMemoryFeatureLayer();
        
        public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeographyUnit.DecimalDegree;


        }

        private void Map1_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeographyUnit.DecimalDegree;
            Map1.CurrentExtent = new RectangleShape(-135.7, 83.6, 113.5, -53);

            ServerLayerOverlay serverLayerOverlay = new ServerLayerOverlay(“NativeServer”, “SilverlightMapConnector1”);
            //serverLayerOverlay.ConnectorHost = new Uri(“localhost:55070/Default.aspx”);
            Map1.Overlays.Add(serverLayerOverlay);

            Map1.Refresh();
        }
    }
}



Map1_Loaded is tied in at the XAML file.

I didn't have a world file.


But now my issue is that I want to open to that zoom level immediately when I apply that layer.  What happens is that it seems it opens to a really high zoom level and I can't find my image (it is areal small slice of area when compared to the world)


 



Nevermind.  I fixed this too.

Hello Mark, 
  
 So have you fixed all the problem? Or you still need some help? 
  
 Regards, 
  
 Gary

I'm good right now, unless you can also point me to an example that can display a desc/status window of a point on right click.



Hello Mark, 
  
 I’m glad to help, could you please describe your requirements with more detail? 
  
 Regards, 
  
 Gary