The simFlight Network Forums

## Recommended Posts

Hi there!

I'm working at the moment on a little tool which positions (or should) your plane 4nm away from the runway. I already got it working setting the altitude and speed, but when it comes to longitude and latitude i have a problem.

As said i want to position the aircracft 4 nautical miles away from the runway. I thought it should work with picking the runway coordinates and adding values to the latitude and longitude (Offsets 0560, 0568). I was able to calculate with the law of sines the the values i have to add. But those values are in nautical miles (because I used the 4nm as  my hypotenuse for my calculation)... so how do I convert them into FS Values?

Philipp

##### Share on other sites

Pete's away at the moment so I'll tell you how I did this in my .NET Client DLL for FSUIPC. It has a helper class for calculating the very thing you describe. I assume you're not using .NET and so can't use these facilities, so here's what's 'under the hood':

What I suggest is not converting the NM distances into FS Units, but rather use them to calculate new Lon/Lat positions, then convert these to FS Units in the normal way. Converting Lon/Lat to FS Units for 0560 and 0568 is well documented and fairly easy. Trying to convert NM distances into these units is not documented and more difficult.

Adding/subtracting NM distances to Lon/Lat coordinates is easy for Latitude and a bit more cumbersome for Longitude. The following calculations all assume the Lon/Lat is in pure degrees and fractions of a degree (e.g. you're working with a value of 50.5 degrees representing 50 Degrees 30 Minutes)

Latitude:

1 Nautical Mile = 1/60th of 1 degree of Latitude, or

1 Degree of Latitude = 60 NM.

Therefore the number of degrees (or fraction of degrees) to add for distance d in NM = d / 60.

e.g. Adding 30NM to latitude 50.454:

50.454 + (30 / 60) = 50.954

Longitude:

A bit more tricky because the length of 1 degree of longitude varies depending on the latitude because the circles of longitude are smaller towards the pole than at the equator.

The first step is to figure out the length of a degree of longitude at the latitude of the point. This is given by:

cosine(latitude) * circumference of FS equator / 360

The circumference of the FS Equator is 40,075km = 21,638.7689 NM

So at 49.882 degrees latitude, one degree of longitude (in FS at least) is:

cos(49.882) * 21638.7689 / 360 = 38.73 NM

(Assume the cos function above takes degrees to keep this simple. Most programming languages have trig functions that take radians).

The next step is to calculate the number of degrees of longitude to add for the given distance (same as latitude but using the value from step 1 instead of the fixed 60 value)

e.g. Adding 30mn to 2.33 degrees longitude at latitude 49.882:

2.33 + (30 / 38.73) = 3.10

Once you have the new Lon/Lat you can just do the normal conversion to FS units to write to the offsets you mentioned.

Paul

Nothing in this post should be used for real-world navigation :smile:

##### Share on other sites

Many Thanks Paul!

Very well explained. Now I'm a big step further in "developing" my little tool ;)

I assume you're not using .NET and so can't use these facilities, so here's what's 'under the hood':

Actually I'm using Visual Studio and working with .NET  :smile:

Thanks a lot

Philipp

EDIT:

I just realized that you added an example project to the FSUIPC Client DLL Package  :oops: . I took the code for positioning the plane on the runway and edited it a bit(the distance, the heading, and the start position):

```        Dim latFS As Offset(Of Long) = New FSUIPC.Offset(Of Long)(&H560)
Dim lonFS As Offset(Of Long) = New FSUIPC.Offset(Of Long)(&H568)

slewMode.Value = 1
CMD_PAUSE.Value = 1
FSUIPCConnection.Process()

Dim lon As FsLongitude = New FsLongitude(lonFS.Value)
Dim lat As FsLatitude = New FsLatitude(latFS.Value)
Dim newPos As FsLatLonPoint = New FsLatLonPoint(lat, lon)
Dim rwyTrueHeading As Double = 161.18D

latFS.Value = newPos.Latitude.ToFSUnits8()
lonFS.Value = newPos.Longitude.ToFSUnits8()
speed.Value = 180 * 128
alt.Value = 1870 / 3.28
FSUIPCConnection.Process()

slewMode.Value = 0
FSUIPCConnection.Process()

CMD_WRITE.Value = REFRESH_SCENERY
FSUIPCConnection.Process()
```

It works quite well and everything seems logical, BUT: The plane is positioned 4nm away from the runway edge but not infront of it. It's a bit aside(see at the attached picture).

What did I wrong?

Thanks again :) ##### Share on other sites

The runway heading you used (161) seems to be the Magnetic heading. You need to use True headings when working with Lon/Lat positions.

If you don't have the true headings for the runways you can derive them from the magnetic headings by adding the magnetic variation. This can be found is offset 02A0, but only gives the value for the current position of the player.

Paul

## Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible. ×   Pasted as rich text.   Paste as plain text instead

Only 75 emoji are allowed.

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×

×