新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论SVG, GML, X3D, VRML, VML, XAML, AVALON, Batik等基于XML的图形技术,以及有关GIS的应用。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - 高级XML应用『 SVG/GML/VRML/X3D/XAML 』 → 基于SVG+XMLHTTP+ORACLE SPATIAL的WEBGIS基础平台实例新址[分享] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 46355 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 基于SVG+XMLHTTP+ORACLE SPATIAL的WEBGIS基础平台实例新址[分享] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     zhou_gong 帅哥哟,离线,有人找我吗?
      
      等级:大二期末(汇编考了97分!)
      文章:36
      积分:373
      门派:XML.ORG.CN
      注册:2005/8/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zhou_gong发送一个短消息 把zhou_gong加入好友 查看zhou_gong的个人资料 搜索zhou_gong在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zhou_gong的博客楼主
    发贴心情 基于SVG+XMLHTTP+ORACLE SPATIAL的WEBGIS基础平台实例新址[分享]

    大家好,网站终于重新开通了:HTTP://222.216.109.154:7799/
    欢迎大家与大家交流,QQ:185006613,zhou_gong_nn@163.com
    注:使用前必须安装SVG插件(ADOBE公司的)
    此主题相关图片如下:
    按此在新窗口浏览图片

       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/26 6:31:00
     
     zhou_gong 帅哥哟,离线,有人找我吗?
      
      等级:大二期末(汇编考了97分!)
      文章:36
      积分:373
      门派:XML.ORG.CN
      注册:2005/8/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zhou_gong发送一个短消息 把zhou_gong加入好友 查看zhou_gong的个人资料 搜索zhou_gong在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zhou_gong的博客2
    发贴心情 
    难道没有人对此技术的实现感兴趣吗?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/2/22 10:19:00
     
     hiker365 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:60
      门派:XML.ORG.CN
      注册:2007/1/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hiker365发送一个短消息 把hiker365加入好友 查看hiker365的个人资料 搜索hiker365在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hiker365的博客3
    发贴心情 
    做的不错,我的毕业设计也做这个,能说说你是怎么做的吗?
    用了那些技术,看那些资料呢?
    能把一些相关的资料贴出来吗?
    或发给我一份:hiker365@163.com
    非常感谢了!有时间可以交流一下
    -----------------
    学了一段时间的orcale SPATIAL 感觉这个很难呀!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/14 23:48:00
     
     zhou_gong 帅哥哟,离线,有人找我吗?
      
      等级:大二期末(汇编考了97分!)
      文章:36
      积分:373
      门派:XML.ORG.CN
      注册:2005/8/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zhou_gong发送一个短消息 把zhou_gong加入好友 查看zhou_gong的个人资料 搜索zhou_gong在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zhou_gong的博客4
    发贴心情 
    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,生日值,面积,周长

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/15 8:11:00
     
     hiker365 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:60
      门派:XML.ORG.CN
      注册:2007/1/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hiker365发送一个短消息 把hiker365加入好友 查看hiker365的个人资料 搜索hiker365在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hiker365的博客5
    发贴心情 
    我的毕业设计和这个相比要简单多了,只要把orcale spatial中的图形用svg显示出来就行了。orcale spatial建表存图形我会了但是如何生成svg不知到怎么办,还没有思路,你能给我一些指点吗?我该看那些方面的资料呢?
    谢谢!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/15 12:40:00
     
     zhou_gong 帅哥哟,离线,有人找我吗?
      
      等级:大二期末(汇编考了97分!)
      文章:36
      积分:373
      门派:XML.ORG.CN
      注册:2005/8/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zhou_gong发送一个短消息 把zhou_gong加入好友 查看zhou_gong的个人资料 搜索zhou_gong在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zhou_gong的博客6
    发贴心情 
    下面是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;
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/28 8:17:00
     
     nika 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2007/4/6

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给nika发送一个短消息 把nika加入好友 查看nika的个人资料 搜索nika在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看nika的博客7
    发贴心情 
    你给的网站一直上不去啊,我对Oracle Spatial应用方面也很感兴趣,能不能给我份程序参考一下,我的邮箱:zhy241@sina.com.cn
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/6 15:41:00
     
     zhou_gong 帅哥哟,离线,有人找我吗?
      
      等级:大二期末(汇编考了97分!)
      文章:36
      积分:373
      门派:XML.ORG.CN
      注册:2005/8/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zhou_gong发送一个短消息 把zhou_gong加入好友 查看zhou_gong的个人资料 搜索zhou_gong在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zhou_gong的博客8
    发贴心情 
    大家好,好久没有上网了,如谁需要原代码,与我联系,自我介绍我可以贡献出来.QQ185006613,zhou_gong_nn@163.com
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/8/14 20:28:00
     
     zhou_gong 帅哥哟,离线,有人找我吗?
      
      等级:大二期末(汇编考了97分!)
      文章:36
      积分:373
      门派:XML.ORG.CN
      注册:2005/8/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zhou_gong发送一个短消息 把zhou_gong加入好友 查看zhou_gong的个人资料 搜索zhou_gong在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zhou_gong的博客9
    发贴心情 
    下面是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;
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/8/14 20:37:00
     
     frogbag 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:5
      积分:88
      门派:XML.ORG.CN
      注册:2005/12/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给frogbag发送一个短消息 把frogbag加入好友 查看frogbag的个人资料 搜索frogbag在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看frogbag的博客10
    发贴心情 给我一份,frogbag@163.com,谢谢
    给我一份,frogbag@163.com,谢谢
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/10/17 10:18:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/27 22:22:45

    本主题贴数20,分页: [1] [2]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    2,921.875ms