ThinkGeo.com    |     Documentation    |     Premium Support

Move feature to absolute point

Hi there


I am trying to move a feature to an asbolut X,Y point.


It seems that there is not a function that does that precisely. Or not?


Do i have to find the distance from the previous point to the new one? How can i do that?


I am sorry to bother for easy questions but i want things to happen rapidly and i could not find what i wanted in the documentation



To move a feature to an absolute point, if your feature is made of a point, this is easy, you just change the X and Y value of the point.  We have many Code Community projects that show how to do that. For example, you look at the project Moving Vehicle With Changing Label and you will see in the timer Tick event how to do that. code.thinkgeo.com/projects/show/88


 If your feature is made of another type of shape, such as a line or a polygon, this is not as simple. You need to define what point of the shape is the reference point that is going to be translate the whole shape to the new point. So, actually, the function that you would need is Register where you have an anchor point (reference point) and a destination point (your absolute point). We have a project very similar to what you are trying to do in the Code Community, Register Shape. In this example, we go from a non geographic coordinate system to a world coordinate on the map. In your case, you basically just translate the whole shape on the same coordinate system and Register can work for that too. code.thinkgeo.com/projects/show/90


If you are still confused, let us know and we will create a little sample specifically for your case.



Hi there, thanks for the answer but to be honest I am starting to get tired. 
 It is obvious that this api is very powerful and extensible but i am wasting a whole day for each very simple thing that i want to do. 
  
 Unfortunately I can’t get the feature to move. 
 First of all it was nowhere stated that i need to use the shape of the feature (i didn’t even know of the existence of the shape). But anyhow i saw the example you provided me with (half the samples are on the code community, the others on the how do i folder) 
  
 Here is my code. I get to see the feature to appear (the first if), but it never moves.  
 
Dim fishLayer As InMemoryFeatureLayer = DirectCast(Map1.FindFeatureLayer(“FishLayer”), InMemoryFeatureLayer)

If Not fishLayer.InternalFeatures.Contains(temp_fish.id) Then
                Dim latitude As Double = Convert.ToDouble(temp_fish.Y, CultureInfo.InvariantCulture)
                Dim longitude As Double = Convert.ToDouble(temp_fish.X, CultureInfo.InvariantCulture)
                Dim feature As New Feature(longitude, latitude, temp_fish.id)
                feature.Tag = temp_fish
                fishLayer.Open()
                fishLayer.InternalFeatures.Add(temp_fish.id, feature)
                fishLayer.Close()
                Map1.Refresh(Map1.Overlays(“FishOverlay”))
            Else
                Dim fish_shape As PointShape = fishLayer.FeatureSource.GetFeatureById(temp_fish.id, ReturningColumnsType.AllColumns).GetShape()
               
                fish_shape.X = temp_fish.X
                fish_shape.Y = temp_fish.Y

                fishLayer.Open()
                fishLayer.EditTools.BeginTransaction()
                fishLayer.EditTools.Update(fish_shape)
                fishLayer.EditTools.CommitTransaction()
                Map1.Refresh(Map1.Overlays(“FishOverlay”))

 
 
  
 The temp_fish is ok and the values valid 
 I use the debugger and i can see that the shape is ok, it has the id of the feature and valid X,Yvalues, i can see them change but the when the refresh happens the point will just stay there. 
  
 What shoud I do. 
 As for changing the angle, it weird that i have to change it through the styling of the layer. That will change the angle of all features on that layer. Right? 
  
 These are simple things, and should happen in a simple manner. Could you please help me? If i am wasting so much time, that means that my hired programmers will waste even more which makes it not very efficient.

I am sorry if i sound edgy, but i am wasting hours for simple things. I like the API and would like to buy a couple of  licenses, but i need to make sure that i can simply do the simple stuff.

Best way I have found is to get the examples & use them as starting points. It would be nicer if every example had a web, wpf & desktop version both in C and VB, but generally they provide enough info to get you started. I am on a steep learning curve as well, trying to rewrite my existing MapInfo application and could definitely do with some more general info such as would be found in a users manual. 
  
 I am just heading out & don’t have my code open but will have a look when I get back - I did something similar to what you are doing by starting off with the example application of the plane flying across the world. It varies the X & Y and makes the plane move.

Great! This is exactly what i need! 
 Looking forward to it. Thanks

Ioustinos,


 I created a Desktop VB app that shows how to move a feature to a new location.  I looked at your code and I reduced it as much as possible to show the logic for moving the feature. You will also see the comments. I think this is going to help. For this project, only add the references to MapSuiteCore.dll and DesktopEdition.dll and you should be able to just run it.


 Sorry for the frustration in learning the API. We know we have to present a more complete documentation with high level explanation of key concepts such as Feature, Shape, the relationship between them etc. And we are working studiously on a Wiki type of documention that will benefit all our users.


 



TestApp7794.zip (15.1 KB)

Grande! 
 Thanks it worked, the only thing that i needed to change in my code was to DirectCast the feature.getShape. 
 Which is kind of weird and would never have thought it but ok now. 
  
 How can i change the rotation of the shape? For that feature only and not for all features in the layer…? 
  
 Thanks!

If you are using a feature made of a PointShape as in the attached sample app, what you need is to actually change the rotation of the symbol representing the feature. For that, you can use for example a custom style as RotatedImageStyle that you can find in the Code Community project Rotated Image Stylecode.thinkgeo.com/projects/show/rotatedimagestyle. You can see how we are using a column for the angle. I  think this project is going to get you inspired. If you still have some doubts, tell us more about your scenario and we will complete the sample app for your needs. Thank you.



I do not really get what happens here. 
 I have no clue how to create the new style class. 
  
 When i do that, every time i change the column value of the feature it will automatically change the features angle?? 
  
 It is way too complicated and without documentation i fear that i will waste hours and hours for very simple things. As i have so far for drawing an icon, making it move. And i still can’t change its color and rotation. 
 Why could it not be as simple as feature.getShape().rotation = 230 
 I don’t get it

I understand your frustration and we should do a better job at explaining some high level concepts. Soon, we will present a new Documentation addressing this.


In the meantime, I want to explain to you some key concepts so that you have a better grasp of what is going on. In your case,  you are dealing with points as shape and a point being a one dimentional shape with an X and a Y, you cannot apply a rotation to it. You need to apply the rotation to the symbol representing the point. Now, there is a property at the DefaultPointStyle level RotationAngle and this is going to set the angle for the symbol. You can see that in the new TestApp (TestApp_7794new.zip) that I attached in this post. You can see that you can apply the desired rotation to the symbol, but doing it that way this is going to happen to all the features of the InMemoryFeratureLayer. I don't think that this is what you want  and I think that you want to be able to control what feature you want to apply the rotation.   


That it is why, you need to go one step further and use a custom Style where you have control of both the rotation of the angle and the type of angle based on some column values of the features.   ( and in addition to that you want to change also the icon to have a different color).  You can see in the second attached file TestApp2 (testApp2_7794.zip)  how I created a custom Style specifically for your case and see how to have control for both the angle and the icon of the feature. The Style class I created is pretty rough, but I think you will see how to extent it from that to your own more realistic cases. You can extend the Style class to allow to display the features in any way you need, based on any parameters, all that thanks to object oriented inheritance and the flexibility of our framework. :-)


 


 



TestApp_7794new.zip (16.8 KB)
TestApp2_7794new.zip (19.5 KB)

I have another question regarding TestApp2. I have expanded it so it can read the position & rotation from records in a SQL Server database. Now I am trying to expand it to label each vehicle from columns to eventually show vehicle ID, speed & heading: 



If I just add labels with the normal  

VesselLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.......... 

code I get an error: 



"You are trying to use both a default style and the custom styles collection.  You may only use one or the other." 



So, does this mean I have to create the labels from within the style class in RotatedImageStyle.vb? I'd just like that confirmed before I go searching around for examples one way or the other. 



Thanks, 



Dave



If you are using CustomStyles, you cannot have Default Styles. You need to add the Styles to the CustomStyles collection. If you want to label your features, you create a TextStyle and add it to CustomStyles just as you do for RotatedImageStyle. Let say that the column name is "ID", the code would be as seen below:


 



       Dim rotatedImageStyle As New RotatedImageStyle(New GeoImage("..\..\data\blue_icon.png"), New GeoImage("..\..\data\red_icon.png"), "Color", "Angle")
        fishLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Clear()
        fishLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(rotatedImageStyle)

        'Adding TextStyle to CustomStyles collection.
        Dim textStyle1 As New TextStyle("ID", New GeoFont("Arial", 12), New GeoSolidBrush(GeoColor.StandardColors.Black))
        fishLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(textStyle1)

        fishLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20