要访问 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 文件,并存储图像的地理配准信息。 因此,将自动设置 Dimensions 和 Location 参数。 有关详细信息,请参阅栅格数据集的坐标定位文件

    “导入纹理”对话框

  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 教程目录

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。