ThinkGeo.com    |     Documentation    |     Premium Support

Drawing Image on the map

Hi everybody,


I am trying to Draw image on the map with the following code:


public class MyValueStyle : ValueStyle


protected override void DrawCore(IEnumerable<Feature> features, GeoCanvas canvas, Collection<SimpleCandidate> labelsInThisLayer, Collection<SimpleCandidate> labelsInAllLayers)

        {

            List<Feature> listFeatures = new List<Feature>();

            foreach (Feature feature in features)

            {

                listFeatures.Add(feature);

               

                GeoImage image = new GeoImage(new Uri(@"..\..\Resource\lawrencecity.jpg", UriKind.RelativeOrAbsolute));

                

                canvas.DrawWorldImageWithoutScaling(image, ((PointShape)feature.GetShape()).X, ((PointShape)feature.GetShape()).Y, 0, 0, 0);



            }


 




            if (listFeatures.Count > 2)

            {

                LineShape line = new LineShape();

                Vertex vertex1 = new Vertex((PointShape)listFeatures[listFeatures.Count - 2].GetShape());

                Vertex vertex2 = new Vertex((PointShape)listFeatures[listFeatures.Count - 1].GetShape());

                line.Vertices.Add(vertex1);

                line.Vertices.Add(vertex2);

                canvas.DrawLine(line, new GeoPen(GeoColor.GeographicColors.Forest));

            }

        }


 


 


As a result of this code I can see the green line being drawn (the one that I draw with DrawLine method), so the coordinates of the image (same coordinates) are Ok.


So what is the problem?


I tried to compile the image in Resources of the Silverlight project as Resource, Embedded Resource, Content with Always Copy option - nothing.


 


Any help would be appreciated.


 


Maxim



This line succeded: 

GeoImage image = new GeoImage(new Uri("/Theme/lawrencecity.jpg", UriKind.RelativeOrAbsolute)); 

(Content build option) 

Probably the slash sign was the problem.



Maxim, 
  
 Yes; in Silverlight you need notice the slash when you use Uri with content or resource build options. Please feel free to let us know if you have more questions. 
  
 Thanks, 
 Howard

In continue to the same topic - I tried to add column values to Feature before adding it to the InMemoryFeatureLayer: 
             private void Map1_Click(object sender, MapClickEventArgs e) 
         { 
             Point clickedPoint = e.WorldPoint; 
             PointShape shape = new PointShape(clickedPoint.X,clickedPoint.Y); 
             IDictionary<string, string> columns = new Dictionary<string,string>(); 
             string columnValue = new Random().Next(1, 4).ToString(); 
             columns.Add(“Drawing”, columnValue); 
             Feature newFeature = new Feature(shape);//,columns); 
             newFeature.ColumnValues.Add(“aaa”, “345”); 
             newFeature.ColumnValues.Add(“bbb”, columnValue); 
             newFeature.ColumnValues.Add(“ccc”, columnValue); 
             highlightLayer.InternalFeatures.Add(newFeature); 
              
             
             Map1.Refresh(); 
         } 
  
 But when the drawing event happens (DrawCore of my MyStyle), I don’t see any values in the Column of the feature., though I filled it in the GetRequiredColumnNamesCore. The Key “aaa” exists, but the value is empty.  
  
 protected override Collection<string> GetRequiredColumnNamesCore() 
         { 
             Collection<string> columnNames = new Collection<string>(); 
             columnNames.Add(“bbb”); 
             columnNames.Add(“ccc”); 
             columnNames.Add(“ddd”); 
             return columnNames; 
         } 
  
 So what could be the problem?

Got it! 
 Apperantly if you want to fetch Column later during DrawCore, one must define it for the layer using FeatureSourceColumn.

Maxim, 
  
 Great. Feel free to let me know if you have more questions. 
  
 Thanks, 
 Howard

Hi everybody, 
 I want to draw some image in the layer with drawcore()    method 
  
 please help me. 

Hi, Serxan 
  
 We have provided many methods for users with the GeoCanvas parameter of the DrawCore method, such as DrawScreenImageWithoutScaling,DrawWorldImageWithoutScaling or others. Maybe this is your need. 
  
 Thanks, 
 Khalil 


Hi,  
  
 Is it possible to get a full example of how to draw an image on the map?  I’m not familiar with what a GeoCanvas is, and how I add that to my map control.  I would greatly appreciate your help! 
  
 Thanks, 
 Blake

Hi,


Here is a sample code about  how to reneder the images in the silverlight. (The sample use jpeg2000 formate).


Client Side:



        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeographyUnit.Meter;
            Map1.CurrentExtent = new RectangleShape(-0.5, 0.5, 37800.5, -15824.5);

            ServerLayerOverlay serverLayerOverlay = new ServerLayerOverlay("ImageOverlay", "SilverlightMapConnector1");
            Map1.Overlays.Add(serverLayerOverlay);

            Map1.Refresh();
        }


Server Side:



Jpeg2000RasterLayer layer = new Jpeg2000RasterLayer(MapPath("~/globe.jp2"));
layer.UpperThreshold = double.MaxValue;
layer.LowerThreshold = double.MinValue;
ServerLayerOverlay overlay = new ServerLayerOverlay("ImageOverlay");
overlay.Layers.Add(layer);
SilverlightMapConnector1.ServerLayerOverlays.Add(overlay);



Thanks,


Johnny



Hi, I tried sample, but works just for jp2 raster image. 
 I’m trying simple as possible to show raster tiff images on silverlight. (This example load maps every time when user connect on page, what is not good solution with lot of users. Better way is to connect on server where are maps) 
  
 My code looks like this: 
  
 Server side: 
  
  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
  
         If Not Page.IsPostBack Then 
  
             Dim layer As GeoTiffRasterLayer = New GeoTiffRasterLayer(MapPath("~/E240162C.TIF")) 
             layer.UpperThreshold = Double.MaxValue 
             layer.LowerThreshold = Double.MinValue 
             Dim overlay As ServerLayerOverlay = New ServerLayerOverlay(“ImageOverlay”) 
             overlay.Layers.Add(layer) 
             SilverlightMapConnector1.ServerLayerOverlays.Add(overlay) 
  
         End If 
  
     End Sub 
  
 Client side: 
   
  Private Sub LoadMap() 
  
         Map1.MapUnit = GeographyUnit.Meter 
         Map1.CurrentExtent = New RectangleShape(-0.5, 0.5, 37800.5, -15824.5) 
  
         Dim serverLayerOverlay As ServerLayerOverlay = New ServerLayerOverlay(“ImageOverlay”, “SilverlightMapConnector1”) 
         Map1.Overlays.Add(serverLayerOverlay) 
         Map1.Refresh() 
  
     End Sub 
  
 Is there some kind of solution to create server application (or maybe some of your product do that) with all raster images (with cashing), and then in silverlight just connecting to that url link where placed maps (like this "http:\192.168.0.1\ThinkGeoMaps&#34;)   
  
 Thank you very much  
 Best regards  
  
 Urko 


Urko, 
 The SilverlightConnector simulates kind of Server with HttpHanlder to draw the images following the requests from Client side. Just as you said, the application will become slower if lots of users request the application that is deployed on only one server.  The world around is that you can deploy the application to several different servers to share the access stress. 
 Also we can create some kinds of server application with another product “MapSuite WmsServer Edition”. With the help of maps server, the Silverlight application just connects to different link to request images, and then represent the image on screen.  Any details please try gis.thinkgeo.com/Products/GISComponentsforNETDevelopers/MapSuiteWMSServerEdition/tabid/796/Default.aspx . 
 Thanks, 
 Johnny 


 


Urko,
The SilverlightEdition also can work with Tiff raster image besides the JP2. Please have a look at the attached sample. 
Thanks,
Johnny

001_Sample.zip (3.59 KB)

 



Data.zip.001.zip (450 KB)
Data.zip.002.zip (282 KB)

Hi Johnny, 
  
 Is there any way to draw a jpg image using the client side code. I don’t want to use the serer side code to draw jpg or other images  
  
  
 Thanks 
 Raquib

 



Raquibur,
I’m sorry but I need to say we don’t support the Jpg currently, we just allow you to display jpg images via <Image> tag or loading the image into a WMSOverlay, the code as following:
WmsOverlay wmsOverlay = new WmsOverlay();
wmsOverlay.ServerUris.Add(new Uri("***.jpg"));
wmsOverlay.TransitionEffect = TransitionEffect.None;
wmsOverlay.TileType = TileType.SingleTile;
 
Map1.Overlays.Add("WMSOverlay", wmsOverlay);
But I don’t think it can works normally as you have expected. Also it’s unable to be used to load the other Raster images, such as ECW, Jpeg2000 etc. 
Sorry for the inconvience.
Johnny