目的:满足路口处道路变宽、车道数增加的需求
思路:由于道路数据在进入CityEngine时己经按照道路的宽度处理好相应的形数据,因而只有改变路口处道路宽度来满足相应的需求。据此主要有以下几个方面的技术:提取线图层的交点、加宽起始点与距离的设定、线的打断以及相应宽度的赋予。在CE方面主要要做的是如何根据车道路数进行划分与贴图。
下面要把上面提供的几个技术方面及其实现过程来介绍路口加宽处理的流程:
提取线图层的交点:通过提取线图层的交点来判断那些是路口。其过程如下:
1. 预处理数据
在arcmap中编辑shapefile文件,全部选中要素,点击打断线工具,在交点处打断线,保存结果,我这里保存到了test.shp。
2. 在arccatalog中右键点击刚才保存的文件,选新建网络数据集,一路next和yes,别管内容。
这样就生成了结合点文件test_ND_Junctions.shp,但这还不是我们要的线交点文件,因为里边有悬挂结点和自相交结点。
3. 用空间连接(Analysis Tools\Overlay\Spatial Join),将test_ND_Junctions.shp和test.shp连接,生成文件test_Junctions_SpatialJoin.shp。打开此文件属性表,发现多了一个字段join_count:
这个字段的数值就是点和多少条线相连的数。
4. 编辑test_Junctions_SpatialJoin.shp,按属性选择join_count小于2的点,删除,剩下的点就是我们要的线的交点,保存文件。
加宽起始点与距离的设定:通过线图层的交点按一定的半径做缓存的方式来设定加宽的距离。
线的打断与相应宽度的赋予
1. 利用擦除工具()擦除缓冲区以内的数据,此部分道路宽度不发生变化。
2. 利用相交分析()获取缓冲区以内的数据。
3. 对路口处的数据进行加宽处理,通过得到intersect数据的属性表进行计算按实际需要增加相应的宽度值。
4. 相交得到的结果和控除得到的结果整理到同一个图层中去。
此数据导入到CityEngine里的时候就会出现路口加宽的shp数据出来。
根据车道路数进行划分与贴图
CityEngine通过对路面进行不同的划分并进行做相应的贴图是其实现道路建模的主旨所在。这里能过一段代码来说明其主要过程。
/**
* File: rule.cga
* Created: 21 Jul 2012 15:49:08 GMT
* Author: Rukun Xu
*/
version "2011.2"
lenAlongU=geometry.du(0,unitSpace) //计算当前段道路的长度
lenAlongV=geometry.dv(0,unitSpace) //计算当前段道路的宽度
attr CDS=2 //读取数据中当前路段的车道数,其默认值为2
attr Med_wid=0.5 //国道中心双实线的宽度
//对路边人行道路进行贴图
Sidewalk-->
normalizeUV(0, uv, collectiveAllFaces)
scaleUV(0, rint(lenAlongU/20),1)
texture("walkside.png")
//道路上的贴图实现
Street-->
split(v,unitSpace,0){(lenAlongV-Med_wid)/2:Maneeuvering | Med_wid: Median| ~1:Maneeuvering } //把道路分成中心双实线和两边的机动车道三个部分,并对每个部分进行不同的贴图
Maneeuvering-->
normalizeUV(0, uv, collectiveAllFaces)
scaleUV(0, rint(lenAlongU/20),CDS/2-0.1)
texture("road.png")
Median-->
normalizeUV(0, uv, collectiveAllFaces)
scaleUV(0, rint(lenAlongU/10),1)
texture("kdmdl029.jpg")
//对交叉口进行贴图
Crossing-->
setupProjection(0,scope.xy,4,4)
texture("road2.png")
projectUV(0)
处理前效果图
处理后效果图