Skip navigation
All Places > 3D Mapping > Blog

3D Mapping

13 posts

Hello and welcome the the Scene Layers section of the 3D GIS Showcase!

Even thought we're virtual, we'll make sure to answer all your questions and provide you with guidance for utilizing 3D Scene Layers.  If you're new to Scene Layers, it's the mechanism that we use to stream large volumes of 3D GIS content over the web that can be consumed by Scene Viewer, Earth, ArcGIS Pro and other clients.  This enables beautiful and performant 3D experiences that help solve real problems.

We encourage you to chat or schedule meetings with us to ask questions and provide feedback that will guide our roadmap moving forward.   

ucRelevant links:

What is a Scene Layer?

Esri I3S Specifications

Editing Scene Layers

Authoring 3D Layers and Creating Web Scene in ArcGIS Online

What's New in Scene Viewer, June 2020

Storymap:  What's New in Scene Viewer 2020

Don't miss these sessions! 

3D Across ArcGIS

CAD: Using BIM Data from Revit in ArcGIS Pro

3D on the Web with ArcGIS

ArcGIS API for JavaScript: 3D Visualization

A Deep Dive into 3D Analysis Options

Creating and Visualizing Voxel Layers in ArcGIS

These steps show how to convert 2-dimensional (2D) points into 3-dimensional (3D) ones, and how to use those points to convert 2D lines into 3D lines, given the existence of an elevation (Z) attribute within the point layer. The points and lines should have a meaningful, connective, spatial relationship. Examples include sewer manholes and sewer lines; water valves, hydrants, and water lines; street lights and underground power feed lines.



  • ArcGIS Desktop Advanced (formerly called ArcInfo)
  • 3D Analyst Extension for Desktop (extension files must be installed and then checked out in Customize > Extensions…)


For best results:

  • Single-part, 2D lines are best.  Multi-part, 2D lines can be converted to 3D, but the results need to be re-broken into parts
  • If the point layer is actually a multipoint layer, use ArcToolbox > Data Management Tools > Features > Multipart to Singlepart first, and use the resulting layer in the instructions below
  • It is desirable that the point and line feature classes share the same coordinate system, resolution, and tolerance to improve the Spatial Join step
  • These steps assume that an elevation of 0 is valid, such as sea level. If this is not the case, you should change the SQL queries below or set 0's to NULL through Field Calculator.



  • These steps do not alter the original data
  • It is not necessary that all line vertices coincide with all points
  • It is not necessary that all points coincide with line vertices
  • It is not necessary that all of the points have a non-null, non-zero value for elevation


Tools and dialogs require input and output values. Values colored in orange reference the tutorial data. In practice, choose your own feature classes, field names, and constants. Values colored in blue are output values; you choose the name of what is created.   Blue feature classes are not included in the .zip file.   I try to use ArcToolbox throughout, so that the Geoprocessing Results window contains all steps as they were taken.   Tools that modify or create new data work off of the selected features, if any, or all features if there is no selection, so keep that in mind.

These steps were tested with ArcGIS Desktop 10.6.1, but may work in other versions as well. A downloadable .zip file contains a 10.6.1 map document with fake data in a file geodatabase to work through as a tutorial. In 10.6.1, I noticed that wizards worked all of the time, while ArcToolbox only worked most of the time. When the ArcMap UI offers a way of doing something that a Toolbox also provides, use the UI in 10.6.1.


First, create a map document containing the layers you are interested in converting, as well as a few layers for reference. Save at every meaningful point along the way.


Second, create 3D points from 2D points. This tool can be run with any level of Desktop, but requires 3D Analyst.

  • ArcToolbox > 3D Analyst Tools > Feature to 3D By Attribute
    • Input Features: MY_2D_POINTS
    • Output Feature Class: MY_3D_POINTS
    • Height Field: Z
    • To Height Field: None
    • OK

Examine the output attribute table. The SHAPE field should show "Point Z". The properties of your feature class should show "Coordinates include Z values. Used to store 3D data" as checked. All of the fields from the original 2D feature class should be intact, including names, types, aliases, widths, and domains.


Third, create a new 2D point layer whose geometry and attributes represent the vertices of the 2D lines. For example, a line with four vertices in your 2D layer will result in four point features in your output layer. Each feature will have the attributes of the line it came from.   This tool can only be run with an Advanced Desktop license, but does not require 3D Analyst.

  • ArcToolbox > Data Management Tools > Features > Feature Vertices to Points
    • Input Features: MY_2D_LINES
    • Output Feature Class: MY_2D_VERTICES
    • Point Type: ALL
    • OK

Examine the output attribute table. There will be more features in this feature class than the original, because each feature is a point representing the vertex of the original geometry. An important field in the output is ORIG_FID. This corresponds to the OBJECTID in the original 2D layer.


Fourth, find out which vertices correspond to the 3D points.   You might have 3D points match 0, 1, or more 2D vertices, and you might have 2D vertices which match 0, 1, or more 3D points. If a line's vertex matches up with more than one feature with different elevations, choose how ArcToolbox will resolve the elevation in the step marked with a * below.

  • ArcToolbox > Analysis Tools > Overlay > Spatial Join
    • Target Features: MY_2D_VERTICES
    • Join Features: MY_3D_POINTS
    • Output Feature Class: MY_2D_VERTEX _POINTS
    • Join Operation: JOIN_ONE_TO_ONE
    • Keep All Target Features: Checked
    • * Field Map of Join Features: Right-click Z > Properties… and select Mean for Merge Rule
    • Match Option: WITHIN_A_DISTANCE (or INTERSECT or ARE_IDENTICAL_TO, if your original 2D line or polygon feature vertices are all snapped to the original 2D points)
    • Search Radius (optional): Your choice. I chose 1
    • Units: Your choice.   I chose Inches
    • OK


Examine the output attribute table. Although the SHAPE is a "Point Z", the actual Z values in the feature geometry are 0.   Next, find which vertices will not have a proper elevation.


  • ArcToolbox > Data Management Tools > Layers and Table Views > Select Layer By Attribute
    • Layer Name or Table View: MY_2D_VERTEX_POINTS
    • Selection type: NEW_SELECTION
    • Expression: Join_Count = 0 OR Z IS NULL
    • OK


Examine the input attribute table. The selected features represent vertices from your 2D lines that didn't coincide with any 3D points OR coincided with points of unknown altitude. You'll notice that the elevation field for these points is <Null> which means "Unknown".


Fifth, you must make a decision as to how the original shapes will be transformed to 3D when the elevations of these vertices are missing.   Here are viable options I present to you:


Option A: Assume a flat, constant elevation value where the elevation is unknown. Edges of your resulting 3D lines will dip or rise to this constant elevation. This will help you find anomalies if you choose a very low or very high value. However, it will make your data look weird in 3D. If your data is relatively flat, this could be a good option. If you go this route, proceed to "Steps for Option A".


Option B: Assign a Z value per vertex that is the average of the other Z values in the same line. Edges of your resulting 3D lines will dip or rise moderately. However, this will give a false picture of your data in 3D space while not drawing attention to the anomalies. If you go this route, proceed to "Steps for Option B".


Option C: Do nothing and allow 3D vertices to have a 0 or NULL value. You might also choose this option if all of your vertices coincided with points of known elevation. If you go this route, proceed to "Continue".


Steps for Option A

Select all the vertices where the elevation is unknown and calculate a fixed value for those.

  • ArcToolbox > Data Management Tools > Layers and Table Views > Select Layer By Attribute
    • Layer Name or Table View: MY_2D_VERTEX_POINTS
    • Selection type: NEW_SELECTION
    • Expression: Join_Count = 0 OR Z IS NULL
    • OK
  • ArcToolbox > Data Management Tools > Fields > Calculate Field
    • Input Table: MY_2D_VERTEX_POINTS
    • Field Name: Z
    • Expression: 4300 (or the flat Z value you picked)
    • OK
  • Proceed to "Continue"


Steps for Option B

Find all the vertices where the elevation is known, and calculate an average elevation per feature.

  • ArcToolbox > Data Management Tools > Layers and Table Views > Select Layer By Attribute
    • Layer Name or Table View: MY_2D_VERTEX_POINTS
    • Selection type: NEW_SELECTION
    • Expression: Join_Count > 0 AND Z IS NOT NULL
    • OK
  • ArcToolbox > Analysis Tools > Statistics > Summary Statistics
    • Input Table: MY_2D_VERTEX_POINTS
    • Output Table: MY_AVG_LINE_Z
    • Statistics Fields: Z (MEAN)
    • Case field: ORIG_FID
    • OK
  • ArcToolbox > Data Management Tools > Layers and Table Views > Select Layer By Attribute
    • Input Table: MY_2D_VERTEX_POINTS
    • Selection type: CLEAR_SELECTION
    • OK

Join the results of the average elevation table to the vertices table by feature ID. Copy the elevation attribute over to the vertices where the vertex elevation is unknown. But before the join is performed, index important fields.

  • ArcToolbox > Data Management Tools > Indexes > Add Attribute Index
    • Input Table: MY_2D_VERTEX_POINTS
    • Fields to Index: ORIG_FID
    • Index Name: I_ORIG_FID
    • Unique: Unchecked
    • Ascending: Checked
    • OK
  • ArcToolbox > Data Management Tools > Indexes > Add Attribute Index
    • Input Table: MY_AVG_LINE_Z
    • Fields to Index: ORIG_FID
    • Index Name: I_ORIG_FID
    • Unique: Unchecked
    • Ascending: Checked
    • OK
  • ArcToolbox > Data Management Tools > Joins > Add Join
    • Layer Name or Table View: MY_2D_VERTEX_POINTS
    • Input Join Field: ORIG_FID
    • Join Table: MY_AVG_LINE_Z
    • Output Join Field: ORIG_FID
    • Keep All Target Features: Checked
    • OK
  • ArcToolbox > Data Management Tools > Layers and Table Views > Select Layer By Attribute
    • Layer Name or Table View: MY_2D_VERTEX_POINTS
    • Selection type: NEW_SELECTION
    • OK
  • ArcToolbox > Data Management Tools > Fields > Calculate Field
    • Input Table: MY_2D_VERTEX_POINTS
    • Field Name: Z
    • Expression: [MY_AVG_LINE_Z.MEAN_Z]
    • Expression Type: VB
    • OK
  • Remove the join (or ArcToolbox > Data Management Tools > Joins > Remove Join)
  • Proceed to "Continue" just below



  • Clear the Selection (or ArcToolbox > Data Management Tools > Layers and Table Views > Select Layer By Attribute > Selection type: CLEAR_SELECTION).


Sixth, now that the line vertices know their elevations, they can be converted to 3D points, and then stitched together into 3D lines with attributes from the original 2D lines.

  • ArcToolbox > 3D Analyst Tools > 3D Features > Feature to 3D By Attribute
    • Input Features: MY_2D_VERTEX_POINTS
    • Output Feature Class: MY_3D_VERTICES
    • Height Field: Z
    • OK
  • ArcToolbox > Data Management Tools > Features > Points to Line
    • Input Features: MY_3D_VERTICES
    • Output Feature Class: MY_3D_LINES
    • Line Field: ORIG_FID
    • Sort Field: OBJECTID
    • Close Line: Unchecked
    • OK
  • ArcToolbox > Data Management Tools > Joins > Join Field
    • Input Table: MY_3D_LINES
    • Input Join Field: ORIG_FID
    • Join Table: MY_2D_LINES
    • Output Join Field: OBJECTID
    • Join Fields: (All except OBJECTID AND Shape_Length)
    • OK
  • ArcToolbox > Data Management Tools > Fields > Delete Field
    • Input Table: MY_3D_LINES
    • Drop Field: ORIG_FID
    • OK


Now, you can delete intermediate data if you so desire. You do so at your own risk. The temporary feature classes and tables are MY_2D_VERTICES, MY_2D_VERTEX_POINTS, MY_AVG_LINE_Z, and MY_3D_VERTICES. In the future, you might be able to delete your 2D feature classes when you and your organization have migrated to using the 3D data in all applications, maps, and services.


MY_3D_POINTS and MY_3D_LINES are your final results. Add them to ArcScene to look at them in 3D.  ArcScene should be installed since you have the 3D Analyst extension. Or, add them to ArcGIS Pro with a 3D extension.


If you chose Option A, some vertices of some lines will be at the fixed elevation you chose. Some lines will be entirely at that elevation.   You should work to collect truer data at those spots to have better 3D data.


If you chose Option B, some lines will unexpectedly slope up or down to an average elevation for the feature. Some lines will be at elevation 0 or NULL. You should work to collect truer data at those spots to have better 3D data.



Roger Dunn

Senior GIS Programmer/Analyst

City Manager's Office/Information Technology Division

City of Orem, Utah

In 2014, Esri introduced Scene Layers which are items in the Web GIS architecture that are used to represent 3D GIS features and that combine a scalable graphics cache with attributes, symbology, and can connect to feature services.  Esri applications that consume scene layers are able to use indexing and multiple levels of detail (LODs) in the scene layer to display large data sets quickly across different platforms including on the web and in mobile apps. Scene layers currently contain information on 3D objects, integrated mesh, and 3D point layers.  We are also working on additional layers and capabilities to use and interact with other types of 3D information as scene layers.

ArcGIS Pro 1.3 introduces a new GP tool 'Create Scene Layer Package' that encapsulates a scene layer in a scene layer package ‘.spk’ file that can be uploaded to ArcGIS Online or Portal for ArcGIS to be shared as scene layers. Some Esri applications will also be able to directly read and display some types of scene layer packages, such as ArcGIS Earth 1.2 and Drone2Map 1.0.  The new GP tool creates a single .spk file for each input feature class dataset.

In some environments, users want to be able to repeatedly create scene layers for archive, distribution, and to update or replace existing scene layers.  Like most GP tool, the Create Scene Layer Package tool can be used with the ArcPy Python API to automate scene layer package creation.

The following is an example script illustrating how a user with multiple multipatch datasets can use the ArcPy Python API of the GP tool and create scene layer packages. To get detailed help for the tool refer to the tool documentation. The following script accepts an input file geodatabase containing several multipatch feature classes. It loops through each feature class and creates a corresponding layer file (.lyrx) and a scene layer package (.spk). Sample output the file prints is also shown below.


import arcpy
import os

# Set input and output data locations
geodatabase = r'\\data_share\SPK_Automation\ScriptingData.gdb'
output_path = r'E:\temp\createSPKsample'
upload_to_portal = False

# Set arcpy environment
arcpy.env.workspace = geodatabase

#Handle errors
    # Get list of multipatch feature classes
    feature_list = arcpy.ListFeatureClasses(feature_type="Multipatch")
    print("Found " + str(len(feature_list)) + " multipatch feature classes for processing.")

    # Loop through each multipatch feature and create a scene layer package.
    counter = 0
    for current_feature in feature_list:
        print("Processing feature class: " + current_feature)
        feature_path = geodatabase + os.path.sep + current_feature

        #Create a temporary feature layer from the current multipatch feature class
        arcpy.MakeFeatureLayer_management(feature_path, "temp_in_memory_feature" + str(counter))

        #Save the temporary feature layer into a layer file of extension .lyrx
        output_lyrx_name = output_path + os.path.sep + current_feature + ".lyrx"
        arcpy.SaveToLayerFile_management("temp_in_memory_feature" + str(counter), output_lyrx_name)

        print("    Layer file created at: " + output_lyrx_name)

        #Create a scene layer package for the current feature class
        output_spk_name = output_path + os.path.sep + current_feature + ".spk"
        arcpy.CreateSceneLayerPackage_management(output_lyrx_name, output_spk_name)

        print("    Successfully created scene layer package at: " + output_spk_name)

        counter = counter + 1
        #Upload scene package to portal if required
        #Note - this section would work only if ArcGIS Pro is started and signed into the desired
        if (upload_to_portal):

except Exception as spk_ex:
    print("Error processing. Details: " + str(spk_ex))


The script prints an output such as below to the screen.

Found 4 multipatch feature classes for processing.
Processing feature class: Portland_untextured
    Layer file created at: E:\temp\createSPKsample\Portland_untextured.lyrx
    Successfully created scene layer package at: E:\temp\createSPKsample\Portland_untextured.spk
Processing feature class: RI_colored
    Layer file created at: E:\temp\createSPKsample\RI_colored.lyrx
    Successfully created scene layer package at: E:\temp\createSPKsample\RI_colored.spk
Processing feature class: SF_textured
    Layer file created at: E:\temp\createSPKsample\SF_textured.lyrx
    Successfully created scene layer package at: E:\temp\createSPKsample\SF_textured.spk
Processing feature class: Singapore_repeatingTextures
    Layer file created at: E:\temp\createSPKsample\Singapore_repeatingTextures.lyrx
    Successfully created scene layer package at: E:\temp\createSPKsample\Singapore_repeatingTextures.spk


Output files are created in filesystem as shown in image below:



Once you have one or more SPKs, you can try some of the following with them:

  • Upload them to ArcGIS Online or to your Portal for ArcGIS and share them as scene layers
  • View scene layers shared in ArcGIS Online or Portal for ArcGIS with ArcGIS Pro, Earth, or in web scenes, including within Web AppBuilder
  • View SPKs directly with ArcGIS Earth (3D Object and Integrated Mesh scene layers only)

The buildings being displayed below were packaged as an SPK, uploaded to ArcGIS Online, and shared as a scene layer. They can now be consumed in the Web Scene Viewer, ArcGIS Earth and ArcGIS Pro.


I had a question on 3D Point Cloud data. I've been asked how to get this type of data for an area in the NE US. So far I've only found these guys in Australia:


aero3dpro 3D modelling service


who provide this type of data. Does anybody know of any other sources?





3D Samples 2.0 is available for download at
This release features 38 GP tools that support the management and analysis of
lidar, TIN, and 3D features, along with the EzLAS, CheckLAS, and LAS Report
stand-alone utilities.


List of tools:


With the release of ArcGIS 10.3.1, it is now possible to publish 3D layers to on-premised Portal/Server and combine them up with existing Portal or ArcGIS Online 2D feature layers. This paper will look at the system and configuration requirements for the publication of these layers and the integration and curation of these and other services that make up rich 3D web scenes.




LasReport is a Windows command line utility for reporting information about lidar stored in LAS and Esri zLAS format files. It can send output to the screen as well as to a text file. It can also process all the LAS/zLAS files in a folder and write a separate report text file for each one.


The command line utility is free to use. It will work without need for other Esri software.


Link to app on resource center: LasReport Utility

The Esri zLAS I/O library is a C++ runtime library that provides API access for reading and writing Esri Optimized LAS (*.zlas) format files as well as converting between zLAS and LAS. It is out of beta and available to the general public in final form.



  • Convert zLAS files into LAS files. LAS is an ASPRS industry standard format for lidar data.
  • Convert LAS files into zLAS files.
  • Read zLAS into memory buffers as LAS formatted data (e.g., header record, point data records).
  • Read zLAS into structs for easy interpretation of LAS information.


Find it, along with more information, on GitHub: Esri/esri-zlas-io-library · GitHub

Esri’s 3D Team is accepting applications to the beta program for its Optimized LAS I/O Library. This is a C++ library that enables 3rd party applications to read and write Optimized LAS (zLAS). It’s free and does not require an ArcGIS license.


We’re looking for people to provide feedback on the API and report any problems they may discover with the library. There’s limited room for the program so apply soon!


If you’re interested in participating in the beta program send email to 'ccrawford at esri dot com' with the following information:







Intended use of library

rethinking geonet Places

Posted by artb4math Dec 15, 2014

Sol Wuensch's "Were the previous forums better than this GeoNet Community?" poll, with 14421 views at last count, is perhaps the most commented entry on GeoNet.

Obviously changes must be made, and here I propose a couple of simple changes that may help the average user.


First, let's change the poorly named but trying hard to be hip "Places" to "Groups".

I don't call my Husqvarna chainsaw "Slayer of Trees", I call it my chainsaw.


Second, and here I take a leaf out of the Apple Support Communities book, let's make it easier to find the groups that interest us.

Let's have a peek at the website:


This chunk of the website clearly shows a few hardware-oriented forums and one software forum. The iPad forum is neatly divided into two sub-forums, upon clicking the iPad image.


A similar simple and effective breakdown (sans images - I am not a graphic artist) could be something like this:


3D mapping                                                  GIS Developers                                             Software

                                                                        - python                                                       - ArcGIS Pro

MOOCs                                                            - Arcobjects SDK                                         - ArcMap

  - spatial analysis

                                                                      Web Developers                                           Web GIS

Industry & Government                                       - ArcGIS API for javascript                         - ArcGIS online

- utilities & communications                                - ArcGIS REST API                                    - story maps

- forestry

- ArcGIS for local government                      Servers                                                          Older software

                                                                       - ArcGIS for Server                                        - ArcView

GPS                                                                - Geoevent                                                    - ArcIMS

- Collector for ArcGIS




Note: This is not an exhaustive list, just food for thought.

Please rate/like/enjoy/comment on this if you're in my grid square.

How to calculate a distance over a surface

A point-to-point distance taken from a map does not provide a true measurement of the distance between those points; the intervening topography has to be taken into account...Calculating True Distance Over a Surface - Blogs -


Making Elevation Profiles in 3D Analyst

An elevation profile charts the elevation along a straight or irregular line...Making Elevation Profiles in 3D Analyst - Blogs -

Quick Intro Download and use Esri Freeware for Lidar

(Esri LAS Optimizer)


Hi Everyone,


Thanks for the feedback on the blogs.  I will try to do better on Steve's 3D Blog on this 2nd try.


My second blog will be covering use of the Esri Lidar EzLAS Optimizer Freeware.


I borrowed the following from Gert Van Maren at Esri on the purpose of the Esri EzLAS Optimizer Freeware is to solve one of the problems with the LAS transfer standard.


"The LAS format was intended for data exchange, not direct use. One significant example of this is the lack of indexing. Because of this, any query on a file requires it be scanned, in full, to find the appropriate point records. As files get bigger and increasingly stored on networks, the cost of not having an index becomes prohibitive."


Even though the Esri EzLAS Optimizer Freeware does a good job at compression, I think it is a mistake to think of it as just as Lidar compression software. 


What is the advantage of using this software in the ArcGIS environment?


Instead of providing a laundry list I recommend reading a great article by Gene Roe of Lidar News


What I find useful is that after using the .zlas format I don't need to decompress the Lidar data in ArcGIS 10.2.1 (my current version is 10.2.2) to use it.  Also, another great feature is this is supported in the Esri Mosaic dataset if you would like to create Lidar webservices using your Imagery skills, or creating geospatial products for CityEngine.  This is great when trying to automate your workflows with modelbuilder or phython (still working on my python skills).

If your interested in downloading and trying this standalone Esri Freeware visit the following website LAS+Optimizer+(v1.1)


Here are a few of my notes from using the tool in the past version 1.0 (current is 1.1).


I hope to have this updated soon, depending on spare time.











Steve's 3D Blog

Posted by ssnow-esristaff Employee Jul 29, 2014



Okay, well I've been putting it off for long enough.  Its time to play with some of the Geonet features such as creating my first attempt blog.  I'm not sure how many readers have started blogging but any advice would be greatly appreciated.


Creating your LAS Dataset in 30 seconds.


The subject of my first blog is creating your own LAS Dataset in ArcGIS in 30 seconds.


I have basically summed this up in 2 steps.


1. in the Catalog window Right Click and Choose New LAS Dataset




2. now that the LAS Dataset is made right click on it and choose properties the following screen will pop up.  So choose the 2nd tab on top point to files and add.  Press OK.


You should see details on each file that is added.  If you would like to see a good resource on this topic please check out the following link.


View and Analyze this will cover more of the basics.