[GIS] How to create a fill beneath the 3D surface in ArcScene

3d-analystarcgis-desktoparcsceneextrudetin

I came across this image on http://desktop.arcgis.com/en/arcmap/latest/extensions/3d-analyst/choosing-the-3d-display-environment.htm

enter image description here

I would like to create something similar that shows the below ground underneath my 3D TIN surface so that it looks like it's been sliced out.

However, I can't seem to find instructions for how to do this, what it's called or a tool that can generate it.

I've tried a few things such as the "extrude between" tool but I don't have a TIN to represent the bottom of the block to extrude between. I only have a TIN for the surface. I do have a polygon feature with the z value of 1m which is the exact extent of the TIN surface. I could use that as the base to extrude between but only get a 999 error when I try to generate TIN from it, probably because it is a flat plane rather than an irregular surface.

Are there any tools or work arounds for creating this?

I know it can be done in non-spatial software like InDesign if I export the surface and do some graphic design on it but my main skill in in GIS and it gets expensive and time consuming to work across multiple software packages.

Best Answer

There are multiple approaches using points, line and polygons. First create very small negative buffer of your DEM outline.

arcpy.FeatureToLine_management("BUFFER", "D:/Aerials/jpgs/line.shp")
arcpy.InterpolateShape_3d("dem","line","D:/Aerials/jpgs/line3d.shp")
arcpy.FeatureVerticesToPoints_management("line3d", "D:/Aerials/jpgs/points3d.shp")
arcpy.AddGeometryAttributes_management("points3d","POINT_X_Y_Z_M")

Use expression:

- ( [POINT_Z]-80)

In Extrusion property of the points (80 here is base altitude) to get this:

enter image description here

Alternatively apply this Python field calculator expression on field Shape of pline3D:

def plineZ(shp,base):
 arr=[]
 part=shp.getPart(0);n=len(part)
 for i in xrange(n):
  p1=part.getObject(i);X=p1.X+0.05;Y=p1.Y+0.05;Z=base
  p2=arcpy.Point (X,Y,Z)
  arr.append([p1,p2])
 pLine= arcpy.Polyline(arcpy.Array(arr))
 return pLine
#-------------------------------------------------
plineZ( !Shape!,80 )

This will give similar output to picture shown above.

Alternatively use script on your points to get this: enter image description here

Related Question