riggmatch2sosi.py
# -*- coding: utf-8 -*-
# riggmatch2sosi.py
#
# Leser inn og matcher data fra to filer:
# Data fra borerigg med info om boredybde kobles sammen med
# innmålte posisjoner i KOF-fil.
# Resultatet skrives ut på SOSI-format.
#
# Made by: sverre.stikbakke@hig.no 11.11.11
#
# Oppdatert til python 3 25.03.19
#
# =============================================================================
riggmatch2sosi.py
# Datafiler inn
riggrapport = "KS_PEL_1.csv"
posisjoner = "KS_Pel_1_Test_Sosi.kof"
sosihode = "sosihode.txt"
# SOSI-fil ut
sosifil = "KS_PEL_1.SOS"
# Faste parametre som skrives til fil
KVALITET = "11 1"
# Faste parametre som brukes i beregningene
delta_z = 0.5 # Avstand målepunkt på rigg til bakkenivå
riggmatch2sosi.py (forts.)
Column name;Date;Time;Depth (m);Stabilized (m);M+;M-;Avg.(kg/ls); ..
.. Start weight;Drill time (s);Stab.(s);Elev. mm/r;Tank no.;Orginal name;;;
E24P23;03.10.2011;07:16;10,1;9,6;2,3;0;30;3918;311;167;20;;E24P23;;;
E24P24;03.10.2011;07:20;10;9,5;0;0;27;3631;590;164;20;;E24P24;;;
E24P25;03.10.2011;07:25;9,9;9,4;0;0;27;3369;600;0;20;;E24P25;;;
E24P26;03.10.2011;07:30;9,8;9,3;0;0;29;3111;600;0;20;;E24P26;;;
E24P27;03.10.2011;07:35;9,6;9,1;0,4;0;28;2836;600;0;20;;E24P27;;;
E24P28;03.10.2011;07:40;9,6;9,1;0;0;28;2579;600;0;20;;E24P28;;;
E24P29;03.10.2011;07:45;9,2;8,7;1,6;0;28;2327;600;0;20;;E24P29;;;
E24P30;03.10.2011;07:49;9;8,5;0;0;27;2081;600;0;20;;E24P30;;;
E24P31; 03.10.2011; 07:54; 8,9; 8,5; 0;0; 26; 1849; 600; 0; 20; ;E24P31; ; ;
riggrapport = "KS_PEL_1.csv"
05 E24P23 6443455.431 438931.048 8.000
05 E24P22 6443454.925 438931.263 8.000
05 E24P25 6443455.491 438930.572 8.000
05 E24P24 6443454.984 438930.786 8.000
05 E24P27 6443455.550 438930.096 8.000
05 E24P26 6443455.044 438930.310 8.000
05 E24P29 6443455.610 438929.619 8.000
05 E24P28 6443455.104 438929.834 8.000
05 E24P31 6443455.670 438929.143 8.000
05 E24P30 6443455.163 438929.358 8.000
05 E24P33 6443455.729 438928.667 8.000
05 E24P32 6443455.223 438928.881 8.000
05 E24P35 6443455.789 438928.190 8.000
05 E24P34 6443455.283 438928.405 8.000
posisjoner = "KS_Pel_1_Test_Sosi.kof"
.HODE
..TEGNSETT UTF-8
..OMRÅDE
...MIN-NØ 6443450 438920
...MAX-NØ 6443460 438940
..SOSI-VERSJON 4.0
..SOSI-NIVÅ 3
..TRANSPAR
...KOORDSYS 22
...ORIGO-NØ 0 0
...ENHET 0.001
...VERT-DATUM NN54
..INNHOLD
...PRODUKTSPEK Anvendt geofysikk 4.0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
sosihode = "sosihode.txt"
# Leser inn riggdata
Rigg_data = {} # Python dictionary
with open(riggrapport) as rigg_file:
for pel in rigg_file.readlines():
# Tilordner verdier fra datafil til variabler
# Verdiene skilles fra hverandre med ";"
(Column_name,
Date,
Time,
Depth_m,
Stabilized_m,
riggmatch2sosi.py (forts.)
for pel in rigg_file.readlines():
# Tilordner verdier fra datafil til variabler
# Verdiene skilles fra hverandre med ";"
(Column_name,
Date,
Time,
Depth_m,
Stabilized_m,
M_pluss,
M_minus,
Avg_kg_ls,
Start_weight,
Drill_time_s,
Stab_s,
Elev_mm_r,
Tank_no,
Orginal_name,
Dummy,
Dummy,
Dummy) = pel.split(";")
# Lagrer aktuelle data om hver pel
Rigg_data[Column_name] = (
Column_name,
Date,
Time,
Depth_m)
Lagrer data i dictionary Rigg_data med Column_name som nøkkel
# Leser inn koordinatfil
Pos_data = {} # Python dictionary
with open(posisjoner) as pos_file:
for pel in pos_file.readlines():
if pel.startswith(" 05"):
# Tilordner verdier fra datafil til variabler
# Verdiene skilles fra hverandre med "whitespace"
(Dummy,
Id,
Nord,
Ost,
Hoyde_XYZ0) = pel.split()
Leser data i koordinatfil og tilordner disse til variabler
# Lagrer aktuelle data om hver pel
Pos_data[Id] = (
Id,
Ost,
Nord,
Hoyde_XYZ0)
Lagrer data i dictionary Pos_data med Id som nøkkel
# Leser inn fil med SOSI-hode
with open(sosihode, encoding='utf-8') as sosi_hode_file:
hode = sosi_hode_file.read()
Leser inn tekstfil og tilordner til variabel.
Merk bruk av read() mot tidligere bruk av readlines()
with open(sosifil, "w", encoding='utf-8') as sosi_file:
sosi_file.write(hode)
Åpner utfil, sosifil, for skriving ("w") og skriver ut begynnelsen av fila,
hode
for pel in Rigg_data:
if Pos_data.get(pel):
# Henter ut verdier fra Pos_data
pel_data_pos = Pos_data.get(pel)
Her skjer magien: data fra riggrapport og posisjoner matches ved at
nøkkelen i Rigg_data søkes opp i Pos_data.
for pel in Rigg_data:
if Pos_data.get(pel):
# Henter ut verdier fra Pos_data
pel_data_pos = Pos_data.get(pel)
Her skjer magien: data fra riggrapport og posisjoner matches ved at
nøkkelen i Rigg_data søkes opp i Pos_data.
# Henter ut verdier fra Pos_data
pel_data_pos = Pos_data.get(pel)
pel_ID = pel_data_pos[0]
x = float(pel_data_pos[1])
y = float(pel_data_pos[2])
z2 = float(pel_data_pos[3]) # innmålt høyde topp av pel
Posisjonene (koordinatene) fra posisjonsfila hentes ut og tilordnes variablene x, y og z2.
# Henter ut verdier fra Rigg_data
pel_data_rigg = Rigg_data.get(pel)
boredybde_rigg = pel_data_rigg[3].replace(",", ".")
boredybde = float(boredybde_rigg) - delta_z
# Beregne bunnen av borehull
z1 = z2 - boredybde
Henter ut boredybde fra rigg-dataene og beregner bunnen av borehullet. Merk omgjøring av desimaltegn fra komma til punktum.
sosi_file.write(".KURVE " + KURVE + ":" + "\n")
sosi_file.write("..OBJTYPE GeofLinjeInfo" + "\n")
sosi_file.write("..ID " + pel_ID + "\n")
sosi_file.write("..DATAFANGSTDATO "
+ DATAFANGSTDATO + "\n") # Fra riggrapport
sosi_file.write("..BORLENGDE " + BORLENGDE + "\n")
# Settes fast i begynnelsen av denne fila
sosi_file.write("..KVALITET " + KVALITET + "\n")
sosi_file.write("..NØH" + "\n")
sosi_file.write(N + " " + E + " " + H1 + "\n")
sosi_file.write(N + " " + E + " " + H2 + "\n")
sosi_file.write(".SLUTT")
Etter litt mer omregning skrives resultatet til fil.
Variablene som skrives ut er:
KURVE, pel_ID, DATAFANGSTDATO, BORLENGDE,
KVALITET, N, E, H1, H2.
.KURVE 1:
..OBJTYPE GeofLinjeInfo
..ID E24P23
..DATAFANGSTDATO 20111003
..BORLENGDE 9600
..KVALITET 11 1
..NØH
6443455431 438931048 -1600
6443455431 438931048 8000
Eksempel på data som skrives ut for en enkelt pel. Dette er dokumentasjon på hva som finnes i grunnen.
Komplett kode tilgjengelig på github: