要访问 CityEngine 中的教程,请单击帮助 > 下载教程和示例...。 在选择教程或示例后,系统会自动下载工程并将其添加到工作空间。
导入 DXF 街道数据
CityEngine 街道网络
CityEngine 街道网络是属性图形,由图形节点(交叉路口)和图形边缘(街段)组成。 他们可以使用街道生成功能生成,此街道生成功能可以在 CityEngine 中创建,也可以通过外部文件(例如 DXF)导入。
为 CityEngine 准备街道数据
在此示例中,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 键),然后使用生成街道对话框填充空白区域。
最终结果
sesame_12.cej 场景文件包含带有提取和细分地块的完整街道网络。
以下屏幕截图显示了具有生成的次要街道和提取构建轮廓线的芝麻市:
以下屏幕截图显示了具有简单建筑物和植被模型的芝麻市:
导入 OSM 街道数据
“OpenStreetMap 是一个旨在正好创建和提供免费地理数据(如街道地图)给想要的人的工程。” - openstreetmap.org
OpenStreetMap
OSM 是一种基于 XML 的格式,用于描述地图中的矢量数据。 它定义了三种基本数据类型 - 节点、路线和闭合路线。这些数据类型用于描述所有其他元素:
- 节点 - 绘制线段之间的点。
- 路线 - 节点的有序列表,在编辑器中显示为通过线段连接。
- 闭合路线 - 形成一个完整循环的路线。 可将其用于描述公园、湖泊或岛屿等区域。
导出 OpenStreetMap 中的 OSM 文件
找到当前 CityEngine 工程的数据文件夹中的 .osm 文件。
将 OSM 文件导入 CityEngine
- 通过单击文件 > 新建 > CityEngine > CityEngine 场景打开一个新建场景文件。
- 将文件拖入 3D 视窗。
- 在“OSM 导入”对话框中,选择要导入的图层。 通常,所有街道都在公路图层中,而建筑物在建筑物图层中。 必要时,请使用全选/取消全选复选框来取消选中所有图层。
- 按照以下屏幕截图设置其他选项:
- 单击完成。
- 接受建议的坐标系 WGS 1984 UTM Zone 33N。
- 单击确定。
- 将图形网络图层重命名为 OSM_Streets。
- 将形状图层重命名为 OSM_Shapes。
街道宽度
如果仔细观察生成的街道形状,您会发现它们的宽度有所不同。 在启用“地图 OSM 标签”选项的情况下导入 OSM 数据时,CityEngine 将创建图层属性,这些属性根据 OSM 街道类型定义街道宽度。
选择一个街段,并在“检查器”中记录其参数。
在以下屏幕截图中,公路类型为一级的街道已根据导入的 OSM 图层 OSM_Streets 中的图层属性映射分配了街道和人行道宽度参数:
您可以通过将新的宽度值设置为 streetWidth 参数(该值将更改为用户设置的值)或使用工具条上的街道编辑工具来手动修改街道宽度。
OSM 属性映射
- 在场景编辑器中选择新的图形网络图层,然后在检查器中查看图层属性代码。
上一张图片中的街段为第三季类型,并在函数 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 街道数据通常包含高程数据(属性级别),但可能有错误。 如果激活了运行生成桥梁工具选项,CityEngine 会自动找出可行的解决方案。
添加具有地理配准的卫星影像的地图图层
- 单击文件 > 导入 > CityEngine 图层 > 纹理导入。
- 浏览到地图文件夹中的 pompeii_satellite.tif 文件。 pompeii_satellite.tfw 坐标定位文件随附 pompeii_satellite.tif 文件,并存储图像的地理配准信息。 因此,将自动设置大小(边界)和位移(位置)参数。 有关详细信息,请参阅坐标定位文件栅格数据集
- 单击完成以新建纹理地图图层。
注:
CityEngine 不会在导入时重新投影图像。 在导入图像时选择坐标系统只用于计算正确的位置信息。 因此,在 CityEngine 场景中使用的投影中准备图像数据是至关重要的。 在前面的示例中,庞贝卫星图像已在 ArcMap 中重新投影到 WGS 1984 UTM Zone 33N(用于本教程场景的场景坐标系)。
以下屏幕截图显示了添加到 OSM 街道数据的卫星地图:
生成模型
- 在场景编辑器的 OSM_Shapes 图层中选择所有形状。
- 分配 osm_generic.cga 规则文件。
由于某些形状已经具有有效初始规则设置,因此会显示。
- 单击跳过。
- 单击生成。 您可能已经注意到,仅生成了街道。 没有生成建筑物形状。 选择其中一个,并在检查器中注意未分配初始规则。
- 要对其进行修复,请在视窗中右键单击选定的形状,然后从上下文菜单中选择选择 > 选择具有相同初始规则的对象。 这将选择所有未设置初始规则的形状。
- 在检查器中,单击“初始规则”字段旁边的选择按钮。
- 在设置初始规则对话框中,选择地块。
- 再次单击生成。
导入 shapefile(和地理数据库)街道数据
由于从 shapefile 和地理数据库文件导入街道的操作几乎相同,因此这里不显示地理数据库的具体示例。
Shapefile 数据
- 在教程工程的数据文件夹中找到 street.shp 文件。
导入数据
- 新建一个空的 CityEngine 场景。
- 将 street.shp 文件从导航器拖放到 3D 视窗中。
- 导入期间,CityEngine 会提示您选择场景坐标系。 建议将为 shapefile 定义的投影作为默认设置。在此处使用。
注:
本示例中的 .shp 数据包含控制街道宽度的宽度属性。 不具有此类属性的数据将导致默认街道宽度。 导入后,也可以手动设置街道宽度。 使用属性映射也可以映射到其他属性名称。 有关详细信息,请参阅 CityEngine 手册。
清理
导入的街道形状显示一些冲突的街道形状,并标有红色虚线。 使用启用了解决冲突形状的清理图形操作可以自动修复这些形状。 您也可以使用简化图形工具通过删除不需要的图形设置和设置切线来接近图形,从而减少不需要的复杂图形段。 有关详细信息,请参阅 CityEngine 手册的“街道网络”部分。
分配规则文件
- 选择所有街道形状。
- 在文件导航器中,将 sesame_01.cga 规则文件从工程规则文件夹拖动到 3D 视窗中的选定形状上。