以文本方式查看主题

-  中文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=32265)


--  作者:zhou_gong
--  发布时间:5/13/2006 10:39:00 PM

--  [分享]基于SVG+XMLHTTP+ORACLE SPATIAL的WEBGIS基础平台实例
这是我的毕业论文实例.现在贡献出来,让有兴趣的朋友一起学习:http://www.9place.com:6677/svgmap
联系:zhou_gong_nn@163.com qq:185006613

--  作者:spears
--  发布时间:5/14/2006 4:59:00 PM

--  
哇,赞啊
--  作者:spears
--  发布时间:5/14/2006 5:00:00 PM

--  
怎么看不到地图
--  作者:zhou_gong
--  发布时间:5/14/2006 8:11:00 PM

--  
需要安装SVGView.exe插件才能看到图形.
--  作者:wangyan5118
--  发布时间:5/18/2006 11:01:00 AM

--  
你写的网址我打不开啊,我也要写这个方面的论文,希望高手指点一下
--  作者:zhou_gong
--  发布时间:5/23/2006 12:23:00 AM

--  
怎么没有多少人感兴趣呢.ORACLE SPATIAL是和数据库结合一起的GIS啊
--  作者:beijie
--  发布时间:5/23/2006 11:17:00 AM

--  
兄弟能不能把代码发一份   谢谢老
wybjie@21cn.com
--  作者:zhangjp999
--  发布时间:5/23/2006 1:04:00 PM

--  
兄弟,能否发份代码?zhou_gong_nn@163.com,不胜感激!
--  作者:zhou_gong
--  发布时间:5/23/2006 4:31:00 PM

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

--  作者:柯西
--  发布时间:5/23/2006 4:46:00 PM

--  
LZ厉害,
我要是能做多好啊
--  作者:柯西
--  发布时间:5/23/2006 5:06:00 PM

--  
以下是引用zhou_gong在2006-5-23 0:23:00的发言:
怎么没有多少人感兴趣呢.ORACLE SPATIAL是和数据库结合一起的GIS啊

大家还没看到呢其实~~LZ表心急~~


--  作者:zhou_gong
--  发布时间:5/23/2006 7:48:00 PM

--  
本人正在准备论文答辩,等答辩完会陆续整理公布所有的代码!
--  作者:zhou_gong
--  发布时间:5/24/2006 4:47:00 PM

--  
大地坐标系与SVG DOM屏幕坐标之间的变换
在SVG DOM里,显示给用户是的真实世界的坐标系,视图的放大、缩小、平移及对空间对象的创建、操作都是基于真实世界的坐标系。这要求设计出一套真实坐标与屏幕坐标之间变换。
在本 选项题中使用的大地坐标系是X轴向北,Y轴向东,称为(realX,realY),单位m,而SVG DOM有两套坐标系,一为屏幕坐标系,X轴向东(右),Y轴向南(下),下称为(clientX,clientY),单位px,原点(0,0)在SVG DOM视窗的左上角, 屏幕坐标系的位置是固定的。另一套坐标为用户坐标系,下称为(userX,userY),初始时, 用户坐标系与屏幕坐标系重叠一致(图12)。在SVG DOM 我们使用的是用户坐标系,通过对用户坐标系旋转、平移、缩放以到达能在SVG DOM的矩形视窗范围内显示用户关心的图象。

图 12    各种坐标系关系
可以看出,用户坐标系逆时针旋转90度后与大地坐标系一致,因此设定大地坐标系与用户坐标为1:1对应关系,现在要解决的是用户坐标系与屏幕坐标系之间的变换关系就行了。要在SVG DOM中显示大地坐标系中比例系数为s(px/m,1真实坐标单位m等于s个屏幕坐标单位px),左上角的大地坐标为(realX0,realY0),则用户坐标系必须做如下顺序变换(图 5-2):(1)平移(-realX0,-realY0);(2)放大S倍;(3)旋转(-90)度。参看图13所示。

图 13   大地坐标系与SVG DOM屏幕坐标系转换
在SVG的规范中,此变换由属性transform描述定义这种坐标变换:
transform=”rotate(-90) scale(S) translate(-realX0,-realY0)”
 三种坐标的关系为:
  realX = userX = realX0 - clientY/S;
  realY = userY = realY0 + clientX/S;
 几何解释为:SVG DOM当前呈现视图,左上角的位置是大地坐标(realX0,realY0),S个像素(px)相当于一个大地坐标单位(m)。 每次放大、缩小、平移视窗,都必须重新计算设置realX0,realY0及比例S,可动态维持大地坐标系与屏幕坐标系之间的映射对应关系。
--  作者:zhou_gong
--  发布时间:6/2/2006 2:21:00 PM

--  
大家需要设计原理和代码吗?
--  作者:luxiaochuan
--  发布时间:6/14/2006 9:41:00 AM

--  
没有呀!!!
--  作者:zhou_gong
--  发布时间:6/15/2006 12:04:00 AM

--  
不好意思,这段时间我北京答辩论文,单位里的服务器停了.因此大家看不到我做的网站,我会尽快恢复.
--  作者:Redsnow
--  发布时间:7/5/2006 3:13:00 PM

--  
需要,LZ发一份给我。Redsnow2003@tom.com
--  作者:ycth1984
--  发布时间:7/7/2006 4:50:00 PM

--  
我也很需要阿
能不能发份给我哈
youthchao1984@yahoo.com.cn
--  作者:keeponline
--  发布时间:7/7/2006 5:20:00 PM

--  
我也需要一份,谢谢!keeponline75@163.com
--  作者:magiclove
--  发布时间:7/10/2006 11:08:00 AM

--  
no thing!
--  作者:bin
--  发布时间:9/5/2006 10:04:00 PM

--  
给我也留一份,谢谢  ybzzhp@163.com
--  作者:gao1012
--  发布时间:9/12/2006 11:21:00 AM

--  
能不能把原理和代码也给我发一份啊?谢谢!
gao1012@126.com
--  作者:wuping0206
--  发布时间:9/25/2006 3:44:00 PM

--  
给我也发一份原理和代码吧!多谢多谢!   wuping_cb@yahoo.com.cn
--  作者:huangwanfu
--  发布时间:9/25/2006 9:16:00 PM

--  
谢谢了
我也想要一份
fiv_521@163.com
--  作者:baiyun_xu
--  发布时间:9/29/2006 8:44:00 PM

--  
能发一份代码给我吗学习学习 baiyun_xu@hotmail.com
--  作者:huangwanfu
--  发布时间:9/30/2006 9:42:00 AM

--  
fiv_521@163.com我也想要一份
--  作者:gao1012
--  发布时间:10/21/2006 9:31:00 PM

--  
能发我一份吗?谢谢!
gao1012@126.com
--  作者:rab63
--  发布时间:10/26/2006 10:51:00 AM

--  
SVG Fans!My God!

密切关注中!
qq:641978896
email:sxtone@163.com


--  作者:zhou_gong
--  发布时间:10/26/2006 10:31:00 PM

--  
谢谢大家的关注,一直没有时间重新开发WEB服务器,真是不好意思了.给你们一份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;

--  作者:collar_lu
--  发布时间:11/1/2006 10:10:00 AM

--  
我也需要一份
luzhihao@sf-auto.com
--  作者:duduhap
--  发布时间:11/14/2006 11:18:00 AM

--  
能发我一份吗? wendy.li.heb@gmail.com 谢谢!
--  作者:tianxian80
--  发布时间:11/22/2006 8:18:00 AM

--  
能把原理和代码给我发一份吗,谢谢!linanhljdq@126.com     QQ:504975032
--  作者:hahb
--  发布时间:12/17/2006 9:41:00 AM

--  
能给我一份吗?网站打不开
hahb@21cn.com
--  作者:fangjunlxj
--  发布时间:12/22/2006 12:03:00 AM

--  
不错,
兄弟,能否发份代码及整个设计的完整分析么?fangjun83049@126.com,不胜感激!

--  作者:msnow
--  发布时间:12/25/2006 10:56:00 AM

--  
给我也发一份啊  hswmxr@tom.com  谢谢!
--  作者:lengyuye3
--  发布时间:12/27/2006 4:01:00 PM

--  
能把原理和代码给我发一份吗,谢谢!hziee_yxj@163.com
--  作者:zhou_gong
--  发布时间:1/23/2007 1:26:00 PM

--  
大家好,网站终于重新开通了:HTTP://222.216.109.154:7799/
欢迎大家与大家交流,QQ:185006613,zhou_gong_nn@163.com
注:使用前必须安装SVG插件(ADOBE公司的)
--  作者:fangxu1979
--  发布时间:3/26/2007 9:39:00 AM

--  
lz能给我发一份源码么?谢谢了!
我的信箱是fangxu1979@163.com
--  作者:fangjunfj
--  发布时间:3/26/2007 10:46:00 PM

--  
不错! 学习!想学习参考下!
楼主:能否发分代码呀到fangjun83049@126.com
      不胜感激!
--  作者:icey1982
--  发布时间:6/13/2007 4:00:00 PM

--  
能给我一份原理和代码吗?我想学习一下,万分感谢!!  邮箱 icey1982@163.com
--  作者:华山之颠
--  发布时间:6/13/2007 11:27:00 PM

--  
ghmlww@163.com,谢谢lz
--  作者:样条
--  发布时间:6/14/2007 11:30:00 AM

--  
仰视楼主,渴望垂爱,pengkaiquan@tom.com静候
--  作者:rodychan
--  发布时间:6/15/2007 11:01:00 AM

--  
楼主是好人哪,我也要,rodychan@163.com,谢谢!
--  作者:纷纷0212
--  发布时间:6/28/2007 11:26:00 AM

--  
能否发一份到我的邮箱,lwf0543@163.com,谢谢!
--  作者:zhengminxin
--  发布时间:6/29/2007 11:44:00 AM

--  
LZ的网站还是打不开.
--  作者:frogbag
--  发布时间:10/17/2007 9:16:00 AM

--  给我一份,frogbag@163.com
支持
--  作者:followicey1982
--  发布时间:10/23/2007 3:18:00 PM

--  
支持,能给我一份吗,楼主辛苦   icey1982@163.com
--  作者:colin190
--  发布时间:7/20/2009 11:43:00 PM

--  
楼主能给我发一份原理和代码么 很需要谢谢呀
colin190@163.com

--  作者:zhaling
--  发布时间:3/15/2010 4:28:00 PM

--  
楼主,小妹的论文也是有关SVG的。最近遇到坐标转换的问题!在网上看到楼主的帖子,真的是雪中送碳啊!不知道楼主现在还保留着源代码没?希望楼主也能发一份给我!邮箱:yuzhong0920@163.com.
谢谢啦!希望能与楼主多交流交流
--  作者:hjx_221
--  发布时间:3/16/2010 8:42:00 AM

--  
上传过来,大家就可以分享了
谢谢!!
--  作者:zhaling
--  发布时间:3/16/2010 4:43:00 PM

--  
你好!最近在学这方面的东西!希望楼主也能发我一份!谢谢!
我的邮箱是yuzhong0920@163.com
--  作者:hpj123good
--  发布时间:5/24/2010 9:11:00 AM

--  
你好,我在做GML到SVG的转换,没有经验,能请教下你吗?我的邮箱:hpj123good@yahoo.com.cn
谢谢
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
226.563ms