I am developing C# code that reads 1090ES Automatic Dependent Surveillance - Broadcast (ADS-B).

The ADS-B position messages broadcast by the aircraft's ADS-B transmitter have a different encoding depending on whether the aircraft is airborne or on the ground.

When I decode Airborne Position frames as Compact Position Reporting (CPR) encoded positions, I get realistic results. However, when I decode the CPR for Surface Position frames, the positions I get are far (geographically) from what I should get.

How is the CPR in Surface position messages different from airborne position messages and how are they decoded properly?

  • $\begingroup$ Too high a value for what parameters? $\endgroup$
    – GdD
    May 12, 2016 at 9:10
  • $\begingroup$ Sorry, it was wrong to write "too high value", I edited " much too far position from what I should get". Now I've just found out of some C# library that there may be differences in computations of Surface/Airbone frame types. $\endgroup$
    – TTT
    May 12, 2016 at 9:30
  • $\begingroup$ Why is this put "off-topic". Ads-B is a standard positioning system in aviation. The site even has a tag for it. $\endgroup$
    – TTT
    May 13, 2016 at 7:45
  • $\begingroup$ As I see it, it is actually both software and aviation. $\endgroup$
    – TTT
    May 13, 2016 at 8:15
  • $\begingroup$ If you see it clearer, yes it's OK that you re-write the question. I guess I'll have a validation step, not sure, it happens some times. But OK. $\endgroup$
    – TTT
    May 13, 2016 at 9:58

1 Answer 1


The Compact Position Report (CPR) coding in Surface squiters is different from Airborne CPR coding. The resolution is 4 times better (~1.25 m instead of ~ 5 m), at the cost of losing the 2 most significant bits.

Due to this, global surface position decoding gives an ambiguous solution. IIRC the solution can be at 4 points on the globe, you have to select the nearest to you. And you should validate that it is within a realistic range, like you should do with Airborne CPR decoding. After you validated the position using global decoding on a couple of odd- even squiter pairs you can use the more efficient local decoding. Of course, as with Airborne CPR decoding, you need to protect against position jumps and time gaps in your decoding algorithm.

  • $\begingroup$ You mean I should do 4 "local" CPR decodings and pick the one that is closest to my reference poin? What are those points ? Context: I'm working within a range of max a few handred kilometer from some reference point. I don't really know how to do local CPR decodings ? So far the only CPR decoding I know is inspired from inst.eecs.berkeley.edu/~ee123/sp15/lab/lab2/rtadsb.py $\endgroup$
    – TTT
    May 13, 2016 at 6:59
  • $\begingroup$ Maybe I could get inpiration from this github.com/bistromath/gr-air-modes/blob/master/python/cpr.py , function cpr_resolve_local with my reference location. Is that what I should do ? (Implementing this in my C# solution may take some time, so I'd prefer to be sure I'm on the right way.) $\endgroup$
    – TTT
    May 13, 2016 at 7:36
  • 1
    $\begingroup$ You could look in RTCA DO-260B or EUROCAE ED-102A, appendix A 1.7 and appendix T. See also this question. I'd like to write a more detailed explanation if I find the time, but don't expect that to be soon. $\endgroup$
    – DeltaLima
    May 13, 2016 at 9:03
  • $\begingroup$ Ah, thank you. I suggested colleagues we buy DO-260B. But so far they prefer to rely on Google searches... $\endgroup$
    – TTT
    May 13, 2016 at 9:07
  • 5
    $\begingroup$ If you are trying to build anything serious, I strongly recommend buying DO-260B or ED-102A (they are effectively the same, pick the cheapest). $\endgroup$
    – DeltaLima
    May 13, 2016 at 9:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.