动态分段 |
实现动态分段的首要步骤是获得路由数据。每一条路由具有唯一标识值(路由ID)和刻度值(M值),生成事件表时,事件发生的路由和刻度值(线事件包含起始和终止刻度值),需要参考路由数据集中的路由ID和M值。
路由数据可以是已有的(通过数字化工作获得,或是从外部及其他格式导入),也可以由线数据通过一定方式生成。SuperMap提供了生成路由数据集的方法。
SuperMap提供了以下四种生成路由的方式,由GenerateType枚举类型定义。
1. 线参考点刻度方式(GenerateType.ByPoint)
该方式需要两份输入数据:线数据和参考点数据。实现的过程是:首先通过路由标识字段值将参考点对应到线数据上,再根据参考点的刻度值(存储在一个属性字段中)来确定线数据节点的刻度值,从而生成路由数据集。理想情形是线数据的每个节点都有参考点与之重合,但实际数据可能达不到如此精确,参考点的数量也可能与线节点并不一致。因此,参考点与对应线节点的位置通常有以下三种情形,请结合图 6‑1来理解,图中蓝色线是用于生成路由的线数据,红色方点为参考点,圆形浅橙色区域为给定的一个容限值所确定的范围。该容限值用于判定参考点是否有效,可由用户指定,与数据集节点的容限不同。
(1)给定的参考点与对应线的节点重合,或在给定的容限范围内(如图 6‑1中的参考点1),会将参考点的刻度值直接赋予该节点作为M值。如果节点容限范围内有多个参考点(如图 6‑1中的节点4),则取距离最近的参考点的M值。
(2)参考点不在节点的容限范围内,系统此时会判断该参考点是否“在线上”。如果参考点到对应弧段的垂距小于容限,则视为“在线上”,那么该参考点的M值可能用于计算节点M值;如果垂距大于容限,则视为“不在线上”,不会参与计算节点的M值。如图 6‑1所示,参考点2不在节点2的容限范围内,但根据规则为“在线上”的点,那么节点2的M值将由参考点1和2的M值插值得出。而参考点3既不在节点容限范围内,也“不在线上”,因此是无效的参考点,不会参与节点3的M值的计算。因此节点3的M值将由参考点2和4插值得出。关于插值求M值,在第4章基本概念中有介绍。
(3)如果一个线对象周围没有可用于计算的参考点,即节点的容限范围内没有参考点,也没有参考点可视为“在线上”,那么该线对象的所有节点的M值都无法获得,该线对象将不会生成对应的路由。因此,使用这种方式生成的路由数据集的对象数和原有线数据集的对象数可能不一致。
|
图 6‑1 线参考点生成路由 |
注意:假设参考点数据集有一个刻度值字段M,对应某一线对象的按一定方向排列的参考点的M字段值应该是递增或者递减的,或者保持不变。
2. 线单字段方式(GenerateType.BySingleField)
这种方式是根据线数据的一个属性字段来生成路由数据集。该字段记录了一个刻度值,将作为对应路由的终止M值(即一条路由的最后一个节点的M值),而该路由的起始刻度值(第一个节点的M值)为0,如果有中间节点,则其M值则通过插值得出。
此种方式生成的路由数据集的对象数和原有线数据集的对象数一致。
3. 线双字段方式(GenerateType.ByDoubleFields)
线双字段方式根据线数据的两个属性字段来生成路由数据集。这两个属性字段存储的刻度值将分别作为对应路由的起始节点的M值和终止节点的M值,中间节点的M值也是通过插值计算得出。
此种方式生成的路由数据集的对象数和原有线数据集的对象数一致。
4. 线长度方式(GenerateType.ByLength)
线长度方式,是将线对象的节点到起始节点的沿线长度作为每个节点的刻度值,从而生成路由数据集。显然,生成的路由数据集中,每条路由的起始节点的M值为0,终止节点的M值为对应路线的长度。
此种方式生成的路由数据集的对象数和原有线数据集的对象数一致。
linearReferencing类的GenerateRoutes方法用于生成路由数据集。该方法有两个参数:一个是用于生成路由的线数据集,另一个是生成路由参数设置(GenerateRoutesParameter)对象。通过一个实例化的GenerateRoutesParameter对象,可以设置生成路由的相关参数,具体参数参见表 6.1。
表 6.1 GenerateRoutesParameter类的属性列表
类型 |
名称 |
描述 |
GenerateType |
Type |
获取或设置生成路由数据集的方式。 |
DatasetVector |
DatasetPoint |
获取或设置参考点数据集,只当生成路由方式为线参考点刻度(GenerateType.ByPoint)时才有意义。 |
String |
LineRouteIDField |
获取或设置用于生成路由的线数据集的路由标识字段。 |
String |
PointRouteIDField |
获取或设置参考点数据集的路由标识字段,只当生成路由方式为线参考点刻度(GenerateType.ByPoint)时才有意义。 |
String |
MeasureField |
获取或设置用于生成路由的参考点数据集中存储了刻度值的字段,只当生成路由方式为线参考点刻度(GenerateType.ByPoint)时才有意义。 |
String |
MeasureStartField |
获取或设置用于生成路由的线数据集中存储了起始刻度值的字段,只当生成路由方式为线双字段(GenerateType.ByDoubleFields)时才有意义。 |
String |
MeasureEndField |
获取或设置用于生成路由的线数据集中存储了终止刻度值的字段,当生成路由方式为线单字段(GenerateType.BySingleField)或线双字段(GenerateType.ByDoubleFields)时有意义。 |
Double |
Tolerance |
获取或设置容限值,只当生成路由方式为线参考点刻度(GenerateType.ByPoint)时才有意义。单位与用于生成路由的线数据集相同。默认为1.0e-10。 |
Boolean |
IgnoringGaps |
获取或设置是否忽略子对象之间的间隔。默认为true,即忽略子对象间隔。 |
Double |
MeasureOffset |
获取或设置路由的刻度偏移量。刻度偏移量设定之后,将会对路线上所有刻度做整体偏移。例如,若一个刻度点的刻度值为0.09,设置的刻度偏移量为10,则在生成的路由数据集中该刻度点的刻度值为10.09。默认为0.0。 |
Double |
Ratio |
获取或设置刻度因子,通常用于刻度值的单位换算。当已有的刻度值的单位与实际研究需求不一致时,可以通过刻度因子来进行单位换算。例如,将刻度值的单位从米转换为千米,刻度缩放因子应设置为0.001。默认为1.0。 |
String |
ErrorInfoField |
获取或设置记录错误信息的字段,只当生成路由方式为线参考点刻度(即GenerateType.ByPoint)时有效。如果通过该属性设置了错误信息字段名称,则在使用线参考点刻度方式生成路由数据集后,系统会自动添加该错误字段到参考点数据集的属性表中,用于存储生成路由错误信息。字段值为空表示没有错误。错误信息类型如表 6.4所示。 |
String |
OutputDatasetName |
获取或设置结果路由数据集的名称。 |
String |
OutputDatasource |
获取或设置存储路由数据集的数据源。如果为null,生成的结果路由数据集将存储到线数据集所在的数据源中。 |
需要注意,SuperMap对路由ID字段和刻度值字段所支持的字段类型有所限制,如表 6.2所示。注意,其中宽字符和文本型字段的值只能由数字构成,不能包含其他文字或者符号。
表 6.2 路由ID字段和刻度值字段对字段类型的支持情况
字段 |
布尔 |
二进 制型 |
日期 |
字节 |
字符型 |
宽字符型 |
文本型 |
单精度 |
双精度 |
16位整型 |
32位整型 |
64位整型 |
路由ID |
û |
û |
û |
û |
û |
ü |
ü |
û |
û |
ü |
ü |
ü |
刻度值 |
û |
û |
û |
û |
û |
ü |
ü |
ü |
ü |
ü |
ü |
ü |
生成路由时,最好首先将GenerateRoutesParameter对象的Type属性设置为相应的生成路由方式。生成路由的方式不同,需要设置的参数也所有不同,如表 6.3所示,可结合生成路由的方式的介绍和表来理解。其中,必须设置的参数,如果不设置将会抛出异常,未列出的属性表示使用该方式生成路由时该属性设置无效。
表 6.3 采用不同的生成路由方式时参数的设置
生成路由的方式 |
必须设置的参数 |
可选参数 |
线参考点方式 |
Type,DatasetPoint,LineRouteIDField,PointRouteIDField,MeasureField,OutputDatasetName |
Tolerance,IgnoringGaps,ErrorInfoField,Ratio,MeasureOffset, OutputDatasource |
单字段方式 |
Type,MeasureEndField,OutputDatasetName |
IgnoringGaps,Ratio,MeasureOffset,OutputDatasource |
双字段方式 |
Type,MeasureStartField,MeasureEndField,OutputDatasetName |
IgnoringGaps,Ratio,MeasureOffset, OutputDatasource |
线长度方式 |
Type,OutputDatasetName |
IgnoringGaps,Ratio,MeasureOffset, OutputDatasource |
i注意 |
如果不设置OutputDatasource属性,生成的结果路由数据集将存储到线数据集所在的数据源中。 |
表 6.4线参考点刻度方式时的错误信息类型
序号 |
错误信息 |
说明 |
1 |
不是几何对象 |
获取该参考点的几何对象失败。 |
2 |
间隙点 |
位于路由子对象的间隔上且不在容限范围内的点称为间隙点。间隙点不能用于生成路由的计算。 |
3 |
无值点 |
刻度值为-9999的参考点为无值点,不用于生成路由的计算。 |
4 |
非单调点 |
该参考点的刻度值与对应同一路由的其他参考点的刻度值在路由方向上不能保持单调性,则称为非单调点。 |
特别需要强调的是,生成路由前,最好对用于生成路由的线数据进行去除重复节点处理。如果线对象具有重复节点,即相同坐标的节点,对应生成的路由可能产生"两个或多个相同的点具有相同的刻度值"的情况,可能破坏路由刻度值的单调性(递增、递减或保持不变),从而导致后续的动态分段分析结果不正确。