以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 SVG/GML/VRML/X3D/XAML 』  (http://bbs.xml.org.cn/list.asp?boardid=21)
----  基于SVG+XMLHTTP+ORACLE SPATIAL的WEBGIS基础平台实例新址[分享]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=21&rootid=&id=42793)


--  作者:zhou_gong
--  发布时间:1/26/2007 6:31:00 AM

--  基于SVG+XMLHTTP+ORACLE SPATIAL的WEBGIS基础平台实例新址[分享]
大家好,网站终于重新开通了:HTTP://222.216.109.154:7799/
欢迎大家与大家交流,QQ:185006613,zhou_gong_nn@163.com
注:使用前必须安装SVG插件(ADOBE公司的)
此主题相关图片如下:
按此在新窗口浏览图片
--  作者:zhou_gong
--  发布时间:2/22/2007 10:19:00 AM

--  
难道没有人对此技术的实现感兴趣吗?
--  作者:hiker365
--  发布时间:3/14/2007 11:48:00 PM

--  
做的不错,我的毕业设计也做这个,能说说你是怎么做的吗?
用了那些技术,看那些资料呢?
能把一些相关的资料贴出来吗?
或发给我一份:hiker365@163.com
非常感谢了!有时间可以交流一下
-----------------
学了一段时间的orcale SPATIAL 感觉这个很难呀!

--  作者:zhou_gong
--  发布时间:3/15/2007 8:11:00 AM

--  
http://222.216.109.154:7799/

 摘要
时态性、新地块产生与旧地块消亡紧密关联,是国土资源空间信息的两个特征。
本文从国土资源信息分离出基于时态事件的GIS内容,建立满足两个基本特征的土地时空数据模型概念,并提出利用ORACLE SPATIAL、SVG、XMLHTTP等技术,将土地时空数据模型在WEB上实现的可行性 ,论述对每一个土地空间对象(地块)基于时间事件的增、删、查、改,让用户动态实时查询、维护土地地块的动态变化过程,建立从过去到现在所有地块全息演变过程的土地时空数据库基础平台系统架构。
作为建立开放、分布式、标准化、大众化南宁市综合国土资源信息系统的核心有机组成部分,本文设计和实现土地时空数据库管理部署在WEB上,主要内容如下:
 在ORACLE SPATIAL环境建立土地时空数据库;
 在ORACLE环境建立PL/SQL土地时空数据业务逻辑及数据转换管理模块;
 在客户层利用SVG DOM+JAVASCRIPT建立土地时空对象编辑模块;
 在客户层与数据层之间用XMLHTTP 无刷新技术实现XML消息实时传送;
[关键词]分布式、ORACLE SPATIAL、SVG、XMLHTTP、土地时空数据模型

功能:
1) 改变颜色
功能:重新自动生成土地时空对象的填充颜色
参数:无
2) 刷新视窗
功能:重新从数据服务层检索视窗范围的土地时空对象,更新视窗的数据呈现
参数1:自动/手动,当设为自动时,当视窗改变时会自动执行此命令;
参数2:日期开始,表示大于此日期的土地时空对象被检索;
参数3:日期结束,表示小于此日期的土地时空对象被检索;
参数4:数据返回最大长度(k),表示返回检索XML消息结果不能超过此值
3) 放大视窗
功能:按住鼠标左键保持不松,拖动鼠标则放大拖动范围到视窗;如果点击鼠标,则在此位置作为中心按缩放比例放大视窗
参数:缩放比例,此值在1.1~10之间
4) 缩小视窗
功能:按住鼠标左键保持不松,拖动鼠标则移动视窗;如果点击鼠标,则在此位置作为中心按缩放比例缩小视窗
参数:缩放比例,此值在1.1~10之间
5) 创建对象
功能:创建一个简单的土地时空对象,只有一个闭合环
参数1:日期值(z),土地时空对象的生日值,缺省为空,格式:YYYY-MM-DD
参数2:直线/园弧,表示输入线的类型,可以相互切换
参数3:闭合,表示此土地时空对象创建完毕
参数4:取消,取消此土地时空对象创建的所有操作
6) 构建对象
功能:由存在的土地时空对象通过叠加运算生成新的对象,此命令可以连续操作,直接按接受才把结果作为土地时空对象增加到土地时空数据表里
参数1:日期值(z),土地时空对象的生日值,缺省为空,格式:YYYY-MM-DD
参数2:并集/交集/差集/异域/缓冲,表示空间叠加运算类型,可以随时切换
参数3:接受,表示将运算的结果作为土地时空对象增加到增加到土地时空数据表
参数4:取消,清空空间运算结果
7) 修改对象
功能:修改土地时空对象的生日值。土地时空对象的空间消息修改可通过构建命令生成
参数1:日期值(z),土地时空对象的新的生日值,缺省为空,格式:YYYY-MM-DD
参数2:接受,表示将选中的土地时空对象的生日值修改为新值
参数4:取消,取消选中的土地时空对象
8) 删除对象
功能:删除SVG DOM和(或)数据服务层的土地时空对象
参数1:保留数据/删除数据,表示是否同时删除数据服务层的土地时空对象,缺省为保留数据
参数2:取消,表示取消选中的要删除的土地时空对象
9) 信息呈现
功能1:左上角显示所有存在的土地时空生日值,点击相应的生日值,会切换相应的土地时空对象开关显示,日期值为绿色则表示显示,红色表示不显示;
功能2:当点击一具体的土地时空对象时,具有相同生日值的所有土地时空对象不显示;
功能3:显示鼠标经过的土地时空对象的属性:id,生日值,面积,周长


--  作者:hiker365
--  发布时间:3/15/2007 12:40:00 PM

--  
我的毕业设计和这个相比要简单多了,只要把orcale spatial中的图形用svg显示出来就行了。orcale spatial建表存图形我会了但是如何生成svg不知到怎么办,还没有思路,你能给我一些指点吗?我该看那些方面的资料呢?
谢谢!


--  作者:zhou_gong
--  发布时间:3/28/2007 8:17:00 AM

--  
下面是GEOM转换到SVG格式的PL/SQL代码:
FUNCTION geom_to_svgpath(v_geom SDO_GEOMETRY) RETURN CLOB        
as        
--v_path    VARCHAR2(32767) := '';  
v_path      clob := '';    
i            binary_integer;       
j            binary_integer;  
k            binary_integer;  
m            binary_integer := precision;  
v_offend     binary_integer;      
v_count      binary_integer;  
v_subelem    binary_integer;    
v_elem_info  SDO_ELEM_INFO_ARRAY;      
v_ordinates  SDO_ORDINATE_ARRAY;       
v_offset     binary_integer;       
v_etype      binary_integer;       
v_interpret  binary_integer;  
       
begin       
  --本函数转换线、面状类型空间数据到SVG;       
  IF NOT (    v_geom.SDO_GTYPE = 2002       -- 线  
           OR v_geom.SDO_GTYPE = 2003        -- 面  
           OR v_geom.SDO_GTYPE = 2004        -- 混集合  
           OR v_geom.SDO_GTYPE = 2006        -- 线集合  
           OR v_geom.SDO_GTYPE = 2007)       -- 面集合   
           THEN       
    RETURN NULL;       
  END IF;       
  v_elem_info := v_geom.sdo_elem_info;       
  v_ordinates := v_geom.sdo_ordinates;       
  v_count     := v_elem_info.count();       
  v_subelem   := 0;      
  i           := 0;      
  WHILE i< v_count LOOP      
    i := i + 1;       
    v_offset   := v_elem_info(i);      
    i := i + 1;      
    v_etype    := MOD(v_elem_info(i),1000);      
    i := i + 1;       
    v_interpret:= v_elem_info(i);  
      
    --处理空间对象中的一条线或一个面的开始  
    IF v_path = '' OR v_path IS NULL THEN     
      v_path := 'M';     
    ELSE     
      DBMS_LOB.APPEND(v_path, ' M');      
    END IF;   
      
    CASE v_etype   
   
      --处理简单线      
      WHEN 2 THEN      
        CASE v_interpret       
     
          --处理由纯折线构成的简单线;      
          WHEN 1 THEN           
            IF i = v_count THEN       
              v_offend := v_ordinates.count();      
            ELSE      
              v_offend := v_elem_info(i+1) - 1;      
            END IF;      
            FOR j IN v_offset..v_offend LOOP      
             DBMS_LOB.APPEND(v_path , (' ' ||  TO_CHAR(v_ordinates(j)))) ;      
            END LOOP;      
    
      
          --处理由纯圆弧构成的简单线;      
          WHEN 2 THEN      
            IF i = v_count THEN       
              v_offend := v_ordinates.count()- 5;      
            ELSE      
              v_offend := v_elem_info(i+1) - 6;      
            END IF;   
   
            j := v_offset;    
            DBMS_LOB.APPEND(v_path,( ' ' ||  TO_CHAR(v_ordinates(j)) || ' ' ||  TO_CHAR(v_ordinates(j+1)))) ;    
            WHILE j<= v_offend LOOP     
              DBMS_LOB.APPEND(v_path, (arc_to_svgpath(v_ordinates(j)  ,v_ordinates(j+1),     
                                                 v_ordinates(j+2),v_ordinates(j+3),     
                                                 v_ordinates(j+4),v_ordinates(j+5),     
                                                 1)));    
              j := j + 4;       
            END LOOP;  
          END CASE;  
      --处理面数据;     
      WHEN 3 THEN      
        CASE v_interpret       
     
          --处理由纯折线构成的面;      
          WHEN 1 THEN           
            IF i = v_count THEN       
              v_offend := v_ordinates.count()- 2;      
            ELSE      
              v_offend := v_elem_info(i+1) - 3;      
            END IF;      
            FOR j IN v_offset..v_offend LOOP      
              DBMS_LOB.APPEND(v_path,( ' ' ||  TO_CHAR(v_ordinates(j)))) ;      
            END LOOP;      
            v_path := v_path  || ' Z';       
      
          --处理由纯圆弧构成的面;      
          WHEN 2 THEN      
            IF i = v_count THEN       
              v_offend := v_ordinates.count()- 5;      
            ELSE      
              v_offend := v_elem_info(i+1) - 6;      
            END IF;   
             j := v_offset;    
            DBMS_LOB.APPEND(v_path,( ' ' || to_char(v_ordinates(j)) || ' ' || to_char(v_ordinates(j+1))));    
            WHILE j<= v_offend LOOP     
             DBMS_LOB.APPEND(v_path,( arc_to_svgpath(v_ordinates(j)  ,v_ordinates(j+1),     
                                                 v_ordinates(j+2),v_ordinates(j+3),     
                                                 v_ordinates(j+4),v_ordinates(j+5),     
                                                 1)));    
              j := j + 4;       
            END LOOP;       
      
          --处理矩形;      
          WHEN 3 THEN      
            j := v_offset;      
            DBMS_LOB.APPEND(v_path,(' '||  TO_CHAR(v_ordinates(j))   || ' ' ||  TO_CHAR(v_ordinates(j+1))));      
            DBMS_LOB.APPEND(v_path,(' '||  TO_CHAR(v_ordinates(j+2)) || ' ' ||  TO_CHAR(v_ordinates(j+1))));      
            DBMS_LOB.APPEND(v_path,(' '||  TO_CHAR(v_ordinates(j+2)) || ' ' ||  TO_CHAR(v_ordinates(j+3))));      
            DBMS_LOB.APPEND(v_path,(' '||  TO_CHAR(v_ordinates(j))   || ' ' ||  TO_CHAR(v_ordinates(j+3) || ' Z')));      
     
          --处理园;     
          WHEN 4 THEN     
            j := v_offset;     
            DBMS_LOB.APPEND(v_path,(arc_to_svgpath(v_ordinates(j)  ,v_ordinates(j+1),     
                                                 v_ordinates(j+2),v_ordinates(j+3),     
                                                 v_ordinates(j+4),v_ordinates(j+5),     
                                                 0)));     
     
        END CASE;   
   
      --处理复合线;      
      WHEN 4 THEN  
       DBMS_LOB.APPEND(v_path,( ' ' ||  TO_CHAR(v_ordinates(v_offset)) || ' ' ||  TO_CHAR(v_ordinates(v_offset + 1))));   
          
        --复合线中连续折线和连续园弧个数;  
        v_subelem := v_interpret;  
          
        --处理每一连续折线或连续园弧;  
        FOR k IN 1..v_subelem LOOP  
          i := i + 1;  
          v_offset   := v_elem_info(i) ;      
          i := i + 1;      
          v_etype    := MOD(v_elem_info(i),1000);  
          i := i + 1;  
          v_interpret:= v_elem_info(i);  
            
          CASE v_interpret       
     
            --处理连续折线;      
            WHEN 1 THEN  
              IF i = v_count THEN       
                v_offend := v_ordinates.count();      
              ELSE  
                IF k = v_subelem THEN  
                  v_offend := v_elem_info(i+1) - 1;  
                ELSE  
                  v_offend := v_elem_info(i+1) + 1;  
                END IF;  
              END IF;   
              IF k>1 THEN   
                v_path := v_path || ' L';  
              END IF;  
              FOR j IN (v_offset + 2)..v_offend LOOP      
               DBMS_LOB.APPEND(v_path,( ' ' ||  TO_CHAR(v_ordinates(j)))) ;      
              END LOOP;      
              
                   
            --处理连续圆弧;;      
            WHEN 2 THEN      
              IF i = v_count THEN       
                v_offend := v_ordinates.count()- 5;      
              ELSE   
                IF k = v_subelem THEN   
                  v_offend := v_elem_info(i+1) - 6;   
                ELSE   
                  v_offend := v_elem_info(i+1) - 4;   
                END IF;  
              END IF;   
              j := v_offset;  
              --v_path := v_path || ' A';  
              WHILE j<= v_offend LOOP     
               DBMS_LOB.APPEND(v_path,(arc_to_svgpath(v_ordinates(j)  ,v_ordinates(j+1),     
                                                   v_ordinates(j+2),v_ordinates(j+3),     
                                                   v_ordinates(j+4),v_ordinates(j+5),     
                                                   1)));    
                j := j + 4;       
              END LOOP;  
          END CASE;  
        END LOOP;  
          
      --处理复合线构成的面;        
      WHEN 5 THEN   
        DBMS_LOB.APPEND(v_path,(' ' ||  TO_CHAR(v_ordinates(v_offset)) || ' ' ||  TO_CHAR(v_ordinates(v_offset + 1))));  
        v_subelem := v_interpret;  
        FOR k IN 1..v_subelem LOOP  
          i := i + 1;       
          v_offset   := v_elem_info(i) ;      
          i := i + 1;      
          v_etype    := MOD(v_elem_info(i),1000);      
          i := i + 1;       
          v_interpret:= v_elem_info(i);  
            
          CASE v_interpret               
     
            --处理复合面中的折线;      
            WHEN 1 THEN           
              IF i = v_count THEN       
                v_offend := v_ordinates.count();      
              ELSE  
                IF k = v_subelem THEN  
                  v_offend := v_elem_info(i+1) - 1;  
                ELSE  
                  v_offend := v_elem_info(i+1) + 1;  
                END IF;  
              END IF;  
              IF k>1 THEN   
                DBMS_LOB.APPEND(v_path, ' L');  
              END IF;  
              FOR j IN (v_offset + 2)..v_offend LOOP      
               DBMS_LOB.APPEND(v_path,( ' ' || TO_CHAR(v_ordinates(j))));      
              END LOOP;      
              
                   
            --处理复合面中的弧线;;      
            WHEN 2 THEN      
              IF i = v_count THEN       
                 v_offend := v_ordinates.count()- 5;      
              ELSE   
                IF k = v_subelem THEN   
                  v_offend := v_elem_info(i+1) - 6;   
                ELSE   
                  v_offend := v_elem_info(i+1) - 4;   
                END IF;  
              END IF;   
              j := v_offset;  
              --v_path := v_path || ' A';  
              WHILE j<= v_offend LOOP     
                DBMS_LOB.APPEND(v_path, arc_to_svgpath(v_ordinates(j)  ,v_ordinates(j+1),     
                                                   v_ordinates(j+2),v_ordinates(j+3),     
                                                   v_ordinates(j+4),v_ordinates(j+5),     
                                                   1));    
                j := j + 4;       
              END LOOP;  
          END CASE;  
        END LOOP;      
    END CASE;      
  END LOOP;       
  RETURN v_path;    
  /*  
EXCEPTION  
    WHEN OTHERS THEN  
         DBMS_OUTPUT.PUT_LINE( i || ',' || j || ',' ||  v_ordinates.COUNT() || ',' || v_elem_info.COUNT());  
  
         DBMS_OUTPUT.PUT_LINE( v_ordinates(j) || ',' || v_ordinates(j+1));  
         DBMS_OUTPUT.PUT_LINE (v_path);  
         RETURN NULL;  
         */  
end;
FUNCTION  arc_to_svgpath(x1 NUMBER,y1 NUMBER,  
                         x2 NUMBER,y2 NUMBER,  
                         x3 NUMBER,y3 NUMBER,  
                         is_arc NUMBER   
                         ) return CLOB    
AS        
v_path CLOB:='';       
cx     NUMBER;  --弧中心点坐标;     
cy     NUMBER;       
r      NUMBER;  --弧半径;     
s      NUMBER;      
s12    NUMBER;      
s13    NUMBER;    
m      NUMBER :=precision;       
begin        
  s   := 2 * ((x3 - x1)*(y2 - y1) -(x2 - x1)*(y3 - y1));      
  --DBMS_OUTPUT.PUT_LINE('S:' || S);     
  IF s> -1e-10 AND s<1e-10 THEN      
    IF is_arc = 1 THEN      
      v_path := ' L ' || x1 || ' ' || y1 ||' ' ||x3 || ' ' || y3;      
    END IF;      
    RETURN v_path;      
  END IF;      
  s12 := x1*x1 + y1*y1;      
  s13 := x3*x3 + y3*y3 - s12;      
  s12 := x2*x2 + y2*y2 - s12;      
  cx  :=  (s13*(y2 - y1) - s12*(y3 - y1))/s;      
  cy  := -(s13*(x2 - x1) - s12*(x3 - x1))/s;      
  r   := sqrt((x1 - cx)*(x1 - cx) + (y1 - cy)*(y1 - cy));       
  r   := round(r,4);    
  IF is_arc=1 THEN      
    S12 := (x3 - x1)*(cy - y1) - (cx - x1)*(y3 - y1);      
    v_path := ' A ' || r || ' ' || r || ' 0';      
    IF (s * s12) < 0 THEN       
      v_path := v_path || ' 0';      
    ELSE      
      v_path := v_path || ' 1';      
    END IF;      
    IF s>0 THEN      
      v_path := v_path || ' 0';      
    ELSE      
      v_path := v_path || ' 1';      
    END IF;      
    v_path := v_path || ' ' || x3 || ' ' || y3;            
  ELSE      
    v_path := ' ' || (cx - r) || ' ' || cy     
              || ' A ' || r || ' ' || r || ' 0 0 1 ' || (cx + r) || ' ' || cy        
              || ' A ' || r || ' ' || r || ' 0 0 1 ' || (cx - r) || ' ' || cy;        
  END IF;       
  RETURN v_path;        
end;
--  作者:nika
--  发布时间:4/6/2007 3:41:00 PM

--  
你给的网站一直上不去啊,我对Oracle Spatial应用方面也很感兴趣,能不能给我份程序参考一下,我的邮箱:zhy241@sina.com.cn
--  作者:zhou_gong
--  发布时间:8/14/2007 8:28:00 PM

--  
大家好,好久没有上网了,如谁需要原代码,与我联系,自我介绍我可以贡献出来.QQ185006613,zhou_gong_nn@163.com
--  作者:zhou_gong
--  发布时间:8/14/2007 8:37:00 PM

--  
下面是svg转换到GEOM格式的PL/SQL代码:
FUNCTION svgpath_to_geom(v_path  CLOB) RETURN SDO_GEOMETRY  
AS  
  v_geom        SDO_GEOMETRY;  
  v_geom1       SDO_GEOMETRY;  
  v_geom2       SDO_GEOMETRY;  
  v_elem_info   SDO_ELEM_INFO_ARRAY;      
  v_ordinates   SDO_ORDINATE_ARRAY;  
  v_xy_count    binary_integer;  
  v_path_len    binary_integer;  
  i             binary_integer;  
  j             binary_integer;  
  v_count1      binary_integer := 0;  
  v_count2      binary_integer := 0;  
  v_str         VARCHAR2(100);  
  v_command     char(1);  
  v_data_count  binary_integer;  
  x1            NUMBER;  --弧的起点;  
  y1            NUMBER;  
  x2            NUMBER;  --弧上点;  
  y2            NUMBER;  
  x3            NUMBER;  --弧的终点;  
  y3            NUMBER;  
  s             NUMBER;  --弧弦长度;  
  h             NUMBER;  --弧高度;  
  r             NUMBER;  --弧半径;  
  large_arc     NUMBER;  --大弧标志=1;  
  sweep_flag    NUMBER;  --顺时针方向=1;  
  m             binary_integer := precision;  
    
    
    
BEGIN  
  IF v_path IS NULL THEN  
    RETURN NULL;  
  END IF;  
  v_path_len := LENGTH(v_path);  
  IF v_path_len < 10 THEN  
     RETURN NULL;  
  END IF;  
  i     := 1;  
  IF get_svgdata(v_path,i) <> 'M' THEN  
    RETURN NULL;  
  END IF;  
  i := 1;  
  LOOP  
    v_str := get_svgdata(v_path,i);   
    EXIT WHEN v_str IS NULL;  
    IF v_str ='M' THEN   
      v_command := 'M';  
      IF v_elem_info IS NOT NULL THEN  
        v_geom := SDO_GEOM.SDO_XOR(v_geom,reform_geom(v_elem_info,v_ordinates),tolerance);  
      END IF;  
      v_elem_info := SDO_ELEM_INFO_ARRAY(1,0,1,1,2,1);  
      v_ordinates := SDO_ORDINATE_ARRAY();  
      v_xy_count  := 0;  
    ELSIF v_str = 'A' THEN  
      IF v_xy_count = 2 THEN  
        v_elem_info(v_elem_info(3)*3 + 3) := 2;  
      ELSIF v_xy_count <2 THEN  
        RETURN NULL;  
      ELSE   
        IF v_elem_info(v_elem_info(3)*3 + 3) = 1 THEN  
          v_elem_info(3) := v_elem_info(3) + 1;  
          v_elem_info.EXTEND(3);  
          v_elem_info(v_elem_info(3)*3 + 1) := v_xy_count - 1;  
          v_elem_info(v_elem_info(3)*3 + 2) := 2;  
          v_elem_info(v_elem_info(3)*3 + 3) := 2;      
        END IF;  
      END IF;  
      v_command := 'A';  
    ELSIF v_str = 'L' THEN  
      IF v_xy_count <2 THEN  
        RETURN NULL;  
      ELSE   
        IF v_elem_info(v_elem_info(3)*3 + 3) = 2 THEN  
          v_elem_info(3) := v_elem_info(3) + 1;  
          v_elem_info.EXTEND(3);  
          v_elem_info(v_elem_info(3)*3 + 1) := v_xy_count - 1;  
          v_elem_info(v_elem_info(3)*3 + 2) := 2;  
          v_elem_info(v_elem_info(3)*3 + 3) := 1;      
        END IF;  
      END IF;  
      v_command := 'L';  
    ELSIF v_str = 'Z' THEN  
      IF v_xy_count <2 THEN  
        RETURN NULL;  
      END IF;  
      IF    v_ordinates(1) <> v_ordinates(v_xy_count - 1)   
         OR v_ordinates(2) <> v_ordinates(v_xy_count )    THEN  
        IF v_elem_info(v_elem_info(3)*3 + 3) = 2 THEN  
          v_elem_info(3) := v_elem_info(3) + 1;  
          v_elem_info.EXTEND(3);  
          v_elem_info(v_elem_info(3)*3 + 1) := v_xy_count - 1;  
          v_elem_info(v_elem_info(3)*3 + 2) := 2;  
          v_elem_info(v_elem_info(3)*3 + 3) := 1;      
        END IF;  
        v_ordinates.EXTEND(2);  
        v_xy_count := v_xy_count + 1;  
        v_ordinates(v_xy_count) :=  v_ordinates(1);  
        v_xy_count := v_xy_count + 1;  
        v_ordinates(v_xy_count) :=  v_ordinates(2);          
      END IF;  
      v_command := 'Z';  
    ELSE  
      IF v_command = 'M' OR  v_command ='L' THEN  
        v_ordinates.EXTEND(2);  
        v_xy_count := v_xy_count + 1;  
        v_ordinates(v_xy_count) := TO_NUMBER(v_str);  
        v_xy_count := v_xy_count + 1;  
        v_ordinates(v_xy_count) := TO_NUMBER(get_svgdata(v_path,i));  
       -- DBMS_OUTPUT.PUT_LINE('M:' || x || ',' || y || 'len:' ||  v_ordinates.COUNT);  
      ELSIF v_command = 'A' THEN  
        x1 :=  v_ordinates(v_xy_count - 1);  
        y1 :=  v_ordinates(v_xy_count );      
        r          := TO_NUMBER(v_str);  
        v_str      := get_svgdata(v_path,i);  
        v_str      := get_svgdata(v_path,i);  
        large_arc  := TO_NUMBER(get_svgdata(v_path,i));   
        sweep_flag := TO_NUMBER(get_svgdata(v_path,i));  
        x3         := TO_NUMBER(get_svgdata(v_path,i));  
        y3         := TO_NUMBER(get_svgdata(v_path,i));  
          
        s          := SQRT((x3 - x1)*(x3 - x1) + (y3 - y1)*(y3 - y1));  
        IF s > r*2 THEN  
          r := s/2;  
          h := r;  
        ELSE  
          h := r - SQRT(r*r - s*s/4);  
          IF  large_arc = 1 THEN  
            h := 2*r - h;  
          END IF;  
        END IF;  
        IF sweep_flag = 1 THEN  
          x2 := (x1 + X3)/2 + h*(y3 - y1)/s;  
          y2 := (y1 + Y3)/2 - h*(x3 - x1)/s;  
        ELSE  
          x2 := (x1 + X3)/2 - h*(y3 - y1)/s;  
          y2 := (y1 + Y3)/2 + h*(x3 - x1)/s;  
        END IF;  
        v_ordinates.EXTEND(4);  
        v_xy_count := v_xy_count + 1;  
        v_ordinates(v_xy_count) := x2;  
        v_xy_count := v_xy_count + 1;  
        v_ordinates(v_xy_count) := y2;  
        v_xy_count := v_xy_count + 1;  
        v_ordinates(v_xy_count) := x3;  
        v_xy_count := v_xy_count + 1;  
        v_ordinates(v_xy_count) := y3;  
          
       -- DBMS_OUTPUT.PUT_LINE('A:' || r || ','|| x || ',' || y);  
      ELSE  
        RETURN NULL;  
      END IF;  
    END IF;   
  END LOOP;  
  --DBMS_OUTPUT.PUT_LINE(v_ordinates.COUNT);  
  v_geom := SDO_GEOM.SDO_XOR(v_geom,reform_geom(v_elem_info,v_ordinates),tolerance);  
  RETURN v_geom;  
END;  
  
  
FUNCTION reform_geom(v_elem_info IN OUT NOCOPY SDO_ELEM_INFO_ARRAY,v_ordinates IN OUT NOCOPY  SDO_ORDINATE_ARRAY) RETURN SDO_GEOMETRY  
AS  
  v_geom     SDO_GEOMETRY;  
  v_xy_count binary_integer;  
BEGIN  
      IF (v_elem_info IS NULL) OR (v_ordinates IS NULL) THEN  
        RETURN NULL;  
      ELSE  
        v_geom := SDO_GEOMETRY(NULL,NULL,NULL,NULL,v_ordinates);  
        v_xy_count := v_ordinates.COUNT;  
        IF     v_ordinates(1) = v_ordinates(v_xy_count - 1)   
           AND v_ordinates(2) = v_ordinates(v_xy_count )    THEN  
          v_geom.SDO_GTYPE := 2003;  
        ELSE   
          v_geom.SDO_GTYPE := 2002;  
        END IF;  
        IF v_elem_info(3)>1 THEN  
          IF v_geom.SDO_GTYPE = 2002 THEN  
             v_elem_info(2) := 4;  
          ELSE  
             v_elem_info(2) := 1005;  
          END IF;  
        ELSE  
          IF v_geom.SDO_GTYPE = 2002 THEN  
            v_elem_info(2) := 2;  
            v_elem_info(3) := v_elem_info(6);  
          ELSE  
            v_elem_info(2) := 1003;  
            v_elem_info(3) := v_elem_info(6);  
          END IF;  
          v_elem_info.TRIM(3);  
        END IF;  
        v_geom.SDO_ELEM_INFO := v_elem_info;  
        v_geom := SDO_GEOM.SDO_INTERSECTION(v_geom,max_shape,tolerance);  
        RETURN v_geom;  
      END IF;  
END ;  
  
FUNCTION get_svgdata(v_path  CLOB,pos IN OUT binary_integer) RETURN VARCHAR2  
AS  
  v_data VARCHAR2(100);  
  j      binary_integer;  
BEGIN  
  LOOP  
    j := INSTR(v_path, ' ',pos,1);  
    IF j = pos THEN  
      pos := pos + 1;  
    ELSE  
      EXIT;  
    END IF;  
  END LOOP;  
  IF j = 0 THEN  
    j :=LENGTH(v_path) + 1;  
  END IF;  
  v_data := SUBSTR(v_path,pos,(j - pos));  
  pos := j + 1;  
  RETURN v_data;  
END;
--  作者:frogbag
--  发布时间:10/17/2007 10:18:00 AM

--  给我一份,frogbag@163.com,谢谢
给我一份,frogbag@163.com,谢谢
--  作者:Tsinghua_shi
--  发布时间:10/23/2007 11:39:00 AM

--  
同等
--  作者:followicey1982
--  发布时间:10/23/2007 2:56:00 PM

--  
做的不错,能发一份给我吗?我也想研究一下,辛苦楼主    icey1982@163.com
--  作者:wjcumt001
--  发布时间:11/15/2007 9:20:00 AM

--  
网站一直上不去啊
--  作者:wjcumt001
--  发布时间:11/15/2007 9:23:00 AM

--  
关注
--  作者:hzrong123
--  发布时间:12/6/2007 2:52:00 PM

--  
请给我一份,hzrong123@163.com,不胜感激!
--  作者:ojahe
--  发布时间:8/10/2008 8:30:00 PM

--  
你好。能给我一份吗?谢谢!egreen88@sohu.com
--  作者:zpjdgp888
--  发布时间:8/12/2008 8:38:00 AM

--  
这贴子快2年了,被你挖出来这么回一句,我晕
--  作者:byterman
--  发布时间:9/2/2008 3:38:00 PM

--  
请给我一份,bytesman@163.com,不胜感激!
--  作者:mutian12345
--  发布时间:11/28/2008 12:04:00 AM

--  
mafengmei.fm@126.com 等待
--  作者:ccgk831
--  发布时间:7/4/2009 9:35:00 AM

--  
ccgk831@hostmail.com来一份
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
328.125ms