[应用相关] 不同SDE GeoSQL构造函数的效率问题

[复制链接]
749|6
 楼主| 发给她更好fh 发表于 2022-2-23 22:29 | 显示全部楼层 |阅读模式
今天有问题咨询了一下几个SDE For Oracle函数的效率比较问题:

问题如下:
SDE提供了
ST_LineString、ST_Point、ST_PolyFromText几个函数来进行点,线,面的构建,同时也提供了
ST_Geometry函数进行点线面的构建,这些函数的功能都是相同的,到底谁的效率更好。

 楼主| 发给她更好fh 发表于 2022-2-23 22:31 | 显示全部楼层
初步判断:

从字面上看ST_LINESTRING,ST_POINT应该是ST_GEOMETRY的子类,以我对ESRI研发人员的风格了解,应该不会每个函数使用不同的算法,这些对象应该最终都会指向同一个函数,也就是说效率是一样的,下面我们可以查看一下源码验证一下。
 楼主| 发给她更好fh 发表于 2022-2-23 22:31 | 显示全部楼层
查看ST_LINESTRING是怎么定义的
 楼主| 发给她更好fh 发表于 2022-2-23 22:38 | 显示全部楼层
  1. SQL> select text from user_source where name='ST_LINESTRING' and type='TYPE BODY';

  2. TEXT
  3. --------------------------------------------------------------------------------
  4. Type Body st_linestring AS

  5. constructor Function st_linestring(geom_str clob,srid number)
  6.     Return self AS result
  7. IS
  8.    temp          varchar2(1);
  9.    tempraw       raw(1);
  10.    entity        number;
  11.    geom_type     number;
  12.    name          varchar2(32);
  13.    spref_r       SDE.spx_util.spatial_ref_record_t;

  14. TEXT
  15. --------------------------------------------------------------------------------
  16.    shape         SDE.st_geom_util.shape_r;
  17.    is_empty      boolean := False;
  18.    rc            number;
  19.    buffer        clob;

  20. Begin

  21.    geom_type := SDE.st_geom_util.unspecified_type;
  22.    buffer := geom_str;
  23.    SDE.st_geom_util.get_type(buffer,entity,geom_type,is_empty,SDE.st_geom_util.l
  24. inestring_type);

  25. TEXT
  26. --------------------------------------------------------------------------------


  27.    If entity = SDE.st_geom_util.sg_illegal_shape THEN
  28.      raise_application_error (SDE.st_type_util.st_geometry_invalid_type,'Invalid
  29. ST_Linestring type.');

  30.    End If;

  31.    SDE.st_geom_util.get_name(entity,name);

  32.    If name != 'LINESTRING' THEN

  33. TEXT
  34. --------------------------------------------------------------------------------
  35.      raise_application_error (SDE.st_type_util.st_geometry_invalid_type,'ST_Line
  36. string must use a LINESTRING type.');

  37.    End If;

  38.    spref_r.srid := srid;
  39.    rc := SDE.st_spref_util.select_spref(spref_r);
  40.    If rc != SDE.st_type_user.se_success THEN
  41.                   raise_application_error (SDE.st_type_util.st_no_srid,'srid '||spref_r.srid||



  42. TEXT
  43. --------------------------------------------------------------------------------
  44.                                            ' does not exist in st_spatial_references table.');


  45.    End If;

  46.    shape.points := empty_blob();
  47.    shape.numpts := 0;
  48.    shape.entity := 0;
  49.    shape.minx   := 0;
  50.    shape.miny   := 0;
  51.    shape.maxx   := 0;

  52. TEXT
  53. --------------------------------------------------------------------------------
  54.    shape.maxy   := 0;
  55.    shape.area   := 0;
  56.    shape.len    := 0;
  57.    shape.minz   := NULL;
  58.    shape.maxz   := NULL;
  59.    shape.minm   := NULL;
  60.    shape.maxm   := NULL;

  61.    temp := lpad('a', 1, 'a');
  62.    tempraw := utl_raw.cast_to_raw (temp);
  63.    shape.points := tempraw;

  64. TEXT
  65. --------------------------------------------------------------------------------

  66.    If is_empty = False THEN
  67.      SDE.st_geometry_shapelib_pkg.geometryfromtext(buffer,spref_r.srid,spref_r.x
  68. _offset,spref_r.y_offset,spref_r.xyunits,

  69.                                                    spref_r.z_offset,spref_r.z_sc
  70. ale,spref_r.m_offset,spref_r.m_scale,

  71.                                                                                        spref_r.Definit
  72. hape.minx,shape.miny,


  73. TEXT
  74. --------------------------------------------------------------------------------
  75.                                                                                        shape.maxx,shap
  76. hape.maxm,shape.area,shape.len,

  77.                                                                                        shape.points);
  78.    ELSE
  79.      shape.numpts := 0;
  80.      If geom_type > SDE.st_geom_util.unspecified_type Then
  81.        shape.entity := geom_type;
  82.      else
  83.        shape.entity := 0;
  84.      end if;

  85. TEXT
  86. --------------------------------------------------------------------------------
  87.      shape.minx   := 0;
  88.      shape.miny   := 0;
  89.      shape.maxx   := 0;
  90.      shape.maxy   := 0;
  91.          shape.minz   := NULL;
  92.          shape.maxz   := NULL;
  93.          shape.minm   := NULL;
  94.          shape.maxm   := NULL;
  95.      shape.area   := 0;
  96.      shape.len    := 0;
  97.      shape.points := empty_blob();

  98. TEXT
  99. --------------------------------------------------------------------------------
  100.      shape.srid   := srid;
  101.    End If;

  102.    if(shape.numpts IS NULL and shape.entity = 0) then
  103.      self.entity    := shape.entity;
  104.      self.numpts    := 0;
  105.      self.minx      := 0;
  106.      self.maxx      := 0;
  107.      self.miny      := 0;
  108.      self.maxy      := 0;
  109.      self.minz      := NULL;

  110. TEXT
  111. --------------------------------------------------------------------------------
  112.      self.maxz      := NULL;
  113.      self.minm      := NULL;
  114.      self.maxm      := NULL;
  115.      self.srid      := srid;
  116.    else
  117.      self.entity   := shape.entity;
  118.      self.numpts   := shape.numpts;
  119.      self.minx     := shape.minx;
  120.      self.miny     := shape.miny;
  121.      self.maxx     := shape.maxx;
  122.      self.maxy     := shape.maxy;

  123. TEXT
  124. --------------------------------------------------------------------------------

  125.      if(shape.minz IS NULL) then
  126.        self.minz := NULL;
  127.      else
  128.        self.minz := shape.minz;
  129.      end if;

  130.      if(shape.maxz IS NULL) then
  131.        self.maxz := NULL;
  132.      else
  133.        self.maxz := shape.maxz;

  134. TEXT
  135. --------------------------------------------------------------------------------
  136.      end if;

  137.      if(shape.minm IS NULL) then
  138.        self.minm := NULL;
  139.      else
  140.        self.minm := shape.minm;
  141.      end if;

  142.      if(shape.maxm IS NULL) then
  143.        self.maxm := NULL;
  144.      else

  145. TEXT
  146. --------------------------------------------------------------------------------
  147.        self.maxm := shape.maxm;
  148.      end if;

  149.    end if;

  150.    self.area     := 0;
  151.    self.len      := shape.len;
  152.    self.srid     := srid;
  153.    self.points   := shape.points;
  154.    Return;
  155. End;

  156. TEXT
  157. --------------------------------------------------------------------------------

  158. static Function get_release
  159.   Return number
  160.   IS
  161.     c_type_release    Constant pls_integer := 1007;

  162.   Begin
  163.     Return c_type_release;
  164.   End get_release;
  165. End;
 楼主| 发给她更好fh 发表于 2022-2-23 22:39 | 显示全部楼层
  1. SQL> select text from user_source where name='ST_GEOMFROMTEXT' and type='TYPE BODY';

  2. TEXT
  3. --------------------------------------------------------------------------------
  4. Type Body st_geomfromtext AS

  5. constructor Function st_geomfromtext(geom_str clob,srid number)
  6.     Return self AS result
  7. IS
  8.    temp          varchar2(1);
  9.    tempraw       raw(1);
  10.    entity        number;
  11.    geom_type     number;
  12.    name          varchar2(32);
  13.    spref_r       SDE.spx_util.spatial_ref_record_t;

  14. TEXT
  15. --------------------------------------------------------------------------------
  16.    shape         SDE.st_geom_util.shape_r;
  17.    is_empty      boolean := False;
  18.    rc            number;
  19.    buffer        clob;

  20. Begin

  21.    geom_type := SDE.st_geom_util.unspecified_type;
  22.    buffer := geom_str;
  23.    SDE.st_geom_util.get_type(buffer,entity,geom_type,is_empty,SDE.st_geom_util.s
  24. t_geometry_type);

  25. TEXT
  26. --------------------------------------------------------------------------------


  27.    If entity = SDE.st_geom_util.sg_illegal_shape THEN
  28.      raise_application_error (SDE.st_type_util.st_geometry_invalid_type,'Invalid
  29. ST_GEOMETRY type.');

  30.    End If;

  31.    SDE.st_geom_util.get_name(entity,name);

  32.    If name != 'POINT' AND name != 'LINESTRING' AND name != 'POLYGON' AND

  33. TEXT
  34. --------------------------------------------------------------------------------
  35.       name != 'MULTIPOINT' AND name != 'MULTILINESTRING' AND name != 'MULTIPOLYG
  36. ON' THEN

  37.      raise_application_error (SDE.st_type_util.st_geometry_invalid_type,'ST_GEOM
  38. ETRY type must be a valid subtype.');

  39.    End If;

  40.    spref_r.srid := srid;
  41.    rc := SDE.st_spref_util.select_spref(spref_r);
  42.    If rc <> SDE.st_type_user.se_success THEN

  43. TEXT
  44. --------------------------------------------------------------------------------
  45.                   raise_application_error (SDE.st_type_util.spx_no_srid,'Parameter ST_SRID '||
  46. spref_r.srid||

  47.                                            ' does not exist in ST_SPATIAL_REFERENCES table.');


  48.    End If;

  49.    shape.points := empty_blob();
  50.    shape.numpts := 0;
  51.    shape.entity := 0;

  52. TEXT
  53. --------------------------------------------------------------------------------
  54.    shape.minx   := 0;
  55.    shape.miny   := 0;
  56.    shape.maxx   := 0;
  57.    shape.maxy   := 0;
  58.    shape.area   := 0;
  59.    shape.len    := 0;
  60.    shape.minz   := NULL;
  61.    shape.maxz   := NULL;
  62.    shape.minm   := NULL;
  63.    shape.maxm   := NULL;


  64. TEXT
  65. --------------------------------------------------------------------------------
  66.    -- Initialize POINTS blob.
  67.    temp := lpad('a', 1, 'a');
  68.    tempraw := utl_raw.cast_to_raw (temp);
  69.    shape.points := tempraw;

  70.    If is_empty = False THEN
  71.    SDE.st_geometry_shapelib_pkg.geometryfromtext (buffer,spref_r.srid,spref_r.x_
  72. offset,spref_r.y_offset,spref_r.xyunits,

  73.                                                   spref_r.z_offset,spref_r.z_sca
  74. le,spref_r.m_offset,spref_r.m_scale,

  75. TEXT
  76. --------------------------------------------------------------------------------

  77.                                                                                       spref_r.D
  78. ape.minx,shape.miny,

  79.                                                                                        shape.ma
  80. hape.maxm,shape.area,shape.len,

  81.                                                                                        shape.po

  82.    ELSE
  83.      shape.numpts := 0;

  84. TEXT
  85. --------------------------------------------------------------------------------
  86.      If geom_type > SDE.st_geom_util.unspecified_type Then
  87.        shape.entity := geom_type;
  88.      else
  89.        shape.entity := 0;
  90.      end if;
  91.      shape.minx   := 0;
  92.      shape.miny   := 0;
  93.      shape.maxx   := 0;
  94.      shape.maxy   := 0;
  95.          shape.minz   := NULL;
  96.          shape.maxz   := NULL;

  97. TEXT
  98. --------------------------------------------------------------------------------
  99.          shape.minm   := NULL;
  100.          shape.maxm   := NULL;
  101.      shape.area   := 0;
  102.      shape.len    := 0;
  103.      shape.points := empty_blob();
  104.      shape.srid   := srid;
  105.    End If;

  106.    if(shape.numpts IS NULL and shape.entity = 0) then
  107.      self.entity    := shape.entity;
  108.      self.numpts    := 0;

  109. TEXT
  110. --------------------------------------------------------------------------------
  111.      self.minx      := 0;
  112.      self.maxx      := 0;
  113.      self.miny      := 0;
  114.      self.maxy      := 0;
  115.      self.minz      := NULL;
  116.      self.maxz      := NULL;
  117.      self.minm      := NULL;
  118.      self.maxm      := NULL;
  119.      self.srid      := srid;
  120.    else
  121.      self.entity   := shape.entity;

  122. TEXT
  123. --------------------------------------------------------------------------------
  124.      self.numpts   := shape.numpts;
  125.      self.minx     := shape.minx;
  126.      self.miny     := shape.miny;
  127.      self.maxx     := shape.maxx;
  128.      self.maxy     := shape.maxy;

  129.      if(shape.minz IS NULL) then
  130.        self.minz := NULL;
  131.      else
  132.        self.minz := shape.minz;
  133.      end if;

  134. TEXT
  135. --------------------------------------------------------------------------------

  136.      if(shape.maxz IS NULL) then
  137.        self.maxz := NULL;
  138.      else
  139.        self.maxz := shape.maxz;
  140.      end if;

  141.      if(shape.minm IS NULL) then
  142.        self.minm := NULL;
  143.      else
  144.        self.minm := shape.minm;

  145. TEXT
  146. --------------------------------------------------------------------------------
  147.      end if;

  148.      if(shape.maxm IS NULL) then
  149.        self.maxm := NULL;
  150.      else
  151.        self.maxm := shape.maxm;
  152.      end if;

  153.    end if;

  154.    self.area     := shape.area;

  155. TEXT
  156. --------------------------------------------------------------------------------
  157.    self.len      := shape.len;
  158.    self.srid     := srid;
  159.    self.points   := shape.points;
  160.    Return;
  161. End;

  162.   static Function get_release
  163.   Return number
  164.   IS
  165.     c_type_release    Constant pls_integer := 1007;


  166. TEXT
  167. --------------------------------------------------------------------------------
  168.   Begin
  169.     Return c_type_release;
  170.   End get_release;
  171. End;
 楼主| 发给她更好fh 发表于 2022-2-23 22:40 | 显示全部楼层
  1. CREATE OR REPLACE Type Body st_geometry AS

  2. constructor Function st_geometry (geom_str clob, srid number)
  3.   Return self AS result
  4. IS
  5.    temp            varchar2(1);
  6.    tempraw         raw(1);
  7.    entity          number;
  8.    geom_type       number;
  9.    name            varchar2(32);
  10.    spref_r         SDE.st_spref_util.spatial_ref_record_t;
  11.    shape           SDE.st_geom_util.shape_r;
  12.    is_empty        boolean := False;
  13.    rc              number;
  14.    buffer          clob;
  15. Begin

  16.    geom_type := SDE.st_geom_util.unspecified_type;
  17.    buffer := geom_str;
  18.    SDE.st_geom_util.get_type(buffer,entity,geom_type,is_empty,SDE.st_geom_util.st_geometry_type);

  19.    If entity = SDE.st_geom_util.sg_illegal_shape THEN
  20.      raise_application_error (SDE.st_type_util.st_geometry_invalid_type,'ST_GEOMETRY type must be a geometry type.');
  21.    End If;

  22.    SDE.st_geom_util.get_name(entity,name);

  23.    spref_r.srid := srid;
  24.    rc := SDE.st_spref_util.select_spref(spref_r);
  25.    If rc != SDE.st_type_user.se_success THEN
  26.           raise_application_error (SDE.st_type_util.st_no_srid,'SRID '||spref_r.srid||
  27.                                    ' does not exist in ST_SPATIAL_REFERENCES table.');
  28.    End If;

  29.    shape.points := empty_blob();
  30.    shape.numpts := 0;
  31.    shape.entity := 0;
  32.    shape.minx   := 0;
  33.    shape.miny   := 0;
  34.    shape.maxx   := 0;
  35.    shape.maxy   := 0;
  36.    shape.area   := 0;
  37.    shape.len    := 0;
  38.    shape.minz   := NULL;
  39.    shape.maxz   := NULL;
  40.    shape.minm   := NULL;
  41.    shape.maxm   := NULL;

  42.    temp := lpad('a', 1, 'a');
  43.    tempraw := utl_raw.cast_to_raw (temp);
  44.    shape.points := tempraw;

  45.    If is_empty = False THEN
  46.      geom_type := SDE.st_geom_util.unspecified_type;
  47.      SDE.st_geometry_shapelib_pkg.geometryfromtext(buffer,spref_r.srid,spref_r.x_offset,spref_r.y_offset,spref_r.xyunits,
  48.                                                    spref_r.z_offset,spref_r.z_scale,spref_r.m_offset,spref_r.m_scale,
  49.                                                    spref_r.Definition,geom_type,shape.numpts,shape.entity,shape.minx,shape.miny,
  50.                                                    shape.maxx,shape.maxy,shape.minz,shape.maxz,shape.minm,shape.maxm,
  51.                                                    shape.area,shape.len,shape.points);
 楼主| 发给她更好fh 发表于 2022-2-23 22:40 | 显示全部楼层
发现最终调用的是SDE.st_geometry_shapelib_pkg.geometryfromtext函数进行对象的构建。

所以效率是一样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

563

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部