{"id":1364972,"date":"2021-10-06T00:10:00","date_gmt":"2021-10-06T07:10:00","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=1364972"},"modified":"2021-10-07T08:14:10","modified_gmt":"2021-10-07T15:14:10","slug":"representing-permeability-using-voxel-layers","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers","title":{"rendered":"Representing Permeability Using Voxel Layers"},"author":80572,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[23771],"tags":[25781,34261,24341,744242],"industry":[],"product":[36561],"class_list":["post-1364972","blog","type-blog","status-publish","format-standard","hentry","category-3d-gis","tag-3d","tag-netcdf","tag-python","tag-voxel","product-arcgis-pro"],"acf":{"short_description":"ESRI and Technical University of Darmstadt collaborated to pioneer a work flow for creating source data (NetCDF) for the new Voxel Layer.","flexible_content":[{"acf_fc_layout":"content","content":"<h1>Introduction<\/h1>\n<p>Creating data for the voxel layer can be an intimidating process. The process of creating source data (NetCDF) from a table is laid out in this blog. In collaboration of the Technical University of Darmstadt, soil permeability data was collected, processed and visualized as a voxel layer.<\/p>\n"},{"acf_fc_layout":"content","content":"<h1>Data Collection<\/h1>\n<p>The 3D geological model (SGrid) for the study area is generated using the software SKUA-GOCAD (Emerson Paradigm Holding LLC). The model describes the aquifer distribution of the study area. The delineation of the aquifers is based on a voxel model parameterized with petrographical descriptions and kf-classes. In addition, measurements describing the groundwater level are utilized. A north-south trending sub-vertical fault is also included in the model. In the eastern fault block the model covers the upper 10 meters, in the western fault block the upper 30 meters. In order to provide content in the NetCDF format, which is needed for a visualization in ArcGIS Pro, the overall framework of the model requires some adjustment before the data can be exported to ASCII format. A shoebox model must be generated in SKUA-GOCAD; it contains the original geological model.\u00a0 The image below illustrates the cage geometry of the original model included within the extent of the shoebox model, with the topmost K-layer of the geological model being displayed along with the major fault in the study area.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":1368412,"id":1368412,"title":"Shoebox model in SKUA-GOCAD","filename":"shoebox_model.png","filesize":343434,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\/shoebox_model","alt":"Shoebox model in SKUA-GOCAD","author":"80572","description":"3D viewer in SKUA-GOCAD shows 3D geological model, shoebox model, topmost K-layer of the geological model and the fault.","caption":"3D viewer in SKUA-GOCAD shows 3D geological model, shoebox model, topmost K-layer of the geological model and the fault.","name":"shoebox_model","status":"inherit","uploaded_to":1364972,"date":"2021-10-06 05:04:37","modified":"2021-10-06 05:05:32","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":942,"height":497,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model.png","medium-width":464,"medium-height":245,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model.png","medium_large-width":768,"medium_large-height":405,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model.png","large-width":942,"large-height":497,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model.png","1536x1536-width":942,"1536x1536-height":497,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model.png","2048x2048-width":942,"2048x2048-height":497,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model-826x436.png","card_image-width":826,"card_image-height":436,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model.png","wide_image-width":942,"wide_image-height":497}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>The main difference between the two models (shoebox and geological) is the geometry of the K-layers. The K-layers in the original 3D geological model follow the morphology of the topographic surface. In contrast, the K-layers in the shoebox model are horizontal. \u00a0The cell resolution of the horizontal K-layers is 25m x 25m x 2m along each (X, Y, Z) direction respectively. Each horizontal K-layer now receives properties from the original model by a transfer. Above the topographic surface, No data value (-99999 or -9999) is assigned to the cells since every single cell needs a value. In addition, in the eastern fault block the lithology and permeability are extended to 30 meters to match the total depth of the western block, leading to an overall regular gridded volume.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":1368452,"id":1368452,"title":"3D Geological Model 3D Cross Section","filename":"geological_model.png","filesize":70935,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/geological_model.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\/geological_model","alt":"Geological model from GOCAD","author":"80572","description":"An I and J cross section in a 3D geological model","caption":"An I and J cross section in a 3D geological model","name":"geological_model","status":"inherit","uploaded_to":1364972,"date":"2021-10-06 05:23:00","modified":"2021-10-06 05:23:52","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":875,"height":422,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/geological_model-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/geological_model.png","medium-width":464,"medium-height":224,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/geological_model.png","medium_large-width":768,"medium_large-height":370,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/geological_model.png","large-width":875,"large-height":422,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/geological_model.png","1536x1536-width":875,"1536x1536-height":422,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/geological_model.png","2048x2048-width":875,"2048x2048-height":422,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/geological_model-826x398.png","card_image-width":826,"card_image-height":398,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/geological_model.png","wide_image-width":875,"wide_image-height":422}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"image","image":{"ID":1368462,"id":1368462,"title":"Shoebox Model 3D Cross Section","filename":"shoebox_model_comparison.png","filesize":82669,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model_comparison.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\/shoebox_model_comparison","alt":"Shoebox model from GOCAD","author":"80572","description":"An I and J cross section in a 3D shoebox model","caption":"An I and J cross section in a 3D shoebox model","name":"shoebox_model_comparison","status":"inherit","uploaded_to":1364972,"date":"2021-10-06 05:24:02","modified":"2021-10-06 05:25:05","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":873,"height":489,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model_comparison-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model_comparison.png","medium-width":464,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model_comparison.png","medium_large-width":768,"medium_large-height":430,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model_comparison.png","large-width":873,"large-height":489,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model_comparison.png","1536x1536-width":873,"1536x1536-height":489,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model_comparison.png","2048x2048-width":873,"2048x2048-height":489,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model_comparison-826x463.png","card_image-width":826,"card_image-height":463,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/shoebox_model_comparison.png","wide_image-width":873,"wide_image-height":489}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>In this example, the properties were transferred using the command \u201cTransfer Property &gt; From Nearby Grid Node or Cell\u201d in SKUA-GOCAD. The command transfers property from an object to another. The object can be an SGrid, a Voxel or a Solid. The transferred values are snapped from the server cell to client node which it resides in. If the server is a cell-centered SGrid or a Voxel with a block-interpolated property; the transferred value is interpolated from nearby server nodes in all other cases. After this step, the K-layers are converted to triangulated surfaces. The triangulated surfaces contain coordinates, depth, K-layer identifier, permeability, lithology and fault identifier as properties. These triangulated surfaces are exported separately as ASCII files for the processing stage using a Python script and later for visualization in ArcGIS Pro as a voxel layer.<\/p>\n"},{"acf_fc_layout":"content","content":"<h1>Processing ASCII to NetCDF with Python<\/h1>\n<p>The modules needed to process the data are <code>numpy<\/code>, <code>netCDF4<\/code>, and <code>pandas<\/code>. The aforementioned K-layers exported from SKUA-GOCAD in this example are written out as one layer per ASCII text file. Therefore, all text files must first be collected which includes the need for the standard module <code>os<\/code> as well.<\/p>\n<p><code>folder<\/code> is a variable which indicates the folder directory where the ASCII files are located. <code>files<\/code> holds a list of all files in the directory with their full path appended before the file name.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #000096\">import<\/span> netCDF4\r\n<span style=\"color: #000096\">import<\/span> os\r\n<span style=\"color: #000096\">import<\/span> numpy as np\r\n<span style=\"color: #000096\">from<\/span> netCDF4 <span style=\"color: #000096\">import<\/span>  Dataset\r\n<span style=\"color: #000096\">import<\/span> pandas as pd\r\n \r\n<span style=\"color: #808080\"># Folder path<\/span>\r\nfolder = <span style=\"color: #008000\">r'C:\\temp\\myData'<\/span>\r\n\r\n<span style=\"color: #808080\"># Collect all text file paths<\/span>\r\nfiles = [os.path.join(folder,f) <span style=\"color: #000096\">for<\/span> f <span style=\"color: #000096\">in<\/span> os.listdir(folder) <span style=\"color: #000096\">if<\/span> os.path.isfile(os.path.join(folder, f))]\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>The ASCII file is delimited by a single space, and a newline separates entries. Using the <code>read_table<\/code> function from the pandas module, a dataframe is created to hold the first K-layer entry. The <code>size<\/code> variable is used to verify that each K-layer have an equal number of entries, due to the requirement of having equally spaced gridded data.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #808080\"># Create initial dataframe<\/span>\r\ndfPoints = pd.read_table(files[<span style=\"color: #008000\">0<\/span>], delimiter = ' ') \r\n\r\n<span style=\"color: #808080\"># All files need consistent size<\/span>\r\nsize = dfPoints.size\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>Now that all files are collected into a list, they must be processed using a for loop starting at the first index (second element) of the list, since the zeroth index (first element) was already added to the dataframe. A dataframe buffer is created each iteration of the loop. If the size of the buffer is not equal to the <code>size<\/code> variable, we continue to the next file in the list. If it is equal, then it is appended to the original dataframe, <code>dfPoints<\/code>. The number of entries in this dataframe will be equal to the total number of entries across all valid files.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #808080\"># Put all data into dataframe<\/span>\r\n<span style=\"color: #808080\"><span style=\"color: #000096\">for<\/span> i <span style=\"color: #000096\">in<\/span> range(1, len(files)):\r\n  dfBuffer = pd.read_csv(files[i], delimiter = ' ')\r\n  <span style=\"color: #000096\">if<span style=\"color: #808080\">(dfBuffer.size != size):<\/span>\r\n    continue\r\n<\/span><\/span>dfPoints = dfPoints.append(dfBuffer, ignore_index = <span style=\"color: #000096\">True<\/span>)\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>Since the data is not guaranteed to be in any kind of order, the dataframe is sorted using the <code>sort_values<\/code> function. This data is sorted first by the Z coordinate, then Y, and finally X. Voxel layers have requirements for dimension order, (X,Y,Z,T) or (T,Z,Y,X) with the T and Z dimension being removeable, but at least 1 of them is required to be present in the data.<\/p>\n<p>The domains of each dimension must also be extracted from the dataframe. Using the index location, or <code>iloc<\/code> operator, the raw values are accessed. Using the numpy function <code>unique<\/code> a list of unique values for each dimension is created and then sorted.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #808080\"># Sort the values by Z, then Y, then X<\/span>\r\ndfPoints = dfPoints.sort_values(by=[<span style=\"color: #008000\">'Z','Y','X'<\/span>])\r\n\r\n<span style=\"color: #808080\"># Create domain for longitude, latitude, and Z<\/span>\r\nxDomain = np.sort(np.unique(dfPoints.iloc[:,<span style=\"color: #008000\">0<\/span>].values))\r\nyDomain = np.sort(np.unique(dfPoints.iloc[:,<span style=\"color: #008000\">1<\/span>].values))\r\nzDomain = np.sort(np.unique(dfPoints.iloc[:,<span style=\"color: #008000\">2<\/span>].values))<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>Now the data is processed and mostly ready to be added to a NetCDF file. A output file must first be created using the <code>Dataset<\/code> constructor. Dimensions of the NetCDF file are set using the <code>createDimension<\/code> function for X, Y, and Z. The length of each domain must also be specified.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #808080\"># Create NetCDF<\/span>\r\noutDataSet = Dataset(<span style=\"color: #008000\">'myOutput.nc'<\/span>, <span style=\"color: #008000\">'w'<\/span>, format = <span style=\"color: #008000\">'NETCDF4'<\/span>)\r\n\r\n<span style=\"color: #808080\"># Create dimensions<\/span>\r\noutDataset.createDimension(<span style=\"color: #008000\">'z'<\/span>,len(zDomain))\r\noutDataset.createDimension(<span style=\"color: #008000\">'y'<\/span>,len(zDomain))\r\noutDataset.createDimension(<span style=\"color: #008000\">'x'<\/span>,len(zDomain))<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>The <code>createVariable<\/code> function is used to create a variables in a NetCDF file. Each dimension must have a variable associated with it, which contains the values in their respective domains. Other variables, such as Lithology and Predicted KF in this case, have multiple dimensions associated with it. For example, <code>ncLithology<\/code> has the Z,Y,X dimensions, therefore the number of entries for <code>ncLithology<\/code> will be the length of each dimension multiplied together. <code>fill_value<\/code> is a property of the variable which indicates what value was used to fill missing data.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #808080\"># Create variables<\/span>\r\nncZ = outDataset.createVariable(<span style=\"color: #008000\">'z'<\/span>, np.float32, <span style=\"color: #008000\">'z'<\/span>)\r\nncY = outDataset.createVariable(<span style=\"color: #008000\">'y'<\/span>, np.float32, <span style=\"color: #008000\">'y'<\/span>)\r\nncX = outDataset.createVariable(<span style=\"color: #008000\">'x'<\/span>, np.float32, <span style=\"color: #008000\">'x'<\/span>)\r\nncPredictedKF = outDataset.createVariable(<span style=\"color: #008000\">'Predicted_kf'<\/span>, np.float32, (<span style=\"color: #008000\">'z'<\/span>, <span style=\"color: #008000\">'y'<\/span>, <span style=\"color: #008000\">'x'<\/span>), fill_value = <span style=\"color: #008000\">-99999<\/span>)\r\nncLithology = outDataset.createVariable(<span style=\"color: #008000\">'Lithology'<\/span>, int, (<span style=\"color: #008000\">'z'<\/span>, <span style=\"color: #008000\">'y'<\/span>, <span style=\"color: #008000\">'x'<\/span>), fill_value = <span style=\"color: #008000\">-9999<\/span>)<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>Now that the variables for the NetCDF file are created, the values in the dataframe that were processed earlier must be assigned to the variables. Using the\u00a0<code>[:]<\/code> operator, the values processed are assigned to the NetCDF variable values. For the variables which have three dimensions, the <code>[:,:,:]<\/code> is the same operator, but implies that there are three dimensions to the array. Variables more than one dimension must have their dataframe values be reshaped to match the size of the multidimensional array which was allocated for the output. Numpy has a <code>reshape<\/code> function which allows this to be accomplished. The second argument of <code>reshape<\/code> is a tuple of values, and in this example the tuple consists of the length of each dimension, Z,Y,X.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #808080\"># Assign values<\/span>\r\nncX[:] = xDomain[:]\r\nncY[:] = yDomain[:]\r\nncZ[:] = zDomain[:]\r\nncPredictedKF[:,:,:] = np.reshape(\r\n  dfPoints[<span style=\"color: #008000\">'Predicted_kf'<\/span>].values,\r\n  zDomain.shape[<span style=\"color: #008000\">0<\/span>], yDomain.shape[<span style=\"color: #008000\">0<\/span>], xDomain.shape[<span style=\"color: #008000\">0<\/span>]\r\n)\r\nncLithology[:,:,:] = np.reshape(\r\n  dfPoints[<span style=\"color: #008000\">'Lithology'<\/span>].values,\r\n  zDomain.shape[<span style=\"color: #008000\">0<\/span>], yDomain.shape[<span style=\"color: #008000\">0<\/span>], xDomain.shape[<span style=\"color: #008000\">0<\/span>]\r\n)<\/code><\/pre>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"content","content":"<p>With the values added, some attribute information can be added to each variable. Attributes such as <code>long_name<\/code> and <code>units<\/code> give information but do not change the way the layer draws. Other attributes, such as <code>positive<\/code>, will change the way the layer draws.\u00a0<code>positive<\/code> gives the direction of the data, and in a voxel layer this attribute determines the vertical exaggeration direction. Global attributes can also be assigned, which apply to the entire dataset. In this case, <code>esri_pe_string<\/code> is used to the coordinate system. After adding attributes, the output NetCDF is closed.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #808080\"># Assign attributes<\/span>\r\nncPredictedKF.long_name = <span style=\"color: #008000\">'Predicted_kf'<\/span>\r\n\r\nncLithology.long_name = <span style=\"color: #008000\">'Lithology'\r\n<\/span>\r\nncZ.positive = <span style=\"color: #008000\">'up'<\/span>\r\n\r\nncY.standard_name = <span style=\"color: #008000\">'projection_y_coordinate'<\/span> \r\nncY.units = <span style=\"color: #008000\">'m'<\/span> \r\n\r\nncX.standard_name = <span style=\"color: #008000\">'projection_x_coordinate'<\/span> \r\nncX.units = <span style=\"color: #008000\">'m'<\/span> \r\n\r\noutDataSet.esri_pe_string = <span style=\"color: #008000\">'PROJCS[\"ETRS_1989_UTM_Zone_32N_7stellen\",GEOGCS[\"GCS_ETRS_1989\",DATUM[\"D_ETRS_1989\",SPHEROID[\"GRS_1980\",6378137.0,298.257222101]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",2500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",9.0],PARAMETER[\"Scale_Factor\",0.9996],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0],AUTHORITY[\"Esri\",102328]]'<\/span> \r\noutDataSet.close()<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>The resulting NetCDF can be added to a voxel layer for analysis and exploration, as seen below. For more information on adding a NetCDF to a voxel layer, please see <a href=\"https:\/\/pro.arcgis.com\/en\/pro-app\/2.7\/help\/mapping\/layer-properties\/add-a-voxel-layer-to-a-local-scene.htm\">add a voxel layer to a local scene<\/a>.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":1368942,"id":1368942,"title":"Voxel layer of lithoclasses of county Darmstadt in Germany.","filename":"GeologicalModelBlog.png","filesize":527203,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/GeologicalModelBlog.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\/geologicalmodelblog","alt":"output voxel layer","author":"80572","description":"Voxel layer of lithoclasses of county Darmstadt in Germany.","caption":"Voxel layer of lithoclasses of county Darmstadt in Germany.","name":"geologicalmodelblog","status":"inherit","uploaded_to":1364972,"date":"2021-10-06 18:13:02","modified":"2021-10-06 18:27:53","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":854,"height":494,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/GeologicalModelBlog-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/GeologicalModelBlog.png","medium-width":451,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/GeologicalModelBlog.png","medium_large-width":768,"medium_large-height":444,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/GeologicalModelBlog.png","large-width":854,"large-height":494,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/GeologicalModelBlog.png","1536x1536-width":854,"1536x1536-height":494,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/GeologicalModelBlog.png","2048x2048-width":854,"2048x2048-height":494,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/GeologicalModelBlog-804x465.png","card_image-width":804,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2021\/10\/GeologicalModelBlog.png","wide_image-width":854,"wide_image-height":494}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h3>About the Authors:<\/h3>\n<h3>Rouwen Lehne<\/h3>\n<p>Hessian Agency for Nature Conservation, Environment and Geology (HLNUG), TU Darmstadt<\/p>\n<p>Rouwen is a geologist working for the Geological Survey of Hesse (Germany). He is very interested in geodynamic processes and how information about geology can contribute to sustainable action. Of particular interest is the urban space and thus the synopsis of various specialized information in 3D space. To work on such questions he uses geoinformation systems and tools for 3D modeling as well as for 3D visualization.<\/p>\n<h3>Sonu Roy<\/h3>\n<p>Sonu is pursuing her second Master\u2019s degree in Tropical Hydrogeology and Environmental Engineering at TU Darmstadt, Germany. She started her career as a Geomodeler in Oil and Gas Industry. She is doing her Master\u2019s thesis in the field of Geomechanics. She believes that the future lies in renewable energies and wants to contribute in the research sector.<\/p>\n"}],"authors":[{"ID":80572,"user_firstname":"Richard","user_lastname":"Vargas","nickname":"rvargas","user_nicename":"rvargas","display_name":"Richard Vargas","user_email":"rvargas@esri.com","user_url":"","user_registered":"2020-08-10 14:52:53","user_description":"Richard is a Product Engineer (SDET) on the 3D Scene Layers Team at ESRI.  In this role he works on multidimensional voxel and 3D object layers, as well as a maintainer for the ESRI I3S specification.  Richard has a Bachelor of Science in Computer Science from California State University San Bernardino.  Outside of work, Richard likes to indulge in video games, fiddle with the guitar, and go on hikes.","user_avatar":"<img alt='' src='https:\/\/secure.gravatar.com\/avatar\/9de372c1a55e00f37736cbaec72166a0f0701a4707387b62e57eb1f2edd547c4?s=96&#038;d=blank&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/9de372c1a55e00f37736cbaec72166a0f0701a4707387b62e57eb1f2edd547c4?s=192&#038;d=blank&#038;r=g 2x' class='avatar avatar-96 photo' height='96' width='96' loading='lazy' decoding='async'\/>"}],"related_articles":"","card_image":false,"wide_image":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Representing Permeability Using Voxel Layers<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Representing Permeability Using Voxel Layers\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2021-10-07T15:14:10+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\"},\"author\":{\"name\":\"Richard Vargas\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/bbcf766588e35d801ddbfaf611da7006\"},\"headline\":\"Representing Permeability Using Voxel Layers\",\"datePublished\":\"2021-10-06T07:10:00+00:00\",\"dateModified\":\"2021-10-07T15:14:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\"},\"wordCount\":5,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"3D\",\"netCDF\",\"python\",\"Voxel\"],\"articleSection\":[\"3D Visualization &amp; Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\",\"name\":\"Representing Permeability Using Voxel Layers\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2021-10-06T07:10:00+00:00\",\"dateModified\":\"2021-10-07T15:14:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Representing Permeability Using Voxel Layers\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/bbcf766588e35d801ddbfaf611da7006\",\"name\":\"Richard Vargas\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9de372c1a55e00f37736cbaec72166a0f0701a4707387b62e57eb1f2edd547c4?s=96&d=blank&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9de372c1a55e00f37736cbaec72166a0f0701a4707387b62e57eb1f2edd547c4?s=96&d=blank&r=g\",\"caption\":\"Richard Vargas\"},\"description\":\"Richard is a Product Engineer (SDET) on the 3D Scene Layers Team at ESRI. In this role he works on multidimensional voxel and 3D object layers, as well as a maintainer for the ESRI I3S specification. Richard has a Bachelor of Science in Computer Science from California State University San Bernardino. Outside of work, Richard likes to indulge in video games, fiddle with the guitar, and go on hikes.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/94richardvargas94\/\"],\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/rvargas\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Representing Permeability Using Voxel Layers","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers","og_locale":"en_US","og_type":"article","og_title":"Representing Permeability Using Voxel Layers","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2021-10-07T15:14:10+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers"},"author":{"name":"Richard Vargas","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/bbcf766588e35d801ddbfaf611da7006"},"headline":"Representing Permeability Using Voxel Layers","datePublished":"2021-10-06T07:10:00+00:00","dateModified":"2021-10-07T15:14:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers"},"wordCount":5,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["3D","netCDF","python","Voxel"],"articleSection":["3D Visualization &amp; Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers","name":"Representing Permeability Using Voxel Layers","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2021-10-06T07:10:00+00:00","dateModified":"2021-10-07T15:14:10+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/3d-gis\/representing-permeability-using-voxel-layers#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Representing Permeability Using Voxel Layers"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/bbcf766588e35d801ddbfaf611da7006","name":"Richard Vargas","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9de372c1a55e00f37736cbaec72166a0f0701a4707387b62e57eb1f2edd547c4?s=96&d=blank&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9de372c1a55e00f37736cbaec72166a0f0701a4707387b62e57eb1f2edd547c4?s=96&d=blank&r=g","caption":"Richard Vargas"},"description":"Richard is a Product Engineer (SDET) on the 3D Scene Layers Team at ESRI. In this role he works on multidimensional voxel and 3D object layers, as well as a maintainer for the ESRI I3S specification. Richard has a Bachelor of Science in Computer Science from California State University San Bernardino. Outside of work, Richard likes to indulge in video games, fiddle with the guitar, and go on hikes.","sameAs":["https:\/\/www.linkedin.com\/in\/94richardvargas94\/"],"url":"https:\/\/www.esri.com\/arcgis-blog\/author\/rvargas"}]}},"text_date":"October 6, 2021","author_name":"Richard Vargas","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/rvargas","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/Newsroom-Keyart-Wide-1920-x-1080.jpg","primary_product":"ArcGIS Pro","tag_data":[{"term_id":25781,"name":"3D","slug":"3d","term_group":0,"term_taxonomy_id":25781,"taxonomy":"post_tag","description":"","parent":0,"count":342,"filter":"raw"},{"term_id":34261,"name":"netCDF","slug":"netcdf","term_group":0,"term_taxonomy_id":34261,"taxonomy":"post_tag","description":"","parent":0,"count":11,"filter":"raw"},{"term_id":24341,"name":"python","slug":"python","term_group":0,"term_taxonomy_id":24341,"taxonomy":"post_tag","description":"","parent":0,"count":171,"filter":"raw"},{"term_id":744242,"name":"Voxel","slug":"voxel","term_group":0,"term_taxonomy_id":744242,"taxonomy":"post_tag","description":"","parent":0,"count":6,"filter":"raw"}],"category_data":[{"term_id":23771,"name":"3D Visualization &amp; Analytics","slug":"3d-gis","term_group":0,"term_taxonomy_id":23771,"taxonomy":"category","description":"","parent":0,"count":687,"filter":"raw"}],"product_data":[{"term_id":36561,"name":"ArcGIS Pro","slug":"arcgis-pro","term_group":0,"term_taxonomy_id":36561,"taxonomy":"product","description":"","parent":0,"count":2037,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=arcgis-pro","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/1364972","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/80572"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=1364972"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/1364972\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=1364972"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=1364972"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=1364972"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=1364972"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=1364972"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}