Relatório de Posição Compacta (Compact Position Reporting, CPR) é uma maneira de reduzir o número de bits necessários para transmitir a posição enquanto mantém a resolução de posição alta (~ 5,1 metros para codificação aérea). A codificação ordinária exigiria 45 bits, mas a CPR usa 35 bits, economizando 10 bits. Para fazer isso, o mundo é dividido em várias zonas, tanto para latitude quanto para longitude, e a posição dentro da zona é codificada. Uma vez que a transmissão dos números da zona custaria tantos bits quanto o que teria sido salvo, um truque inteligente é usado. Dois tipos de codificação são usados, cada um com um número diferente de zonas. A partir da diferença nas coordenadas da zona entre os dois tipos de codificação, pode-se determinar em qual zona a aeronave está. Portanto, é necessário receber uma mensagem codificada par e ímpar dentro de 10 segundos um do outro. Uma vez que a decodificação da posição inicial seja bem sucedida, cada mensagem de posição subseqüente fornecerá a posição atualizada.
Na decodificação de RCP, você primeiro determina a latitude da aeronave com base em um par de mensagens de posição ímpar e par recebidas dentro de 10 segundos uma da outra.
A latitude é sempre codificada no mesmo número de zonas entre o equador e os pólos (15 para codificação uniforme, 14.75 para codificação ímpar). Devido ao arredondamento da Terra, o número de zonas usadas para codificação de longitude depende da latitude. A codificação por longitude usa 59 zonas no equador e apenas 1 nos pólos. A codificação ímpar usa sempre uma zona a menos, exceto perto do pólo em que uma zona é usada como na codificação uniforme. O número de zonas de longitude usadas para codificação uniforme pode ser encontrado pela função $ NL () $.
As latitudes de transição, isto é, onde o número de zonas para codificação de longitude mudam, podem ser calculadas pela função inversa $ NL () $. Essa função pode ser usada para criar uma tabela de pesquisa de latitudes de transição que seja mais eficiente de usar do que a função $ $ () $ original.
Sem saber nada sobre sua implementação, é difícil ajudar ainda mais. A fórmula é descrita corretamente na sua pergunta. Note que a latitude de entrada é dada em graus, mas supõe-se que a função trigonométrica trabalhe em radianos, daí o fator $ \ frac {\ pi} {180} $.
Editar: na inspeção posterior, notei um erro na fórmula: deve ser:
$$ NL = int \ left (2 \ pi \ esquerdo [arccos \ left (1 - {1 - cos \ left) ({\ pi \ over 2NZ} \ right) \ over cos ^ 2 \ left ({\ pi \ over 180} \ mid lat \ mid \ right)} \ right) \ right] ^ {- 1} \ right) $$
(note que a conversão de graus para radianos é corrigida)
Para aqueles que realmente querem entender detalhadamente a codificação e decodificação de RCP, você terá que obter uma cópia do documento RTCA DO-260B ou do documento Eurocae ED-102A (infelizmente eles são caros, eu penso em $ 700) e leia o Apêndice A.1.7 e o Apêndice T.