摘要
SceneLayerSharingDraft 类允许您为具有关联 Web 要素图层的 Web 场景图层创建共享草稿。 您可以为 Web 场景图层配置 SceneLayerSharingDraft 对象,将所有数据或引用的注册数据复制到 ArcGIS Enterprise,或将所有数据复制到 ArcGIS Online。
对象可发布以下类型的场景图层:
- 点
- 3D 对象
- 建筑物
要在 Python 中发布本地缓存的 Web 场景图层,请改用地理处理工具。 有关详细信息,请参阅使用包发布 Web 图层。
说明
要创建 SceneLayerSharingDraft 对象,需使用 Map 对象的 getWebLayerSharingDraft 方法并将 service_type 参数设置为 SCENE_LAYER。 要指定 Web 场景图层是否将所有数据或引用注册的数据复制到 ArcGIS Enterprise,请将 server_type 参数设置为下列之一:
- HOSTING_SERVER - 复制所有数据;包括关联的 web 要素图层。
- FEDERATED_SERVER - 引用注册的数据;包括关联的地图影像图层和 web 要素图层。
此外,getWebLayerSharingDraft 方法中的 layers_and_tables 参数必须是具有单个图层的列表。 使用 ArcGISProject 对象中的 listMaps 函数和 Map 类上的 listLayers 方法来引用要发布的 3D 场景中的图层。
然后,可通过设置服务级别属性配置 SceneLayerSharingDraft 对象。 您还可以设置关联的 Web 要素图层和地图影像图层的 SceneLayerSharingDraft 对象属性。 如果未指定属性的值,则使用默认值。 下面的属性列表中提供了有关每个属性的信息。
注:
如果未设置元数据属性(credits、description、summary、tags 和 useLimitations)或其具有空字符串,则 Web 图层项目将从 ArcGIS Pro 工程中的场景图层获取元数据,具体取决于共享的内容。 有关 Web 图层如何获取元数据的详细信息,请参阅 Web 图层元数据。
配置 SceneLayerSharingDraft 对象后,可以使用可选 analyzeForSharing 方法分析错误和警告,并使用 Publish 函数发布。 Publish 函数将 Web 场景图层及任何相关 Web 图层发布至 ArcGIS Online 或 ArcGIS Enterprise,并开始在服务器上缓存。
代码示例可用于以下用途:
属性
属性 | 说明 | 数据类型 |
allowUpdateWithoutMValues (可读写) | 指定是否允许几何在不指定 m 值的情况下更新为启用了 m 值的要素。 默认值为 True。 这是 Web 要素图层和地图影像图层属性。 | Boolean |
approvePublicDataCollection (可读写) | 指定是否允许在 Web 要素图层上进行公开编辑。 | Boolean |
cachedAttributes (可读写) | 将包含在 Web 场景图层缓存中的图层字段列表。 | List |
compressedTextures (可读写) | 指定是否启用纹理优化,支持在 3D 应用程序中更快的显示。 共享多面体或 3D 对象要素图层时支持此属性。 | Boolean |
credits (可读写) | web 图层制作者名单。 | String |
description (可读写) | web 图层的描述。 | String |
export (可读写) | 指定用户是否可以将网 Web 场景图层导出为不同格式。 | Boolean |
featureCapabilities (可读写) | 已启用的功能,以逗号分隔。 支持以下功能:
当 server_type 属性设置为 FEDERATED_SERVER 时, Query、Create、Update、Delete 和 Editing 是默认值。 这是 Web 要素图层和地图影像图层属性。 | String |
maxRecordCount (可读写) | 服务器在查询期间返回的最大记录数。 默认值为 2000。 这是 Web 要素图层和地图影像图层属性。 | Integer |
portalFolder (可读写) | 将发布 Web 图层的门户文件夹的名称。 默认文件夹是“我的内容”中的根文件夹。 | String |
preserveEditUsersAndTimestamps (可读写) | 指定是否将保留编辑者追踪信息。 默认值为 False。 这是 Web 要素图层属性。 | Boolean |
serviceName (可读写) | web 图层名称。 用户可以看到该名称并使用该名称来识别 web 图层。 名称只能包含字母数字字符和下划线。 不允许使用空格或特殊字符。 名称不能超过 120 个字符。 | String |
sharing.groups (可读写) | 以逗号分隔的组名称。 | String |
sharing.sharingLevel (可读写) | Web 图层的共享级别。
| String |
summary (可读写) | Web 图层的摘要。 | String |
tags (可读写) | Web 图层的标签。 可以添加多个标签,或用逗号分隔。 | String |
timezone.DaylightSavingTime (可读写) | 指定时区是否考虑夏令时。 默认值为 False。 这是 Web 要素图层和地图影像图层属性。 | Boolean |
timezone.ID (可读写) | 存储日期值的时区。 字符串值必须与 Windows 操作系统识别的官方时区 ID 之一匹配。 有关时区的列表,请参阅 Microsoft 文档中的时区。 这是 Web 要素图层和地图影像图层属性。 | String |
timezone.preferredTimezoneID (可读写) | 显示来自 web 要素图层的查询时要使用的 ArcGIS Pro 时区。 字符串值必须与 Windows 操作系统识别的官方时区 ID 之一匹配。 有关时区的列表,请参阅 Microsoft 文档中的时区。 这是 Web 要素图层和地图影像图层属性。 | String |
timezone.preferredTimezoneIDDaylightSavingTime (可读写) | 指定首选时区是否考虑夏令时。 默认值为 False。 这是 Web 要素图层和地图影像图层属性。 | Boolean |
useLimitations (可读写) | Web 图层的使用限制。 | String |
zDefault.enable (可读写) | 指定是否允许编辑者通过不允许指定 z 值的客户端添加或更新要素。 默认值为 True。 这是 Web 要素图层和地图影像图层属性。 | Boolean |
zDefault.value (可读写) | 插入或更新要素时将使用的默认 z 值。 仅在属性 zDefault.enable 设置为 True 时支持此属性。 默认值为 0。 这是 Web 要素图层和地图影像图层属性。 | Double |
方法概述
方法 | 说明 |
analyzeForSharing () | analyzeForSharing 方法分析 SceneLayerSharingDraft 对象并返回错误、警告和消息。 |
方法
analyzeForSharing ()
数据类型 | 说明 |
Dictionary | 错误、警告和消息的字典。 |
代码示例
以下脚本为场景中的图层创建 Web 场景图层共享草稿并设置元数据和文件夹属性。 Web 场景图层将发布到 ArcGIS Online 或 ArcGIS Enterprise 的文件夹中并与所有人(公共)共享。 门户信息可从 SignInToPortal 函数中获得。
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")
以下脚本创建了 Web 场景图层共享草稿。 分析了共享草稿。 如果返回 analyzer 00231,则使用 ArcGIS API for Python 中的 arcgis.gis 模块注册数据存储。
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")
以下脚本创建 Web 场景图层共享草稿并为关联的 Web 要素图层设置功能、时区和缓存属性。 然后,为 Web 场景图层和关联的 Web 图层指定项目 ID。 Web 场景图层将发布至 ArcGIS Enterprise。 必须已在服务器上注册数据存储,才能引用数据。
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")