ThinkGeo.com    |     Documentation    |     Premium Support

Move point up

Hi


I have a number of points in a shape layer. I want to display bitmaps over some of them. I have managed this by creating an in memory layer with a point type of bitmap then using the following code:



  PointShape pointShape = feature.GetShape().GetCenterPoint();
  inMemoryLayer.InternalFeatures.Add(new Feature(pointShape));

The problem is that the bitmap obscures the point. I want to move the bitmap up so it is just above the point. I have tried changing both the X and Y of pointShape but neither seem to work.


Any ideas?


Cheers


Steve



Steve, 
  
 Thanks for your post and question. 
  
 If my mind do not make me understand the problem, what you are trying to do it try to display both Point and Bitmap for one point within one layer(such as ShapeFileFeatureLayer)? If yes, then we may need to add two styles to the CustomStyle for it, one is for Symbol type pointStyle, and one is for BitmapType pointStyle. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Hi Yale 
  
 The point is in a ShapeFileFeatureLayer and the bitmap is in an InMemoryLayer. 
  
 I don’t want the bitmap to hide the point so want to move it up. 
  
 I get the feature for the point. I then want to offset it before I add it to the in memory layer. Something like: 
  
    (feature.GetShape() as PointShape).Y += 100; 
  
    inMemoryLayer.InternalFeatures.Add(feature.Id, feature); 
  
 This does not seem to work. 
  
 Any ideas? 
  
 Cheers 
  
 Steve

Steve,


Thanks for your post and sorry for my misunderstanding.
 
I reviewed the code you provided and figured out where is the problem, the key problem is that feature is a structure, so it shape will not change in your statement.  Now, there are 2 kinds of solutions for you.
1)Use following statement to replace yours:

double x = (feature.GetShape() as PointShape).X;
double y = (feature.GetShape() as PointShape).Y + 10 ;
feature = new Feature(x, y, feature.Id);

 
2) Add a YOffset for the point style in your inMemoryLayer.


inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.YOffsetInPixel = 10;

 
Any all, thanks for your letting me know your status.
 
Thanks.
 
Yale
 

Steve, 
  
   There are a few ways to go here.  The first is to draw the bitmaps layer first then the points will always draw on top of the bitmaps.  If you want to move the bitmaps then you can use something like the code below to offset the images.  On each style there is usually a property to adjust the X & Y offset of the style.  I think this is the missing piece.   
  
 featureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.XOffsetInPixel = 10; 
  
   Another thing you could do is to not use the InMemoryFeatureLayer and on the style for the one layer use a custom set of styles.  In this way with one layer you can draw both styles. 
  
             // This represents some feature layer 
             ShapeFileFeatureLayer featureLayer = new ShapeFileFeatureLayer(); 
  
             // This is your simple point style 
             PointStyle circlePointStyle = PointStyles.CreateSimpleCircleStyle(GeoColor.StandardColors.Black, 5); 
              
             // Here we create a value style.  We determine to draw a bitmap based on the  
             // column name spcified below. 
             ValueStyle valueSytle = new ValueStyle(); 
             valueSytle.ColumnName = "Add Column Name Here"; 
  
             // Here we creare your bitmap point style with an X offet of 10 pixels 
             PointStyle bitmapPointStyle = new PointStyle(new GeoImage(@"C:\test.png")); 
             bitmapPointStyle.XOffsetInPixel = 10; 
  
             // Here we say that is the value of the column above is "Value 1" then we draw 
             // the bitmap point style as well 
             ValueItem item1 = new ValueItem("Value 1",bitmapPointStyle); 
             valueSytle.ValueItems.Add(item1); 
              
             // Here we add both the circle point style and the value style for the bitmaps 
             // to the custom styles collection. 
             featureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(circlePointStyle); 
             featureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueSytle); 
             featureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
  
  
   In the future it would be great if you can post a picture to show us what things look like as it can really help is diagnose the issue.   
  
 David

Steve, 
  
   You do not want to use Yale’s first way by modifying the shapes X or Y.  The reason is that is in World Coordinates so moving it 10 could mean 10 meters or 1 decimal degrees.  You are much better off with the offset as that is measured in pixels. 
  
 David

Thanks Guys 
  
 The YOffsetInPixel works a treat. 
  
 Cheers 
  
 Steve

Steve, 
  
   No problem.  For some reason I kept thinking it was the XOffsetInPixel! :-)  Anyway glad to see it worked, from your description I thought there might be better ways to display your symbols but if the YOffsetInPixel works then that is excellent and simple. 
  
 David