Skip to content

Instantly share code, notes, and snippets.

@procrastinatio
Created November 19, 2020 08:56
Show Gist options
  • Save procrastinatio/cf41a2e9f570bd2f54505d2745d4b499 to your computer and use it in GitHub Desktop.
Save procrastinatio/cf41a2e9f570bd2f54505d2745d4b499 to your computer and use it in GitHub Desktop.
Format for LTOP-EL
#!/usr/bin/python3
import sys
import csv
import random
import string
from datetime import datetime
FNAME = '20201102_Goms_RAW_Swisstopo.csv'
'''
Format LtOP: EL
https://geodesy.geo.admin.ch/reframe/ltop_fmt_descr_fr.html#EL
Format EL ( Exemple: chtrs95.el )
$$ELC'est la ligne titre
TRI150 PY 751030 4BL087334 +007 36 15.265890 +47 10 21.838950 657 617.1602 657CH -0.0485 114CH -10.2 15.5 114 0.0 0.0 114ST 01 @ 264TEXT-..
TRI152 PY 751030 4BL087336 7 36 10.521760 47 10 21.761880 657 633.4622 657CH -0.0486 114CH -10.5 15.0 114 0.0 0.0 114ZI 02 @ 264TEXT-..
TRI153 PY 751030 4BL087337 7 35 49.178250 47 10 28.434750 657 594.7734 657CH -0.0490 114CH -10.9 14.9 660 0.0 0.0 114ZI 03 @ 264TEXT-..
| | | | | | | | | | | | | | | | | | | | | | | | | | | | |
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
1 1 1 1 1 1 1
gcp227 PY 20201118 4BLHRXGWE 8 7 56.585350 46 23 46.471020 657 0.000000 11484
$$EL Type du fichier de coordonnées EL Coordonnées ellipsoïdiques (géodésiques), en degrés, minutes et secondes sexagésimales
1 - 10 (A10) Identification du point, nom
11 - 14 (A4) Identification du point, type
15 - 22 (A8) Identification du point, date du repérage (YYYYMMDD)
23 - 26 (A4) Ordre, canton
27 - 32 (A6) Nouveau numéro: carte / numéro du point
33 - 37 (I5) Longitude: degrés
38 - 40 (I3) Longitude: minutes
41 - 50 (F10.6) Longitude: secondes
51 - 55 (I5) Latitude: degrés
56 - 58 (I3) Latitude: minutes
59 - 68 (F10.6) Latitude: secondes
69 - 72 (I4) Provenance des coordonnées
73 - 82 (F10.4) Altitude H (sur l'ellipsoïde) [m]
83 - 86 (I4) Provenance de l'altitude
87 - 88 (A2) Code système de référence - CH : Bessel CH1903
- 84 : WGS84
- .......
89 - 96 (F8.4) Cote du géoïde [m] = écart entre le géoïde et l'ellipsoïde défini par le code (Pos.101-102)
97 - 100 (I4) Provenance de la cote du géoïde
101 - 102 (A2) Code de l'ellipsoïde (ellipsoïde de référence pour la cote du géoïde et la déviation de la verticale)
- CH : Bessel CH1903
- 84 : WGS84
- .......
103 - 108 (F6.1) Déviation de la verticale ETA (à l'altitude H) [cc]
109 - 114 (F6.1) Déviation de la verticale XI (à l'altitude H) [cc]
115 - 118 (I4) Provenance de la déviation de la verticale
119 - 124 (F6.1) Déviation de la verticale au niveau de la mer ETA0 [cc]
125 - 130 (F6.1) Déviation de la verticale au niveau de la mer XI0 [cc]
131 - 134 (I4) Provenance de la déviation de la verticale au niveau de la mer
135 - 138 (A4) Code point pour RAUMTRI *)
139 - 141 (I3) numérotation continue (pour GPS-Software) **)
142 - 143 (A2) Flag pour GPS **)
144 - 147 (I4) Numéro de session GPS (Day of Year) ***)
148 - 160 (A13) Réserve, texte supplémentaire
*) prévu pour code RAUMTRI
**) nécessaire pour "Bernese GPS-Software"
***) nécessaire pour la distinction des sessions (fichier des mesures pour LTOP)
'''
'''
Padding
String
'{:>10}'.format('test') --> align right
'{:10}'.format('test') --> align left
Integer
'{:4d}'.format(42)
Float
'{:06.2f}'.format(3.141592653589793)
'''
class FixWidthFieldLine(object):
fields = (('idname', '{:10}'),
('idtype', '{:4}'),
('iddate', '{:>8}'),
('canton', '{:>4}'),
('nr', '{:>6}'),
('lngdeg', '{:5d}' ),
('lngmin', '{:3d}' ),
('lngsec', '{:10.6f}'),
('latdeg', '{:5d}' ),
('latmin', '{:3d}' ),
('latsec', '{:10.6f}'),
('provcoord', '{:4d}' ),
('alt', '{:10.6f}'),
('provalt', '{:4d}' ),
('ref', '{:>2}')
)
def __init__(self):
self.idname = 'gcp11'
self.idtype = 'PY'
self.iddate = datetime.today().strftime('%Y%m%d')
self.canton = '4BL'
self.nr = ''.join(random.choices(string.ascii_uppercase + string.digits, k=6))
self.lngdeg = 0
self.lngmin = 0
self.lngsec = 0.0
self.latdeg = 0
self.latmin = 0
self.latsec = 0.0
self.provcoord = 657
self.alt = 0.0
self.provalt = 114
self.ref = '84'
def __str__(self):
tpls = [tpl for field_name, tpl in self.fields]
template = ''.join(tpls)
# print(template)
vals = [getattr(self, field_name) for field_name, width in self.fields]
#for x,y in zip(tpls, vals):
# print(x,y, type(y))
return template.format(*vals)
def get_coords(coord):
d,m,s = coord.split(':')
return (int(d), int(m), float(s))
with open(FNAME, newline='') as csvfile:
csv_reader = csv.reader(csvfile, delimiter=',')
header = next(csv_reader)
if header != None:
print('$$EL')
for row in csv_reader:
nr, b, l, h = row
bb = get_coords(b)
ll = get_coords(l)
hh = float(h)
le = FixWidthFieldLine()
le.idname = nr
le.lngdeg, le.lngmin, le.lngsec = ll
le.latdeg, le.latmin, le.latsec = bb
le.alt = hh
print(le)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment