Summary
The SceneLayerSharingDraft class allows you to create a sharing draft for a web scene layer with an associated web feature layer. You can configure the SceneLayerSharingDraft object for a web scene layer that copies all data or references registered data to ArcGIS Enterprise, or copies all data to ArcGIS Online.
The object can publish the following types of scene layers:
- Point
- 3D object
- Building
To publish a web scene layer cached locally in Python, use geoprocessing tools instead. For more information, see Publish web layers using packages.
Discussion
To create the SceneLayerSharingDraft object, use the Map object's getWebLayerSharingDraft method and set the service_type parameter to SCENE_LAYER. To specify whether the web scene layer copies all data or references registered data to ArcGIS Enterprise, set the server_type parameter to one of the following:
- HOSTING_SERVER—Copies all data; an associated web feature layer is included.
- FEDERATED_SERVER—References registered data; an associated map image layer and web feature layer are included.
Additionally, the layers_and_tables parameter in the getWebLayerSharingDraft method must be a list with a single layer. Use the listMaps function from the ArcGISProject object and the listLayers method on the Map class to reference the layer in the 3D scene you want to publish.
The SceneLayerSharingDraft object can then be configured by setting service level properties. You can also set properties on the SceneLayerSharingDraft object for the associated web feature layer and map image layer. If no value is specified for a property, the default value is used. Information about each property is provided in the Properties list below.
Note:
If metadata properties (credits, description, summary, tags, and useLimitations) are not set or consist of empty strings, the web layer item will source metadata from the scene layer in the ArcGIS AllSource project, depending on what is shared. For more information about how web layers source metadata, see Web layer metadata.
After the SceneLayerSharingDraft object is configured, it can be analyzed for errors and warnings using the optional analyzeForSharing method, and published using the Publish function. The Publish function publishes the web scene layer and any associated web layers to either ArcGIS Online or ArcGIS Enterprise, and starts caching on the server.
Code samples are available for the following:
Properties
Property | Explanation | Data Type |
allowUpdateWithoutMValues (Read and Write) | Specifies whether geometry updates to m-enabled features will be allowed without specifying an m-value. The default value is True. This is a web feature layer and map image layer property. | Boolean |
approvePublicDataCollection (Read and Write) | Specifies whether public editing will be allowed on a web feature layer. | Boolean |
cachedAttributes (Read and Write) | A list of the layer's fields that will be included in the web scene layer cache. | List |
compressedTextures (Read and Write) | Specifies whether texture optimization will be enabled, which supports faster display in 3D applications. This property is supported when sharing a multipatch or 3D object feature layer. | Boolean |
credits (Read and Write) | The credits of the web layer. | String |
description (Read and Write) | The description of the web layer. | String |
export (Read and Write) | Specifies whether users can export the web scene layer to different formats. | Boolean |
featureCapabilities (Read and Write) | The enabled capabilities, separated by commas. The following capabilities are supported:
Query, Create, Update, Delete, and Editing are the defaults when the server_type property is set to FEDERATED_SERVER. This a web feature layer and map image layer property. | String |
maxRecordCount (Read and Write) | The maximum number of records that will be returned by the server during querying. The default value is 2000. This a web feature layer and map image layer property. | Integer |
portalFolder (Read and Write) | The name of the portal folder where the web layer will be published. The default folder is your root folder in My Content. | String |
preserveEditUsersAndTimestamps (Read and Write) | Specifies whether editor tracking information will be preserved. The default value is False. This is a web feature layer property. | Boolean |
serviceName (Read and Write) | The name of the web layer. This is the name people will see and use to identify the web layer. The name can only contain alphanumeric characters and underscores. No spaces or special characters are allowed. The name cannot be more than 120 characters. | String |
sharing.groups (Read and Write) | The group names, separated by commas. | String |
sharing.sharingLevel (Read and Write) | The sharing level of the web layer.
| String |
summary (Read and Write) | The summary of the web layer. | String |
tags (Read and Write) | The tags of the web layer. Multiple tags can be added or separated by a comma. | String |
timezone.DaylightSavingTime (Read and Write) | Specifies whether the time zone accounts for daylight saving time. The default value is False. This a web feature layer and map image layer property. | Boolean |
timezone.ID (Read and Write) | The time zone in which date values are stored. The string value must match one of the official time zone IDs recognized by the Windows operating system. For a list of time zones, see Time zones in the Microsoft documentation. This is a web feature layer and map image layer property. | String |
timezone.preferredTimezoneID (Read and Write) | The time zone for ArcGIS AllSource to use when displaying queries from the web feature layer. The string value must match one of the official time zone IDs recognized by the Windows operating system. For a list of time zones, see Time zones in the Microsoft documentation. This is a web feature layer and map image layer property. | String |
timezone.preferredTimezoneIDDaylightSavingTime (Read and Write) | Specifies whether the preferred time zone accounts for daylight saving time. The default value is False. This is a web feature layer and map image layer property. | Boolean |
useLimitations (Read and Write) | The use limitations of the web layer. | String |
zDefault.enable (Read and Write) | Specifies whether editors will be allowed to add or update features through clients that don't allow a z-value to be given. The default value is True. This is a web feature layer and map image layer property. | Boolean |
zDefault.value (Read and Write) | The default z-value that will be used when inserting or updating features. This property is only honored if the zDefault.enable property is set to True. The default value is 0. This is a web feature layer and map image layer property. | Double |
Method Overview
Method | Explanation |
analyzeForSharing () | The analyzeForSharing method analyzes the SceneLayerSharingDraft object and returns errors, warnings, and messages. |
Methods
analyzeForSharing ()
Data Type | Explanation |
Dictionary | A dictionary of errors, warnings, and messages. |
Code sample
The following script creates a web scene layer sharing draft for a layer in a scene and sets metadata and folder properties. The web scene layer is published to a folder in either ArcGIS Online or ArcGIS Enterprise and shared with everyone (public). Portal information is obtained from the SignInToPortal function.
import arcpy
# Sign in to portal
arcpy.SignInToPortal("https://www.arcgis.com", "MyUserName", "MyPassword")
# Reference layer to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps('World')[0]
lyr = m.listLayers('Cities')
# Create SceneLayerSharingDraft and set metadata and portal folder properties
server_type = "HOSTING_SERVER"
service_type = "SCENE_LAYER"
service_name = "SceneLayerSharingDraftExample"
scene_draft = m.getWebLayerSharingDraft(server_type, service_type, service_name, lyr)
scene_draft.credits = "These are credits"
scene_draft.description = "This is description"
scene_draft.summary = "This is summary"
scene_draft.tags = "tag1, tag2"
scene_draft.useLimitations = "These are use limitations"
scene_draft.portalFolder = "my folder name"
scene_draft.sharing.sharingLevel = "EVERYONE"
scene_draft.sharing.groups = "" # Group names = "group1,group2"
# Share to portal
print("Start Publishing")
res = arcpy.sharing.Publish(scene_draft)
print(r"item_url: " + res["web_scene_layer"]["item_url"])
print(r"rest_url: " + res["web_scene_layer"]["rest_url"])
print(r"cache_job_id: " + res["web_scene_layer"]["cache_job_id"])
print("Finish Publishing")
The following script creates a web scene layer sharing draft. The sharing draft is analyzed. If analyzer 00231 is returned, the data store is registered using the arcgis.gis module in ArcGIS API for Python.
import arcpy
# Add a data store item on the portal and register it with a federated server
def register_datastore_item(portal_url, username, password, sde_conn_file, data_store_name, federated_server_url):
from arcgis.gis import GIS
tags = "tag1, tag2"
description = "Data Store Item created from ArcGIS API for Python"
federated_server_url = federated_server_url.rstrip('/')
federated_server_adminurl = federated_server_url + "/admin"
# Connect to your portal using ArcGIS API for Python
gis = GIS(url=portal_url, username=username, password=password)
# Get federated server ID
server_list = gis.servers["servers"]
fedserver_dict = [srvr for srvr in server_list if srvr["url"] == federated_server_url][0]
fedserver_id = fedserver_dict["id"]
print("Server id: " + fedserver_id)
# Get federated server's DatastoreManager object
fedserver = [srvr for srvr in gis.admin.servers.list() if srvr.url == fedserver_dict["adminUrl"]+"/admin"][0]
fedserver_dsmgr = fedserver.datastores
# Create a connection string from .sde file connection
conn_file = sde_conn_file
conn_string = fedserver_dsmgr.generate_connection_string(conn_file)
print("Connection string generated")
# Create a dictionary for data store configuration
ds_config = {"type": "egdb",
"path": "/enterpriseDatabases/" + data_store_name,
"info": {"isManaged": "false",
"dataStoreConnectionType": "shared",
"connectionString": conn_string}
}
# Create a dictionary for the item properties
item_properties = {"title": data_store_name,
"type": "Data Store",
"tags": tags,
"snippet": description}
# Add the data store item to the portal
ds_item = gis.content.add(item_properties=item_properties,
text=ds_config)
print("Data store item added")
# Get portal data store
portal_ds = gis.datastore
# Validate the data store item can be connected to before registering
validation_state = portal_ds.validate(server_id=fedserver_id,
item=ds_item)
print("Data store item validated")
# Register the database with the federated server
portal_ds.register(item=ds_item,
server_id=fedserver_id,
bind=False)
print("Data store item registered to server")
return True
if __name__ == "__main__":
portal_url = "https://organization.example.com/webadaptorname"
username = "MyUserName"
password = "MyPassword"
# Sign in to portal
arcpy.SignInToPortal(portal_url, username, password)
# Reference layer to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps('World')[0]
lyr = m.listLayers('Cities')
# Local variables
server_type = "FEDERATED_SERVER"
service_type = "SCENE_LAYER"
service_name = "SceneLayerSharingDraftExample"
sde_conn_file = r"C:\Project\db_conn.sde"
data_store_name = "PortalDSItem"
# Create SceneLayerSharingDraft for scene layer that references data in registered data store and set metadata, portal folder, and server folder properties
scene_draft = m.getWebLayerSharingDraft(server_type, service_type, service_name, lyr)
scene_draft.credits = "These are credits"
scene_draft.description = "This is description"
scene_draft.summary = "This is summary"
scene_draft.tags = "tag1, tag2"
scene_draft.useLimitations = "These are use limitations"
scene_draft.portalFolder = "my folder name"
scene_draft.serverFolder = "MyServerFolder"
scene_draft.sharing.sharingLevel = "EVERYONE"
scene_draft.sharing.groups = "" # Group names = "group1,group2"
print("Analyzing")
analyze_res = scene_draft.analyzeForSharing()
print(analyze_res)
register_error = [err for err in analyze_res["errors"] if err["code"] == "00231"]
# If data store is not registered
if register_error:
# Register data store
register_res = register_datastore_item(portal_url, username, password, sde_conn_file, data_store_name,
"https://gisserver.example.com/webadaptorname")
if not register_res:
print("Unable to register the data store, skipping publish")
exit()
# Share to portal
print("Start Publishing")
res = arcpy.sharing.Publish(scene_draft)
print(r"item_url: " + res["web_scene_layer"]["item_url"])
print(r"rest_url: " + res["web_scene_layer"]["rest_url"])
print(r"cache_job_id: " + res["web_scene_layer"]["cache_job_id"])
print("Finish Publishing")
The following script creates a web scene layer sharing draft and sets capabilities, time zone, and cached attributes for the associated web feature layer. It then specifies item IDs for the web scene layer and associated web layers. The web scene layer is published to ArcGIS Enterprise. The data store must be registered on the server before the data can be referenced.
import arcpy
# Sign in to portal
arcpy.SignInToPortal("https://organization.example.com/webadaptorname",
"MyUserName", "MyPassword")
# Reference layer to publish
aprx = arcpy.mp.ArcGISProject(r"C:\Project\World.aprx")
m = aprx.listMaps('World')[0]
lyr = m.listLayers('Cities')
# Create SceneLayerSharingDraft and set feature capabilities, time zone, and cached attributes properties
server_type = "HOSTING_SERVER"
service_type = "SCENE_LAYER"
service_name = "SceneLayerSharingDraftExample"
scene_draft = m.getWebLayerSharingDraft(server_type, service_type, service_name, lyr)
scene_draft.featureCapabilities = "Query,Create,Update"
scene_draft.timezone.ID = "Pacific Standard Time"
scene_draft.timezone.DaylightSavingTime = True
scene_draft.cachedAttributes = ["field1", "field2"]
# Publish scene layer using the SceneLayerSharingDraft object and specific item ID
# The ID must be available and contain 32 alphanumeric values ranging from letters a to f and numbers 0 to 9
item_id = {
"web_scene_layer_id": "itemid1",
"web_feature_layer_id": "itemid2",
"map_image_layer_id": "itemid3"
}
# Share to portal
print("Start Publishing")
res = arcpy.sharing.Publish(scene_draft, item_id)
print(r"item_url: " + res["web_scene_layer"]["item_url"])
print(r"rest_url: " + res["web_scene_layer"]["rest_url"])
print(r"cache_job_id: " + res["web_scene_layer"]["cache_job_id"])
print("Finish Publishing")