Para resolver esse problema escrevi um código usando o Console Python do QGIS. A Vantagem é poder modificar o código para ler qualquer tipo de arquivo txt de entrada.
import math
import shutil
entrada='C:\\willian\\coordenadas_conversor\\exemplo.txt' #definir os arquivos de entrada e saida
saida='C:\\willian\\coordenadas_conversor\\saida.txt'
with open(entrada,'rt') as arquivo: #abre o arquivo de entrada
linhas = arquivo.readlines() #le cada linha
numeroLinhas=len(linhas)
jj=0
while jj < (numeroLinhas):
if linhas[jj].startswith('startAt='): #procura a linha que guarda o ponto inicial
coord_ini=linhas[jj].split('startAt=')
coord_ini=coord_ini[1].split(';')
x=float(coord_ini[0])
y=float(coord_ini[1])
linha_coordenada=[x]
linha_coordenada.append(y)
print(x,'\t',y)
saida_file = open(saida,'w+')
saida_file.write(str(x))
saida_file.write('\t')
saida_file.write(str(y))
saida_file.write('\n')
saida_file.close()
while jj <=(numeroLinhas-4): #iteracao: separa cada item contido na linha (usando o tab) e atribui os nomes para cada uma
graus=linhas[(jj+3)].split('D') #graus[0]
minutos=graus[1].split("'") #minutos[0] GMD
segundos=minutos[1].split('"') #segundos[0]
distancia=segundos[1].split(';')
distancia=(distancia[1])
angulo=(float(graus[0])+((float(minutos[0]))/60)+((float(segundos[0]))/3600)) #transforma angulo DMS em Decimais
x=x+(float(distancia)*math.sin(angulo*math.pi/180)) #calculo do proximo ponto
linha_coordenada.append(x)
y=y+(float(distancia)*math.cos(angulo*math.pi/180))
linha_coordenada.append(y)
print(x,'\t',y)
saida_file = open(saida,'a')
saida_file.write(str(x)) #salva a coordenada calculada
saida_file.write('\t')
saida_file.write(str(y))
saida_file.write('\n')
saida_file.close()
jj=jj+1
jj=jj+1
linha_coordenada_str=(str((linha_coordenada)))
linha_coordenada_str=(linha_coordenada_str[1:-1])
Arquivo exemplo de entrada:
startAt=445241.520;6731402.580;90
survey=Polygonal
{data}
310D21'16";60.10;90
36D04'34";55.30;90
60D14'57";243.30;90
29D48'19";414.90;90
50D31'35";327.00;90
35D03'45";165.95;90
84D04'22";218.90;90
06D11'18";85.75;90
77D36'17";236.15;90
106D15'43";506.25;90
119D11'08";66.60;90
240D17'56";481.00;90
110D35'56";263.70;90
143D26'38";184.35;90
151D14'09";283.40;90
85D22'06";170.00;90
45D01'58";72.00;90
79D54'52";89.50;90
67D10'23";316.20;90
79D11'49";184.90;90
Como resultado temos o seguinte arquivo de saida:
445241.52 6731402.58
445195.72059166385 6731441.495603504
445228.2845177578 6731486.191025163
445439.51553336164 6731606.923572751
445645.7431934786 6731966.940464303
445898.1602035488 6732174.821807927
445993.4934421632 6732310.656178082
446211.2231735018 6732333.260914118
446220.4667596245 6732418.511243241
446451.11209678225 6732469.201981521
446937.1077924437 6732327.437224623
446824.28615410055 6731963.86085104
446934.08680919197 6731815.777298133
447070.46045618673 6731567.346647034
447290.846109881 6731631.956670678
447378.96309852815 6731647.629778595
447670.3985715945 6731770.299273738
447852.021636299 6731804.955764722
Como cada um tem seu próprio tipo de arquivo de entrada, basta adaptar como o arquivo de entrada deve ser lido.
Abraço.