-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathprimerjava.py
More file actions
324 lines (266 loc) · 11.8 KB
/
primerjava.py
File metadata and controls
324 lines (266 loc) · 11.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
Simon Šanca: Primerjava tahimetrične in GNSS izmere
"""
import matplotlib.pyplot as plt
import math
import numpy as np
#%% 1. PRIMERJAVA VIŠIN: A-Tahimeter, G-GNSS
def dol(y1:float,x1:float,y2:float,x2:float): #iz kooridnat
dolzina = math.sqrt((y2-y1)**2 + (x2-x1)**2)
return dolzina
def pravokotnaRazdalja(p1,p2,p3): #Pravokotna razdalja
pravokotnaRazdalja = np.linalg.norm(np.cross(p2-p1, p1-p3))/np.linalg.norm(p2-p1) #cross - vektorski produkt norm - norma
return pravokotnaRazdalja
def tockaNaPravokotnici(p1,p2,p3): #Pravokotna razdalja - preureditev iz Matlab funkcije
p = [p2[0] - p1[0],p2[1] - p1[1]] #vektor B-A
dAB = p[0]*p[0] + p[1]*p[1] #dolzina AB
if(dAB == 0):
return [0,0]
u = float(((p3[0]-p1[0])*p[0]+(p3[1]-p1[1])*p[1]))/float(dAB) #skalarni produkt (AB*AT)/dAB
point = [p1[0] + u*p[0],p1[1] + u*p[1]] #point = A+v*AB
return point
def resi(A,G,AH,GH): #G - GNSS, A-tahimeter, AH - H-tah, GH - H-gnss
pravokotneTockeX = []
pravokotneTockeY = []
izrisPravokotnihCrt = [] #za graf
praz = []
tah1H = []
tah2H = []
gnssH = []
file = open("rezultati.txt","w") #Izpis rezultatov
file.write("A(tahimeter), B(tahimeter), GNSS, Tocka pravokotnice, Razdalja do pripadajoce premice TAH\n")
for k in range(len(G)): #sprehod cez vse GNSS
i = 0 #prva tocka za vektor na katerega projekciramo
j = 1 #druga tocka za vektor na katerega projekciramo
print(k) #st. iteracije
Ai = i
Aj = j
minP = G[k]
minDol = math.inf; #najmanjsa oddaljenost od premice
while j < len(A): #cez vse TAH
p = tockaNaPravokotnici(A[i],A[j],G[k]) #(A,B,T)
if(A[i][0] <= A[j][0]): #katera manjsa po x osi
if p[0] >= A[i][0] and p[0] <= A[j][0]: #ce je pravokotna tocka znotraj intervala na x osi
if(k == 87): print(G[k],p)
if(A[i][1] <= A[j][1]): #katera je manjsa po y osi
if(p[1] >= A[i][1] and p[1] <= A[j][1]): # pravokotna tocka znotraj intervala na y osi
d = pravokotnaRazdalja(A[i],A[j],G[k]) #izračun pravokotne razdalje na premico
if(d < minDol): #trenutna dolzina < najmanjse dolzine
minP = p
minDol = d
Ai = i
Aj = j
elif(A[i][1] > A[j][1]): #ce je vecja po y osi
if(p[1] <= A[i][1] and p[1] >= A[j][1]):
d = pravokotnaRazdalja(A[i],A[j],G[k]) #izračun pravokotne razdalje na premico
if(d < minDol):
minP = p
minDol = d
Ai = i
Aj = j
elif(A[i][0] > A[j][0]): #ce je vecja po x osi
if p[0] <= A[i][0] and p[0] >= A[j][0]:
if(A[i][1] <= A[j][1]):
if(p[1] >= A[i][1] and p[1] <= A[j][1]):
d = pravokotnaRazdalja(A[i],A[j],G[k]) #izračun pravokotne razdalje na premico
if(d < minDol):
minP = p
minDol = d
Ai = i
Aj = j
elif(A[i][1] > A[j][1]): #ce je vecja po y osi - enako kot zgoraj
if(p[1] <= A[i][1] and p[1] >= A[j][1]):
d = pravokotnaRazdalja(A[i],A[j],G[k]) #izračun pravokotne razdalje na premico
if(d < minDol):
minP = p
minDol = d
Ai = i
Aj = j
i = i+1 #vzame naslednji dve TAH tocki
j = j+1
if(minDol != math.inf): #ce minDol ni enaka neskoncnosti --> najmanjsa pravokotna tocka na premico AB
if (minDol < 1): #Vecjih dolzin od 1 m ne shranjujemo med rezultate ker so posledica izgube signala GNSS med izmero
#FORMAT izpisa na 3 decimalna mesta
dec = "{:.4f}" #koordinate x,y
#TAH
tah1x = dec.format(A[Ai][0])
tah1y = dec.format(A[Ai][1])
tah2x = dec.format(A[Aj][0])
tah2y = dec.format(A[Aj][1])
visinaTAH1 = dec.format(AH[Ai]) #A
visinaTAH2 = dec.format(AH[Aj]) #B
#GNSS
gnss_x = dec.format(G[k][0])
gnss_y = dec.format(G[k][1])
visinaGNSS = dec.format(GH[k])
#Tocka pravokotnice
prav_x = dec.format(minP[0])
prav_y = dec.format(minP[1])
#Dolzina
prav_dol = dec.format(minDol)
file.write("("+str(tah1x)+","+str(tah1y)+","+visinaTAH1+") ("+str(tah2x)+","+ str(tah2y)+","+visinaTAH2+") ("+str(gnss_x)+","+str(gnss_y)+","+visinaGNSS+") ["+str(prav_x)+","+ str(prav_y)+"] " + str(prav_dol)+"\n")
if(minDol < 1 ): #uporabimo za izris pravokotnih crt, dolge ne izrisujemo
izrisPravokotnihCrt.append([G[k][0],G[k][1],minP[0],minP[1]]) #v tabelo shranimo podatke o tem katera pravokotna tocka pripada kateri gnss tocki
pravokotneTockeX.append(minP[0]) #za izris pravokotnih tock
pravokotneTockeY.append(minP[1])
tah1H.append(AH[Ai])
tah2H.append(AH[Aj])
gnssH.append(GH[k])
praz.append(minDol)
file.close()
return [pravokotneTockeX,pravokotneTockeY,praz,izrisPravokotnihCrt,tah1H,tah2H,gnssH]
#%% 2. BRANJE PODATKOV
A = [] #TAH
AH= [] #Visine TAH
Ax = []
Ay = []
G = [] #GNSS
GH = [] #Visine GNSS
Gx = []
Gy = []
#TAH
file = open("tah1.txt", "r") #Spreminjaj prebrano datoteko za primerjavo
for line in file:
x = float(line.split()[1])
y = float(line.split()[2])
A.append([x,y])
AH.append(float(line.split()[3]))
Ax.append(x)
Ay.append(y)
A = np.array(A)
file.close()
#GNSS
file = open("csrs1.txt","r") #Spreminjaj prebrano datoteko za primerjavo
for line in file:
x = float(line.split()[0])
y = float(line.split()[1])
G.append([x,y])
GH.append(float(line.split()[2]))
Gx.append(x)
Gy.append(y)
G = np.array(G)
file.close()
#RESITEV PRIMERJAVE:
resitev = resi(A,G,AH,GH) #(TAH,GNSS,H-tah,H-GNSS)
print("------------------------------------------------------------------------")
print("Konec primerjave!")
print("Rezultati primerjave horizontalnih položajev TAH in GNSS so v datoteki rezultati.txt, v isti mapi!")
print("Sledi statistična analiza!")
print("Rezultati statistične analize so v datoteki statistika.txt, v isti mapi!")
print("Sledi grafični izris!")
print("Graf 1 - Primerjava HZ položajev")
print("Graf 2 - Primerjava višin")
print("Za naslednjo analizo spremenite imena vhodnih datotek in znova zaženite program!")
print("------------------------------------------------------------------------")
#%% 3. PRIMERJAVA VISIN
"""
Nadmorske visine SitraNet in Tahimetricna izmera
h_prizme = 5.9 cm, vse visine tahimetra so preracuane na fazni center antene sprejemnika
"""
praz = np.array(resitev[2]) #razdalja med premico TAH in GNSS
tahH1 = np.array(resitev[4]) #A
tahH2 = np.array(resitev[5]) #B
gnssH = np.array(resitev[6]) #GNSS
tahHi = (tahH1 + tahH2)/2 #povprecje A-B potrebno za izris
st_op = [] #stevilo opazovanj
vrstice = 0 #
for i in resitev[4]:
st_op.append(vrstice)
vrstice = vrstice + 1
praz_2 = (praz)**2
tahH = (tahH1 + tahH2)/2 #povprecje A-B
dH = abs(tahH - gnssH) #razlike v visini TAH-GNSS
dH_2 = (dH)**2 # dH^2
#%% 4. STATISTIČNA ANALIZA - za vsako serijo posebej
#%% 4.1 HZ KOORDINATE
praz_povp = np.mean(praz) #povprecje
praz_min = np.min(praz) #min
praz_max = np.max(praz) #max
praz_std = np.std(praz) #standardni odklon
praz_var = np.var(praz) #varianca
praz_rms = np.sqrt(np.mean(praz_2)) #rms
#%% 4.2 VISINE
dH_povp = np.mean(dH) #povprecje visinske razlike
dH_min = np.min(dH) #min
dH_max = np.max(dH) #max
dH_std = np.std(dH) #standardni odklon
dH_var = np.var(dH) #varianca
dH_rms = np.sqrt(np.mean(dH_2)) #rms
#%% 4.3 IZPIS REZULTATOV
dec = "{:.4f}"
filestat = open("statistika.txt","w")
#HZ-koordinate
filestat.write("Statistika primerjave HZ koordinat:\n")
filestat.write("Povprecje: "+str(dec.format(praz_povp))+"\n")
filestat.write("Minimum: "+str(dec.format(praz_min))+"\n")
filestat.write("Maksimum: "+str(dec.format(praz_max))+"\n")
filestat.write("St. odklon: "+str(dec.format(praz_std))+"\n")
filestat.write("Varianca: "+str(dec.format(praz_var))+"\n")
filestat.write("RMS: "+str(dec.format(praz_rms))+"\n")
filestat.write("\n")
#VISINE
filestat.write("Statistika primerjave visin:\n")
filestat.write("Povprecje: "+str(dec.format(dH_povp))+"\n")
filestat.write("Minimum: "+str(dec.format(dH_min))+"\n")
filestat.write("Maksimum: "+str(dec.format(dH_max))+"\n")
filestat.write("St. odklon: "+str(dec.format(dH_std))+"\n")
filestat.write("Varianca: "+str(dec.format(dH_var))+"\n")
filestat.write("RMS: "+str(dec.format(dH_rms))+"\n")
filestat.close()
#IZPIS RAZLIK VISIN
dHizpis = dH.tolist()
filedH = open("rtklib_dH.txt","a")
for i in range(len(dH)):
filedH.write('{} {:.4f}\n'.format('dH',abs(dH[i])))
filedH.close()
#%% 5. GRAFIČNI IZRIS
#%% 5.1 HZ-koordinate TAH in GNSS
#Koordinate stebrov
fgg124e = [460878.787,460938.078,460888.287]
fgg124n = [100784.216,100811.610,100763.782]
##IZRIS
plt.figure(num=1,dpi=100,facecolor='w',edgecolor='k')
plt.title('Primerjava 2D položajev: TAH in GNSS')
plt.grid(True)
plt.autoscale(enable = True, axis = 'both')
plt.ylabel('n [m]')
plt.xlabel('e [m]')
plt.ticklabel_format(useOffset=False)
#STEBRI
plt.scatter(fgg124e,fgg124n,marker = 'o',s=10.0,color = 'k') #FGG1 in FGG2
plt.text(fgg124e[0],fgg124n[0], "FGG1",color = 'k',style = 'italic',fontsize = 11)
plt.text(fgg124e[1],fgg124n[1], "FGG2",color = 'k',style = 'italic',fontsize = 11)
plt.text(fgg124e[2],fgg124n[2], "FGG4",color = 'k',style = 'italic',fontsize = 11)
#TAH
plt.scatter(Ax,Ay,marker='+',color='r',label='TAH')
plt.plot(Ax,Ay,color='r') #poveži
#GNSS
plt.scatter(Gx,Gy,marker='o',color='g',label='GNSS')
plt.plot(Gx,Gy,color='g')
#Pravokotne tocke x,y
plt.scatter(resitev[0],resitev[1],marker="*",color="b",label='PravT')
#Pravokotne crte, ki povezujejo GNSS s premico TAH - odstopanja med trajektorijama
for tocke in resitev[3]:
plt.plot([tocke[0],tocke[2]],[tocke[1],tocke[3]], color='b')
plt.legend(loc=2)
plt.gca().set_aspect('equal',adjustable='box')
plt.show()
#%% 5.2 Visine TAH in GNSS
plt.figure(num=2, figsize=(10,6),dpi=100,facecolor='w',edgecolor='k')
plt.title('Primerjava višin TAH in GNSS')
plt.grid(True)
plt.xlabel('Zaporedna številka opazovanj')
plt.ylabel('Nadmorska višina izmerjenih točk [m]')
plt.ticklabel_format(useOffset=False)
#TAH
plt.scatter(st_op,tahHi,marker = '+',s=10.0,color='r',label='Tahimeter')
plt.plot(st_op,tahHi,color='r') #povezave
#GNSS
plt.scatter(st_op,gnssH,marker = 'o',s=10.0,color='g',label='GNSS')
plt.plot(st_op,gnssH,color='g') #povezave
plt.xlim(xmin=-5)
plt.legend(loc=1)
plt.show()
print("Konec izrisa!")