 # flightconflicts

Tools to analyze conflicts between aircraft.

lonlatToXY.R (1847B)

```      1 #' Convert lon/lat coordinates to north/east coordinates (in feet) using a
2 #' flat-Earth approximation.
3 #'
4 #' @param longitude A numeric vector.
5 #' @param latitude A numeric vector.
6 #' @param originLongintude The logntidue for which x = 0 feet.
7 #' @param originLatitude The latitude for which x = 0 feet.
8 #' @return A n x 2 matrix giving the x and y distance (respectively), in feet,
9 #'   of each longitude/latitude pair from the origin longitude/latitude.
10 lonlatToXY <- function(longitude, latitude, originLongitude, originLatitude) {
11   # This implementation is based on code from:
12   # http://williams.best.vwh.net/avform.htm#flat
13   lon0 <- originLongitude * pi / 180.0
14   lat0 <- originLatitude * pi / 180.0
15
16   dlon <- longitude * pi / 180.0 - lon0
17   dlat <- latitude * pi / 180.0 - lat0
18
19   # Radius in feet and flattening based on WGS84
20   a <- 20925646
21   #a <- 6378137
22   f <- 1/298.257223563
23   e2 <- f*(2-f)
24
25   R1 <- a*(1-e2)/(1-e2*(sin(lat0))^2)^(3/2)
26   R2 <- a/sqrt(1-e2*(sin(lat0))^2)
27
28   xyFeet <- cbind(R2 * cos(lat0) * dlon,
29                   R1 * dlat)
30
31   return(xyFeet)
32 }
33
34 #' Convert a bearing (in degrees) and velocity (in knots) to north and east
35 #' velocity (in ft / s).
36 #'
37 #' @param bearing A numeric vector giving the instantaneous direction of the
38 #'   velocity in degrees.
39 #' @param speed A numeric vector giving the instantaneous magnitude of the
40 #'   velocity in knots.
41 #' @return A n x 2 matrix giving the north/south and east/west components of the
42 #'   velocity, in feet/s.
43 bearingToXY <- function(bearing, speed) {
44   # Velocity should be in knots. Convert to ft / s
45   fps <- speed * 1.68781
46   # Bearing should be degrees from north. Convert to radians.
47   theta <- bearing * pi / 180
48   # Return x and y components of the velocity in ft / s
49   return(cbind(fps * sin(theta),
50                fps * cos(theta)))
51 }
```