sdo_lrs包
Subprograms for Creating and Editing Geometric Segments
1、SDO_LRS.DEFINE_GEOM_SEGMENT(过程)
语法:
SDO_LRS.DEFINE_GEOM_SEGMENT(
geom_segment IN OUT SDO_GEOMETRY
[, start_measure IN NUMBER,
end_measure IN NUMBER]);
or
SDO_LRS.DEFINE_GEOM_SEGMENT(
geom_segment IN OUT SDO_GEOMETRY,
dim_array IN SDO_DIM_ARRAY
[, start_measure IN NUMBER,
end_measure INNUMBER]);
功能:根据起始点和终止点测量值计算出没有测量的点
例子:
-- Testthe LRS procedures.
DECLARE
geom_segmentSDO_GEOMETRY;
line_stringSDO_GEOMETRY;
dim_arraySDO_DIM_ARRAY;
result_geom_1SDO_GEOMETRY;
result_geom_2SDO_GEOMETRY;
result_geom_3SDO_GEOMETRY;
BEGIN
SELECT a.route_geometry intogeom_segment FROM lrs_routes a
WHERE a.route_name = 'Route1';
SELECT m.diminfo into dim_array from
user_sdo_geom_metadatam
WHERE m.table_name = 'LRS_ROUTES'AND m.column_name = 'ROUTE_GEOMETRY';
--Define the LRS segment for Route1. This will populate any null measures.
-- Noneed to specify start and end measures, because they are already defined in thegeometry.
SDO_LRS.DEFINE_GEOM_SEGMENT (geom_segment, dim_array);
SELECT a.route_geometry INTOline_string FROM lrs_routes a
WHERE a.route_name = 'Route1';
--Split Route1 into two segments.
SDO_LRS.SPLIT_GEOM_SEGMENT(line_string,dim_array,5,result_geom_1,result_geom_2);
--Concatenate the segments that were just split.
result_geom_3 := SDO_LRS.CONCATENATE_GEOM_SEGMENTS(result_geom_1,dim_array,
result_geom_2,dim_array);
--Update and insert geometries into table, to display later.
UPDATE lrs_routes a SET a.route_geometry = geom_segment
WHERE a.route_id = 1;
INSERTINTO lrs_routes VALUES(
11,
'result_geom_1',
result_geom_1
);
INSERTINTO lrs_routes VALUES(
12,
'result_geom_2',
result_geom_2
);
INSERTINTO lrs_routes VALUES(
13,
'result_geom_3',
result_geom_3
);
END;
2、SDO_LRS.REDEFINE_GEOM_SEGMENT(过程)
语法:
SDO_LRS.REDEFINE_GEOM_SEGMENT(
geom_segment IN OUT SDO_GEOMETRY
[, start_measure IN NUMBER,
end_measure IN NUMBER]);
or
SDO_LRS.REDEFINE_GEOM_SEGMENT(
geom_segment IN OUT SDO_GEOMETRY,
dim_array IN SDO_DIM_ARRAY
[, start_measure IN NUMBER,
end_measure INNUMBER]);
功能:重新定义几何体(可进行单位转换)
例子:
--Redefine geometric segment to "convert" miles to kilometers
DECLARE
geom_segmentSDO_GEOMETRY;
dim_arraySDO_DIM_ARRAY;
BEGIN
SELECT a.route_geometry intogeom_segment FROM lrs_routes a WHERE a.route_name = 'Route1';
SELECT m.diminfo into dim_array from user_sdo_geom_metadata m WHEREm.table_name = 'LRS_ROUTES'AND m.column_name = 'ROUTE_GEOMETRY';
--"Convert" mile measures to kilometers (27 * 1.609 = 43.443).
SDO_LRS.REDEFINE_GEOM_SEGMENT (geom_segment,
dim_array,
0, -- Zerostarting measure: LRS segment starts at start of route.
43.443); -- Endof LRS segment. 27 miles = 43.443 kilometers.
--Update and insert geometries into table, to display later.
UPDATE lrs_routes a SET a.route_geometry = geom_segment WHEREa.route_id = 1;
END;
3、SDO_LRS.CLIP_GEOM_SEGMENT
语法:
SDO_LRS.CLIP_GEOM_SEGMENT(
geom_segment IN SDO_GEOMETRY,
start_measure IN NUMBER,
end_measure IN NUMBER,
tolerance IN NUMBER DEFAULT 1.0e-8
) RETURN SDO_GEOMETRY;
or
SDO_LRS.CLIP_GEOM_SEGMENT(
geom_segment IN SDO_GEOMETRY,
dim_array IN SDO_DIM_ARRAY,
start_measure IN NUMBER,
end_measure IN NUMBER
) RETURN SDO_GEOMETRY;
功能:截取指定的一段
例子:
-- Clipa piece of Route1.
SELECT SDO_LRS.CLIP_GEOM_SEGMENT(route_geometry, 5, 10) FROM lrs_routesWHERE route_id = 1;
4、SDO_LRS.DYNAMIC_SEGMENT
语法:
SDO_LRS.DYNAMIC_SEGMENT(
geom_segment IN SDO_GEOMETRY,
start_measure IN NUMBER,
end_measure IN NUMBER,
tolerance IN NUMBER DEFAULT 1.0e-8
) RETURN SDO_GEOMETRY;
or
SDO_LRS.DYNAMIC_SEGMENT(
geom_segment IN SDO_GEOMETRY,
dim_array IN SDO_DIM_ARRAY,
start_measure IN NUMBER,
end_measure IN NUMBER
) RETURNSDO_GEOMETRY;
用法与SDO_LRS.CLIP_GEOM_SEGMENT一样
5、SDO_LRS.CONCATENATE_GEOM_SEGMENTS
语法:
SDO_LRS.CONCATENATE_GEOM_SEGMENTS(
geom_segment_1 INSDO_GEOMETRY,
geom_segment_2 INSDO_GEOMETRY,
tolerance IN NUMBER DEFAULT 1.0e-8
) RETURN SDO_GEOMETRY;
or
SDO_LRS.CONCATENATE_GEOM_SEGMENTS(
geom_segment_1 INSDO_GEOMETRY,
dim_array_1 INSDO_DIM_ARRAY,
geom_segment_2 INSDO_GEOMETRY,
dim_array_2 INSDO_DIM_ARRAY
) RETURNSDO_GEOMETRY;
功能:连接线串,例子见1
6、SDO_LRS.OFFSET_GEOM_SEGMENT
语法:
SDO_LRS.OFFSET_GEOM_SEGMENT(
geom_segment IN SDO_GEOMETRY,
start_measure IN NUMBER,
end_measure IN NUMBER,
offset IN NUMBER,
tolerance IN NUMBER DEFAULT 1.0e-8
[, unit IN VARCHAR2]
) RETURN SDO_GEOMETRY;
or
SDO_LRS.OFFSET_GEOM_SEGMENT(
geom_segment IN SDO_GEOMETRY,
dim_array IN SDO_DIM_ARRAY,
start_measure IN NUMBER,
end_measure IN NUMBER,
offset IN NUMBER
[, unit IN VARCHAR2]
) RETURNSDO_GEOMETRY;
功能:指定的线段内进行偏移
例子:
SELECT SDO_LRS.OFFSET_GEOM_SEGMENT(a.route_geometry, m.diminfo,5, 10, 2)
FROM lrs_routes a, user_sdo_geom_metadata m
WHERE m.table_name = 'LRS_ROUTES'
AND m.column_name = 'ROUTE_GEOMETRY'
AND a.route_id = 1;
7、SDO_LRS.SPLIT_GEOM_SEGMENT(过程)
语法:
SDO_LRS.SPLIT_GEOM_SEGMENT(
geom_segment IN SDO_GEOMETRY,
split_measure IN NUMBER,
segment_1 OUT SDO_GEOMETRY,
segment_2 OUT SDO_GEOMETRY);
or
SDO_LRS.SPLIT_GEOM_SEGMENT(
geom_segment IN SDO_GEOMETRY,
dim_array IN SDO_DIM_ARRAY,
split_measure IN NUMBER,
segment_1 OUT SDO_GEOMETRY,
segment_2 OUT SDO_GEOMETRY);
功能:将一个几何体分为两个
例子见1
8、SDO_LRS.RESET_MEASURE(过程)
语法:
SDO_LRS.RESET_MEASURE(
geom_segment IN OUT SDO_GEOMETRY
[, dim_array INSDO_DIM_ARRAY]);
功能:将起始点到终止点的测量值都清空
例子:
--Reset geometric segment measures.
DECLARE
geom_segmentSDO_GEOMETRY;
BEGIN
SELECT a.route_geometry intogeom_segment FROM lrs_routes a
WHERE a.route_name = 'Route1';
SDO_LRS.RESET_MEASURE(geom_segment);
--Update and insert geometries into table, to display later.
UPDATE lrs_routes a SET a.route_geometry = geom_segment
WHERE a.route_id = 1;
END;
9、SDO_LRS.SET_PT_MEASURE
语法:
SDO_LRS.SET_PT_MEASURE(
geom_segment IN OUT SDO_GEOMETRY,
point IN SDO_GEOMETRY,
measure IN NUMBER) RETURN VARCHAR2;
or
SDO_LRS.SET_PT_MEASURE(
geom_segment IN OUT SDO_GEOMETRY,
dim_array IN SDO_DIM_ARRAY,
point IN SDO_GEOMETRY,
pt_dim_array IN SDO_DIM_ARRAY,
measure IN NUMBER) RETURN VARCHAR2;
or
SDO_LRS.SET_PT_MEASURE(
point IN OUT SDO_GEOMETRY,
measure IN NUMBER) RETURN VARCHAR2;
or
SDO_LRS.SET_PT_MEASURE(
point IN OUT SDO_GEOMETRY,
dim_array IN SDO_DIM_ARRAY,
measure IN NUMBER) RETURN VARCHAR2;
功能:将测量值设为一个特定的点
-- Setthe measure value of point 8,10 to 20 (originally 22).
DECLARE
geom_segmentSDO_GEOMETRY;
dim_arraySDO_DIM_ARRAY;
resultVARCHAR2(32);
BEGIN
SELECT a.route_geometry intogeom_segment FROM lrs_routes a
WHERE a.route_name = 'Route1';
SELECT m.diminfo into dim_array from
user_sdo_geom_metadatam
WHERE m.table_name = 'LRS_ROUTES'AND m.column_name = 'ROUTE_GEOMETRY';
-- Setthe measure value of point 8,10 to 20 (originally 22).
result := SDO_LRS.SET_PT_MEASURE (geom_segment,
SDO_GEOMETRY(3301, NULL, NULL,
SDO_ELEM_INFO_ARRAY(1, 1, 1),
SDO_ORDINATE_ARRAY(8, 10, 22)),
20);
--Display the result.
DBMS_OUTPUT.PUT_LINE('Returned value = ' || result);
END;
10、SDO_LRS.REVERSE_MEASURE
11、SDO_LRS.TRANSLATE_MEASURE
12、SDO_LRS.REVERSE_GEOMETRY
外环应是逆时针的,内环应是顺时针的。若不对可用该函数进行修正。
SELECT SDO_LRS.REVERSE_GEOMETRY(a.gwm_geometry, m.diminfo)
FROM p_street_area a, user_sdo_geom_metadata m
WHERE m.table_name = 'P_STREET_AREA'
AND m.column_name = 'GWM_GEOMETRY'
AND a.id = 8;
13、SDO_LRS.VALID_GEOM_SEGMENT
14、SDO_LRS.VALID_LRS_PT
15、SDO_LRS.VALID_MEASURE
16、SDO_LRS.CONNECTED_GEOM_SEGMENTS
17、SDO_LRS.GEOM_SEGMENT_LENGTH
18、SDO_LRS.GEOM_SEGMENT_START_PT
19、SDO_LRS.GEOM_SEGMENT_END_PT
20、SDO_LRS.GEOM_SEGMENT_START_MEASURE
21、SDO_LRS.GEOM_SEGMENT_END_MEASURE
22、SDO_LRS.GET_MEASURE
23、SDO_LRS.GET_NEXT_SHAPE_PT
24、SDO_LRS.GET_NEXT_SHAPE_PT_MEASURE
25、SDO_LRS.GET_PREV_SHAPE_PT
26、SDO_LRS.GET_PREV_SHAPE_PT_MEASURE
27、SDO_LRS.IS_GEOM_SEGMENT_DEFINED
28、SDO_LRS.IS_MEASURE_DECREASING
29、SDO_LRS.IS_MEASURE_INCREASING
30、SDO_LRS.IS_SHAPE_PT_MEASURE
31、SDO_LRS.MEASURE_RANGE
32、SDO_LRS.MEASURE_TO_PERCENTAGE
33、SDO_LRS.PERCENTAGE_TO_MEASURE
34、SDO_LRS.LOCATE_PT
35、SDO_LRS.PROJECT_PT
36、SDO_LRS.FIND_LRS_DIM_POS
37、SDO_LRS.FIND_MEASURE
38、SDO_LRS.FIND_OFFSET
39、SDO_LRS.VALIDATE_LRS_GEOMETRY
Subprograms for Converting Geometric Segments