教程 4:导入街道

要访问 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 选项对话框中的建议选项:

Illustrator 中的 “DXF/DWG选项”对话框

将 DXF 文件导入 CityEngine

  1. 打开 sesame_01.cej 场景文件。
  2. 找到数据文件夹中的 sesame_streetsketch.dxf 文件。
  3. 右键单击文件,然后选择导入
    图层 2 数据图层已添加为要导入的图形图层。
    DXF 导入对话框
  4. 确保选中导入后运行图形清理工具,然后单击下一步
  5. 启用相交线段,将节点捕捉到段和合并节点。
  6. 将捕捉距离设置为 1,并将合并距离设置为 5。
  7. 单击完成
    名为 sesame_streetsketch 的新建图形图层将显示在场景编辑器中。 或者,您可以打开 sesame_02.cej 场景文件以获取带有导入数据的场景。

生成次要街道

导入主要街道后,您可以开始优化街道网络,并在两者之间生成次要街道。 CityEngine 中的街道生成算法将尝试填充现有的封闭街区,因此您可以使用街道迭代填充街区。

  1. 聚焦于您要创建次要街道的街区。
  2. 使用图形编辑工具创建两个单一的小型街道。
  3. 这 a) 指定了街区中街道的总体方向,并 b) 定义了街道生成算法的起始节点。
  4. 手动创建一些街段。
  5. 选择街段(q 键),然后使用生成街道对话框填充空白区域。
    生成用于创建一个街段的街道
    生成用于对面街段的街道
  6. sesame_03.cej 场景文件包含完成的街道网络。
    完整的街道网络

最终结果

sesame_12.cej 场景文件包含带有提取和细分地块的完整街道网络。

以下屏幕截图显示了具有生成的次要街道和提取构建轮廓线的芝麻市:

芝麻市的街道网络和建筑物

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

添加到芝麻市的植被模型

导入 OSM 街道数据

“OpenStreetMap 是一个旨在正好创建和提供免费地理数据(如街道地图)给想要的人的工程。” - openstreetmap.org

OpenStreetMap

OSM 是一种基于 XML 的格式,用于描述地图中的矢量数据。 它定义了三种基本数据类型 - 节点、路线和闭合路线。这些数据类型用于描述所有其他元素:

  • 节点 - 绘制线段之间的点。
  • 路线 - 节点的有序列表,在编辑器中显示为通过线段连接。
  • 闭合路线 - 形成一个完整循环的路线。 可将其用于描述公园、湖泊或岛屿等区域。

导出 OpenStreetMap 中的 OSM 文件

OpenStreetMap 的 OSM 文件

找到当前 CityEngine 工程的数据文件夹中的 .osm 文件。

将 OSM 文件导入 CityEngine

  1. 通过单击文件 > 新建 > CityEngine > CityEngine 场景打开一个新建场景文件。
  2. 将文件拖入 3D 视窗。
  3. 在“OSM 导入”对话框中,选择要导入的图层。 通常,所有街道都在公路图层中,而建筑物在建筑物图层中。 必要时,请使用全选/取消全选复选框来取消选中所有图层。
  4. 按照以下屏幕截图设置其他选项:
    “OSM导入”对话框
  5. 单击完成
  6. 接受建议的坐标系 WGS 1984 UTM Zone 33N。
  7. 单击确定
    选择“场景坐标系”对话框
  8. 场景编辑器中将显示两个新图层(街道网络和形状),并且 OSM 数据在 3D 视窗中可见,并且在导入的街道中心线上自动创建了街道形状。
  9. 将图形网络图层重命名为 OSM_Streets
  10. 将形状图层重命名为 OSM_Shapes
    场景编辑器中的 OSM 街道网络和形状

街道宽度

如果仔细观察生成的街道形状,您会发现它们的宽度有所不同。 在启用“地图 OSM 标签”选项的情况下导入 OSM 数据时,CityEngine 将创建图层属性,这些属性根据 OSM 街道类型定义街道宽度。

选择一个街段,并在“检查器”中记录其参数。

在以下屏幕截图中,公路类型为一级的街道已根据导入的 OSM 图层 OSM_Streets 中的图层属性映射分配了街道和人行道宽度参数:

检查器视窗显示街道参数和对象属性

您可以通过将新的宽度值设置为 streetWidth 参数(该值将更改为用户设置的值)或使用工具条上的街道编辑工具来手动修改街道宽度。

OSM 属性映射

  1. 在场景编辑器中选择新的图形网络图层,然后在检查器中查看图层属性代码。

上一张图片中的街段为第三季类型,并在函数 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 会自动找出可行的解决方案。

添加具有地理配准的卫星影像的地图图层

  1. 单击文件 > 导入 > CityEngine 图层 > 纹理导入
  2. 浏览到地图文件夹中的 pompeii_satellite.tif 文件。
    pompeii_satellite.tfw 坐标定位文件随附 pompeii_satellite.tif 文件,并存储图像的地理配准信息。 因此,将自动设置大小(边界)和位移(位置)参数。 有关详细信息,请参阅坐标定位文件栅格数据集
    pompeii_satellite.jpg 的“纹理”对话框
  3. 单击完成以新建纹理地图图层。
注:

CityEngine 不会在导入时重新投影图像。 在导入图像时选择坐标系统只用于计算正确的位置信息。 因此,在 CityEngine 场景中使用的投影中准备图像数据是至关重要的。 在前面的示例中,庞贝卫星图像已在 ArcMap 中重新投影到 WGS 1984 UTM Zone 33N(用于本教程场景的场景坐标系)。

以下屏幕截图显示了添加到 OSM 街道数据的卫星地图:

将卫星图像添加到地图,并将 OSM 街道数据添加到场景

生成模型

  1. 在场景编辑器的 OSM_Shapes 图层中选择所有形状。
  2. 分配 osm_generic.cga 规则文件。

    由于某些形状已经具有有效初始规则设置,因此会显示

    设置初始规则对话框

  3. 单击跳过
  4. 单击生成
    您可能已经注意到,仅生成了街道。 没有生成建筑物形状。 选择其中一个,并在检查器中注意未分配初始规则。
  5. 要对其进行修复,请在视窗中右键单击选定的形状,然后从上下文菜单中选择选择 > 选择具有相同初始规则的对象。 这将选择所有未设置初始规则的形状。
  6. 在检查器中,单击“初始规则”字段旁边的选择按钮。
  7. 设置初始规则对话框中,选择地块
  8. 再次单击生成
  9. 以下屏幕截屏显示了根据 OSM 数据生成的简单通用模型:
    根据 OSM 数据生成的简单通用模型

导入 shapefile(和地理数据库)街道数据

由于从 shapefile 和地理数据库文件导入街道的操作几乎相同,因此这里不显示地理数据库的具体示例。

Shapefile 数据

  1. 在教程工程的数据文件夹中找到 street.shp 文件。
  2. shapefile 还具有一个 .prj 文件,可确保在导入时进行正确的地理配准。 数据由在 CityEngine 中导入为街段的折线组成。 数据还包含宽度属性,该属性控制 CityEngine 中的街道宽度。
    在 ArcMap 中显示的 shapefile 的属性表:
    ArcMap 属性表显示折线形状的街道宽度

导入数据

  1. 新建一个空的 CityEngine 场景。
  2. 将 street.shp 文件从导航器拖放到 3D 视窗中。
  3. 导入期间,CityEngine 会提示您选择场景坐标系。 建议将为 shapefile 定义的投影作为默认设置。在此处使用。
    选择“场景坐标系”对话框
注:

本示例中的 .shp 数据包含控制街道宽度的宽度属性。 不具有此类属性的数据将导致默认街道宽度。 导入后,也可以手动设置街道宽度。 使用属性映射也可以映射到其他属性名称。 有关详细信息,请参阅 CityEngine 手册。

清理

导入的街道形状显示一些冲突的街道形状,并标有红色虚线。 使用启用了解决冲突形状清理图形操作可以自动修复这些形状。 您也可以使用简化图形工具通过删除不需要的图形设置和设置切线来接近图形,从而减少不需要的复杂图形段。 有关详细信息,请参阅 CityEngine 手册的“街道网络”部分。

用红色虚线标记的冲突街道形状

分配规则文件

  1. 选择所有街道形状。
  2. 在文件导航器中,将 sesame_01.cga 规则文件从工程规则文件夹拖动到 3D 视窗中的选定形状上。
  3. 生成简单街道模型。
    基础街道网络和生成的模型