要访问 ArcGIS CityEngine 中的教程工程,请打开 CityEngine,然后在主菜单中单击帮助 > 下载教程和示例。 在选择教程或示例后,系统会自动下载工程并将其添加到 CityEngine 工作空间。
CityEngine 街道网络由图形节点(交叉路口)和图形边(街段)组成。 街道网络可以使用生成街道工具生成,在 CityEngine 中手动绘制,或者从外部文件(例如 DXF 或 SHP 文件)导入。
以下示例显示了在 Adobe Illustrator 中草绘的海滨城市的主要道路结构。
然后,将其导出为 DXF 文件以导入 CityEngine。
注:
将街道网络导出为 DXF 时,请确保将应用程序的单位转换为米,因为 CityEngine 坐标系以米为单位。
导入 DXF 文件
要将 DXF 文件导入场景,请执行以下操作:
- 打开 \scene\ 文件夹中的 sesame_01.cej 场景:
海滨纹理将显示在场景中。
- 右键单击 \data\ 文件夹中的 sesame_streetsketch.dxf 文件,并选择导入。
您也可以选择 .dxf 文件,然后单击主菜单中的文件 > 导入。
图形框显示 Layer 2 数据已添加为要导入的图形图层。
- 确保选中导入后运行图形清理工具和根据图形创建街道/节点形状复选框,然后单击下一步。
- 选中相交段、将节点捕捉到段和合并节点复选框。
- 将水平捕捉距离和垂直捕捉距离值设置为 1。
- 将水平合并距离和垂直合并距离值设置为 5。
清理图形设置应如下所示:
- 单击 完成。
- 在检查器中将新街道图层重命名为 Sesame Street Sketch。
- 通过按 (D+G) 或者单击视图设置工具 下的格网关闭视窗中的格网。
打开 \scenes\ 文件夹中的 sesame_02.cej 场景以查看海滨旁边已导入的 DXF。
生成次要街道
导入主要街道后,您可以开始优化街道网络,并在两者之间生成次要街道。 接下来,您将使用生成街道工具填充现有的封闭街区,以使用街道迭代填充街区。
- 保持 sesame_02.cej 场景处于打开状态。
- 使用选择工具 选择主要街道环内的主要街道段之一。
由此指定了街区中街道的总体方向,并定义了生成街道算法的起始节点。
- 单击可见性设置 并选择形状,或者按 F11 以关闭形状可见性。
执行此操作可以隔离街道网络中的主要街道和次要街道。
- 单击主菜单中的图形 > 生成街道以打开生成街道对话框。
- 在次要街道模式旁边的下拉菜单中单击径向。
- 单击应用。
次要街道将以径向模式生成。
- 要继续生成次要街道,请选择另一条街道。
- 保持相同的设置并单击应用。
仅在环内生成街道。 sesame_03.cej 场景显示了已完成的径向街道模式。
- 在街道网络的不同部分中创建街道以继续生成街道。
可以使用面街道创建工具 以添加两条新街道并保持其处于选中状态。
- 这次,将次要街道的模式设置更改为栅格。
- 单击应用。
将根据所选街道生成街道,其中次要街道采用栅格模式。
在生成街道时,可以更改该设置以获取不同的街道模式。 有关详细信息,请参阅街道模式示例。
生成建筑物和植被模型
sesame_12.cej 场景从上方显示了已完成的场景。 多次应用生成街道算法后,将存在生成的主要街道和次要街道以及提取的建筑物覆盖区。 接下来,您将生成建筑物和植被模型。
- 打开 sesame_12.cej 场景。
- 当系统询问您是否要生成模型时,请单击否。
- 右键单击 streets final 图层并单击选择对象。
- 单击生成按钮 (Ctrl+G) 以生成所有建筑物和植被模型。
导入 OSM 数据
OSM 是一种基于 XML 的格式,用于描述地图中的矢量数据。 它定义了三种基本数据类型 - 节点、路线和闭合路线。这些数据类型用于描述所有其他元素:
- 节点 - 绘制线段之间的点。
- 路线 - 节点的有序列表,在编辑器中显示为通过线段连接。
- 闭合路线 - 形成一个完整循环的路线。 可将其用于描述公园、湖泊或岛屿等区域。
现在,您将开始导入 OSM 数据。
要导入 OSM 文件,请执行以下操作:
- 通过单击文件 > 新建 > CityEngine > CityEngine 场景打开一个新的场景文件。
- 将 \data\ 文件夹中的 .osm 文件拖动到视窗中。
- 在“OSM 导入”对话框中,选择要导入的图层。
通常,街道将位于公路图层中,而建筑物位于建筑物图层中。 必要时,请使用全选/取消全选复选框来取消选中所有图层。
- 如下图所示设置附加选项:
- 单击 完成。
- 保持场景坐标系设置为 WGS 1984 UTM Zone 33N。
有关详细信息,请参阅场景坐标系。
- 单击确定。
两个新图层:街道网络和形状图层随即出现在 Scene Editor 中。 OSM 数据在视窗中可见,显示了在已导入街道中心线上自动创建了街道形状。
- 在 Scene Editor 中将形状网络图层重命名为 OSM_Streets。
- 将形状图层重命名为 OSM_Shapes。
街道宽度
如果仔细观察生成的街道形状,您会发现它们的宽度有所不同。 在启用 Map OSM 标签选项的情况下导入 OSM 数据时,CityEngine 将创建图层属性,这些属性根据 OSM 街道类型定义街道宽度。
选择一个街道段,并在检查器中记录其参数。
所选街道的 highway 参数设置为 primary,并根据已导入 OSM_Streets 图层的图层属性映射定义街道和人行道宽度参数。
可以通过在 Segment Width 参数中设置新的宽度值(该值将更改为用户设置的值)或者使用编辑街道/曲线工具 (C) 来手动修改街道宽度。
OSM 属性映射
要查看 OSM 街道数据图层属性,请在 Scene Editor 中选择 OSM_Streets 图层,然后在检查器中的图层属性下探索图层属性。
例如,在 streetWidthByClass 函数中将上图中的所选街道段设置为 primary,并将街道宽度映射为 8 米。 可以在图层属性中修改映射。
//-------------------------
// Example OSM Tag Mapping
streetscale = 1 // street width scale factor
width = getFloatObjectAttr("width", false)
lanes = getFloatObjectAttr("lanes", false)
attr streetWidth = // street width depending on available attributes
case width > 0 : width * streetscale
case lanes > 0 : lanes * 3.5 * streetscale
else : streetWidthByClass * streetscale * oneway
class = getStringObjectAttr("highway", false)
streetWidthByClass =
case class == "primary" : 8
case class == "secondary" : 7
case class == "tertiary" : 6
case class == "motorway" : 12
case class == "trunk" : 11
case class == "road" : 6
case class == "residential" : 5
case class == "footway" : 2
case class == "cycleway" : 2
case class == "steps" : 2
else : 4
oneway = // oneway width correction
case getStringObjectAttr("oneway", false) == "yes" : 0.5
else : 1
sidewalkscale = 1 // sidewalk width scale factor
sidewalkWidth =
case class == "primary" : 2
case class == "secondary" : 2
case class == "tertiary" : 2
case class == "residential" : 2
else : 0
attr sidewalkWidthLeft = sidewalkWidth * sidewalkscale
attr sidewalkWidthRight = sidewalkWidth * sidewalkscale
数据冲突
导入的 OSM 数据通常不是很清晰,并导致冲突(例如,街道重叠)。 开放的或红色虚线表示未连接的路段或街道重叠,可能会导致无效的街区。 可以通过以下方式解决冲突:
- 使用清理街道工具 。
- 在导入对话框的公路图层中选择较少的街道。
- 将街道和人行道的宽度设置为较低的值(由此导致重叠的街道减少)。
- 导入后,通过合并或删除附近的十字路口或平行街道来手动清理街道网络。
下图显示了清理前后未连接形状节点的示例:
注:
OSM 街道数据通常包含高程数据(属性 level),但可能有错误。 如果激活了运行生成桥梁工具选项,则 CityEngine 会自动找出可行的解决方案。
添加具有地理配准的卫星影像的地图图层
接下来,您将向场景中添加地理配准航空图像。
- 单击文件 > 导入 > CityEngine 图层 > 纹理导入。
- 浏览到 \maps\ 文件夹中的 pompeii_satellite.tif 文件。
pompeii_satellite.tfw 坐标定位文件随附 pompeii_satellite.tif 文件,并存储图像的地理配准信息。 因此,将自动设置 Dimensions 和 Location 参数。 有关详细信息,请参阅栅格数据集的坐标定位文件。
- 单击完成以新建纹理地图图层。
注:
CityEngine 不会在导入时重新投影图像。 在导入图像时选择坐标系统只用于计算正确的位置信息。 因此,需要在 CityEngine 场景中使用的投影中准备图像数据。 在之前的示例中,庞贝卫星图像已重新投影到 WGS 1984 UTM Zone 33N(用于本教程场景的场景坐标系)。生成模型
最后,您将根据 OSM 形状生成模型。
- 在 Scene Editor 的 OSM_Shapes 图层中选择所有形状。
- 将 osm_generic.cga 规则文件拖动到所选形状上。
由于某些形状已经具有有效初始规则设置,因此会显示设置初始规则对话框。
- 选择地块规则。
- 单击确定。
导入 SHP 和 GDB 数据
您还可以将 shapefile (SHP) 和地理数据库 (GDB) 数据导入 CityEngine 中。 由于从 shapefile 和地理数据库导入街道的操作几乎相同,因此这里不显示地理数据库的具体示例。
导入 shapefile 数据
要导入 shapefile,请执行以下操作:
- 创建 CityEngine 场景。
- 将 \data\ 文件夹中的 streets.shp 文件拖动到视窗中。
shapefile 还具有一个 .prj 文件,可确保在导入时进行正确的地理配准。 数据由在 CityEngine 中导入为街段的折线组成。 数据还包含 width 属性,该属性用于控制街道宽度。
- 在导入期间,CityEngine 会提示您选择场景坐标系。
- 保持场景坐标系为 WGS 1984 UTM Zone 11N,然后单击确定。
注:
本示例中的 .shp 数据包含控制街道宽度的 width 属性。 如果 shapefile 没有 width 属性,则会自动分配默认街道宽度。 此外,可以在导入后手动设置街道宽度。 您也可以使用属性映射来映射到其他属性名称。
清理
导入的街道形状显示一些冲突的街道形状,并标有红色虚线。
在启用了解决冲突形状的情况下,可以使用清理街道工具 自动修复这些形状。 您还可以单击图形 > 简化图形,通过删除不必要的图形和设置切线来减少复杂图形段的数量。 有关详细信息,请参阅清理街道。
分配规则文件
最后,您将分配规则以生成街道模型:
- 选择所有街道形状。
- 在视窗中,将 sesame_01.cga 规则文件拖动到所选形状上。
在本教程中,您学习了如何导入不同数据类型的街道,包括 DXF、OSM 和 shapefile。
要继续学习 CityEngine,请参阅完整的 CityEngine 教程目录。