冀幼平
(中铁国际集团有限公司,北京 100039)
铁路建设必然要占用土地资源,改变原有土地的使用功能,并对沿线范围内的经济、环境和居民生活产生重要影响。合理用地可充分利用土地资源,使沿线土地升值,使未被利用土地充分发挥其功能,带动沿线经济发展,改善周边居民生活环境,否则,将导致土地资源浪费,破坏生态环境,甚至影响沿线居民基本生活和经济产业布局[1]。
在规划阶段,用地设计主要是使公路尽量绕避不良地质地段,以减少工程造价;远离环境保护区域,以实现人与环境的和谐发展;靠近重要经济据点,以促进沿线经济发展;并尽可能的少侵入居民聚集地,以避免大量的居民拆迁。在设计阶段,用地设计的主要任务是检查设计用地是否完全满足规划阶段的要求,根据实际需要对用地进行适当调整,尽可能精确地计算征地数量和费用[2-3]。
传统的用地设计主要是依靠人工在地形图上进行分析计算。该方法效率低、工作量大、易出错,用地面积和费用计算精度低。对此,提出一种基于Object-ARX自定义实体的铁路用地辅助设计方法。首先定制铁路用地区域和各类既有地理区域(包括:既有建筑物、经济作物区、环境保护区等)的自定义实体,用户可像操作AutoCAD自有的直线、圆等实体一样,方便地对这些自定义实体进行编辑、修改、拖动;然后设计了任意多边形之间的重叠面积算法,并在此基础上实现了征地、拆迁面积和费用的自动统计。该方法能辅助设计人员进行用地分析,显著降低设计人员的工作强度,提高设计效率。
用地区域是由铁路路基地段左右侧用地桩所构成的封闭多边形。将左右侧的相邻用地桩分别连接起来,并在桥隧头尾处封闭起来,即可形成用地区域。因而,可采用用地桩数组来表示用地区域。
在进行用地设计的过程中,设计人员通常习惯给定各桩号里程Mi及桩号左右侧用地宽WLi和WRi的方式来表示用地桩。基于这种设计习惯,考虑到绘图和计算中都需要反复使用到该桩号处的线路中线坐标和用地桩坐标,本文设计的用地桩数据结构如下:
typedef struct
{
double Millage;//用地桩里程Mi
double Cen_N,Cen_E;//线路中线经度距坐标Ni,Ei
double Alfa;//该桩号的坐标方位角αi
double Left_Wide,Right_Wide;//左、右侧用地宽 WLi,WRi
double Left_N,Left_E;//左、右侧用地桩的经度距坐标 NLi,ELi
double Right_N,Right_E;//右侧用地桩的经度距坐标 NRi,ERi
}LandStation//用地桩Si
根据平面交点坐标、曲线半径、缓和曲线长等设计参数,可以快速计算出Mi里程处的线路中线坐标(Ni,Ei)和方位角 αi[4-5]。计算出这 3 个参数后,左、右侧用地桩坐标可按公式(1)计算
AutoCAD是当前计算机辅助设计中广泛使用的一个平台[6]。因此,本铁路用地设计系统选择在该平台上进行开发。ObjectARX作为AutoCAD的二次开发工具,不仅提供了AutoCAD自有的直线、圆、多段线等图形实体,还允许用户对其扩展,根据需要定制自定义图形实体,用户可像操作直线、圆等图形实体一样方便地对自定义实体进行数据编辑、对象捕捉、夹点拖动等操作[7,8]。
①从实体基类AcDbEntity派生出用地区域自定义实体类Land
class Land:public AcDbEntity;
②在Land类的头文件中定义类声明宏
ACRX_DECLARE_MEMBERS(Land);
③在Land类的源文件中定义类执行宏
ACRX_DXF_DEFINE_MEMBERS(Land,AcDbEntity;
AcDb::kDHL_CURRENT,AcDb::kMReleaseCurrent,0,Land,“RailDesign”);
④在ARX程序初始化时进行用地区域类的初始化
Land::rxInit();
acrxBuildClassHierarchy();
⑤在ARX程序卸载时清除自定义用地区域类
deleteAcRxClass(Land::desc())。
自定义实体在AutoCAD中的显示由以下3个函数完成:
Adesk::Boolean worldDraw(AcGiWorldDraw*pWd);与视图无关的实体图形绘制
void viewportDraw(AcGiViewportDraw*PVd);与视图相关的实体图形绘制
Adesk::Uint32 setAttributes(AcGiDrawableTraits*pDt);初始化实体颜色、层和线型等属性
在自定义实体类中重载这些函数,便可实现图形的绘制。上述3个函数中worldDraw()函数必须在自定义实体类中重载,其余2个可根据需要选择。
用地区域自定义实体需要具备保存、复制等操作功能,必须对该自定义实体进行编档。在用地区域实体类中重载dwgOut()和dxfOut()的两个函数,可分别实现DWG、DXF文件中实体的编出;dwgIn()和dxfIn()则实现实体的编入。编出、编入函数的实现首先调用assertWriteEnabled()和 assertReadEnabled(),然后调用readItem()和writeItem(),按预定顺序读、写该实体的属性数据。
为使用地区域实体的修改操作更加方便,为其定义了夹点和夹点拖动操作,如图1所示。当该实体被选中后,用地桩将突出显示,并且可以实时拖动这些用地桩,由计算机自动刷新用地数据。
图1 用地桩夹点拖动
为便于设计人员获取用地桩,可将这些用地桩点作为该自定义实体的捕捉点。实现该过程可重载getOsnapPoints()函数,并在该函数中遍历所有用地桩,将其加入捕捉点数组snapPoints中。
通过上述过程便完成了铁路用地区域自定义实体的定制,设计人员可以像操作AutoCAD自有的直线、多段线、圆一样,方便地对用地区域进行修改、捕捉、实时动态拖动用地桩。
除了通过图形方式修改用地数据外,经常使用的还有列表编辑方式直接录入和修改用地数据。对此,本研究重载了自定义实体的List()函数,选中实体后运行List命令,弹出如图2所示对话框,设计人员可查询、编辑、增加、删除、修改用地数据,并自动刷新用地区域实体。
图2 用地桩数据编辑
铁路用地设计主要是处理铁路用地区域与既有建筑物、经济作物及环境保护区等地理区域的关系。因此,除了用地区域自定义实体外,还需要定制各地理区域自定义实体,此类实体包括几何属性数据和物理属性数据两类。
几何属性数据主要是描述其几何边界的顶点数组,物理属性则包括名称、征地或拆迁单价、是否允许线路穿越等。采用统一的数据结构对这些地理区域进行描述,不同类型的区域采用Type变量标记。且Type变量为整形量,允许用户自定义和扩展地理区域类型。
Typedef struct{
AcGePoint3dArray BorderPtArray;//几何边界顶点数组
int Type;//区域类型,包括
Cstring Name;//名称
bool IsCanUse;//是否允许征用、拆迁
double CostPer;//如果允许征用、拆迁,每平米费用
Cstring HatchType;//在CAD中绘制该区域时填充的图形
…
}Geo//地理区域
与用地区域自定义实体类似,地理区域自定义实体的定制也包含上述创建、实时显示、编档、夹点操作、捕捉5个部分。在该自定义实体中,几何边界顶点均作为捕捉点和夹点,用户可通过夹点拖动的方式在AutoCAD中方便地调整区域范围。另外,考虑到设计的便利性,加入了多段线、面域等实体转换为地理区域实体的功能,用户可在CAD图上拾取封闭多段线、面域,再给定单价等物理属性,便可自动生成需要的地理区域实体。
征地、拆迁费用计算是铁路用地设计中的一项主要任务。传统方法主要靠人工处理,估算精度低,对于既有建筑物、经济作物较少的地区尚可满足要求。对于城市或者居民区周边,征地拆迁造价较高,必须精确计算面积。由于用地区域和既有地理区域形状均不规则,精确计算费时费力,而且极易出错。
如能由计算机自动计算征地拆迁面积,并统计出总造价,将显著降低设计人员的工作强度,提高用地设计的准确性。考虑到无论是用地区域还是既有地理区域均可能是任意复杂的多边形。因此,要实现该功能,首先需要解决任意两个复杂多边形的交集面积计算问题。
AutoCAD中提供了两任意形状面域的布尔运算功能,ObjectARX作为AutoCAD的二次开发工具,也可定义面域并进行布尔运算。ObjectARX提供的面域布尔运算成熟可靠、计算精度高,直接利用可节省大量的开发工作。ObjectARX中采用AcDbRegion类来实现面域的功能,可采用该类的createFromCurves函数创建面域对象。该函数原型如下:
static Acad::ErrorStatus createFromCurves(const AcDbVoidPtrArray& curveSegments,AcDbVoidPtrArray&regions)
该函数可将直线、圆、圆弧、多段线等CAD内部任意类型的图形边界组合为一个面域。其中curveSegments即为用于构建面域的图形指针数组,regions则为生成的面域对象。
用地区域生成面域时可先将用地桩逐个连接,形成封闭多段线,然后再将多段线转换为面域。
地理区域实体转换为面域的过程更加简单,只需要遍历几何边界顶点数组BorderPtArray,将所有顶点加入多段线中,最后再将多段线转换为面域GeoRegion即可。
构建出用地区域和地理区域面域后,便可调用AcDbRegion类的布尔求交,得到两区域的交集,该交集的面积即为征地拆迁面积。该布尔运算函数如下:
virtual Acad::ErrorStatus booleanOper(AcDb::BoolOperType operation,AcDbRegion*otherRegion);
参数operation为布尔运算类型,包含有AcDb::kBoolUnite(并集)、AcDb::kBoolIntersect(交集)和 Ac-Db::kBoolSubtract(差集)3类。otherRegion为布尔操作的另一个面域,该函数将返回布尔运算后形成的面域。
通过遍历图形中所有的地理区域实体,调用booleanOper函数进行交集运算,便可得到铁路用地区域与它们的交集,获取面积,进而统计出总的征地拆迁造价。该过程实现关键代码如下:
pBloRec->newIterator(pIter);//新建一个块表记录迭代器pIter
for(pIter- >start();!pIter- >done();pIter->step())//通过迭代器遍历所有实体
{
pIter- >getEntity(pEntity,AcDb::kFor-Read);//获取图形上的某一实体
if(pEntity- >isKindOf(Geo::desc())//如果实体类型为自定义的地理区域
{
GeoRegion=CreateRegion(pEntity);//创建地理区域的面域
If(GeoRegion==NULL)//无交集,跳过该区域
continue;
IntRegion=LandRegion.booleanOper(GeoRegion);//布尔运算求区域交集
IntRegion.getArea(Area);//获取交集的面积
CalCost(Area,pEntity);//计算统计造价
…
}
}
需要注意的是:如果与用地实体相交的区域为不允许铁路通过的禁区,则应将造价赋值为无穷大,并将该信息反馈给设计人员,通知设计人员调整设计方案;如果相交的区域为既有建筑物,则拆迁费用应该按整个建筑物面积计算,而不仅仅是交集的面积。
基于上述原理与方法,开发了铁路用地设计模块。在一些城市地铁设计当中,线路途经住宅密集的城市或城市周边,征地拆迁费用较高,要求精确统计征地拆迁造价。
人工统计费时费力,而且错误时有发生,采用该设计模块,设计人员可通过实体转换命令,直接将地形图上的既有建筑物、经济作物区等转换为自定义的地理区域实体,铁路用地区域、地理区域实体可像AutoCAD内部实体一样进行对象捕捉、夹点拖动、数据编辑,操作便捷,符合设计习惯,在进行用地设计过程中可自动统计征地拆迁数量和费用,并对一些穿越禁区的情况发出警告。
经对比分析,该模块计算的费用与人工计算结果完全一致,而计算时间可缩短数十倍甚至上百倍。
铁路用地设计是铁路设计的一个重要部分。基于ObjectARX自定义实体技术定制了铁路用地区域、既有地理区域自定义实体,铁路规划设计人员可像操作AutoCAD自有实体一样对其进行对象捕捉、夹点拖动、数据编辑修改,方便地进行用地设计。据此开发的用地设计模块可自动分析铁路用地是否占用环境保护区等禁止穿越区域,精确计算出征地面积和费用。生产实践表明,该方法符合设计习惯,保证征地费用计算精度和速度,可显著降低劳动强度,提高规划设计人员的工作效率。
[1] 李连成.交通用地的优化配置问题研究[D].北京:北京交通大学,2013
[2] 张利华,薛重生.基于ArcGIS的铁路用地综合信息管理系统的分析与设计[J].计算机工程与设计,2005,26(3):623-626
[3] 徐文荣,李红璇.GIS在铁路用地的应用与发展[J].铁路计算机应用,2007,16(3):23-24
[4] 彭利辉,蒲浩.道路平面线形交互式设计方法研究[J].铁路计算机应用,2006,15(8):7-9
[5] 杨柳,郑健龙,闻德保.基于ObjectARX实现自定义回旋线实体[J].大地测量与地球动力学,2013,33(5):110-115
[6] 王欣,程耀东,孟凡相.ObjectARX二次开发运行机制及应用研究[J].测绘科学,2009,34(S2):182-185
[7] 蒲浩,宋占峰.道路路线CAD原理与方法[M].长春:吉林科学技术出版社,2005
[8] 蒲浩,宋占峰,詹振炎.公路路线设计的一体化与可视化[J].中南大学学报:自然科学版,2004,35(5):830-835