我正在寻求确认以下情况目前是否可行。我目前正在编写一条 CGA 规则,用于我的 ArcGIS Urban 场景。我正在编写的规则利用 CityEngine 的功能来检查和处理超出 Urban 直接可行范围的有条件分区规定。我正在探索的条件之一是相邻地块的分区会影响可建性要求的情况(例如,工业区可能需要在与住宅区接壤的地方设置额外的退让线)。
我理解如何在 CityEngine 中使用遮挡查询构建逻辑的原理,但在构建该逻辑之前,我需要一种方法来通过 CGA 访问分配给每个地块的分区。但是,ArcGIS Urban 的分区指定位于检查器中这个特殊的“分区”部分中,而不是作为对象属性:
有没有办法将此部分中的“区域类型”值链接到我的 CGA 中的属性?
我知道使用 Python/利用 ArcGIS Pro 可以轻松实现这一点,但由于我正在利用 CGA 来实现此建模的其他组件,因此如果可能的话,我宁愿避免在工作流程中引入额外的步骤。
回复:
我很高兴看到您 利用 CityEngine 功能来检查和处理有条件的分区规定。
此宗地形状的示例规则显示了如何使用 从场景的区域边界层获取的 ZoneTypeID属性 :
version "2025.0"
@Order(1)
@Enum(valuesAttr=zoneTypeIDs,restricted=false)
@DisplayName("Zone Type ID")
attr ZoneTypeID = ""
@Hidden
attr zoneTypeIDs = getKeys(zoneTypeTable)
@Order(2)
@DisplayName("Zone Type Label")
attr Zone_Type_Label = getValue( zoneTypeTable, ZoneTypeID, "Label")
@Order(3)
@Color
@DisplayName("Zone Type Color")
attr Zone_Type_Color = getValue( zoneTypeTable, ZoneTypeID, "Color")
@Order(4)
@DisplayName("Zone Type HeightMax")
attr Zone_Type_HeightMax = float(getValue( zoneTypeTable, ZoneTypeID, "HeightMax"))
@Order(0)
@File
@DisplayName("Zone Type Table")
attr Zone_Type_Table = "data/Urban_for_CE_Database_View.csv"
const zoneTypeTable = readStringTable(Zone_Type_Table)
getKeys(table) = transpose(table[1:nRows(table) - 1, 0])
getValue(table, key, columnName) with(
keysColumn := getKeys(table)
rowIndex := findFirst(keysColumn, key) + 1
columnIndex := findFirst(table[0, 0:nColumns(table)], columnName)
) =
case (rowIndex == 0) || (columnIndex == -1): "Error"
else: table[rowIndex, columnIndex]
@StartRule
Parcel -->
print(ZoneTypeID)
print(Zone_Type_Label)
color(Zone_Type_Color)
extrude(Zone_Type_HeightMax)
与空间类型信息不同,从 ArcGIS Urban 导入规划图时,分区信息不会以 CSV 格式添加到项目中。您可以执行以下操作来处理分区信息:
- 在门户内容中找到您的规划的 ArcGIS Urban Database View。它包含一个名为ZoneTypes的表
- 将此ZoneTypes 表导出为 CSV 文件,然后下载
- 在 CityEngine 中,将ZoneTypes CSV 文件添加到项目的数据文件夹
- 现在您可以将 规则属性 Zone_Type_Table连接 到下载的ZoneTypes CSV 文件。
- 要获取地块的区域类型信息,只需将规则属性 ZoneTypeID连接 到场景的区域边界层中的匹配属性:
- 最终结果应如下所示:











