说明:
该专栏之前的文章中python脚本使用的是ArcMap10.6自带的arcpy(好几年前的文章),从本篇开始使用的是ArcGIS Pro 3.3版本自带的arcpy,需要注意不同版本对应的arcpy函数是存在差异的
数据准备:准备一个带高度属性的二维面图层shape文件
示例代码说明:
①2D要素类(Polygon)转换为3D要素类(PolygonZ)
②3D要素类(PolygonZ,三维表面)转3D要素类(MultiPatch,体,三维模型)
③3D要素类(MultiPatch)转3D对象场景图层包.slpk数据
# -*- coding: utf-8 -*- import arcpy from arcpy import env import os import sys import shutil import datetime,time starttime = datetime.datetime.now() output_dir = 'E:/Dataset/output' # 检查文件夹是否存在 if os.path.exists(output_dir): # 如果文件夹不为空,则删除其中的所有文件和子文件夹 for filename in os.listdir(output_dir): file_path = os.path.join(output_dir, filename) try: if os.path.isfile(file_path) or os.path.islink(file_path): os.unlink(file_path) # 删除文件或符号链接 elif os.path.isdir(file_path): shutil.rmtree(file_path) # 删除子文件夹及其内容 except Exception as e: print(f"无法删除 {file_path}。原因:{e}") print(f"文件夹 '{output_dir}' 已清空。") else: print(f"文件夹 '{output_dir}' 不存在,无需清空。") # 设置工作空间 env.workspace = output_dir # 输入 Shapefile 文件路径 in_features = 'E:/Dataset/build/build.shp' # 输出 Shapefile 文件名称 out_feature='build3d.shp' # 设置高度字段 height_field ='height' arcpy.ddd.FeatureTo3DByAttribute(in_features, out_feature, height_field) print("2D要素类转换为3D要素类完成,文件类型为PolygonZ") # 创建要素图层 layer_name_polygonz = "temp_layer_polygonz" # 临时图层的名称 arcpy.MakeFeatureLayer_management(out_feature, layer_name_polygonz) print("PolygonZ文件转临时图层文件完成") # 输出3D要素类路径 output_feature_class='build3dmultipatce.shp' # 执行 Layer3DToFeatureClass 工具 arcpy.ddd.Layer3DToFeatureClass(layer_name_polygonz,output_feature_class) print("3D图层转换为3D要素类完成,文件类型为MultiPatch") out_slpk='buildslpk.slpk' # 创建要素图层 layer_name_multipatch = "temp_layer_multipatch" # 临时图层的名称 arcpy.MakeFeatureLayer_management(output_feature_class, layer_name_multipatch) print("MultiPatch文件转临时图层文件完成") arcpy.management.Create3DObjectSceneLayerPackage( in_dataset=layer_name_multipatch,# 输入的3D模型数据 out_slpk=out_slpk,# 输出的SLPK文件路径 out_coor_system=None,# 使用输入数据的坐标系(与ArcGIS Pro默认行为一致)# 输出坐标系(设置为默认,即与输入数据相同) transform_method="",# 不进行坐标转换(与ArcGIS Pro默认行为一致) # 转换方法(可选) texture_optimization="None", # 不进行纹理优化(与ArcGIS Pro默认行为一致)# 纹理优化:ALL | DESKTOP | MOBILE | NONE target_cloud_connection=""# 不使用云连接(与ArcGIS Pro默认行为一致)# 目标云连接(可选) ) print("3D对象场景图层包.slpk数据转换完成") endtime = datetime.datetime.now() times=endtime-starttime times_seconds =times.seconds print ("用时:",times_seconds,"s")
输出结果示例:
使用脚本完成slpk数据的生成,接下来一般是上传slpk数据到门户网站,发布为三维服务,给出之前的发布结果示例图: