Working With 3D Seismic Objects

Note: you will need to include SeismicData and Seismic3D in your Module Dependencies list in addition to Viewer3D.

Three types of seismic 3D objects can be manipulated:

  • Seismic Volumes: based upon datasets with 3 dimensions (Example: INLINE, XLINE, Time)
  • Seismic PreStack: based upon datasets with 4 dimensions (Example: INLINE, XLINE, OFFSET, Time)
  • Seismic Line: based upon datasets where designated X and Y coordinates in the trace header specify where each trace is located in space.

Creating a seismic volume

In this example, we assume you have already created a seismic dataset seismicData and a 3D window threeDWindow. See section Working With Seismic Data for examples on how to create a seismic dataset. Also, see section Working With Windows to find more information on how to create and set attributes for a 3D window.

    import com.interactive.intviewerapi.objects3d.ISeismicVolumeObject3D;
    import com.interactive.intviewerapi.layers.NamedProps;
    NamedProps object3DProperties = new NamedProps();
    object3DProperties.putProperty(ISeismicVolumeObject3D.SCALE, 2.0f);
    ISeismicVolumeObject3D object3D = ISeismicVolumeObject3D.factory.createObject3D(threeDWindow, seismicData, object3DProperties, false);

In the example above, a seismic volume is created and automatically inserted. A scale of 2.0 is set. Each 3D object interface has a factory member that points to the factory for creating that 3D object.

By default, the seismic volume 3D object is meant to be used with seismic datasets with 3 keys (ex: INLINE, XLINE, Time). In some cases, you might want to visualize a 4D dataset as a volume. In this case, you need to indicate which volume keys should be used (ex: INLINE, XLINE). Use the ISeismicVolumeObject3D.INLINE_KEY_NAME and ISeismicVolumeObject3D.XLINE_KEY_NAME properties in this case.

    import com.interactive.intviewerapi.objects3d.ISeismicVolumeObject3D;
    import com.interactive.intviewerapi.layers.NamedProps;
    NamedProps object3DProperties = new NamedProps();
    object3DProperties.putProperty(ISeismicVolumeObject3D .SCALE, 2.0f);
    object3DProperties.putProperty(ISeismicVolumeObject3D.INLINE_KEY_NAME, "INLINE");
    object3DProperties.putProperty(ISeismicVolumeObject3D.XLINE_KEY_NAME, "XLINE");
    ISeismicVolumeObject3D object3D = ISeismicVolumeObject3D.factory.createObject3D(threeDWindow, seismicPreStackData, object3DProperties, false);

Creating a slice in a seismic volume

A slice within a seismic volume is identified by a seismic data query, either a seismic range query or a seismic path query. In the example below, an INLINE slice is created with an increment of 10. The INLINE key is synchronized.

    SeismicRangeQuery inlineQuery = new SeismicRangeQuery();
    SeismicKeyRange inlineKeyRange = new SeismicKeyRange("INLINE", 170d, 170d);
    inlineKeyRange.setIncrement(10);
    inlineQuery.addKeyRange(inlineKeyRange);
    ISeismicVolumeSlice3D slice = ISeismicVolumeSlice3D.factory.createSeismicVolumeSlice3D(object3D, inlineQuery);
    slice.setSynchronized("INLINE", true);

In the other example below, a Traverse slice is created. Please note that the time range specified in the path query is always ignored.

    SeismicPathQuery traverseQuery = new SeismicPathQuery("INLINE", new double[]{170, 540}, "XLINE", new double[]{170, 640});
    ISeismicVolumeSlice3D traverseSlice3d = ISeismicVolumeSlice3D.factory.createSeismicVolumeSlice3D(object3D, traverseQuery);

Note: Creating and deleting a slice triggers a SeismicVolumeObject3DSliceEvent event.

Creating a probe in a seismic volume

A probe within a seismic volume is identified by a seismic range query.

In the example below, a probe is created with INLINE from 170 to 400, XLINE from 200 to 300 and Time from 0.5s to 3s.

    SeismicRangeQuery inlineQuery = new SeismicRangeQuery();
    ISeismicKeyRange inlineKeyRange = new SeismicKeyRange("INLINE", 170d,400d);
    inlineQuery.addKeyRange(inlineKeyRange);
    ISeismicKeyRange xlineKeyRange = new SeismicKeyRange("XLINE", 200d, 300d);
    inlineQuery.addKeyRange(xlineKeyRange);
    ISeismicKeyRange timeKeyRange = new SeismicKeyRange("Time", 0.5d, 3.0d);
    inlineQuery.addKeyRange(timeKeyRange);
    ISeismicVolumeProbe3D probe = ISeismicVolumeProbe3D.factory.createSeismicVolumeProbe3D(object3D, inlineQuery);

Note: Creating and deleting a probe triggers a SeismicVolumeObject3DProbeEvent event. In its current implementation, INTViewer only allows one probe per seismic volume.

Creating a polyline in a seismic volume

    IPolylineData polylineData = ...
    ISeismicVolumePolyline3D polyline = ISeismicVolumePolyline3D.factory.createSeismicVolumePolyline3D(object3D, polylineData);

Moving a slice or a probe in a seismic volume

To move a seismic slice or a probe, just change the query using the select method. In the example below, the INLINE slice created earlier is moved to 180.

ISeismicVolumeSlice3D slice = ...

   SeismicRangeQuery inlineQuery = new SeismicRangeQuery();
    ISeismicKeyRange inlineKeyRange = new SeismicKeyRange("INLINE", 180d, 180d);
    inlineKeyRange.setIncrement(10);
    inlineQuery.addKeyRange(inlineKeyRange);
    slice.select(query);

In the example below, the probe created earlier is shrunk to a smaller XLINE span.

    ISeismicVolumeProbe3D probe = ...
    SeismicRangeQuery inlineQuery = new SeismicRangeQuery();
    ISeismicKeyRange inlineKeyRange = new SeismicKeyRange("INLINE", 170d,400d);
    inlineQuery.addKeyRange(inlineKeyRange);
    ISeismicKeyRange xlineKeyRange = new SeismicKeyRange("XLINE", 250d, 260d);
    inlineQuery.addKeyRange(xlineKeyRange);
    ISeismicKeyRange timeKeyRange = new SeismicKeyRange("Time", 0.5d, 3.0d);
    inlineQuery.addKeyRange(timeKeyRange);
    probe.select(query);

Creating a seismic prestack

A seismic PreStack is identified by one key. In the example below,a seismic PreStack 3D object is created using the OFFSET key as variable, setting the INLINE value to 1193 and the XLINE value to 5231.

    NamedProps props = new NamedProps();
    props.putProperty(ISeismicPreStackObject3D.INLINE_KEY_NAME, "INLINE");
    props.putProperty(ISeismicPreStackObject3D.XLINE_KEY_NAME, "XLINE");
    ISeismicPreStackObject3D object3D = ISeismicPreStackObject3D.factory.createObject3D(window, sdata, props, false);
    object3D.setKeyValues(1193d, 5231d);

Creating a seismic line

A seismic line is identified by two keys. In the example below, a seismic line is created with INLINE and XLINE as keys

    NamedProps props = new NamedProps();
    props.putProperty(ISeismicLineObject3D.X_KEY_NAME, "CDPX");
    props.putProperty(ISeismicLineObject3D.Y_KEY_NAME, "CDPY");
    ISeismicLineObject3D object3D = ISeismicLineObject3D.factory.createObject3D(window, sdata, props, false);