1717from xtgeo .common .xtgeo_dialog import XTGeoDialog
1818from xtgeo .metadata .metadata import MetaDataRegularSurface
1919
20+ import surfio
21+
2022from ._regsurf_ijxyz_parser import parse_ijxyz
2123from ._zmap_parser import parse_zmap
2224
@@ -50,31 +52,20 @@ def import_irap_binary(mfile: FileWrapper, values: bool = True, **_):
5052 if mfile .memstream :
5153 mfile .file .seek (0 )
5254 buf = mfile .file .read ()
55+ surf = surfio .IrapSurface .from_binary_buffer (buf )
5356 else :
54- with open (mfile .file , "rb" ) as fhandle :
55- buf = mmap .mmap (fhandle .fileno (), 0 , access = mmap .ACCESS_READ )
56-
57- # Ensure buffer is large enough for header
58- header_size = 100
59- if len (buf ) < header_size :
60- raise ValueError ("Buffer size is too small for header" )
61-
62- # unpack header with big-endian format string (cf. docstring info)
63- hed = np .frombuffer (
64- buf [:header_size ],
65- dtype = ">i4,>i4,>i4,>f4,>f4,>f4,>f4,>f4,>f4,>i4," # <32> IDFLAG NY XORI ... <32>
66- + ">i4,>i4,>f4,>f4,>f4,>i4," # <16> NX ROT X0ORI Y0ORI<16>
67- + ">i4,>i4,>i4,>i4,>i4,>i4,>i4,>i4,>i4" , # <28> 0 0 0 0 0 0 0 <28>
68- )
57+ surf = surfio .IrapSurface .from_binary_file (mfile .file )
58+
59+ header = surf .header
6960
7061 args = {}
71- args ["nrow" ] = int ( hed [ 0 ][ 2 ])
72- args ["xori" ] = float ( hed [ 0 ][ 3 ])
73- args ["yori" ] = float ( hed [ 0 ][ 5 ])
74- args ["xinc" ] = float ( hed [ 0 ][ 7 ])
75- args ["yinc" ] = float ( hed [ 0 ][ 8 ])
76- args ["ncol" ] = int ( hed [ 0 ][ 11 ])
77- args ["rotation" ] = float ( hed [ 0 ][ 12 ])
62+ args ["nrow" ] = header . nrow
63+ args ["xori" ] = header . xori
64+ args ["yori" ] = header . yori
65+ args ["xinc" ] = header . xinc
66+ args ["yinc" ] = header . yinc
67+ args ["ncol" ] = header . ncol
68+ args ["rotation" ] = header . rot
7869
7970 args ["yflip" ] = 1
8071 if args ["yinc" ] < 0.0 :
@@ -84,32 +75,15 @@ def import_irap_binary(mfile: FileWrapper, values: bool = True, **_):
8475 if not values :
8576 return args
8677
87- # Values: traverse through data blocks
88- stv = header_size # Starting byte
89- datav = []
90-
91- while stv < len (buf ):
92- # start block integer - number of bytes of floats in following block
93- blockv = np .frombuffer (buf [stv : stv + 4 ], dtype = ">i4" )[0 ]
94- stv += 4
95- # floats
96- datav .append (np .frombuffer (buf [stv : stv + blockv ], dtype = ">f4" ))
97- stv += blockv
98- # end block integer not needed really
99- stv += 4
100-
101- values = np .hstack (datav )
102- values = np .reshape (values , (args ["ncol" ], args ["nrow" ]), order = "F" )
103- values = np .array (values , order = "C" )
78+ values = surf .values
10479 values = np .ma .masked_greater_equal (values , UNDEF_MAP_IRAPB )
10580 args ["values" ] = np .ma .masked_invalid (values )
10681
107- del buf
10882 return args
10983
11084
11185def import_irap_ascii (mfile : FileWrapper , ** _ ):
112- """Import Irap in pure python code, suitable for memstreams, and now efficient.
86+ """Import Irap ascii which has the following format:
11387 -996 2010 5.000000 5.000000
11488 461587.553724 467902.553724 5927061.430176 5937106.430176
11589 1264 30.000011 461587.553724 5927061.430176
@@ -124,33 +98,30 @@ def import_irap_ascii(mfile: FileWrapper, **_):
12498 if mfile .memstream :
12599 mfile .file .seek (0 )
126100 buf = mfile .file .read ().decode ()
101+ surface = surfio .IrapSurface .from_ascii_string (buf )
102+ del buf
127103 else :
128- with open (mfile .file ) as fhandle :
129- buf = fhandle .read ()
130-
131- buf = buf .split (maxsplit = 19 )
132- args = {}
133- args ["nrow" ] = int (buf [1 ])
134- args ["xinc" ] = float (buf [2 ])
135- args ["yinc" ] = float (buf [3 ])
136- args ["xori" ] = float (buf [4 ])
137- args ["yori" ] = float (buf [6 ])
138- args ["ncol" ] = int (buf [8 ])
139- args ["rotation" ] = float (buf [9 ])
140-
141- nvalues = args ["nrow" ] * args ["ncol" ]
142- values = np .fromstring (buf [19 ], dtype = np .double , count = nvalues , sep = " " )
104+ surface = surfio .IrapSurface .from_ascii_file (str (mfile .file ))
143105
144- values = np .reshape (values , (args ["ncol" ], args ["nrow" ]), order = "F" )
145- values = np .array (values , order = "C" )
146- args ["values" ] = np .ma .masked_greater_equal (values , UNDEF_MAP_IRAPA )
106+ values = surface .values
107+ values = np .ma .masked_greater_equal (values , UNDEF_MAP_IRAPB )
108+ values = np .ma .masked_invalid (values )
109+ args = {
110+ "nrow" : surface .header .ny ,
111+ "xinc" : surface .header .xinc ,
112+ "yinc" : surface .header .yinc ,
113+ "xori" : surface .header .xori ,
114+ "yori" : surface .header .yori ,
115+ "ncol" : surface .header .nx ,
116+ "rotation" : surface .header .rot ,
117+ "values" : surface .values ,
118+ }
147119
148120 args ["yflip" ] = 1
149121 if args ["yinc" ] < 0.0 :
150122 args ["yinc" ] *= - 1
151123 args ["yflip" ] = - 1
152124
153- del buf
154125 return args
155126
156127
0 commit comments