教程 4:导入街道

要访问 ArcGIS CityEngine 中的教程工程,请打开 CityEngine,然后在主菜单中单击帮助 > 下载教程和示例。 在选择教程或示例后,系统会自动下载工程并将其添加到 CityEngine 工作空间。

添加到芝麻市的植被模型

CityEngine 街道网络由图形节点(交叉路口)和图形边(街段)组成。 街道网络可以使用生成街道工具生成,在 CityEngine 中手动绘制,或者从外部文件(例如 DXF 或 SHP 文件)导入。

以下示例显示了在 Adobe Illustrator 中草绘的海滨城市的主要道路结构。

海滨道路网络的已导出 DXF

然后,将其导出为 DXF 文件以导入 CityEngine

注:

将街道网络导出为 DXF 时,请确保将应用程序的单位转换为米,因为 CityEngine 坐标系以米为单位。

在本教程中,您将学习和探索针对不同的数据类型导入街道。

导入 DXF 文件

要将 DXF 文件导入场景,请执行以下操作:

  1. 导航窗口中展开 Tutorial_04_Import_Streets 教程文件夹。
  2. 打开 \scenes\ 文件夹中的 sesame_01.cej 场景:

    海滨纹理将显示在场景中。

    海滨纹理

  3. 右键单击 data 文件夹中的 sesame_streetsketch.dxf 文件,并选择导入

    您也可以选择 .dxf 文件,然后单击主菜单中的文件 > 导入

    “DXF 导入”对话框

    图形框显示 Layer 2 数据已添加为要导入的图形图层。

  4. 确保选中导入后运行图形清理工具根据图形创建街道/节点形状复选框,然后单击下一步
  5. 选中相交段将节点捕捉到段合并节点复选框。
  6. 水平捕捉距离垂直捕捉距离值设置为 1
  7. 水平合并距离垂直合并距离值设置为 5

    清理图形设置应如下所示:

    DXF 导入清理图形

  8. 单击 完成
  9. 检查器窗口中将新街道图层重命名为 Sesame Street Sketch
  10. 通过按 (D+G) 或者单击视图设置工具视图设置下的格网关闭视窗窗口中的格网。

    视窗中的已导入 DXF

    打开 scenes 文件夹中的 sesame_02.cej 场景以查看海滨旁边已导入的 DXF。

生成次要街道

导入主要街道后,您可以开始优化街道网络,并在两者之间生成次要街道。 接下来,您将使用生成街道工具填充现有的封闭街区,以使用街道迭代填充街区。

  1. 保持 sesame_02.cej 场景处于打开状态。
  2. 使用选择工具 “选择”工具 选择主要街道环内的主要街道段之一。

    由此指定了街区中街道的总体方向,并定义了生成街道算法的起始节点。

    要生成街道的所选街道

  3. 单击可见性设置 可见性设置并选择形状,或者按 F11 以关闭形状可见性。

    执行此操作可以隔离街道网络中的主要街道和次要街道。

  4. 单击主菜单中的图形 > 生成街道以打开生成街道对话框。
  5. 次要街道模式旁边的下拉菜单中单击径向

    “次要街道模式”设置为“径向”

  6. 单击应用

    次要街道将以径向模式生成。

    采用径向模式的次要街道

  7. 要继续生成次要街道,请选择另一条街道。

    采用径向街道模式的所选街道

  8. 保持相同的设置并单击应用

    采用径向模式生成的街道

    仅在环内生成街道。 sesame_03.cej 场景显示了已完成的径向街道模式。

  9. 在街道网络的不同部分中创建街道以继续生成街道。

    可以使用面街道创建工具 “面街道创建”工具 以添加两条新街道并保持其处于选中状态。

    为街道生成而创建的街道

  10. 这次,将次要街道的模式设置更改为栅格
  11. 单击应用

    将根据所选街道生成街道,其中次要街道采用栅格模式。

    在次要街道采用栅格模式的情况下生成街道

    在生成街道时,可以更改该设置以获取不同的街道模式。 有关详细信息,请参阅街道模式示例

生成建筑物和植被模型

sesame_12.cej 场景从上方显示了已完成的场景。 多次应用生成街道算法后,将存在生成的主要街道和次要街道以及提取的建筑物覆盖区。 接下来,您将生成建筑物和植被模型。

  1. 打开 sesame_12.cej 场景。

    芝麻市街道和建筑物网络

  2. 当系统询问您是否要生成模型时,请单击
  3. 右键单击 streets final 图层并单击选择对象
  4. 单击生成按钮 生成 (Ctrl+G) 以生成所有建筑物和植被模型。

    添加到芝麻市的植被模型

导入 OSM 数据

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

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

现在,您将开始导入 OSM 数据。

要导入 OSM 文件,请执行以下操作:

  1. 通过单击文件 > 新建 > CityEngine > CityEngine 场景打开一个新的场景文件。
  2. data 文件夹中的 .osm 文件拖动到视窗窗口中。
  3. 在“OSM 导入”对话框中,选择要导入的图层。

    通常,街道将位于公路图层中,而建筑物位于建筑物图层中。 必要时,请使用全选/取消全选复选框来取消选中所有图层。

  4. 如下图所示设置附加选项:

    “OSM 导入”对话框

  5. 单击 完成
  6. 保持场景坐标系设置为 WGS 1984 UTM Zone 33N。

    “场景坐标系”对话框

    有关详细信息,请参阅场景坐标系

  7. 单击确定

    两个新图层:街道网络和形状图层随即出现在场景编辑器窗口中。 OSM 数据在视窗中可见,显示了在已导入街道中心线上自动创建了街道形状。

    已导入的 OSM 街道和形状

  8. 场景编辑器窗口中将形状网络图层重命名为 OSM_Streets
  9. 将形状图层重命名为 OSM_Shapes

注:
您也可以在 CityEngine 中使用获取地图数据工具以从世界所选区域中导入 OSM 数据。 有关详细信息,请参阅获取地图数据

街道宽度

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

选择一个街道段,并在检查器窗口中记录其参数。

具有图层属性的街道

所选街道的 highway 参数设置为 primary,并根据已导入 OSM_Streets 图层的图层属性映射定义街道和人行道宽度参数。

可以通过在 Segment Width 参数中设置新的宽度值(该值将更改为用户设置的值)或者使用编辑街道/曲线工具 编辑街道/曲线工具 (C) 来手动修改街道宽度。

OSM 属性映射

要查看 OSM 街道数据图层属性,请在场景编辑器窗口中选择 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 会自动找出可行的解决方案。

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

接下来,您将向场景中添加地理配准航空图像。

  1. 单击文件 > 导入 > CityEngine 图层 > 纹理导入
  2. 浏览到 \maps\ 文件夹中的 pompeii_satellite.tif 文件。

    pompeii_satellite.tfw 坐标定位文件随附 pompeii_satellite.tif 文件,并存储图像的地理配准信息。 因此,将自动设置 DimensionsLocation 参数。 有关详细信息,请参阅栅格数据集的坐标定位文件

    “导入纹理”对话框

  3. 单击完成以新建纹理地图图层。

    包含 GeoTIFF 的 OSM 数据

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

生成模型

最后,您将根据 OSM 形状生成模型。

  1. 场景编辑器窗口的 OSM_Shapes 图层中选择所有形状。
  2. osm_generic.cga 规则文件拖动到所选形状上。

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

    “设置初始规则”对话框

  3. 选择地块规则。
  4. 单击确定

    根据 OSM 形状生成的模型

导入 SHP 和 GDB 数据

您还可以将 shapefile (SHP) 和地理数据库 (GDB) 数据导入 CityEngine 中。 由于从 shapefile 和地理数据库导入街道的操作几乎相同,因此这里不显示地理数据库的具体示例。

导入 shapefile 数据

要导入 shapefile,请执行以下操作:

  1. 创建 CityEngine 场景。
  2. data 文件夹中的 streets.shp 文件拖动到视窗窗口中。

    shapefile 还具有一个 .prj 文件,可确保在导入时进行正确的地理配准。 数据由在 CityEngine 中导入为街段的折线组成。 数据还包含 width 属性,该属性用于控制街道宽度。

  3. 在导入期间,CityEngine 会提示您选择场景坐标系。

    “Shapefile 场景坐标系”对话框

  4. 保持场景坐标系为 WGS 1984 UTM Zone 11N,然后单击确定

    已导入的 shapefile

    注:

    本示例中的 .shp 数据包含控制街道宽度的 width 属性。 如果 shapefile 没有 width 属性,则会自动分配默认街道宽度。 此外,可以在导入后手动设置街道宽度。 您也可以使用属性映射来映射到其他属性名称。

清理

导入的街道形状显示一些冲突的街道形状,并标有红色虚线。

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

在启用了解决冲突形状的情况下,可以使用清理街道工具 “清理街道”工具 自动修复这些形状。 您还可以单击图形 > 简化图形,通过删除不必要的图形和设置切线来减少复杂图形段的数量。 有关详细信息,请参阅清理街道

分配规则文件

最后,您将分配规则以生成街道模型:

  1. 选择所有街道形状。
  2. 视窗窗口中,将 sesame_01.cga 规则文件拖动到所选形状上。

    生成模型之前的街道
    将显示生成模型之前的街道。 请参阅 shp_01.cej 场景。
    生成模型之后的街道
    将显示生成模型之后的街道。 请参阅 shp_02.cej 场景。

在本教程中,您学习了如何导入不同数据类型的街道,包括 DXF、OSM 和 shapefile。

要继续学习 CityEngine,请参阅完整的 CityEngine 教程目录