[GRASS-user] Automatic 3D geological boreholes representation (automate v.extrude from a table ?): my solution in Python

Martin Laloux martin.laloux at gmail.com
Sun Jun 3 05:56:50 PDT 2012


For those interested, following my question of "automate v.extrude from a
table ?" (
http://osgeo-org.1560.n6.nabble.com/automate-v-extrude-from-a-table-td4978722.html),
I found a solution in pure Python (consulting
href="http://code.google.com/p/postgis-grass-r-py/wiki/0003_01_PythonForGrassGis">http://code.google.com/p/postgis-grass-r-py/wiki/0003_01_PythonForGrassGis).


*My problem is to represent the 3D boreholes in nviz without  manually
repeating the v.extrude command n times.*

My solution in Python (that works for me):

1) I create a buffer around each point locating a borehole to obtain an
area layer (circular)

[image: Images intégrées 4]

2) I process this layer in Python (It is also possible to run it in the
Python shell of the Layer Manager)

  *# import modules (for the pure Python script*)
   import sys, os, numpy, argparse
   import grass.script as g
   import grass.script.setup as gsetup
    *# init*
   gisbase = os.environ['GISBASE']
   gisdb="/Users/me/grassdata"
   location="geol"
   mapset="mymapset"
   gsetup.init(gisbase, gisdb, location, mapset)

   *# read the depths of the limits of two formations (A and B) in the
boreholes* *table*
   inmap = "boreholes" # the area layer
   val = g.read_command('v.db.select', map = inmap, columns = "A,B",fs=',',
flags = 'c')
   levels=val.split('\n')
   levels=[i.split(',') for i in levels]
   print levels
   *[['890', '850'], ['1040', '830'],....]*
    *# read the identification code of the boreholes* *in the table*
    test= g.read_command('v.db.select', map = inmap, columns =
"IDENT",fs=',', flags = 'c')
    ident =  test.split('\n')
    ident=[i.split(',') for i in ident]
    print ident
  * [['3930148'], ['3930243'],.....]*
  * # read info from the vector layer (number of boreholes in the layer)*
   info = g.parse_command('v.info',flags='t', map=inmap,quiet=True)
   n = int(info['areas'])

   *# extrude each individual boreholes (one 3D layer for each borehole)*
   for i in range(n-1):
         name = "bore"+str(ident[i]) # name of the 3D layer
         # selection/extraction of one element of the table
         g.run_command('v.extract',input=inmap, list=i+1,
output='tmp',type='area', quiet=True, overwrite=True)
         # extrusion with base = limit of B formation (levels[i][1] = 850
for the first), height=thickness A-B (levelst[i][0])-float(levelst[i][1]) =
40 for the first)
         g.run_command('v.extrude', input='tmp', output=name,
zshift=float(levels[i][1]),height=
float(levelst[i][0])-float(levelst[i][1]),overwrite=True)
         g.run_command('g.remove', vect='tmp', quiet=True)

*3) the resulting 3D layers (cylinders) in nviz (thickness of the interval
A-B) *

[image: Images intégrées 1]

4) *it is not possible to create a single layer because v.patch writes
always 2D layers. For example:*

         *# creation of a layer*
         g.run_command('v.edit', tool='create', map=outmap)

         *# extrude each borehole and add to the layer (v.patch)*
         for i in range(n-1):
             g.run_command('v.extract',input=inmap, list=i+1,
output='tmp',type='area', quiet=True, overwrite=True)
             g.run_command('v.extrude', input='tmp', *output='tmp_extr'*,
zshift=float(levels[i][1]),height=
float(levelst[i][0])-float(levels[i][1]),overwrite=True)
             *g.run_command('v.patch', flags='a', input='tmp_extr',
output=outmap, quiet=True, overwrite=True)*
             g.run_command('g.remove', vect='tmp,tmp_extr', quiet=True)

gives the result "*WARNING: The output map is not 3D*"

5) I repeat the process for the other intervals
[image: Images intégrées 2]
6) result of interpolation of the surface (limit formations A-B) with
r.surf.nnbathy (l algorithm)*
*

[image: Images intégrées 5]


Hoping that it may be useful to someone. The only (small) problem is
you get lots
of layers.
-------------- section suivante --------------
Une pi?ce jointe HTML a ?t? nettoy?e...
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20120603/74e38a8d/attachment-0001.html>
-------------- section suivante --------------
Une pi?ce jointe autre que texte a ?t? nettoy?e...
Nom: result.png
Type: image/png
Taille: 41915 octets
Desc: non disponible
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20120603/74e38a8d/attachment-0004.png>
-------------- section suivante --------------
Une pi?ce jointe autre que texte a ?t? nettoy?e...
Nom: boreholesa.png
Type: image/png
Taille: 8970 octets
Desc: non disponible
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20120603/74e38a8d/attachment-0005.png>
-------------- section suivante --------------
Une pi?ce jointe autre que texte a ?t? nettoy?e...
Nom: boreholes2.png
Type: image/png
Taille: 9756 octets
Desc: non disponible
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20120603/74e38a8d/attachment-0006.png>
-------------- section suivante --------------
Une pi?ce jointe autre que texte a ?t? nettoy?e...
Nom: boreholes.png
Type: image/png
Taille: 9223 octets
Desc: non disponible
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20120603/74e38a8d/attachment-0007.png>


More information about the grass-user mailing list