public class SpatialMeasure extends Object
空间度量用来计算的数据可以是点、线、面。对于点、线和面对象,在距离计算中会使用对象的质心。对象的质心为所有子对象的加权平均中心。点对象的加权项为1(即质心为自身),线对象的加权项是长度,而面对象的加权项是面积。
用户可以通过空间度量计算来解决以下问题:
1. 数据的中心在哪里?
2. 数据的分布呈什么形状和方向?
3. 数据是如何分散布局?
限定符和类型 | 方法和说明 |
---|---|
static void |
addSteppedListener(SteppedListener l)
添加一个进度条事件(
SteppedEvent )的监听器。 |
static DatasetVector |
measureCentralElement(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter)
已过时。
|
static DatasetVector |
measureCentralElement(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter,
SteppedListener... listeners)
计算矢量数据的中心要素,返回结果矢量数据集。
|
static DatasetVector |
measureDirectional(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter)
已过时。
|
static DatasetVector |
measureDirectional(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter,
SteppedListener... listeners)
计算矢量数据的方向分布,返回结果矢量数据集。
|
static DatasetVector |
measureLinearDirectionalMean(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter)
|
static DatasetVector |
measureLinearDirectionalMean(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter,
SteppedListener... listeners)
计算线数据集的方向平均值,并返回结果矢量数据集。
|
static DatasetVector |
measureMeanCenter(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter)
已过时。
|
static DatasetVector |
measureMeanCenter(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter,
SteppedListener... listeners)
计算矢量数据的平均中心,返回结果矢量数据集。
|
static DatasetVector |
measureMedianCenter(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter)
已过时。
|
static DatasetVector |
measureMedianCenter(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter,
SteppedListener... listeners)
计算矢量数据的中位数中心,返回结果矢量数据集。
|
static DatasetVector |
measureStandardDistance(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter)
已过时。
|
static DatasetVector |
measureStandardDistance(DatasetVector sourceDatasetVector,
Datasource targetDatasource,
String targetDatasetName,
MeasureParameter measureParameter,
SteppedListener... listeners)
计算矢量数据的标准距离,返回结果矢量数据集。
|
static void |
removeSteppedListener(SteppedListener l)
移除一个进度条事件(
SteppedEvent )的监听器。 |
@Deprecated public static DatasetVector measureMeanCenter(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter)
SpatialMeasure.measureMeanCenter(DatasetVector, Datasource, String, MeasureParameter, SteppedListener...)
替换。1. 平均中心是根据输入的所有对象质心的平均x和y坐标构造的点。
2. 平均中心的x和y坐标分别储存在结果矢量数据集中的SmX和SmY字段中。如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定平均中心所需的参数,如权重字段、分组字段、统计字段及统计类型等。
sourceDatasetVector
- 指定的待计算的数据集。可以为点、线、面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。public static DatasetVector measureMeanCenter(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter, SteppedListener... listeners)
1. 平均中心是根据输入的所有对象质心的平均x和y坐标构造的点。
2. 平均中心的x和y坐标分别储存在结果矢量数据集中的SmX和SmY字段中。如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定平均中心所需的参数,如权重字段、分组字段、统计字段及统计类型等。
sourceDatasetVector
- 指定的待计算的数据集。可以为点、线、面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。listeners
- 用于接收进度条事件的监听器。private DatasetVector meanCenter(DatasetVector sourceDataset, Datasource targetDatasource) { // 设置结果矢量数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除 String targetDatasetName = "resultMeanCenter"; if (targetDatasource.getDatasets().contains(targetDatasetName)) { targetDatasource.getDatasets().delete(targetDatasetName); } // 设置空间度量参数 MeasureParameter measureParameter = new MeasureParameter(); measureParameter.setWeightFieldName(new String("Weight")); measureParameter.setGroupFieldName(new String("Group")); measureParameter.setStatisticsFieldNames(new String[] { "Max" }); measureParameter.setStatisticsTypes(new StatisticsType[] { StatisticsType.MAX }); // 调用平均中心方法,并获取结果矢量数据集 DatasetVector resultMeanCenter = SpatialMeasure.measureMeanCenter( sourceDataset, targetDatasource, targetDatasetName, measureParameter); return resultMeanCenter; }
@Deprecated public static DatasetVector measureMedianCenter(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter)
SpatialMeasure.measureMedianCenter(DatasetVector, Datasource, String, MeasureParameter, SteppedListener...)
替换。1. 中位数中心是根据输入的所有对象质心,使用迭代算法找出到所有对象质心的欧式距离最小的点。
2. 中位数中心的x和y坐标分别储存在结果矢量数据集中的SmX和SmY字段中。如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 实际上,距所有对象质心的距离最小的点可能有多个,但中位数中心方法只会返回一个点。
4. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定中位数中心所需的参数,如权重字段、分组字段、统计字段及统计类型等。
5. 用于计算中位数中心的算法是由Kuhn,Harold W.和Robert E. Kuenne在1962年提出的迭代加权最小二乘法(Weiszfeld算法),之后由James E. Burt和Gerald M. Barber进一步概括。首先以平均中心(有权重,为加权)作为起算点,利用加权最小二乘法得到候选点,将候选点重新作为起算点代入计算得到新的候选点,迭代计算直到候选点到所有对象质心的欧式距离最小为止。
sourceDatasetVector
- 指定的待计算的数据集。可以为点、线、面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。public static DatasetVector measureMedianCenter(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter, SteppedListener... listeners)
1. 中位数中心是根据输入的所有对象质心,使用迭代算法找出到所有对象质心的欧式距离最小的点。
2. 中位数中心的x和y坐标分别储存在结果矢量数据集中的SmX和SmY字段中。如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 实际上,距所有对象质心的距离最小的点可能有多个,但中位数中心方法只会返回一个点。
4. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定中位数中心所需的参数,如权重字段、分组字段、统计字段及统计类型等。
5. 用于计算中位数中心的算法是由Kuhn,Harold W.和Robert E. Kuenne在1962年提出的迭代加权最小二乘法(Weiszfeld算法),之后由James E. Burt和Gerald M. Barber进一步概括。首先以平均中心(有权重,为加权)作为起算点,利用加权最小二乘法得到候选点,将候选点重新作为起算点代入计算得到新的候选点,迭代计算直到候选点到所有对象质心的欧式距离最小为止。
sourceDatasetVector
- 指定的待计算的数据集。可以为点、线、面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。listeners
- 用于接收进度条事件的监听器。private DatasetVector medianCenter(DatasetVector sourceDataset, Datasource targetDatasource) { // 设置结果矢量数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除 String targetDatasetName = "resultMedianCenter"; if (targetDatasource.getDatasets().contains(targetDatasetName)) { targetDatasource.getDatasets().delete(targetDatasetName); } // 设置空间度量参数 MeasureParameter measureParameter = new MeasureParameter(); measureParameter.setWeightFieldName(new String("Weight")); measureParameter.setGroupFieldName(new String("Group")); measureParameter.setStatisticsFieldNames(new String[] { "Max" }); measureParameter.setStatisticsTypes(new StatisticsType[] { StatisticsType.MAX }); // 调用中位数中心方法,并获取结果矢量数据集 DatasetVector resultMedianCenter = SpatialMeasure.measureMedianCenter( sourceDataset, targetDatasource, targetDatasetName, measureParameter); return resultMedianCenter; }
@Deprecated public static DatasetVector measureCentralElement(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter)
SpatialMeasure.measureCentralElement(DatasetVector, Datasource, String, MeasureParameter, SteppedListener...)
替换。1. 中心要素是与其他所有对象质心的累积距离最小,位于最中心的对象。
2. 如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 实际上,距其他所有对象质心的累积距离最小的中心要素可能会有多个,但中心要素方法只会输出SmID 字段值最小的对象。
4. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定中心要素所需的参数,如权重字段、自身权重字段、分组字段、距离计算方法、统计字段及统计类型等。
sourceDatasetVector
- 指定的待计算的数据集。可以为点、线、面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。public static DatasetVector measureCentralElement(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter, SteppedListener... listeners)
1. 中心要素是与其他所有对象质心的累积距离最小,位于最中心的对象。
2. 如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 实际上,距其他所有对象质心的累积距离最小的中心要素可能会有多个,但中心要素方法只会输出SmID 字段值最小的对象。
4. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定中心要素所需的参数,如权重字段、自身权重字段、分组字段、距离计算方法、统计字段及统计类型等。
sourceDatasetVector
- 指定的待计算的数据集。可以为点、线、面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。listeners
- 用于接收进度条事件的监听器。private DatasetVector centralElement(DatasetVector sourceDataset, Datasource targetDatasource) { // 设置结果矢量数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除 String targetDatasetName = "resultCentralElement"; if (targetDatasource.getDatasets().contains(targetDatasetName)) { targetDatasource.getDatasets().delete(targetDatasetName); } // 设置空间度量参数 MeasureParameter measureParameter = new MeasureParameter(); measureParameter.setWeightFieldName(new String("Weight")); measureParameter.setGroupFieldName(new String("Group")); measureParameter.setSelfWeightFieldName(new String("SelfWeight")); measureParameter.setDistanceMethod(DistanceMethod.EUCLIDEAN); measureParameter.setStatisticsFieldNames(new String[] { "Max" }); measureParameter.setStatisticsTypes(new StatisticsType[] { StatisticsType.MAX }); // 调用中心要素方法,并获取结果矢量数据集 DatasetVector resultCentralElement = SpatialMeasure.measureCentralElement( sourceDataset, targetDatasource, targetDatasetName, measureParameter); return resultCentralElement; }
@Deprecated public static DatasetVector measureDirectional(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter)
SpatialMeasure.measureDirectional(DatasetVector, Datasource, String, MeasureParameter, SteppedListener...)
替换。1. 方向分布是根据所有对象质心的平均中心(有权重,为加权)为圆点,计算x和y坐标的标准差为轴得到的标准差椭圆。
2. 标准差椭圆的圆心x和y坐标、两个标准距离(长半轴和短半轴)、椭圆的方向,分别储存在结果矢量数据集中的CircleCenterX、CircleCenterY、SemiMajorAxis、SemiMinorAxis、RotationAngle字段中。如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 椭圆的方向RotationAngle字段中的正值表示正椭圆(长半轴的方向为X轴方向, 短半轴的方向为Y轴方向))按逆时针旋转,负值表示正椭圆按顺时针旋转。
4. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定方向分布所需的参数,如权重字段、分组字段、统计字段及统计类型等。
5. 输出的椭圆大小有三个级别:Single(一个标准差)、Twice(二个标准差)和Triple(三个标准差),详细介绍请参见 EllipseSize
类。
6. 用于计算方向分布的标准差椭圆算法是由D. Welty Lefever在1926年提出,用来度量数据的方向和分布。首先确定椭圆的圆心,即平均中心(有权重,为加权);然后确定椭圆的方向;最后确定长轴和短轴的长度。
sourceDatasetVector
- 指定的待计算的数据集。可以为点、线、面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。public static DatasetVector measureDirectional(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter, SteppedListener... listeners)
1. 方向分布是根据所有对象质心的平均中心(有权重,为加权)为圆点,计算x和y坐标的标准差为轴得到的标准差椭圆。
2. 标准差椭圆的圆心x和y坐标、两个标准距离(长半轴和短半轴)、椭圆的方向,分别储存在结果矢量数据集中的CircleCenterX、CircleCenterY、SemiMajorAxis、SemiMinorAxis、RotationAngle字段中。如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 椭圆的方向RotationAngle字段中的正值表示正椭圆(长半轴的方向为X轴方向, 短半轴的方向为Y轴方向))按逆时针旋转,负值表示正椭圆按顺时针旋转。
4. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定方向分布所需的参数,如权重字段、分组字段、统计字段及统计类型等。
5. 输出的椭圆大小有三个级别:Single(一个标准差)、Twice(二个标准差)和Triple(三个标准差),详细介绍请参见 EllipseSize
类。
6. 用于计算方向分布的标准差椭圆算法是由D. Welty Lefever在1926年提出,用来度量数据的方向和分布。首先确定椭圆的圆心,即平均中心(有权重,为加权);然后确定椭圆的方向;最后确定长轴和短轴的长度。
sourceDatasetVector
- 指定的待计算的数据集。可以为点、线、面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。listeners
- 用于接收进度条事件的监听器。private DatasetVector directional(DatasetVector sourceDataset, Datasource targetDatasource) { // 设置结果矢量数据集的名称,并检查数据源中是否已存在该数据集,如存在则删除 String targetDatasetName = "resultDirectional"; if (targetDatasource.getDatasets().contains(targetDatasetName)) { targetDatasource.getDatasets().delete(targetDatasetName); } // 设置空间度量参数 MeasureParameter measureParameter = new MeasureParameter(); measureParameter.setWeightFieldName(new String("Weight")); measureParameter.setGroupFieldName(new String("Group")); measureParameter.setStatisticsFieldNames(new String[] { "Max" }); measureParameter.setStatisticsTypes(new StatisticsType[] { StatisticsType.MAX }); // 调用方向分布方法,并获取结果矢量数据集 DatasetVector resultDirectional = SpatialMeasure.measureDirectional( sourceDataset, targetDatasource, targetDatasetName, measureParameter); return resultDirectional; }
@Deprecated public static DatasetVector measureStandardDistance(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter)
SpatialMeasure.measureStandardDistance(DatasetVector, Datasource, String, MeasureParameter, SteppedListener...)
替换。1. 标准距离是根据所有对象质心的平均中心(有权重,为加权)为圆心,计算x和y坐标的标准距离为半径得到的圆。
2. 圆的圆心x和y坐标、标准距离(圆的半径),分别储存在结果矢量数据集中的CircleCenterX、CircleCenterY、StandardDistance字段中。如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定标准距离所需的参数,如权重字段、圆大小、分组字段、统计字段及统计类型等。
4. 输出的圆大小有三个级别:Single(一个标准差)、Twice(二个标准差)和Triple(三个标准差),详细介绍请参见 EllipseSize
枚举类型。
<
sourceDatasetVector
- 指定的待计算的数据集。可以为点、线、面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。public static DatasetVector measureStandardDistance(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter, SteppedListener... listeners)
1. 标准距离是根据所有对象质心的平均中心(有权重,为加权)为圆心,计算x和y坐标的标准距离为半径得到的圆。
2. 圆的圆心x和y坐标、标准距离(圆的半径),分别储存在结果矢量数据集中的CircleCenterX、CircleCenterY、StandardDistance字段中。如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定标准距离所需的参数,如权重字段、圆大小、分组字段、统计字段及统计类型等。
4. 输出的圆大小有三个级别:Single(一个标准差)、Twice(二个标准差)和Triple(三个标准差),详细介绍请参见 EllipseSize
枚举类型。
<
sourceDatasetVector
- 指定的待计算的数据集。可以为点、线、面数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。listeners
- 用于接收进度条事件的监听器。@Deprecated public static DatasetVector measureLinearDirectionalMean(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter)
SpatialMeasure.measureLinearDirectionalMean(DatasetVector, Datasource, String, MeasureParameter, SteppedListener...)
。1. 线性方向平均值是根据所有线对象的质心的平均中心点为其中心、长度等于所有输入线对象的平均长度、方位或方向为由所有输入线对象的起点和终点(每个线对象都只会使用起点和终点来确定方向)计算得到的平均方位或平均方向创建的线对象。
2. 线对象的平均中心x和y坐标、平均长度、罗盘角、方向平均值、圆方差,分别储存在结果矢量数据集中的AverageX、AverageY、AverageLength、CompassAngle、DirectionalMean、CircleVariance字段中。如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 线对象的罗盘角(CompassAngle)字段表示以正北方为基准方向按顺时针旋转;方向平均值(DirectionalMean)字段表示以正东方为基准方向按逆时针旋转;圆方差(CircleVariance)表示方向或方位偏离方向平均值的程度,如果输入线对象具有非常相似(或完全相同)的方向则该值会非常小,反之则相反。
4. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定标准距离所需的参数,如权重字段、是否忽略终点和起点的方向、分组字段、统计字段及统计类型等。
sourceDatasetVector
- 指定的待计算的数据集。为线数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。public static DatasetVector measureLinearDirectionalMean(DatasetVector sourceDatasetVector, Datasource targetDatasource, String targetDatasetName, MeasureParameter measureParameter, SteppedListener... listeners)
1. 线性方向平均值是根据所有线对象的质心的平均中心点为其中心、长度等于所有输入线对象的平均长度、方位或方向为由所有输入线对象的起点和终点(每个线对象都只会使用起点和终点来确定方向)计算得到的平均方位或平均方向创建的线对象。
2. 线对象的平均中心x和y坐标、平均长度、罗盘角、方向平均值、圆方差,分别储存在结果矢量数据集中的AverageX、AverageY、AverageLength、CompassAngle、DirectionalMean、CircleVariance字段中。如果设置了分组字段,则结果矢量数据集将包含 “分组字段名_Group” 字段。
3. 线对象的罗盘角(CompassAngle)字段表示以正北方为基准方向按顺时针旋转;方向平均值(DirectionalMean)字段表示以正东方为基准方向按逆时针旋转;圆方差(CircleVariance)表示方向或方位偏离方向平均值的程度,如果输入线对象具有非常相似(或完全相同)的方向则该值会非常小,反之则相反。
4. 调用该方法时,需要通过 measureParameter 参数指定一个空间度量参数(MeasureParameter
)对象,该对象用于指定标准距离所需的参数,如权重字段、是否忽略终点和起点的方向、分组字段、统计字段及统计类型等。
sourceDatasetVector
- 指定的待计算的数据集。为线数据集。targetDatasource
- 指定的用于存储结果数据集的数据源。targetDatasetName
- 指定的结果数据集名称。measureParameter
- 指定的空间度量参数设置。listeners
- 用于接收进度条事件的监听器。public static void addSteppedListener(SteppedListener l)
SteppedEvent
)的监听器。l
- 一个用于接收进度条事件的监听器。public static void removeSteppedListener(SteppedListener l)
SteppedEvent
)的监听器。l
- 一个用于接收进度条事件的监听器。Copyright © 2021–2024 SuperMap. All rights reserved.