Python - datastrukturer

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:

https://github.com/sverres/riggmatch2sosi

INGG1001 Datastrukturer - eksempel

By sverres

INGG1001 Datastrukturer - eksempel

  • 444