{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["tabs","tab"]},"type":"markdown"},"seo":{"title":"Remote Reader","description":"Accelerate E&P application development and protect your innovation by consuming our Data and Domain APIs / Platform APIs.","lang":"en-US","meta":[{"name":"robots","content":"noindex"}],"llmstxt":{"hide":true,"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"remote-reader","__idx":0},"children":["Remote Reader"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["INTGeoServer provides a set of web services to retrieve geo data for web and standalone applications. It reads a plethora of seismic file formats including SEG-Y, SEG2, Promax, SU, SEP, JavaSeis and SEGD. There is no limit on the size of the seismic datasets the user can provide from this service. In addition it supports different formats of horizons, faults, well logs, microseismic, and reservoir data. GeoToolkit includes an API to read data from INTGeoServer. This tutorial demonstrates the remote reader of the seismic data."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-a-reader","__idx":1},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/Seismic/Readers/remoteReader#CreateReader"},"children":["#"]}," Create a Reader"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["First, provide a location of the GeoServer and a file to visualize. Specify the version of INTGeoServer API to be called. In the current example, a demo server and the last version of API is used. The code below creates a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RemoteSeismicDataSource"]}," that returns information from remote server about the specified seismic data source. It includes meta information and a collection of keys, which can be utilized to make a query like ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INLINE"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XLINE"]}," as shown below. Call the method ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["open"]}," to receive information from the server. This call is asynchronous and one of two methods will be called in case of success or failure. Next, create a query from server using the method ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["select"]},". In the current example, it will be the first ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INLINE"]}," and all ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XLINE"]},". This method returns an instance of the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RemoteSeismicReader"]}," to be provided as parameter for a visualization pipeline. The reader retrieves groups of traces from the server through requests from pipeline. The reader never loads all traces to memory; as a rule it keeps some traces in the memory cache and retrieves groups of traces to be visible in the specified widget."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-a-pipeline","__idx":2},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/Seismic/Readers/remoteReader#CreatePipeline"},"children":["#"]}," Create a Pipeline"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create a simple pipeline, which contains normalization by RMS, interpolation, and rendering routines. Specify color map and plot type to render interpolated density. Seismic data statistics like rms, min, and max of sample values will be provided from the remote server."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-a-widget","__idx":3},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/Seismic/Readers/remoteReader#CreateWidget"},"children":["#"]}," Create a Widget"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The last step is to create a seismic widget that uses the pipeline created earlier. Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SeismicWidget"]}," (which has a center part to display a seismic data and a set of annotations on each side) to display axes, titles, or a colorbar. In addition, display two axes with trace headers values (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INLINE"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XLINE"]},") and hide the default trace number header."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"result","__idx":4},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/Seismic/Readers/remoteReader#General"},"children":["#"]}," Result"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following example uses ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["RemoteSeismicReader"]}," to read data from the server. A slice of one inline is retrieved from the server and displayed with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SeismicWidget"]},". The canvas below shows a result of the visualization. The following steps explain how to set up the Remote Reader."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"main","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ts","header":{"controls":{"copy":{}}},"source":"import { Plot } from \"@int/geotoolkit/plot/Plot.ts\";\nimport { SeismicWidget } from \"@int/geotoolkit/seismic/widgets/SeismicWidget.ts\";\nimport { SeismicColors } from \"@int/geotoolkit/seismic/util/SeismicColors.ts\";\nimport { NormalizationType } from \"@int/geotoolkit/seismic/pipeline/NormalizationType.ts\";\nimport { SeismicPipeline } from \"@int/geotoolkit/seismic/pipeline/SeismicPipeline.ts\";\nimport { RemoteSeismicDataSource } from \"@int/geotoolkit/seismic/data/RemoteSeismicDataSource.ts\";\nconst createSectionQuery = (position, key, oppositeKey) => {\n  const selectKeys = [];\n  selectKeys[0] = {\n    \"name\": key[\"key\"],\n    \"min\": position,\n    \"max\": position,\n    \"step\": key[\"increment\"],\n    \"order\": \"asc\"\n  };\n  selectKeys[1] = {\n    \"name\": oppositeKey[\"key\"],\n    \"min\": oppositeKey[\"min\"],\n    \"max\": oppositeKey[\"max\"],\n    \"step\": oppositeKey[\"increment\"],\n    \"order\": \"asc\"\n  };\n  return {\n    \"keys\": selectKeys,\n    \"options\": null,\n    \"emptyTracesKey\": {\n      \"name\": oppositeKey[\"key\"],\n      \"min\": oppositeKey[\"min\"],\n      \"max\": oppositeKey[\"max\"]\n    }\n  };\n};\nconst createReader = function(onready, onfailure) {\n  const host = \"https://demo.int.com/INTGeoServer/json\";\n  const data = new RemoteSeismicDataSource({\n    \"host\": host,\n    \"file\": \"data/seismic/Gullfaks_Amplitude.xgy\",\n    \"version\": 2\n  });\n  data.open(\n    () => {\n      const keys = data.getKeys();\n      const key = keys[0];\n      const oppositeKey = keys[1];\n      const query = createSectionQuery(key[\"min\"], key, oppositeKey);\n      data.select(query, (reader) => {\n        onready(reader);\n      });\n    },\n    (err) => {\n      onfailure(err);\n    }\n  );\n};\nconst createPipeline = function(reader) {\n  const pipeline = new SeismicPipeline({\n    \"name\": \"Seismic\",\n    \"reader\": reader,\n    \"statistics\": reader.getStatistics()\n  });\n  pipeline.setOptions({\n    \"normalization\": {\n      \"type\": NormalizationType.RMS,\n      \"scale\": 1\n    },\n    \"plot\": {\n      \"type\": {\n        \"wiggle\": false,\n        \"interpolateddensity\": true\n      },\n      \"decimationspacing\": 5\n    },\n    \"colors\": {\n      \"colormap\": SeismicColors.getDefault().createNamedColorMap(\"WhiteBlack\", 32)\n    }\n  });\n  return pipeline;\n};\nfunction createScene(canvas) {\n  const widget = new SeismicWidget({\n    \"colorbar\": {\n      \"axis\": {\n        \"tickgenerator\": {\n          \"edge\": {\n            \"tickvisible\": false,\n            \"labelvisible\": false\n          }\n        }\n      }\n    },\n    \"layouttype\": \"inside\",\n    \"statusbar\": {\n      \"visible\": false\n    },\n    \"table\": {\n      \"size\": 100,\n      \"visible\": false\n    }\n  });\n  createReader((reader) => {\n    const pipeline = createPipeline(reader);\n    widget.setPipeline(pipeline);\n    widget.setScaleOptions({\n      \"tracescale\": 20,\n      \"samplescale\": 200,\n      \"deviceunit\": \"in\",\n      \"sampleunit\": \"ft\"\n    });\n    const headerFields = pipeline.getReader().getTraceHeaderFields();\n    let headerInfo;\n    for (let i = 0; i < headerFields.length; i++) {\n      const header = headerFields[i];\n      if (header.getName() === \"INLINE\" || header.getName() === \"XLINE\") {\n        widget.setTraceHeaderVisible(header, true);\n      } else if (header.getName() === \"TraceNumber\") {\n        widget.setTraceHeaderVisible(header, false);\n      }\n      headerInfo = widget.getTraceHeaderAxis(header);\n      if (headerInfo) {\n        headerInfo[\"label\"].getTextStyle().setColor(\"#6b6b6b\");\n      }\n    }\n  }, (msg) => {\n    alert(msg);\n  });\n  return new Plot({\n    \"canvaselement\": canvas,\n    \"root\": widget\n  });\n}\nexport { createScene };\n\ncreateScene(document.querySelector('[ref=\"plot\"]'));\n\n","lang":"ts"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"css","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"css","header":{"controls":{"copy":{}}},"source":"\n.cg-tooltip-holder {\n  position: relative;\n}\n\n.cg-tooltip {\n  position: absolute;\n  display: block;\n  padding: 2px 12px 3px 7px;\n  overflow: visible !important;\n  font-family: Roboto, Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  background: white !important;\n  opacity: 0.9;\n  color: #333333;\n  border: solid 1px gray;\n  border-radius: 5px;\n  text-align: left;\n  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\n  border-radius: 5px;\n  margin: 0 !important;\n  z-index: 10000;\n  max-width: 400px;\n  text-wrap: normal !important;\n  white-space: normal !important;\n}\n/* Default setting for tooltip */\n.cg-tooltip-container {\n  position: absolute;\n  display: block;\n  overflow: visible !important;\n  font-family: Roboto, Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  padding: 3px 7px;\n  background: #f7f7f7;\n  color: #333333;\n  border: 1px solid #938e8e;\n  opacity: 0.8;\n  text-align: left;\n  box-shadow: 3px 3px 10px #888;\n  margin: 0 !important;\n  z-index: 10000;\n  max-width: 400px;\n  text-wrap: normal !important;\n  white-space: normal !important;\n  user-select: none;\n}\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .cg-tooltip-container {\n    border-radius: 0;\n  }\n}\n/* Default left arrow for tooltip */\n.cg-tooltip-arrow-left::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 0;\n  top: 50%;\n  border: 5px solid transparent;\n  border-left: 0;\n  border-right: 5px solid  #938e8e;\n  transform: translate(calc(-100%), -50%);\n}\n.cg-tooltip-arrow-left::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 0;\n  top: 50%;\n  border: 4px solid transparent;\n  border-left: 0;\n  border-right: 4px solid #f7f7f7;\n  transform: translate(calc(-100%), -50%);\n}\n/* Default top arrow for tooltip */\n.cg-tooltip-arrow-top::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  top: 0;\n  border: 5px solid transparent;\n  border-top: 0;\n  border-bottom: 5px solid #938e8e;\n  transform: translate(-50%, -100%);\n}\n.cg-tooltip-arrow-top::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  top: 0;\n  border: 4px solid transparent;\n  border-top: 0;\n  border-bottom: 4px solid #f7f7f7;\n  transform: translate(-50%, -100%);\n}\n/* Default right arrow for tooltip */\n.cg-tooltip-arrow-right::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  right: 0;\n  top: 50%;\n  border: 5px solid transparent;\n  border-right: 0;\n  border-left: 5px solid #938e8e;\n  transform: translate(100%, -50%);\n}\n.cg-tooltip-arrow-right::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  right: 0;\n  top: 50%;\n  border: 4px solid transparent;\n  border-right: 0;\n  border-left: 4px solid #f7f7f7;\n  transform: translate(100%, -50%);\n}\n/* Default bottom arrow for tooltip */\n.cg-tooltip-arrow-bottom::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  bottom: 0px;\n  border: 5px solid transparent;\n  border-bottom: 0;\n  border-top: 5px solid #938e8e;\n  transform: translate(-50%, 100%);\n  z-index: 10000;\n}\n.cg-tooltip-arrow-bottom::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  bottom: 0;\n  border: 4px solid transparent;\n  border-bottom: 0;\n  border-top: 4px solid #f7f7f7;\n  transform: translate(-50%, 100%);\n  z-index: 10000;\n}\n/* Tooltip item name */\n/* Tooltip item value */\n/* .cg-tooltip-item-value */\n/* Tooltip item value */\n.cg-tooltip-item-unit {\n  text-transform: none;\n}\n\n.cg-tooltip-item-name {\n    text-transform: capitalize;\n    white-space: nowrap;\n    vertical-align: middle;\n    font-size: 13px;\n}\n.cg-tooltip-row {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  white-space: pre-wrap;\n  font-size: 12px;\n  line-height: 100%;\n  margin: 1px 0;\n}\n.cg-tooltip-title {\n  font-size: 13px;\n  height: 14px;\n  text-transform: capitalize;\n}\n.cg-tooltip-title .cg-tooltip-symbol {\n  margin-right: 0 !important;\n}\n.cg-tooltip-title-name {\n  vertical-align: middle;\n}\n.cg-tooltip-row + .cg-tooltip-row {\n  margin-top: 4px;\n}\n.cg-tooltip-row.cg-tooltip-title + .cg-tooltip-row {\n  margin-top: 5px;\n}\n.cg-tooltip-item-value + .cg-tooltip-item-unit {\n    margin-left: 1px;\n}\n/* Tooltip symbol */\n.cg-tooltip-symbol-cell {\n  display: inline-flex;\n  min-width: 13px; /* 10px size + 3px margin */\n}\n.cg-tooltip-symbol {\n  margin-right: 3px;\n  background-color: transparent;\n  display: block;\n}\n.cg-tooltip-symbol > img {\n  display: block;\n}\n.cg-tooltip-list-cell {\n  display: inline-flex;\n}\n.cg-tooltip-list-symbol {\n  display: block;\n  margin-right: 3px;\n  width: 6px;\n  height: 6px;\n  vertical-align: middle;\n  border-radius: 50%;\n  border: 1px solid rgba(0,0,0,.4);\n}\n.cg-tooltip-symbol-legacy {\n  border-radius: 4px;\n  margin-right: 5px;\n  height: 8px;\n  width: 8px;\n  display: inline-block;\n}\n.cg-tooltip-title-legacy {\n  font-weight: 900;\n}\n\n/* Tooltip symbol circle */\n.cg-tooltip-symbol.circle {\n  height: 10px;\n  width: 10px;\n  display: inline-block;\n  border-radius: 50%;\n  border: 1px solid rgba(0,0,0,.4);\n}\n/* Tooltip symbol line */\n.cg-tooltip-symbol.line {\n    height: 10px;\n    width: 10px;\n    display: inline-block;\n    transform: scale(1.2, 0.2);\n}\n/* Tooltip symbol diamond */\n.cg-tooltip-symbol.diamond {\n    height: 10px;\n    width: 10px;\n    display: inline-block;\n    transform: rotate(45deg);\n    border-radius: 0px;\n}\n/* Tooltip symbol square */\n.cg-tooltip-symbol.square {\n    height: 10px;\n    width: 10px;\n    display: inline-block;\n    border-radius: 0px;\n    border: 1px solid rgba(0,0,0,.4);\n}\n\n","lang":"css"},"children":[]}]}]},{"$$mdtype":"Tag","name":"iframe","attributes":{"src":"https://dc2-documentation.s3.amazonaws.com/documentation/slb-docs-test/5.0/examples/vue/tutorials/index.html#/Seismic/Readers/remoteReader?section=General&extract=true","width":"100%","height":"488.5px","style":{"border":"none"}},"children":[]}]},"headings":[{"value":"Remote Reader","id":"remote-reader","depth":1},{"value":"Create a Reader","id":"create-a-reader","depth":3},{"value":"Create a Pipeline","id":"create-a-pipeline","depth":3},{"value":"Create a Widget","id":"create-a-widget","depth":3},{"value":"Result","id":"result","depth":3}],"frontmatter":{"title":"Remote Reader","seo":{"title":"Remote Reader"}},"lastModified":"2026-02-11T19:54:32.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solutions/geotoolkit/tutorials/seismic/readers/remote-reader","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}