不同SDE GeoSQL构造函数的效率问题
分享
今天有问题咨询了一下几个SDE For Oracle函数的效率比较问题:
问题如下: SDE提供了 ST_LineString、ST_Point、ST_PolyFromText几个函数来进行点,线,面的构建,同时也提供了 ST_Geometry函数进行点线面的构建,这些函数的功能都是相同的,到底谁的效率更好。
初步判断:
从字面上看ST_LINESTRING,ST_POINT应该是ST_GEOMETRY的子类,以我对ESRI研发人员的风格了解,应该不会每个函数使用不同的算法,这些对象应该最终都会指向同一个函数,也就是说效率是一样的,下面我们可以查看一下源码验证一下。
查看ST_LINESTRING是怎么定义的
发现最终调用的是SDE.st_geometry_shapelib_pkg.geometryfromtext函数进行对象的构建。
所以效率是一样的。
文章来源:http://blog.csdn.net/liufeng1980423/article/details/71158153
问题如下: SDE提供了 ST_LineString、ST_Point、ST_PolyFromText几个函数来进行点,线,面的构建,同时也提供了 ST_Geometry函数进行点线面的构建,这些函数的功能都是相同的,到底谁的效率更好。
初步判断:
从字面上看ST_LINESTRING,ST_POINT应该是ST_GEOMETRY的子类,以我对ESRI研发人员的风格了解,应该不会每个函数使用不同的算法,这些对象应该最终都会指向同一个函数,也就是说效率是一样的,下面我们可以查看一下源码验证一下。
查看ST_LINESTRING是怎么定义的
SQL> select text from user_source where name='ST_LINESTRING' and type='TYPE BODY';
TEXT --------------------------------------------------------------------------------
Type Body st_linestring AS constructor Function st_linestring(geom_str clob,srid number)
Return self AS result
IS
temp varchar2(1);
tempraw raw(1);
entity number;
geom_type number;
name varchar2(32);
spref_r SDE.spx_util.spatial_ref_record_t;
TEXT --------------------------------------------------------------------------------
shape SDE.st_geom_util.shape_r;
is_empty boolean := False;
rc number;
buffer clob;
Begin
geom_type := SDE.st_geom_util.unspecified_type;
buffer := geom_str;
SDE.st_geom_util.get_type(buffer,entity,geom_type,is_empty,SDE.st_geom_util.l
inestring_type); TEXT --------------------------------------------------------------------------------
If entity = SDE.st_geom_util.sg_illegal_shape THEN
raise_application_error (SDE.st_type_util.st_geometry_invalid_type,'Invalid
ST_Linestring type.');
End If;
SDE.st_geom_util.get_name(entity,name);
If name != 'LINESTRING' THEN
TEXT --------------------------------------------------------------------------------
raise_application_error (SDE.st_type_util.st_geometry_invalid_type,'ST_Line
string must use a LINESTRING type.'); End If;
spref_r.srid := srid;
rc := SDE.st_spref_util.select_spref(spref_r);
If rc != SDE.st_type_user.se_success THEN
raise_application_error (SDE.st_type_util.st_no_srid,'srid '||spref_r.srid||
TEXT --------------------------------------------------------------------------------
' does not exist in st_spatial_references table.');
End If;
shape.points := empty_blob();
shape.numpts := 0;
shape.entity := 0;
shape.minx := 0;
shape.miny := 0;
shape.maxx := 0;
TEXT --------------------------------------------------------------------------------
shape.maxy := 0;
shape.area := 0;
shape.len := 0;
shape.minz := NULL;
shape.maxz := NULL;
shape.minm := NULL;
shape.maxm := NULL;
temp := lpad('a', 1, 'a');
tempraw := utl_raw.cast_to_raw (temp);
shape.points := tempraw;
TEXT --------------------------------------------------------------------------------
If is_empty = False THEN
SDE.st_geometry_shapelib_pkg.geometryfromtext(buffer,spref_r.srid,spref_r.x
_offset,spref_r.y_offset,spref_r.xyunits,
spref_r.z_offset,spref_r.z_sc
ale,spref_r.m_offset,spref_r.m_scale,
spref_r.Definit
hape.minx,shape.miny,
TEXT --------------------------------------------------------------------------------
shape.maxx,shap
hape.maxm,shape.area,shape.len,
shape.points);
ELSE
shape.numpts := 0;
If geom_type > SDE.st_geom_util.unspecified_type Then
shape.entity := geom_type;
else
shape.entity := 0;
end if;
TEXT --------------------------------------------------------------------------------
shape.minx := 0;
shape.miny := 0;
shape.maxx := 0;
shape.maxy := 0;
shape.minz := NULL;
shape.maxz := NULL;
shape.minm := NULL;
shape.maxm := NULL;
shape.area := 0;
shape.len := 0;
shape.points := empty_blob();
TEXT --------------------------------------------------------------------------------
shape.srid := srid;
End If;
if(shape.numpts IS NULL and shape.entity = 0) then
self.entity := shape.entity;
self.numpts := 0;
self.minx := 0;
self.maxx := 0;
self.miny := 0;
self.maxy := 0;
self.minz := NULL;
TEXT --------------------------------------------------------------------------------
self.maxz := NULL;
self.minm := NULL;
self.maxm := NULL;
self.srid := srid;
else
self.entity := shape.entity;
self.numpts := shape.numpts;
self.minx := shape.minx;
self.miny := shape.miny;
self.maxx := shape.maxx;
self.maxy := shape.maxy;
TEXT --------------------------------------------------------------------------------
if(shape.minz IS NULL) then
self.minz := NULL;
else
self.minz := shape.minz;
end if;
if(shape.maxz IS NULL) then
self.maxz := NULL;
else
self.maxz := shape.maxz;
TEXT --------------------------------------------------------------------------------
end if;
if(shape.minm IS NULL) then
self.minm := NULL;
else
self.minm := shape.minm;
end if;
if(shape.maxm IS NULL) then
self.maxm := NULL;
else
TEXT --------------------------------------------------------------------------------
self.maxm := shape.maxm;
end if;
end if;
self.area := 0;
self.len := shape.len;
self.srid := srid;
self.points := shape.points;
Return;
End;
TEXT --------------------------------------------------------------------------------
static Function get_release Return number IS c_type_release Constant pls_integer := 1007;
Begin
Return c_type_release;
End get_release;
End;
SQL> select text from user_source where name='ST_GEOMFROMTEXT' and type='TYPE BODY';
TEXT --------------------------------------------------------------------------------
Type Body st_geomfromtext AS constructor Function st_geomfromtext(geom_str clob,srid number)
Return self AS result
IS
temp varchar2(1);
tempraw raw(1);
entity number;
geom_type number;
name varchar2(32);
spref_r SDE.spx_util.spatial_ref_record_t;
TEXT --------------------------------------------------------------------------------
shape SDE.st_geom_util.shape_r;
is_empty boolean := False;
rc number;
buffer clob;
Begin
geom_type := SDE.st_geom_util.unspecified_type;
buffer := geom_str;
SDE.st_geom_util.get_type(buffer,entity,geom_type,is_empty,SDE.st_geom_util.s
t_geometry_type);
TEXT --------------------------------------------------------------------------------
If entity = SDE.st_geom_util.sg_illegal_shape THEN
raise_application_error (SDE.st_type_util.st_geometry_invalid_type,'Invalid
ST_GEOMETRY type.');
End If;
SDE.st_geom_util.get_name(entity,name);
If name != 'POINT' AND name != 'LINESTRING' AND name != 'POLYGON' AND
TEXT --------------------------------------------------------------------------------
name != 'MULTIPOINT' AND name != 'MULTILINESTRING' AND name != 'MULTIPOLYG
ON' THEN
raise_application_error (SDE.st_type_util.st_geometry_invalid_type,'ST_GEOM
ETRY type must be a valid subtype.'); End If;
spref_r.srid := srid;
rc := SDE.st_spref_util.select_spref(spref_r);
If rc <> SDE.st_type_user.se_success THEN
TEXT --------------------------------------------------------------------------------
raise_application_error (SDE.st_type_util.spx_no_srid,'Parameter ST_SRID '||
spref_r.srid|| ' does not exist in ST_SPATIAL_REFERENCES table.');
End If;
shape.points := empty_blob();
shape.numpts := 0;
shape.entity := 0;
TEXT --------------------------------------------------------------------------------
shape.minx := 0;
shape.miny := 0;
shape.maxx := 0;
shape.maxy := 0;
shape.area := 0;
shape.len := 0;
shape.minz := NULL;
shape.maxz := NULL;
shape.minm := NULL;
shape.maxm := NULL;
TEXT --------------------------------------------------------------------------------
-- Initialize POINTS blob.
temp := lpad('a', 1, 'a');
tempraw := utl_raw.cast_to_raw (temp);
shape.points := tempraw;
If is_empty = False THEN
SDE.st_geometry_shapelib_pkg.geometryfromtext (buffer,spref_r.srid,spref_r.x_
offset,spref_r.y_offset,spref_r.xyunits, spref_r.z_offset,spref_r.z_sca
le,spref_r.m_offset,spref_r.m_scale,
TEXT --------------------------------------------------------------------------------
spref_r.D
ape.minx,shape.miny,
shape.ma
hape.maxm,shape.area,shape.len,
shape.po
ELSE
shape.numpts := 0;
TEXT --------------------------------------------------------------------------------
If geom_type > SDE.st_geom_util.unspecified_type Then
shape.entity := geom_type;
else
shape.entity := 0;
end if;
shape.minx := 0;
shape.miny := 0;
shape.maxx := 0;
shape.maxy := 0;
shape.minz := NULL;
shape.maxz := NULL;
TEXT --------------------------------------------------------------------------------
shape.minm := NULL;
shape.maxm := NULL;
shape.area := 0;
shape.len := 0;
shape.points := empty_blob();
shape.srid := srid;
End If;
if(shape.numpts IS NULL and shape.entity = 0) then
self.entity := shape.entity;
self.numpts := 0;
TEXT --------------------------------------------------------------------------------
self.minx := 0;
self.maxx := 0;
self.miny := 0;
self.maxy := 0;
self.minz := NULL;
self.maxz := NULL;
self.minm := NULL;
self.maxm := NULL;
self.srid := srid;
else
self.entity := shape.entity;
TEXT --------------------------------------------------------------------------------
self.numpts := shape.numpts;
self.minx := shape.minx;
self.miny := shape.miny;
self.maxx := shape.maxx;
self.maxy := shape.maxy;
if(shape.minz IS NULL) then
self.minz := NULL;
else
self.minz := shape.minz;
end if;
TEXT --------------------------------------------------------------------------------
if(shape.maxz IS NULL) then
self.maxz := NULL;
else
self.maxz := shape.maxz;
end if;
if(shape.minm IS NULL) then
self.minm := NULL;
else
self.minm := shape.minm;
TEXT --------------------------------------------------------------------------------
end if;
if(shape.maxm IS NULL) then
self.maxm := NULL;
else
self.maxm := shape.maxm;
end if;
end if;
self.area := shape.area;
TEXT --------------------------------------------------------------------------------
self.len := shape.len;
self.srid := srid;
self.points := shape.points;
Return;
End;
static Function get_release
Return number
IS
c_type_release Constant pls_integer := 1007;
TEXT --------------------------------------------------------------------------------
Begin
Return c_type_release;
End get_release;
End;
CREATE OR REPLACE Type Body st_geometry AS
constructor Function st_geometry (geom_str clob, srid number)
Return self AS result
IS
temp varchar2(1);
tempraw raw(1);
entity number;
geom_type number;
name varchar2(32);
spref_r SDE.st_spref_util.spatial_ref_record_t;
shape SDE.st_geom_util.shape_r;
is_empty boolean := False;
rc number;
buffer clob;
Begin
geom_type := SDE.st_geom_util.unspecified_type;
buffer := geom_str;
SDE.st_geom_util.get_type(buffer,entity,geom_type,is_empty,SDE.st_geom_util.st_geometry_type);
If entity = SDE.st_geom_util.sg_illegal_shape THEN
raise_application_error (SDE.st_type_util.st_geometry_invalid_type,'ST_GEOMETRY type must be a geometry type.');
End If;
SDE.st_geom_util.get_name(entity,name);
spref_r.srid := srid;
rc := SDE.st_spref_util.select_spref(spref_r);
If rc != SDE.st_type_user.se_success THEN
raise_application_error (SDE.st_type_util.st_no_srid,'SRID '||spref_r.srid||
' does not exist in ST_SPATIAL_REFERENCES table.');
End If;
shape.points := empty_blob();
shape.numpts := 0;
shape.entity := 0;
shape.minx := 0;
shape.miny := 0;
shape.maxx := 0;
shape.maxy := 0;
shape.area := 0;
shape.len := 0;
shape.minz := NULL;
shape.maxz := NULL;
shape.minm := NULL;
shape.maxm := NULL;
temp := lpad('a', 1, 'a');
tempraw := utl_raw.cast_to_raw (temp);
shape.points := tempraw;
If is_empty = False THEN
geom_type := SDE.st_geom_util.unspecified_type;
SDE.st_geometry_shapelib_pkg.geometryfromtext(buffer,spref_r.srid,spref_r.x_offset,spref_r.y_offset,spref_r.xyunits,
spref_r.z_offset,spref_r.z_scale,spref_r.m_offset,spref_r.m_scale,
spref_r.Definition,geom_type,shape.numpts,shape.entity,shape.minx,shape.miny,
shape.maxx,shape.maxy,shape.minz,shape.maxz,shape.minm,shape.maxm,
shape.area,shape.len,shape.points);
发现最终调用的是SDE.st_geometry_shapelib_pkg.geometryfromtext函数进行对象的构建。
所以效率是一样的。
文章来源:http://blog.csdn.net/liufeng1980423/article/details/71158153