要访问教程CityEngine中,单击 帮助>下载教程和例子…。选择教程或示例后,项目会自动下载并添加到您的工作区。
导入 DXF 街道数据
CityEngine 街道网络
CityEngine 街道网络是属性图,由图节点(交叉点)和图边(街道段)组成。它们可以使用街道增长功能生成,在 CityEngine 中创建,或通过外部文件(例如 DXF)导入。
为 CityEngine 准备街道数据
在此示例中,已使用 Illustrator 的路径和几何工具在 Illustrator 中绘制了海滨城市的主要道路结构。

从外部 CAD 应用程序导出 DXF 文件
导出街道网络时,请确保单位符合 CityEngine 单位系统,该系统始终将导入文件中的数字解释为米。您可以在文本编辑器中打开 .dxf 并查找顶点数据以查看写出的尺寸。在此示例中,1 个像素等于 10 个单位的导出比例设置为获得所需的尺寸(请参阅下面的导出选项屏幕截图)。
以下是DXF导出操作生成的顶点数据:
顶点数据
...
AcDb2dVertex
10
1244.99951171875
20
234.998046875
30
0.0
0
VERTEX
...
以下屏幕截图显示了 Illustrator DXF/DWG 选项对话框中的建议选项:

将 DXF 文件导入 CityEngine
- 打开sesame_01.cej场景文件。
- 在数据文件夹中找到sesame_streetsketch.dxf文件。
- 右键单击该文件,然后选择“导入”。
的第2层已经添加数据层作为要导入的图表层。
- 确保选中“导入后运行图形清理工具”,然后单击“下一步”。
- 启用相交段、将节点捕捉到段和合并节点。
- 将捕捉距离设置为 1,将合并距离设置为 5。
- 单击完成。
一个名为 sesame_streetsketch 的新图形层出现在场景编辑器中。或者,您可以打开sesame_02.cej场景文件以获取包含导入数据的场景。
发展小街道
导入主要街道后,您可以开始细化街道网络并在其间增加次要街道。CityEngine 中的街道增长算法尝试填充现有的封闭街区,因此您可以用街道迭代地填充街道街区。
-
- 聚焦要创建小街道的街道街区。
- 使用图形编辑工具创建两条单独的小街道。
-
- 手动创建一些街道段。
- 选择路段(q键),然后使用Grow Streets对话框填充空白区域。
该sesame_03.cej场景文件中包含成品街道网络。

最后结果
该sesame_12.cej场景文件包含提取和细分大量成品街道网络。
以下屏幕截图显示了芝麻城与生成的小街道和提取的建筑物足迹:

以下屏幕截图显示了芝麻城与简单的建筑物和植被模型:

导入 OSM 街道数据
“OpenStreetMap 是一个项目,旨在为任何需要它们的人创建和提供免费的地理数据,例如街道地图。” — openstreetmap.org
开放街道地图
OSM 是一种基于 XML 的格式,用于描述地图中的矢量数据。它定义了三种基本数据类型——节点、路和封闭路——用于描述所有其他元素:
- 节点 – 绘制线段之间的点。
- 方式 – 节点的有序列表,在编辑器中显示为由线段连接。
- 封闭的方式——进入一个完整循环的方式。它们用于描述公园、湖泊或岛屿等区域。
从 OpenStreetMap 导出 OSM 文件

在当前 CityEngine 项目的数据文件夹中找到 .osm 文件。
将 OSM 文件导入 CityEngine
-
- 通过单击文件>新建> CityEngine > CityEngine 场景打开一个新场景文件。
- 将文件拖到 3D 视口中。
- 在 OSM 导入对话框中,选择要导入的图层。通常,所有街道都在高速公路层,建筑物在建筑层。如有必要,使用全选/取消全选复选框取消选择所有图层。
- 设置附加选项,如下面的屏幕截图所示:
- 单击完成。
- 接受建议的坐标系 WGS 1984 UTM Zone 33N。
- 单击“确定”。
- 将图形网络层重命名为OSM_Streets。
- 将形状图层重命名为OSM_Shapes。
街道宽度
如果仔细观察生成的街道形状,您会注意到它们的宽度不同。在启用 Map OSM 标签选项的情况下导入 OSM 数据时,CityEngine 创建图层属性,用于定义 OSM 街道类型的街道宽度。
选择一个街道段并在检查器中记下它的参数。
在下面的屏幕截图中,高速公路类型为主要的街道根据导入的 OSM 层 OSM_Streets 的层属性映射分配了街道和人行道宽度参数:

您可以通过为 streetWidth 参数设置新的宽度值(该值将更改为用户设置的值)或使用工具栏上的Street Edit工具来手动修改街道宽度。
OSM 属性映射
- 在 Scene Editor 中选择新的图形网络层,然后在 Inspector 中查看层属性代码。
上图中的街道段属于第三类型,并在函数 streetWidthByClass 中映射到 6 米。您可以根据需要在此处更改映射。
//-------------------------
// Example OSM Tag Mapping
streetscale = 1 // street width scale factor
width = getFloatObjectAttr("width", false)
lanes = getFloatObjectAttr("lanes", false)
attr streetWidth = // street width dependeding 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 街道数据通常包含高程数据(属性级别),但它可能有缺陷。如果您激活Run Generate Bridges Tool选项,CityEngine 会自动找出解决此问题的可能解决方案。
添加带有地理参考卫星图像的地图图层
- 单击文件>导入> CityEngine 图层>纹理导入。
- 浏览至maps 文件夹中的pompeii_satellite.tif文件。
该pompeii_satellite.tfw世界文件伴随 pompeii_satellite.tif文件并存储图像的地理参考信息。因此,会自动设置 Size(边界)和 Offset(位置)参数。有关详细信息,请参阅世界文件栅格数据集。
- 单击完成以创建新的纹理贴图层。
笔记:
CityEngine 在导入时不会重新投影图像。在图像导入时选择坐标系仅用于计算正确的位置信息。因此,在 CityEngine 场景中使用的投影中准备图像数据至关重要。(在前面的示例中,庞贝卫星影像已在 ArcMap 中重新投影到 WGS 1984 UTM Zone 33N(用于本教程场景的场景坐标系)。
以下屏幕截图显示了添加到 OSM 街道数据的卫星地图:

生成模型
-
- 在场景编辑器中选择OSM_Shapes层中的所有形状。
- 分配osm_generic.cga规则文件。
由于某些形状已具有有效的起始规则集,因此会出现“设置起始规则”对话框。
- 单击跳过。
- 单击生成。
您可能已经注意到,只生成了街道。未生成建筑物形状。选择其中之一并在检查器中注意没有分配开始规则。
- 要修复它,请右键单击视口中的选定形状,然后从上下文菜单中选择“选择” >“选择具有相同起始规则的对象”。这将选择所有没有开始规则集的形状。
- 在检查器中,单击“开始规则”字段旁边的“选择”按钮。
- 在设置起始规则对话框中,选择批次。
- 再次单击生成。
以下屏幕截图显示了在 OSM 数据上生成的简单通用模型:

导入 shapefile(和地理数据库)街道数据
由于从 shapefile 和地理数据库文件中导入街道的操作几乎相同,因此此处不显示地理数据库的具体示例。
形状文件数据
-
- 在教程项目的数据文件夹中找到 street.shp 文件。
在 ArcMap 中显示的 shapefile 的属性表:

导入数据
- 创建一个新的空 CityEngine 场景。
- 将 street.shp 文件从导航器拖放到 3D 视口中。
- 在导入过程中,CityEngine 会提示您选择场景坐标系。建议为 shapefile 定义的投影作为默认值;在这里使用。
笔记:
本示例中的 .shp 数据包含用于控制街道宽度的width属性。没有此类属性的数据会导致默认街道宽度。导入后也可以手动设置街道宽度。使用属性映射也可以映射到其他属性名称。有关详细信息,请参阅 CityEngine 手册。
清理
导入的街道形状显示了一些相互冲突的街道形状,用红色虚线标记。使用“清理图形”操作并启用“解决冲突形状”来自动修复这些形状。您还可以使用简化图形工具通过删除不需要的图形设置和设置切线来近似图形来减少不需要的复杂图形段。有关详细信息,请参阅 CityEngine 手册的街道网络部分。

分配规则文件
-
- 选择所有街道形状。
- 从文件导航器中,将sesame_01.cga规则文件从项目规则文件夹拖到 3D 视口中的选定形状上。
生成简单的街道模型。

[/fusion_text][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container][fusion_builder_container type=”flex” hundred_percent=”no” hundred_percent_height=”no” hundred_percent_height_scroll=”no” align_content=”stretch” flex_align_items=”flex-start” flex_justify_content=”flex-start” hundred_percent_height_center_content=”yes” equal_height_columns=”no” container_tag=”div” hide_on_mobile=”small-visibility,medium-visibility,large-visibility” status=”published” spacing_medium=”” spacing_small=”” padding_dimensions_medium=”” padding_dimensions_small=”” border_sizes=”” border_style=”solid” box_shadow=”no” box_shadow_blur=”0″ box_shadow_spread=”0″ gradient_start_color=”” gradient_end_color=”” gradient_start_position=”0″ gradient_end_position=”100″ gradient_type=”linear” radial_direction=”center center” linear_angle=”180″ background_position=”center center” background_repeat=”no-repeat” fade=”no” background_parallax=”none” enable_mobile=”no” parallax_speed=”0.3″ background_blend_mode=”none” video_aspect_ratio=”16:9″ video_loop=”yes” video_mute=”yes” render_logics=”” absolute=”off” absolute_devices=”small,medium,large” sticky=”off” sticky_devices=”small-visibility,medium-visibility,large-visibility” sticky_transition_offset=”0″ scroll_offset=”0″ animation_direction=”left” animation_speed=”0.3″ filter_hue=”0″ filter_saturation=”100″ filter_brightness=”100″ filter_contrast=”100″ filter_invert=”0″ filter_sepia=”0″ filter_opacity=”100″ filter_blur=”0″ filter_hue_hover=”0″ filter_saturation_hover=”100″ filter_brightness_hover=”100″ filter_contrast_hover=”100″ filter_invert_hover=”0″ filter_sepia_hover=”0″ filter_opacity_hover=”100″ filter_blur_hover=”0″][fusion_builder_row][fusion_builder_column type=”1_1″ align_self=”auto” content_layout=”column” align_content=”flex-start” valign_content=”flex-start” content_wrap=”wrap” spacing=”” center_content=”no” link=”” target=”_self” min_height=”” hide_on_mobile=”small-visibility,medium-visibility,large-visibility” sticky_display=”normal,sticky” class=”” id=”” type_medium=”” type_small=”” type=”1_1″ order_medium=”0″ order_small=”0″ dimension_spacing_medium=”” dimension_spacing_small=”” dimension_spacing=”” dimension_margin_medium=”” dimension_margin_small=”” dimension_margin=”” padding_medium=”” padding_small=”” padding=”” hover_type=”none” border_sizes=”” border_color=”” border_style=”solid” border_radius=”” box_shadow=”no” dimension_box_shadow=”” box_shadow_blur=”0″ box_shadow_spread=”0″ box_shadow_color=”” box_shadow_style=”” background_type=”single” gradient_start_color=”” gradient_end_color=”” gradient_start_position=”0″ gradient_end_position=”100″ gradient_type=”linear” radial_direction=”center center” linear_angle=”180″ background_color=”” background_image=”” background_image_id=”” background_position=”left top” background_repeat=”no-repeat” background_blend_mode=”none” render_logics=”” filter_type=”regular” filter_hue=”0″ filter_saturation=”100″ filter_brightness=”100″ filter_contrast=”100″ filter_invert=”0″ filter_sepia=”0″ filter_opacity=”100″ filter_blur=”0″ filter_hue_hover=”0″ filter_saturation_hover=”100″ filter_brightness_hover=”100″ filter_contrast_hover=”100″ filter_invert_hover=”0″ filter_sepia_hover=”0″ filter_opacity_hover=”100″ filter_blur_hover=”0″ animation_type=”” animation_direction=”left” animation_speed=”0.3″ animation_offset=”” last=”no” border_position=”all”][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]