Flyingis

Talking and thinking freely !
Flying in the world of GIS !
随笔 - 156, 文章 - 16, 评论 - 589, 引用 - 0
数据加载中……

2006年6月30日

Flyingis on BlogJava 停止更新

    文章在多个博客间来回拷贝切换比较麻烦,我写博客比较注重排版,格式调整也花费了不少时间,并且多个博客使得大家的讨论也分散在不同的地方,因此今后BlogJavaJavaEye上的文章停止更新(已经停止一段时间了),感谢大家一直以来的关注,今天是愚人节,但这条消息是正式声明:)

    博客园上继续保持更新,请访问:

    http://www.cnblogs.com/flyingis

    欢迎拍砖交流!

    Flyingis

posted @ 2008-04-01 11:01 Flyingis 阅读(2141) | 评论 (1)编辑 收藏

ArcGIS 9.2 SP4 补丁升级

    最近一直在出差,今天发现ArcGIS 9.2 sp4补丁已经出来了,打破了9.0三个补丁包的记录及单位时间内的补丁密度:)。如果是全新的应用系统,请直接升级,否则先参考这两篇说明:

    A complete list of the issues that have been fixed in this service pack is available here.
    A list of the main enhancements that have been made in the 9.2 Service Packs is available here.

    确认需要打上sp4补丁?那就开始吧:所有sp4补丁链接

    ArcGIS 9.2每次释放出的补丁不仅解决了许多已发现的bug,更是在功能、文档方面做了大量的改进,所以现在准备开发或正在开发的应用系统都应该尽量升级到最新补丁,避免被一些无厘头的问题扯了后腿。

posted @ 2007-12-11 23:13 Flyingis 阅读(3510) | 评论 (8)编辑 收藏

跨网段部署 ArcGIS Desktop 浮动 License

    如果单独在服务器上部署ArcGIS桌面浮动License,一般的都需要处理防火墙端口问题,这种环境在校园机房中最为典型,9.x版本需要开放27004端口,这样所有机器都可以访问到服务器上的License,但是在跨网段环境中,还需要额外的处理。

    使用Windows XP/2003自带的防火墙,除了开发27004 TCP端口外,还应将lmgrd.exe、ARCGIS.exe添加到例外程序中,其他商业防火墙同样需要放开这两个程序的访问控制,否则将无法连接到License服务器。

    如果使用的是第三方防火墙,如瑞星、天网,则只需开放27004/tcp端口。

posted @ 2007-12-11 23:12 Flyingis 阅读(2316) | 评论 (0)编辑 收藏

远程连接 SuSE Linux 设置方法

    作者:Flyingis

    且不说远程连接的便利性,就是机房里那轰轰的高分贝就足以让你的耳膜形成习惯性振动,何况还需要集中精神工作呢,在网络带宽允许的情况下,还是选择远程吧。远程连接的客户端工具有很多,有商业的如Symantec pcAnywhere等,但我用的最多的还是Xmanager、VNC、Windows自己的远程连接工具、还有Telnet,和Windows环境一样,默认情况下远程连接是没有打开的,连接SuSE Linux服务器就需要做一些设置,其他Linux服务器相仿。

    Xmanager

1. 编辑 '/etc/opt/kde3/share/config/kdm/kdmrc' file in config section '[XDMCP]'
    更改"Enable=false" to "Enable=true",将port=177的屏蔽去掉。

2. 编辑 '/etc/sysconfig/displaymanager'
    更改'DISPLAYMANAGER_REMOTE_ACCESS="no"' to 'DISPLAYMANAGER_REMOTE_ACCESS="yes"'

    然后使用rcxdm restart命令来重启xdm服务,一定要有/opt/kde3/bin/kdm进程存在,如果没有使用rcxdm restart命令看看是否能重启服务,并且用netstat -a |grep xdm来看看端口是否在listen。

    或者是,YAST中的Network Service打开Remote Administration,然后运行rcxdm restart。

    VNC

    用root用户更改/root/.vnc下的xstart文件,然后注释最后一行,再加上gnome - session &

    执行vncstart,这样就可以通过VNC连接了,如果不更改xstart文件,也可以通过vncstart打开VNC连接,但在客户端连接后出现的是命令行窗口,和ssh类似。

posted @ 2007-10-19 13:20 Flyingis 阅读(4477) | 评论 (0)编辑 收藏

分布式部署 ArcSDE 和 Oracle 服务

     摘要: 经常辗转于各种服务器之间,漂浮于各种主流操作系统(AIX/Solaris/SuSE/RH/Windows)之上,被Windows惯坏了之后面对其他环境时经常会发现自己才疏学浅,有时间还是要恶补一下这些笔记,否则下次自己又忘了~~  阅读全文

posted @ 2007-10-14 22:43 Flyingis 阅读(4159) | 评论 (1)编辑 收藏

高效率编辑器 VIM-操作篇[转载]

原文链接:http://jmcpherson.org/editing.html
翻译链接:http://linuxtoy.org/archives/efficient-editing-with-vim.html


这篇教程写了在不同工作模式下使用 VIM 的一些基本技巧——即插入模式(insert mode), 命令模式(command mode), 存取文件等。目的是帮助刚刚接触 VIM 的新手更加有效率的使用这个出色的编辑器。

说明:在这篇文章里面,<C-X> 代表 Ctrl + X——就是按住 Ctrl 键然后再按 X。而且你可以在很多情况下使用 :help command 来获得大部分命令的帮助,这个是 VIM 的内部帮助文件命令。


高效率移动

在插入模式之外

基本上来说,你应该尽可能少的呆在插入模式里面,因为在插入模式里面 VIM 就像一个“哑巴”编辑器一样。很多新手都会一直呆在插入模式里面,因为这样易于使用。但 VIM 的强大之处在于他的命令行模式!你会发现,在你越来越了解 VIM 之后,你就会花越来越少的时间使用插入模式了。

使用 h、j、k、l

使用 VIM 高效率编辑的第一步,就是放弃使用箭头键。使用 VIM,你就不用频繁的在箭头键和字母键之间移来移去了,这会节省你很多时间。当你在命令模式时,你可以用 h、j、k、l 来分别实现左、下、上、右箭头的功能。一开始可能需要适应一下,但一旦习惯这种方式,你就会发现这样操作的高效之处了。

在你编辑你的电子邮件或者其他有段落的文本时,你可能会发现使用方向键和你预期的效果不一样,有时候可能会一次跳过了很多行。这是因为你的段落在 VIM 看来是一个大的长长的行。这时你可以在按 h、j、k 或者 l 之前键入一个 g,这样 VIM 就会按屏幕上面的行如你所愿的移动了。

在当前行里面有效的移动光标

很多编辑器只提供了简单的命令来控制光标的移动(比如左、上、右、下、到行首/尾等)。VIM 则提供了很多强大的命令来满足你控制光标的欲望。当光标从一点移动到另外一点,在这两点之间的文本(包括这两个点)称作被“跨过”,这里的命令也被称作是 motion。(简单说明一下,后面会用到这个重要的概念)

这里是常用到的一些命令(motion):

  • fx:移动光标到当前行的下一个 x 处。很明显,x 可以是任意一个字母,而且你可以使用 ; 来重复你的上一个 f 命令。
  • tx:和上面的命令类似,但是是移动到 x 的左边一个位置。(这真的很有用)
  • Fx:和 fx 类似,不过是往回找。
  • w:光标往前移动一个词。
  • b:光标往后移动一个词。
  • 0:移动光标到当前行首。
  • ^:移动光标到当前行的第一个字母位置。
  • $:移动光标到行尾。
  • ):移动光标到下一个句子。
  • ( :移动光标到上一个句子。

在整个文件里面有效移动光标

VIM 有很多命令,可以用来到达文件里面你想到达的地方。下面是一些在文件里面移动的命令:

  • <C-F>:向下移动一屏。
  • <C-B>:向上移动一屏。
  • G:到文件尾
  • numG:移动光标到指定的行(num)。(比如 10G 就是到第 10 行)
  • gg:到文件首
  • H:移动光标到屏幕上面
  • M:移动光标到屏幕中间
  • L:移动光标到屏幕下面
  • *:读取光标处的字符串,并且移动光标到它再次出现的地方。
  • #:和上面的类似,但是是往反方向寻找。
  • /text:从当前光标处开始搜索字符串 text,并且到达 text 出现的地方。必须使用回车来开始这个搜索命令。如果想重复上次的搜索的话,按 n。
  • ?text:和上面类似,但是是反方向。
  • ma:在当前光标的位置标记一个书签,名字为 a。书签名只能是小写字母。你看不见书签的存在,但它确实已经在那里了。
  • `a:到书签 a 处。注意这个不是单引号,它一般位于大部分键盘的 1 的左边。
  • `.:到你上次编辑文件的地方。这个命令很有用,而且你不用自己去标记它。

高效的输入

使用关键词自动完成

VIM 有一个非常漂亮的关键词自动完成系统。这表示,你可以输入一个长词的一部分,然后按一下某个键,然后 VIM 就替你完成了这个长词的输入了。举个例子:你有一个变量名为 iAmALongAndAwkwardVarName 在你写的代码的某个地方。也许你不想每回都自己一个一个字母的去输入它。

使用关键词自动完成功能,你只需要输入开始几个字母(比如 iAmAL),然后按 <C-N>(按住 Ctrl,再按 N)或者 <C-P>。如果 VIM 没有给出你想要的词,继续按,直到你满意为止,VIM 会一直循环它找到的匹配的字符串。

聪明的进入插入模式

很多新手进入插入模式都只是用 i。这样当然可以进入插入模式,但通常不是那么合适,因为 VIM 提供了很多进入插入模式的命令。下面是最常用的一些:

  • i:在当前字符的左边插入
  • I:在当前行首插入
  • a:在当前字符的右边插入
  • A:在当前行尾插入
  • o:在当前行下面插入一个新行
  • O:在当前行上面插入一个新行
  • c{motion}:删除 motion 命令跨过的字符,并且进入插入模式。比如:c$,这将会删除从光标位置到行尾的字符并且进入插入模式。ct!,这会删除从光标位置到下一个叹号(但不包 括),然后进入插入模式。被删除的字符被存在了剪贴板里面,并且可以再粘贴出来。
  • d{motion}:和上面差不多,但是不进入插入模式。

有效的移动大段的文本

使用可视选择(visual selections)和合适的选择模式

不像最初的 VI,VIM 允许你高亮(选择)一些文本,并且进行操作。这里有三种可视选择模式:

  • v:按字符选择。经常使用的模式,所以亲自尝试一下它。
  • V:按行选择。这在你想拷贝或者移动很多行的文本的时候特别有用。
  • <C-V>:按块选择。非常强大,只在很少的编辑器中才有这样的功能。你可以选择一个矩形块,并且在这个矩形里面的文本会被高亮。

在选择模式的时候使用上面所述的方向键和命令(motion)。比如,vwww,会高亮光标前面的三个词。Vjj 将会高亮当前行以及下面两行。

在可视选择模式下剪切和拷贝

一旦你高亮了选区,你或许想进行一些操作:

  • d:剪贴选择的内容到剪贴板。
  • y:拷贝选择的内容到剪贴板。
  • c:剪贴选择的内容到剪贴板并且进入插入模式。

在非可视选择模式下剪切和拷贝

如果你很清楚的知道你想拷贝或者剪切什么,那你根本就不需要进入可视选择模式。这样也会节省时间:

  • d{motion}:剪切 motion 命令跨过的字符到剪贴板。比如,dw 会剪切一个词而 dfS 会将从当前光标到下一个 S 之间的字符剪切至剪贴板。
  • y{motion}:和上面类似,不过是拷贝。
  • c{motion}:和 d{motion} 类似,不过最后进入插入模式。
  • dd:剪切当前行。
  • yy:拷贝当前行。
  • cc:剪切当前行并且进入插入模式。
  • D:剪切从光标位置到行尾到剪贴板。
  • Y:拷贝当前行。
  • C:和 D 类似,最后进入插入模式。
  • x:剪切当前字符到剪贴板。
  • s:和x类似,不过最后进入插入模式。

粘贴

粘贴很简单,按 p。

使用多重剪贴板

很多编辑器都只提供了一个剪贴板。VIM 有很多。剪贴板在 VIM 里面被称为寄存器(Registers)。你可以列出当前定义的所有寄存器名和它们的内容,命令为“:reg”。最好使用小写字母来作为寄存器的名称,因为大写的有些被 VIM 占用了。

使用寄存器的命令为双引号 “。

比如:我们要拷贝当前行到寄存器 k。你应该按 “kyy。(你也可以使用 V”ky。为什么这样也可以呢?)现在当前行应该已经存在了寄存器 k 里面直到你又拷贝了一些东西进入寄存器 k。现在你可以使用命令 “kp 来粘贴寄存器 k 里面的内容到你想要的位置。

避免重复

令人惊奇的 . 命令

在 VI 里面,输入 . (小数点符号),将会重复你输入的上一个命令。比如,你上个命令为“dw”(删除一个词),VI 将会接着再删除一个词。

使用数字

使用数字也是 VIM 强大的而且很节省时间的重要特性之一。在很多 VIM 的命令之前都可以使用一个数字,这个数字将会告诉 VIM 这个命令需要执行几次。比如:

  • 3j 将会把光标向下移动三行。
  • 10dd 将会删除十行。
  • y3″ 将会拷贝从当前光标到第三个出现的引号之间的内容到剪贴板。

数字是扩展 motion 命令作用域非常有效的方法。

记录宏

有时候,你会发现你自己在文章的每段或者每行都重复相同的一系列动作。VIM 允许你记录一个宏来完成你的特殊需要。

  • qregister:记录宏到寄存器 register,这里 register 是任意的你的寄存器的名字。比如 qa,将会记录并且把宏存在寄存器 a 里面。
  • q:结束宏的记录。
  • @register:使用存在寄存器 register 的宏。比如 @a,将会使用存在寄存器 a 里面的宏。

必须要记住的是,宏只记录了你的系列按键并且重复执行它们。它们不是魔法。因为在 VIM 里面完成目的的方法有很多,所以有时候你要小心选择命令来记录你的宏。因为它们会在所有你要执行它的地方执行。

用 VIM 写代码

VIM 是一个用来写代码的绝好编辑器,因为它有一些特性是专门为程序员而设计的。这里是一些常用的:

  • ]p:和 p 的功能差不多,但是它会自动调整被粘贴的文本的缩进去适应当前代码的位置。试一下!
  • %:匹配花括号、方括号、括号等。在一个括号的上面,然后按 %,鼠标就会出现在匹配的另外一半括号处。
  • >>:缩进所有选择的代码
  • <<:和上面类似,但是反缩进
  • gd:到达光标所在处函数或者变量的定义处。
  • K:在 Man 里面查找光标当前所在处的词。

posted @ 2007-09-16 14:10 Flyingis 阅读(3408) | 评论 (0)编辑 收藏

AIX 和 Linux 基于 NFS 实现共享

     摘要: 这是ArcIMS在SuSE和AIX(1 suse+n aix)上分布式部署时的一个细节。  阅读全文

posted @ 2007-09-12 14:47 Flyingis 阅读(4458) | 评论 (0)编辑 收藏

又一个升级补丁引发的 arcgisserver cache 问题

    成功创建了地图cache或将arcgis server补丁升级到最新版本后,出现arcgis catalog及web应用程序不能识别的情况,这是由于arcgis桌面软件和arcgis server的补丁不是同一个版本造成的,如server已经升级到9.2 sp3,arcgis desktop还是sp2,解决方法就是将软件补丁版本同步。

    大家都知道不同版本的ArcGIS软件不能安装在同一台计算机上,如Desktop 9.1和ArcGIS Engine 9.2不能共存,在一台计算机上必须保证版本一致,其实同一版本下的补丁也是一样,ESRI官方网站释放出补丁时都会有说明,所以尽量不要被这种问题拖了后腿:)

posted @ 2007-09-07 18:04 Flyingis 阅读(2406) | 评论 (0)编辑 收藏

升级 ArcGIS Server 9.2 sp3 补丁

    作者:Flyingis

    下午花了一个半小时打上了ArcGIS 9.2 sp3全套补丁,现在ESRI发布补丁的速度大大快于以往,打补丁的速度越来越慢,这从侧面反应出了程序存在的bug,但相对于9.2刚刚发步的时候,现在sp3已经完善许多了。

    ArcGIS Server 9.2 sp3解决了不少问题,强烈推荐最新使用server开发的项目先打上补丁,原有的9.2程序也可以运行在新补丁的环境中,暂时没碰到什么问题,但是如果做了大量的cache,升级sp3补丁的时候就需要注意了!

    因为server补丁升级后会进行post installation,重新指定arcgisserver目录,该目录下所有文件的权限都会进行一次更新,如果之前生成了大量cache,更新权限会消耗大量的时间和计算机资源,以至于感觉计算机宕机,因此需要采用其他办法来解决这个问题——偷梁换柱,再换回:)

1.停止server服务。
2.重命名现有的arcgisserver文件夹。
3.进行post installation,注销重新登录计算机,再次停止server服务(post后服务会自动启动)。
4.删除post后生成cache目录。
5.将原来arcgisserver备份文件夹中的cache目录移动到post生成的arcgisserver目录中。
6.重新启动server服务。

    OK,这样就省事了。

    参考:ESRI Support, Article ID 32766

posted @ 2007-09-04 16:45 Flyingis 阅读(2829) | 评论 (1)编辑 收藏

ArcGIS Server 开发系列(二)--Web ADF 编程

     摘要: 目标:
根据查询语句实现图层信息查询
准备工作:
1.Windows XP sp2中/英文版
2.Visual Studio 2005中/英文版
3.ArcGIS Server 9.2(我打上了sp2补丁),创建一个ArcGIS Server服务,Map Server属性中更改Pooling,使用池化连接方式,Progresses选择“In a seperate process for each instance(high isolation)”,我的服务为“World”
4.利用vs2005创建一个模板server应用--Web Mapping Application,并更改MapResourceManager属性  阅读全文

posted @ 2007-08-14 13:55 Flyingis 阅读(7110) | 评论 (10)编辑 收藏

ArcGIS Server 开发系列(一)--编程框架总览

     摘要: 理论性的描述总是让人觉得有点枯燥,但是做ArcGIS Server编程,不论是用.Net ADF还是Java ADF,都需要对Server开发的基本框架有所了解,这样在后面的代码编写中才能逐步理解这些架构的设计思想。  阅读全文

posted @ 2007-08-09 15:54 Flyingis 阅读(6506) | 评论 (2)编辑 收藏

ESRI 发布 ArcGIS 9.2 sp3

    很准时,2007年8月1日ESRI发布了ArcGIS 9.2 sp3补丁,相对于美国时间就是7月的最后一天,大家可以到ESRI官方网站上去下载,至于补丁所包含最新的改进可以参考上篇文章:http://www.blogjava.net/flyingis/archive/2007/07/17/130822.html

posted @ 2007-08-07 15:28 Flyingis 阅读(2483) | 评论 (0)编辑 收藏

ArcGIS 9.2 Service Pack 3 - Announcement

     摘要: ESRI网站上已经帖出ArcGIS 9.2 sp3的说明,提供下载的时间就是本月底了,看看有哪些更新。
http://support.esri.com/index.cfm?fa=downloads.patchesServicePacks.viewPatch&PID=17&MetaID=1319  阅读全文

posted @ 2007-07-17 14:26 Flyingis 阅读(11040) | 评论 (0)编辑 收藏

AE92 for Java 中手动释放 COM 对象

    作者:Flyingis 

    用Java进行ArcEngine或ArcGIS Server开发,在底层实际上是用Java调用AO COM对象,ESRI用Jintegra库来解决Java对COM的调用问题,如果Java对象不再使用,Java虚拟机会自动将这些对象回收,然后 Jintegra将这些对象所指的实际COM对象销毁,默认情况下时间间隔是10秒,对于快速大量调用COM对象的操作来说,如在循环中,COM对象往往得不到及时的销毁,以至于内存报错,这时我们需要手动销毁COM。

    Jintegra释放方法:

    com.linar.jintegra.Cleaner.release(objectRef);

    在ArcEngine和ArcGIS Server中如何释放COM呢?Jintegra为ArcObjects生成了一组proxy类,可以参考com.esri.arcgis.interop命名空间,经常用的是 com.esri.arcgis.interop.Cleaner,它的release(java.lang.Object anObject)和releaseAll()用来释放指定的或所有的COM对象,同时可以为COM连接和释放增加监听, addConnectionListener(ConnectionListener listener)和allUnreferencedListener(Unreferenced listener)。

    同时可以参考:

    HowTo:  Explicitly release a COM object accessed in a Java application
    J-Integra for COM Document
    Garbage Collection: Releasing Java References to COM Objects
    Java调用COM的中间件Jintegra初探

posted @ 2007-07-09 14:10 Flyingis 阅读(3672) | 评论 (1)编辑 收藏

ArcIMS[err0143] 解决方法

     摘要: "Unable to display mapservice:[err0143] server not available for service ...",这是出现错误时网页的提示,应该如何解决这个问题呢?请继续往下看……  阅读全文

posted @ 2007-06-29 13:49 Flyingis 阅读(4486) | 评论 (0)编辑 收藏

ArcGIS Server 体系结构

     摘要: ArcGIS Server包含两个重要部分,一个是ArcGIS Server服务器端(SOM/SOCs),另外就是用于客户端开发的ADF(Application Developer Framework)程序集,包括adf for java和adf for .net。在掌握ArcGIS Server开发之前,先看看ArcGIS Server的体系架构。  阅读全文

posted @ 2007-06-29 09:20 Flyingis 阅读(5728) | 评论 (3)编辑 收藏

ArcGIS Desktop 9.2 非版本编辑

    作者:Flyingis

    ArcGIS Desktop 9.2开始支持非版本编辑,和标准的数据库事务处理一样,ArcSDE非版本编辑直接对原数据进行编辑,非版本编辑的session不保存任何对数据的更改,在ArcMap中对数据start edit,然后对数据进行增、删、改,或是修改属性信息,完成后执行save edit就可以将Geodatabase中的数据直接更新,否则edit session without saving放弃之前的修改。在这种模式下处理数据会存在一些问题,如当某一段编辑过程中出现问题时不能放弃或恢复修改,要么只能退出整个session的编辑放弃所有的修改。

    使用ArcSDE非版本编辑可以针对简单数据进行处理--点、线、面、注记、relationship,如果feature class存在于拓扑或网络中,则不能进行编辑。

    ArcMap中进行非版本编辑需要注意:

    1.数据已经registered with the geodatabase

    所有ArcGIS Desktop创建的数据会自动registered with the geodatabase,只有当数据是在ArcGIS Desktop外创建时(如sdetable命令创建)才需要手动注册。一般我们可以在ArcCatalog中看到空间数据的Register with Geodatabase为灰色的。

    2.数据没有registered as versioned

    如果数据已经注册为版本,可以unregister as versioned,这时之前该版本中没有提交的数据会丢失。

    3.配置ArcMap编辑进程的属性

    取消“Edit a version of the database with the ability to undo and redo”选项。

    编辑非版本Geodatabase数据库中的数据,需要注意DBMS的一些特性:同步与锁、隔离机制、数据完整性等,以后再说吧。

posted @ 2007-06-25 22:49 Flyingis 阅读(2882) | 评论 (3)编辑 收藏

[Design Pattern] The Factory Pattern

     摘要: 对工厂模式的重复罗嗦,用Factory生产Thinkpad。  阅读全文

posted @ 2007-06-17 15:01 Flyingis 阅读(3603) | 评论 (2)编辑 收藏

SuSE 9.1 平台 ArcIMS(JRE) 中文显示解决方案

     摘要: 最初以为是操作系统的字体显示问题,但SuSE9.1本身是包含中文字体的,很容易让我们想到了JRE。

文章标题为《SuSE 9.1 平台 ArcIMS 中文显示解决方案》,ArcIMS运行于JRE环境之上,因此问题的根本在于SuSE9.1平台下JRE运行时环境的中文显示,通过文中介绍的方案可以解决SuSE9.1操作系统中运行于JRE之上的所有应用程序的中文显示问题,如ArcIMS Author打开SDE空间数据库时以中文命名的表无法显示,数据属性字段中的中文显示为乱码等等。  阅读全文

posted @ 2007-05-28 09:29 Flyingis 阅读(3707) | 评论 (1)编辑 收藏

Spatial Reference

     摘要: 空间参考是GIS的基础,失去了空间参考信息,地理空间内所有的信息也就失去了存在的意义,因为它们是不准确的或是错误的。看看ArcGIS9.2对于Spatial Reference的描述及如何编程实现。

文章中代码使用C#描述,AE92 for Java SDK的com.esri.arcgis.geometry中各种接口、实现方式和C#基本一致,可以使用相同的思路来解决AE Java开发中关于Spatial Reference的问题。  阅读全文

posted @ 2007-05-10 14:43 Flyingis 阅读(5021) | 评论 (2)编辑 收藏

ArcSDE 9.1 在 Windows 平台双机热备

     摘要: 一直没有时间整理各种平台下ESRI软件安装文档,只能简单描述一下,有什么问题可以留言。  阅读全文

posted @ 2007-04-24 09:32 Flyingis 阅读(3095) | 评论 (2)编辑 收藏

Geometry 对象浅析

     摘要: ArcEngine Geometry库定义了基本几何图形的矢量表达形式,顶级的几何图形有Points、Multipoints、Polylines、Polygons、Multipatches,Geodatabase和绘图系统使用这些几何图形来定义其他各种形状的特征和图形,提供了编辑图形的操作方法和地图符号系统符号化特征数据的途径。

文章中代码使用C#描述,AE92 for Java SDK的com.esri.arcgis.geometry中各种接口、实现方式和C#基本一致,可以使用相同的思路来解决AE Java开发中关于Geometry的问题。  阅读全文

posted @ 2007-04-19 14:15 Flyingis 阅读(4907) | 评论 (4)编辑 收藏

ArcGIS 9.2 SP2 补丁开始提供下载

2007年4月16日ESRI正式发布ArcGIS 9.2 SP2补丁下载

ArcGIS 9.2 Service Pack 2
(包括ArcGIS Desktop、ArcGIS Desktop开发包、ArcEngine SDK、ArcEngine Runtime、ArcGIS Server、ArcGIS Server WebADF Runtime升级补丁包)
http://support.esri.com/index.cfm?fa=downloads.patchesServicePacks.viewPatch&PID=66&MetaID=1270

ArcIMS 9.2 Service Pack 2
http://support.esri.com/index.cfm?fa=downloads.patchesServicePacks.viewPatch&PID=16&MetaID=1271

ArcSDE 9.2 Service Pack 2
http://support.esri.com/index.cfm?fa=downloads.patchesServicePacks.viewPatch&PID=66&MetaID=1269

SP补丁体积不断增加似乎是当今软件发展的趋势,这次释放出的升级包中,桌面帮助、Server等升级包都超过了200M,补丁升级过程耗时也较长,准备升级之前需做好重要数据备份,参考网站上的说明进行。

ArcGIS 9.2 SP2补丁的改进,请参考这里:
http://downloads.esri.com/support/downloads/other_/ArcGIS-92sp2-issues.htm
http://downloads.esri.com/support/downloads/ims_/ArcIMS_92sp2_issues.htm
http://gisupdates.esri.com/92sp2/ArcSDE-Windows-UNIX-Linux/ArcSDE-92sp2-issues.htm

posted @ 2007-04-17 10:06 Flyingis 阅读(4720) | 评论 (0)编辑 收藏

用多边形裁剪影像文件

     摘要: 裁剪方式分为矩形裁剪和多边形裁剪。  阅读全文

posted @ 2007-04-12 11:23 Flyingis 阅读(4866) | 评论 (1)编辑 收藏

Geoprocessing 消息机制

    作者:Flyingis

    ArcToolbox每个工具执行之后,都会向Geoprocessor返回消息,包括操作何时开始,使用哪些参数,操作的进度,以及可能出现的问题和错误。消息的种类包括常规消息、警告、错误,GPMessage类可以包含消息的文本及严重等级。

    首先,Geoprocessor.getMessage()方法可以捕获最后一个工具执行后返回的错误消息

String messages = gp.getMessages(2);
System.out.println(messages);

    如何使用GPMessage

//if there was an error then you want to loop the messages
//returned by the geoprocessor to look for the error
GPMessages gpMessages = (GPMessages)gp.getReturnMessages();
for(int i = 0;  i gpMessages.getCount(); i++{
      System.out.println(gpMessages.getMessage(i).getDescription());
}

    可以看出,上面都是通过GeoProcessor的方法来获取消息,除此之外还可以使用IGeoProcessorResult接口,从功能上来说它们没有多少区别。

// Execute Union
IGeoProcessorResult pResult = gp.execute(uniontool, null); 
if (pResult.getMessageCount() > 0)  
      
for(int i = 0;  i <= pResult.getMessageCount() - 1; i++){
            System.out.println(pResult.getMessageCount());
      }

}

    另外我们还可以自定义输出的方法,根据程序执行的过程,可以添加的方法有AddMessage、AddWarning、AddError。下面的示例将feature class从一个工作区复制到另外一个工作区,并跟踪显示每个文件复制的情况。

IGpEnumList fcs = gp.listFeatureClasses("""","");
Copy copy 
= new Copy();
String fc 
= fcs.next();
while (! "".equals(fc)){
      gp.addMessage(
"Copying " + fc + " to file gdb" );
      copy.setInData(fc);
      copy.setOutData(
"C:/temp/eric.gdb" + "/" + fc);
      
try {
            gp.execute(copy, 
null);
      }
 catch (Exception e) {
            gp.addError(
"COPY FAILED! " + gp.getMessage(2));
      }

      fc 
= fcs.next();
}

posted @ 2007-04-10 15:58 Flyingis 阅读(3567) | 评论 (0)编辑 收藏

Geoprocessing 数据批处理

     摘要: ArcGIS使用者经常要面对大量的数据处理工作,如果要在自己的程序中使用Geoprocessing,更多的时候我们是要进行对数据进行批处理分析,Geoprocessing为我们提供了丰富的批处理的功能。  阅读全文

posted @ 2007-04-05 15:07 Flyingis 阅读(4487) | 评论 (2)编辑 收藏

Vi 指令大全[转载]

     摘要: 方便自己查阅,转载Vi指令大全。  阅读全文

posted @ 2007-04-05 10:25 Flyingis 阅读(2847) | 评论 (0)编辑 收藏

学习在 ArcEngine 中使用 Geoprocessing

     摘要: Geoprocessing对于ArcGIS使用者来说,是一种非常方便实用的工具,它可以利用ArcToolbox中的各种工具为我们的地理空间工作流进行框架建模,自动执行空间分析与处理。现在ArcEngine 9.2单独提供了com.esri.arcgis.geoprocessing.tools工具包,使得在二次开发中通过Geoprocessing构建应用模型,将ArcGIS众多分析工具集成到我们的应用中成为现实。看看在ArcEngine for Java环境中如何使用它。  阅读全文

posted @ 2007-04-04 17:23 Flyingis 阅读(8926) | 评论 (1)编辑 收藏

ArcGIS 9.1 升级到 9.2 部分文件格式不可读的解决方法

     摘要: 机器上安装了ArcGIS 9.1和Erdas Image,卸载ArcGIS 9.1安装新版本9.2,发现img、tif、grid格式的文件均不可读,其中打开img文件的时候提示"Raster Objects Data Error",卸载ArcGIS 9.2重装ArcGIS 9.1,问题依旧。本文提供了解决方法。  阅读全文

posted @ 2007-03-15 17:21 Flyingis 阅读(3847) | 评论 (2)编辑 收藏

AE92 SDK for Java 窗体简例

     摘要: 看看怎么用AE92 SDK for Java做简单的窗体应用。  阅读全文

posted @ 2007-03-09 12:41 Flyingis 阅读(4940) | 评论 (2)编辑 收藏

AE92 SDK for Java 最小示例学习

     摘要: ArcEngine 92 SDK for Java 最小示例学习,类似于Java开发的第一个例子"Hello World",但要稍微复杂一点。整个过程清晰明了,通过这个例子我们可以顺藤摸瓜,逐渐深入到AE的开发中。  阅读全文

posted @ 2007-03-08 16:21 Flyingis 阅读(3631) | 评论 (0)编辑 收藏

ArcGIS 坐标系统文件

     摘要: 看看ArcGIS 9.2中包含的坐标系统文件夹Geographic Coordinate Systems、Projected Coordinate Systems、Vertical Coordinate Systems的简介,欣赏北京54和西安80投影坐标系令人费解的命名方式。  阅读全文

posted @ 2007-03-02 09:04 Flyingis 阅读(13923) | 评论 (7)编辑 收藏

地震为什么没有影响到 Google

原文链接:http://news.mydrivers.com/pages/20070120074305_14081.htm

2006年底,台湾海域地震,让人们深刻感觉到互联网的脆弱。在这次地震中,中美海缆、亚太一号、亚太二号海缆、FLAG海缆、亚欧海缆、FNAL海缆等多条国际海底通信光缆中断。一时间,台湾,韩国,日本,菲律宾,甚至印度的呼叫中心都受牵连;中国用户几乎无法访问所有的美国网站以及网络服务,有些网站虽然可以勉强登入,但速度也让人无法忍受。

不过,与平时经常被“屏蔽”相反,Google在此期间几乎没有受到影响,搜索引擎、Gmail以及Google旗下的其他服务都能够在国内正常访问。

事实上,连接中国与亚洲、美国以及欧洲的电缆有多个系统。台湾地震只损害了一部分海底电缆,但并不是所有的电缆都出现了问题。这个时间段内,从中国接入国际互联网的服务,就取决于提供该服务的这个互联网公司或者ISP购买的是哪些电缆系统,在地震中是否受到损害。

不过,还有另外一种情况存在:一些国际连接虽然没有受到地震的影响,但是过多地负载了从其它损害的电缆转道而来的信息流量,导致交通堵塞。

Google使用了多网络连接系统,如果某个数据中心出了访问障碍,系统会自动选择其它的网络路径,由其它数据中心无缝地提供服务。

在设计和实施时,Google在中国的服务网络充分考虑了冗余要求,不会因为其它线路的拥挤而变得缓慢。因此,Google中国用户感觉不到任何地震引起的变化。

为什么Google成为此次地震事件中的特例?

时间追溯到2002年2月,Google的一个数据中心的主电源跳闸,导致Google瘫痪了将近1个小时。有了这次教训,Google便彻底改变了自己的文件系统分布。

改进后的Google文件分布系统,即便一个拥有80台电脑的支架被断开连接,也能迅速完成再一次的备份,而且,并不中断正常的服务。实际上,按照霍茨勒的说法,Google的“每台服务器都有50个备份”。除此之外,多网络连接模式应用,也为服务稳定提供了有效的硬件基础。

posted @ 2007-01-20 14:54 Flyingis 阅读(2110) | 评论 (1)编辑 收藏

shapefile 和 MapGIS 文件格式之间的转换

     摘要: 这篇文章比较老了,还是在ArcGIS 8.3平台下做的,这段时间一些朋友经常问到这个问题,现在大家早已进入ArcGIS 9.x时代,但还是可以参考一下,是否适用尚不知道,如有什么变化,欢迎大家写在后面。  阅读全文

posted @ 2007-01-19 09:17 Flyingis 阅读(4593) | 评论 (2)编辑 收藏

全套 ArcGIS 软件安装(Windows 平台)

     摘要: 虽然是Windows平台下的安装,但有时也经常碰到棘手的问题,文章记录的过程比较简单,如果大家有什么疑问可以在后面留言。
关于ESRI产品的安装,以后还会写,包括各种平台下的,各种软件搭配环境下的,有些我自己也是在学习的过程中,欢迎大家一起讨论。  阅读全文

posted @ 2007-01-17 15:03 Flyingis 阅读(3568) | 评论 (0)编辑 收藏

GeoTools 2.3.0 release available for download

2 January 2007 - GeoTools 2.3.0 release brings together a lot of great improvements made over the last year. The main focus of this release is improving the raster story for GeoTools. While plug-ins for a variety of rasters existed previously, all of them were memory constrained and not really suitable for real software.

GeoTools 2.3.0 is available for download at:
http://geotools.codehaus.org/2.3.0

2.3.0 brings solid, scalable, fast support for ArcGrid, GeoTiff, GTOPO30, World Images and Image Mosaics and Pyramids. These are already in action in GeoServer 1.5.x, and will soon work their way into uDig (http://udig.refractions.net). In addition it offers:

- GeoAPI filter interfaces aligned with Filter 1.1 specification
- Completed providence review
- More relaxed PostGIS support, able to handle older varied configurations
- Scalar Vector Graphics "Marks" can be used as part of our SLD support
- Improved plug-in visibility
- Maven "archtype"
- Numerous small bug fixes and improvements

The following organizations, have contributed to this stable release: GeoSolutions for their RnD contributions appearing in this release, and OSGeo Foundation for their support during the incubation process.

- About GeoTools
GeoTools is an open source java GIS toolkit. Used for OGC based projects via GeoAPI interfaces. It includes two great SLD based renderers, raster access and reprojection. Plugins for Shapefile, ArcGrid, ArcSDE, Postgis, OracleSpatial, MySQL and many more.

For more information visit:

- http://docs.codehaus.org/display/GEOTOOLS
- http://docs.codehaus.org/display/GEOTOOLS/Mailing+Lists
- http://docs.codehaus.org/display/GEOTOOLS/Module+Matrix
- http://docs.codehaus.org/display/GEOS/GeoServer+1.5.0+beta1

Source :
http://sourceforge.net

From : http://www.gisdevelopment.net/news/viewn.asp?id=GIS:N_axrmhogkef

posted @ 2007-01-10 22:25 Flyingis 阅读(1861) | 评论 (0)编辑 收藏

静态设计

     摘要: 重新看看静态设计的优劣之处。  阅读全文

posted @ 2006-12-27 16:16 Flyingis 阅读(2449) | 评论 (0)编辑 收藏

初学 Eclipse RCP

     摘要: 以前一直做WebGIS方面的工作,对桌面关心甚少。桌面开发让人第一个想到的是VB6的快速开发,以及VC++平台中对效率的追求,VB.NET似乎找不到一个合适的定位。自己以后想逐步转向桌面,毕竟桌面才是GIS的天下,在效率、可扩展性、开发速度以及平台可持续发展中权衡,让我选择了Eclipse RCP。  阅读全文

posted @ 2006-12-13 19:22 Flyingis 阅读(3480) | 评论 (1)编辑 收藏

乱谈 GIS 中小型应用

     摘要: 文章围绕ESRI的产品讨论。
GIS中小型应用,是采用ArcEngine+ArcIMS+ArcSDE+Oracle等豪华配置,还是有其他方案可以选择?  阅读全文

posted @ 2006-11-28 22:14 Flyingis 阅读(4099) | 评论 (10)编辑 收藏

ArcSDE 中空间数据的备份与恢复 [转载]

原文链接:http://www.gis8.net/Article/arcgis/200611/362.htm

随着GIS应用系统在复杂性、集成性、并发性等方面的要求不断增加,系统所需的空间数据量在急剧地增长,同时用户对空间数据并发访问的需求也越来越突出。以传统的文件形式存储和表示空间数据的方法显然已经无法满足这些需求。由于ArcSDE本身所具有的海量数据存储、多用户并发访问、版本管理、长事务处理等强大优势,在GIS应用系统中引入ArcSDE作为空间数据存储和管理引擎,变得越来越普遍。ArcSDE作为空间数据库引擎,在ArcGIS 8.1系列软件中属于服务器端的产品,在整个产品框架中,处于数据中心的重要地位,它利用Oracle、DB2、SQL Server、Informix等关系型数据库在数据存储、数据完整性等方面的先进技术手段,将海量空间数据(包括矢量数据和栅格数据)有机地组织和管理起来,通过其内部异步缓冲、空间索引等先进的机制,提供对空间数据的多用户高效并发访问。

除了存储空间数据并提供访问,对于空间数据的备份和恢复,是空间数据管理中最重要的工作环节之一,也是保障空间数据安全的重要方式。首先,空间数据本身在应用过程中不断地被更新变动,所以经常会需要备份不同时期,不同的空间数据版本;第二,存储介质的意外损坏会导致严重的空间数据丢失,因此需要定期对空间数据对象的整体进行完全备份;第三,有时出于调整的必要,需要在不同服务器、甚至不同数据库管理系统之间进行空间数据的移植和转换。

在采用文件形式空间数据的时代,空间数据的备份仅仅是操作系统中的文件拷贝、备份和归档的过程;而空间数据的恢复也不过是复制、覆盖的操作;在基于ArcSDE和关系型数据库的空间数据库时代,空间数据的备份更多的依赖于关系型数据库的备份和恢复技术,当然也不能缺少ArcSDE所提供的备份工具。按照备份的方式和对象,ArcSDE中空间数据的备份和恢复可以分为如下两类:指定空间数据对象的备份恢复,和整体空间数据库的备份恢复。

一、 指定空间数据对象的备份和恢复
这种方式主要用于备份指定的空间数据对象,比如某个图层和要素类、其中的某些满足特定条件的记录、甚至特定的版本。实现这种备份方式的方法主要是利用ArcSDE提供的管理工具:sdeexport和sdeimport命令。它们的位置在%ArcSDEHOME%\bin\中。其中,sdeexport用于将空间数据从ArcSDE Server上备份为单独的数据文件,而sdeimport用于将经由sdeexport备份的数据文件恢复到ArcSDE Server中。

这一方式的缺点在于不能一次备份完整的空间数据库。但是也有个明显的优点,在于通过sdeexport和sdeimport工具,可以将空间数据在不同的关系型数据库管理系统(RDBMS)之间进行移植。

1. 备份全部记录
使用sdeexport命令的缺省方式即可,比如:
(1) 将指定的图层备份到备份文件
sdeexport -o create -l dcxq,shape -f d:\dcxq.exp -i jerry_oracle -u sde -p sde
就是将名为jerry_oracle的sde服务(ArcSDE for Oracle8i)中的指定图层“dcxq”按缺省方式备份到文件d:\dcxq.exp中。
(2) 利用操作系统命令,拷贝备份文件到目标服务器上
(3) 将备份文件恢复至目标RDBMS中
sdeimport -o create -l newDcxq,shape -f d:\dcxq.exp -i jerry_sqlsvr -u sde -p sde
此操作将备份文件恢复到名为jerry_sqlsvr的sde服务(ArcSDE for SQLServer)中,图层名为:newDcxq。

2. 备份部分记录
sdeexport命令中添加-w参数和一个条件选择表达式即可,比如:
(1) 将指定图层中满足条件的记录备份到备份文件
sdeexport -o create -l dcxq,shape -f d:\dcxq.exp -w xzqy = '徐汇区' -i jerry_oracle -u sde -p sde
就是将名为jerry_oracle的sde服务(ArcSDE for Oracle8i)内的指定图层“dcxq”中所有"徐汇区"的人口调查小区备份到文件d:\dcxq.exp中。
(2) 利用操作系统命令,拷贝备份文件到目标服务器上
(3) 将备份文件恢复至目标RDBMS中
sdeimport -o create -l XHDcxq,shape -f d:\dcxq.exp -i jerry_sqlsvr -u sde -p sde
此操作将备份文件恢复到名为jerry_sqlsvr的sde服务(ArcSDE for SQLServer)中,图层名为:XHDcxq。

3. 备份特定数据版本
sdeexport命令中添加-v参数和一个版本名称即可,比如:
(1) 将指定图层的特定版本备份到备份文件
sdeexport -o create -l dcxq,shape -f d:\dcxq.exp -V verAPR -i jerry_oracle -u sde -p sde
此操作将名为jerry_oracle的sde服务(ArcSDE for Oracle8i)内的指定图层“dcxq”的verAPR版本备份到文件d:\dcxq.exp中。
(2) 利用操作系统命令,拷贝备份文件到目标服务器上
(3) 将备份文件恢复至目标RDBMS中
sdeimport -o create -l APRdcxq,shape -f d:\dcxq.exp -i jerry_sqlsvr -u sde -p sde
此操作将备份文件恢复到名为jerry_sqlsvr的sde服务(ArcSDE for SQLServer)中,图层名为:APRDcxq。

二、 整体空间数据库的备份和恢复
ArcSDE空间数据库的整体备份和恢复,实质上很大程度上是其所在的数据库或者数据库对象的备份和恢复问题。当然完整的ArcSDE数据备份应当还包括dbtune.sde,giomgr.defs,dbinit.sde和services.sde等文件。

数据库的备份和恢复有很多种类。在不同的数据库管理系统中,更是千差万别。总体上,大都可以分为静态转储和动态转储两个类型。静态转储是在系统中无事务处理时进行的转储操作,因而这种方式得到的一定是一个数据一致性的副本。静态转储的优点是操作简单,保证数据一致性,但是缺点也很明显,转储操作必须等待用户事务结束才能进行,而新的事务必须等待转储操作结束才能执行,因此会降低数据库的可用性。动态转储是指转储操作与用户事务并发进行,转储期间允许数据库进行存取和修改操作,它不必等待所有运行的事务结束,也不会影响新事务的运行,但是无法保证副本中的数据正确、有效、完整。所以在动态转储期间,往往会建立日志文件。后备文件加上日志文件就可以把数据库恢复到正确的状态。

1. Oracle数据库
(1) 两种归档模式(archive mode)
Oracle有两中归档模式:NO ARCHIVELOG和ARCHIVELOG。在NO ARCHIVELOG模式(该模式为缺省模式)下的数据库操作不归档在线日志重做文件。当存储介质损坏时,NO ARCHIVELOG模式的数据库只能恢复到上一次的备份点上。ARCHIVELOG模式的数据库可以通过上一次的备份和归档日志重做文件相结合的方式,恢复到介质损坏之前的点上。
以NO ARCHIVELOG模式创建的Oracle数据库可以切换至ARCHIVELOG模式。
(2) 多种备份与恢复方式
Oracle中的数据备份和恢复方式包括:脱机备份与恢复、逻辑备份与恢复、热备份与恢复。
* 脱机备份与恢复:脱机备份是一种静态转储技术,备份在数据库关闭、不工作的状态下进行。脱机备份包括两种实现方式:第一种是使用Oracle提供的工具Backup/Recover;第二种是利用操作系统的复制功能,复制数据文件,即:冷备份。
* 逻辑备份与恢复:逻辑备份与恢复是指将数据库、用户和表等对象的内容整个转出到一个二进制文件,然后在需要的时候通过转入恢复到原来的形式。这种方式可以备份整个数据库,指定用户和指定表的内容。
* 热备份与恢复:脱机备份和逻辑备份通常是用户不访问数据库时的静态备份操作。这些备份只保证数据备份前的一致性和完整性,不保证备份期间的数据一致性。为了保证数据的即时一致性,在备份数据的同时还需要备份日志文件。数据库运行在ARCHIVELOG方式下,同时作数据和日志文件的备份称为热备份。
(3) 实现步骤
选择使用何种备份方式,由具体的数据备份需求所决定。具体的Oracle数据库备份实现步骤需要参考Oracle相关文档,比如《Oracle8 Backup and Recovery Guide》。本实例采用Oracle中的逻辑备份,使用了exp和imp工具,以sde用户方式备份和恢复整体空间数据。
* 备份数据库:使用Oracle中的exp命令,以sde用户方式备份所有相关数据。
* 恢复数据库:使用Oracle中的imp命令,以sde用户方式恢复后备数据文件。
* 恢复ArcSDE系统文件:如果有必要,在恢复oracle数据之后,需要恢复安装ArcSDE的程序文件;另外还需要从备份机器上恢复dbtune,giomgr.defs,dbinit.sde,和services.sde文件。

2. SQLServer数据库
(1)备份和恢复方式
在MS SQL Server中,ArcSDE利用单独的用户数据库SDE(缺省名)来管理和组织空间数据。
SQLServer不仅可以在同一台服务器上备份和恢复数据库,还允许通过备份和恢复的方式在不同服务器之间很轻松地移动数据库。MS SQL Server也允许将一个服务器上的数据库备份恢复到另外一台服务器上。
如果要将数据库备份恢复到另外一台服务器上,两台服务器上的code page和排序方式必须相同。比如,不能把用二进制排序方式(Binary Sort Order,BSO)建立的数据库恢复到一个配置为缺省排序方式(字典顺序,dictionary)的服务器上。当然,可以通过在master数据库中运行'sp_helpsort'存储过程设定服务器的排序方式。
数据库的备份操作同时备份了数据库的系统表,包括sysusers。当在不同的服务器上执行备份和恢复操作时,备份数据库中所包含的用户可能会和新的服务器上master数据库中sysxlogins表中包含的用户不同。这样的话,就无法登录到恢复后的数据库,知道更正并统一master数据库中sysxlogins表和恢复数据库中sysusers表的登录映射。要使上述两个表同步,需要运行"sp_change_users_login"存储过程。
(2)实现步骤
* 备份SDE数据库到备份文件:既可以使用T-SQL中的BACKUP语句,也可以使用企业管理器中的备份工具向导来完成SDE和其他空间数据库的备份。
* 将备份文件复制到目标服务器
* 将备份文件恢复到目标服务器:可以使用企业管理器中的恢复还原工具向导来完成SDE和其他空间数据库的恢复。
* 统一SDE用户登录映射
A. 两个服务器上都有SDE用户,但是两者的SDE用户具有不同的标识
当恢复SDE数据库至新的服务器后,sde数据库中的sde用户的SID与master数据库中dbo.sysxlogins表中的sde登录名的SID不同,比如:
Use sde
go
Select SID from sysusers where name = 'sde'
Use master
go
select SID from sysxlogins where name = 'sde'

SID
-----------------------------------------------------------
0x76695419BFAED41184FD00C04F8D0451
(1 row(s) affected)

SID
-----------------------------------------------------------
0xEDDFCA8E56B0D411850000C04F8D0451
(1 row(s) affected)
此时必须统一两个表中sde用户的SID标识,运行"sp_change_users_login" 存储过程,示例如下:
    Use sde
go
sp_change_users_login 'update_one','sde','sde'
运行上述的SID查询来验证修改结果:
0xEDDFCA8E56B0D411850000C04F8D0451
0xEDDFCA8E56B0D411850000C04F8D0451
可以看出修改后两个表中sde用户的SID标识完全一致,此时就可以启动ArcSDE for SQLServer的服务来使用了。
B. 目标服务器上还没有SDE用户
这种情形是指目标服务器上还没有sde登录用户,此时执行上述的SID查询,结果如下:
Use sde
go
Select SID from sysusers where name = 'sde'
Use master
go
select SID from sysxlogins where name = 'sde'
SID
-----------------------------------------------------------
0x76695419BFAED41184FD00C04F8D0451
(1 row(s) affected)
SID
-----------------------------------------------------------
(0 row(s) affected)
要矫正这种情况,需要首先到目标服务器中添加sde登录用户,但是不要将sde数据库的权限授予sde用户。添加登录用户,使用"sp_addlogin"存储过程和在企业管理器中使用登录管理工具。比如:
sp_addlogin 'sde','go','sde'
然后需要运行 "sp_change_users_login" 存储过程来统一master内dbo.sysxlogins表和恢复后用户数据库内sysusers表中的sde用户SID标识。
use sde
go
sp_change_users_login 'update_one','sde','sde'
最后,可以执行SID查询来验证SID的一致性:
Use sde
Go
Select SID from sysusers where name = 'sde'
Use master
Go
select SID from sysxlogins where name = 'sde'
SID
-----------------------------------------------------------
0xF6DFCA8E56B0D411850000C04F8D0451
(1 row(s) affected)
SID
-----------------------------------------------------------
0xF6DFCA8E56B0D411850000C04F8D0451
(1 row(s) affected)
经过SDE用户的SID的统一之后,就可以启动ArcSDE服务或者使用直接连接(direct connection)方式使用恢复后的空间数据了。

posted @ 2006-11-28 20:13 Flyingis 阅读(2700) | 评论 (1)编辑 收藏

[DWR文档] WEB-INF 参考

     摘要: DWR中文文档--WEB-INF 参考

翻译的方式采用中英文对照,翻译的文字不会完全和英文一一对照,主要是为了在不失原意的情况下保证中文的阅读理解习惯,当然,翻译的过程需要大家的支持,翻译不妥的地方尽请拍砖、指正。  阅读全文

posted @ 2006-11-18 09:34 Flyingis 阅读(5277) | 评论 (0)编辑 收藏

DWR 中文文档

     摘要: 我是DWR初学者,虽然DWR入门简单,但还是想尝试翻译一下DWR的部分文档,翻译过程中自己会有更多的思考,翻译的方式采用中英文对照,翻译的文字不会完全和英文一一对照,主要是为了在不失原意的情况下保证中文的阅读理解习惯,当然,翻译的过程需要大家的支持,翻译不妥的地方尽请拍砖、指正。

Jet Mah已经开始翻译DWR文档,我将在他未翻译的文档中摘取比较重要的章节进行翻译,也算是对开源尽一点绵薄之力。我已翻译的部分在Java Tang中也会留言给出链接。  阅读全文

posted @ 2006-11-18 09:15 Flyingis 阅读(8328) | 评论 (2)编辑 收藏

中国计划建设自己的卫星导航系统

    2006年11月3日,中国在北京宣布计划建立一套自己的卫星导航系统,整个系统包含35颗卫星,并于2008年在亚洲区域投入运行。该系统名称为“Beidou”,将包括五颗对地静止轨道卫星和三十颗中距离地球轨道卫星,新华社通讯员11月2日。

    据报道,整个卫星导航系统将提供两套服务,其中免费服务面向大众,许可认证服务面向军事方面。面向商业客户的卫星系统服务将提供10米的定位精度,速度分辨率为0.2米/秒,而时间分辨率在50*十亿分之一秒以内。关于整套系统的费用没有详细的报道。

    在此之前,中国已经加入了欧空局35亿欧元伽利略计划研发卫星导航系统,以摆脱美国军用全球卫星导航系统的垄断。

    详细信息可以访问(英文):
    http://www.chinadaily.com.cn/china/2006-11/03/content_723687.htm

posted @ 2006-11-14 22:26 Flyingis 阅读(1316) | 评论 (2)编辑 收藏

用 JavaScript 玩转 DOM Level 1

     摘要: DOM(The Document Object Model)将HTML转换为XML文档格式来表达,为动态HTML编程提供了一种优雅的解决方案。DOM编程可以使用多种语言(Java中可以使用SAX进行XML编程),不论大家使用何种服务器端技术,JavaScript的DOM基础编程还是需要掌握的,最常见的莫过于getElementById(),引用Prototype.js使用最多的也是$(""),但是要做好Web客户端设计,我们需要了解更多更细。

当前各种主流浏览器对DOM Level 1标准支持的相对较好,我们就来看看在JavaScript中如何玩转DOM Level 1。  阅读全文

posted @ 2006-11-07 22:14 Flyingis 阅读(5337) | 评论 (6)编辑 收藏

[Design Pattern] The Decorator Pattern

     摘要: Decorator Pattern,看看魔兽中的山丘是怎么应用这种模式的(个人设想)。  阅读全文

posted @ 2006-11-07 11:04 Flyingis 阅读(3112) | 评论 (3)编辑 收藏

清除 Trojan [转载]

     摘要: 在网上找到的Trojan-Downloader.Win32.QQHelper.mo查杀过程,经验证方法有效,特转贴与大家分享。  阅读全文

posted @ 2006-10-24 16:38 Flyingis 阅读(1616) | 评论 (0)编辑 收藏

Firefox 2.0 正式提供下载,JavaScript 1.7 获得支持

    现在 Mozilla官方网站 还没有Firefox 2.0正式版的下载链接,但驱动之家已经开始提供下载链接,包括 Mozilla官方FTP ,和 mydrivers网站上本地下载 ,迫不及待的朋友可以立即开始体验Firefox 2.0。

    我用Firefox除了支持开源软件外,还有一个重要用途就是调试JavaScript,我之前的一篇随笔《
JavaScript 调试工具 》简单介绍了JavaScript的调试利器。随着Firefox 2.0正式发布,JavaScript 1.7也开始在最新版的Firefox中正式获得支持,虽然正式项目中还不大可能用到JavaScript 1.7,但做JavaScript开发的朋友肯定会给予JavaScript更多的关注。

    JavaScript 1.7在1.6的基础上加入了新的特性,具体大家可以参照这里:

    --
New in JavaScript 1.6 --

    --
New in JavaScript 1.7 --

posted @ 2006-10-24 14:57 Flyingis 阅读(1311) | 评论 (0)编辑 收藏

IE7 正式版推出

     摘要: IE7 官方正式版已经推出,看看它为我们带来了什么……  阅读全文

posted @ 2006-10-19 09:25 Flyingis 阅读(2770) | 评论 (7)编辑 收藏

[翻译] 如何在 JavaScript 中实现拖放(下)

     摘要: 终于完成了全文的翻译,由于时间比较参促,文章没有过多的校正与润色,阅读过程中难免会有些许生硬或不准确的感觉,请大家见量并指出,方便他人阅读。

原文作者将拖放功能的实现分步讲解,其核心的地方在于移动和放置元素时,鼠标、移动元素、目标元素关系的处理,只要这个问题处理好了,代码就很容易理解,译文仅供辅助参考之用,demo可以参考原文链接。  阅读全文

posted @ 2006-10-15 17:03 Flyingis 阅读(6644) | 评论 (19)编辑 收藏

[翻译] 如何在 JavaScript 中实现拖放(中)

     摘要: 上一篇文章介绍了移动页面元素所涉及到的捕获鼠标移动和鼠标点击的相关问题,本段文章将介绍如何移动和放置页面元素。  阅读全文

posted @ 2006-10-13 14:53 Flyingis 阅读(5283) | 评论 (2)编辑 收藏

[翻译] 如何在 JavaScript 中实现拖放(上)

     摘要: JavaScript擅长于修改页面中的DOM元素,但是我们使用JavaScript通常只是实现一些简单功能,例如实现图片的翻转,网页中的标签页,等等。这篇文章将向你展示如何在页面中,对创建的元素实现拖放。
(译者注:原文发布已有一段时间,但感觉作者思路清晰明了,值得一读。文章一次看完比较好,但时间有限,我会尽快将剩下部分补上)  阅读全文

posted @ 2006-10-11 16:20 Flyingis 阅读(7401) | 评论 (2)编辑 收藏

[Design Pattern] The Observer Pattern

     摘要: 在讨论设计模式时,我喜欢用英文名来称呼各种模式,觉得这样会更为准确一些。设计模式在Java开发领域已经是炙手可热的山芋,披上了这件战袍,似乎就可以在程序设计中立于不败之地,不仅可以规范自己的武功招式,还能够看清其他高手的武功套路。在接下来[Design Pattern]一系列的随笔中,我将系统的研究各种常用的设计模式,主要的参考资料是《Head First Design Patterns》,主要的思路是,介绍基本概念(虽然做Java开发的熟手已经对此熟悉的不得了),将思维转换为代码设计,谈谈在实际中开发的应用,也许还会有各种模式的弊端。  阅读全文

posted @ 2006-09-30 16:40 Flyingis 阅读(3007) | 评论 (1)编辑 收藏

GeoRSS 应用方案

    作者:Flyingis

    GeoRSS提供了一种地理位置搜索与聚合的方案,并且可以用于地理分析,例如在指定地点10公里范围内,所有可能受地震影响的地物的信息,在自己出行道路中出现交通事故的位置点,等等。只要RSS包含了地理位置信息,就可以将应用进行扩展。

    那么哪些技术方案可以支持GeoRSS呢?目前ESRI已经支持通过JavaScript API来使用GeoRSS,我们可以不用将GeoRSS导入到ArcWeb Explorer中,仅仅将GeoRSS URL链接输入到搜索框即可。如下图所示(图片来自于James Fee的博客)。


    遗憾的是,ESRI目前仅支持点的聚合查询,并且使用GeoRSS Feeds还存在一些bug。

    另外一种方案,就是结合Microsoft Virtual Earth API来使用GeoRSS,这是Virtual Earth API 3.0中新增的一项强大的功能。GeoRSS层可以很容易的使用基于WGS84 lat/long坐标系,或GeoRSS Simple语法的GeoRSS XML文件,加入一组点到地图上,具体的方法可以参考这两篇文章:

    http://blogs.msdn.com/keithkin/archive/2006/09/19/761333.aspx
    http://blogs.msdn.com/keithkin/archive/2006/09/19/761573.aspx

    在Keith的demo中,他实现了将鼠标停留在地图上某标注点,其相关信息就会反应出来,示例如下:

    http://krkinnan.members.winisp.net/samples/georss/hurricaneivan.html

    关于GeoRSS:http://www.blogjava.net/flyingis/archive/2006/09/25/71823.html

posted @ 2006-09-28 11:15 Flyingis 阅读(1975) | 评论 (0)编辑 收藏

GeoRSS

    作者:Flyingis

    RSS已经成为互联网上共享知识、分享信息的最为主要手段之一,通过订阅RSS,我们可以从网络的海量信息中获取我们所关心的数据,包括文字、图片等。将地址信息通过一种交互的方式,使得应用可以请求、聚合、分享、发布Feeds,成为地理信息在未来一段时间的一个热点。

    GeoRSS成为了地理信息数据Feed资源化的先锋队员,GeoRSS存在两种编码方式,分别是GeoRSS GML和GeoRSS Simple。前者是标准的GML应用,相比后者支持更为广泛的特性,可以和Atom 1.0、RSS 2.0、RSS 1.0一起使用,并且它还可以在非RSS XML编码的环境中使用。GeoRSS Simple显得更为轻便,当然在扩展性能上就会有所限制。

    举个例子说明这两者的区别,例如我们需要将一个点进行XML编码,使用GML和Simple两种方式的格式分别如下:

    Simple
<georss:point>45.256 -71.92</georss:point>

    GML
<georss:where>
  
<gml:Point>
    
<gml:pos>45.256 -71.92</gml:pos>
  
</gml:Point>
</georss:where>

    具体的介绍,可以参考GeoRSS官方网站:http://www.georss.org/。有时间我会对GeoRSS模型与使用方法进行分析。

posted @ 2006-09-25 20:58 Flyingis 阅读(2565) | 评论 (0)编辑 收藏

Firefox 2.0 rc1

    Mozilla Firefox 2.0 rc1已经可以下载测试了,它包含了许多新的变化,具体的参考这篇文章:
http://tech.cybernetnews.com/2006/09/12/another-round-of-theme-updates-for-firefox-2/

    从这个链接可以下载到最新的版本:
http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/2.0rc1-candidates/rc1/ 

    据Jithen Singh介绍,Mozilla Firefox 2.0 rc1对
ArcGIS Server 9.2 rc1似乎提供了更好的支持。

    更新:刚在mydrivers.com上面看到了一篇文章:《IE7 RC1 VS Firefox2 RC1》。比较有意思的对比测试。(2006-9-29)

posted @ 2006-09-25 09:25 Flyingis 阅读(1172) | 评论 (1)编辑 收藏

JavaScript 随笔汇集

     摘要: 更新日期:2006-11-18  阅读全文

posted @ 2006-09-18 15:31 Flyingis 阅读(4068) | 评论 (9)编辑 收藏

[翻译] "this" of JavaScript

     摘要: this是JavaScript中功能最强大的关键字之一。不幸的是,如果你不知道它具体怎么工作,你将很难正确使用它。原文的题目是《The this keyword》。
翻译不恰当的地方请大家指出。  阅读全文

posted @ 2006-09-15 15:02 Flyingis 阅读(3514) | 评论 (3)编辑 收藏

JavaScript 对象的反射及应用

     摘要: Java和.NET都有着比较完善的反射机制,用来处理未知的对象并获取它们的属性和方法。JavaScript虽然没有完善的反射体系,但在编程的时候还是可以通过代码设计来实现类似反射的基本功能。  阅读全文

posted @ 2006-09-12 18:50 Flyingis 阅读(5838) | 评论 (5)编辑 收藏

使用 JSON 创建对象

    作者:Flyingis

    一般在JavaScript中可以调用Object类的构造函数来创建对象:

var obj = new Object();

    并且可以将对象附加到其他对象上,类似于C++中的对象数组,例如,某大学里拥有多个专业,每个专业都有一位主任和多名讲师组成,在JavaScript中可以这样来描述:

var university = new Object();
university.specialty 
= new Array();
university.specialty[
0= new Object();

//该专业的主任是Sam
university.specialty[0].director.name = "Sam";
university.specialty[
0].director.age = 40;

//该专业的两位讲师分别是Tom和Jerry
university.specialty[0].instructor = new Array();

var tom = new Object();
tom.name 
= "Tom";
tom.age 
= 32;
university.specialty[
0].instructor[0= tom;

var jerry = new Object();
jerry.name 
= "Jerry";
jerry.age 
= "35";
university.specialty[
0].instructor[1= jerry;

    可以看出,当对主任和讲师有更详细的描述时,这样一层层的代码给人感觉非常繁琐,许多代码都是重复编写,不但增加了代码量,并且还很枯燥。

    JSON是一种轻量级的数据交换格式,它的优点就是便于读写,可以将JavaScript中的对象及其赋值写成键值对的形式,例如上面代码通过JSON来描述可以写成:

var university = {
  specialty : [
  
{
    director : [
      name : 
"Sam",
      age : 
40
    ],
    instructor : [
      
{name : "Tom", age : 32}
      
{name : "Jerry", age : 35}
    ]
  }

  ]
}

    这样来描述整个对象的内部结构显得更为简洁、清晰,除了声明属性和对象外,还可以使用JSON创建的对象定义成员函数。当然,不论采用何种方法来描述,目的都是为了更高效直观的编写JavaScript代码,我们可以使用JSON定义一个对象,然后使用JavaScript添加属性,也可以使用JSON来扩展JavaScript所定义的对象,创建任意复杂的对象层次。

posted @ 2006-09-11 19:33 Flyingis 阅读(3915) | 评论 (1)编辑 收藏

博客显示的问题(BlogJava 系统 bug)

    我的博客里全是江南白衣的随笔。

    今天已经是第二次出现这种情况,进入我的博客随笔全部重复为江南白衣的一篇随笔,但博客上面的标题和右边的日期、公告、链接、回复等等都还是我自己的,今天上午11:32出现第一次的时候感觉是缓存的问题,偶尔一次没怎么在意,现在下午14:30又出现了一次,dudu看看有没有问题。

    出现问题时的截图:http://www.blogjava.net/images/blogjava_net/flyingis/question2.gif

posted @ 2006-09-05 14:47 Flyingis 阅读(1036) | 评论 (2)编辑 收藏

BlueViewer 地图加载分析(C#)

     摘要: BlueViewer是基于.NET Link进行ArcIMS二次开发的一个实例,里面包含了WebGIS最基本的一些功能。全文对BlueViewer程序启动地图加载的整个过程进行了分析,可以作为.NET Link初学参考。  阅读全文

posted @ 2006-09-03 23:14 Flyingis 阅读(2697) | 评论 (5)编辑 收藏

关于 BOM

    作者:Flyingis

    BOM全称是Browser Object Model,在不依赖于网页内容的情况下提供和浏览器视窗交互的对象,下图显示了BOM的组成结构。

BOM-Structure.gif


    可以看出,window是BOM的核心对象,在使用window中所有对象时,可以省去window,例如window.document可以写成document,window.frames[0]可以写成frame[0]。为了对视窗进行操作,BOM提供了四种方法:moveBy(dx,dy)、moveTo(x,y)、resizeBy(dw,dh)、resizeTo(w,h),这四种方法比较简单,具体使用可以参考相关资料。

    BOM中没有特别复杂的概念,但需要注意的是,现在BOM还没有一个统一的标准,各种浏览器对BOM的支持程度也不一,相同的功能也许其对象描述并不相同,即使是BOM结构本身也存在问题,如location既存在于window下的第二级结构中,也存在于window.document下的第三级结构中,但它们的功能描述是相同的。在目前情况下,只有针对用户所使用的浏览器来定制代码,或为不同的浏览器分别进行代码描述。

posted @ 2006-09-01 17:22 Flyingis 阅读(1890) | 评论 (0)编辑 收藏

SVG 中使用 JavaScript

    作者:Flyingis

    SVG(Scalable Vector Graphics)是一种基于XML的语言,用来在Web中绘制矢量图形。当前,除了Mozilla 2.0外,没有一款浏览器在本质上支持SVG,都需要插件来显示SVG图形,著名的有Adobe公司和Corel公司的SVG插件。

    一个简单的SVG

<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"
>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink=http://www.w3.org/1999/xlink width="100%" height="100%">
<desc>
显示一个正方形和一个圆形
</desc>
<defs>
<rect id="myrect" width="150" height="150" fill="red" x="15" y="15" stroke="black"/>
<circle id="mycircle" r="75" fill="white" stroke="black" cx="150" cy="150"/>
</defs>
<use xlink:href="#myrect" />
<use xlink:href="#mycircle" />
</svg>

    为了更好的理解SVG中的标签,可以和HTML标签作个简单的比较,SVG中的<svg/>和HTML中的<html/>类似,<desc/>和<title/>类似,<g/>和<div/>类似。

    在SVG中可以使用JavaScript,当需要遵循一些规则:必须使用type属性;language属性是非法的;使用特殊XML字符时可以使用CDATA(SVG和CDATA都遵循XML规范);xlink:href替换src。

<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"
>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink=http://www.w3.org/1999/xlink width="100%" height="100%">
<desc>
显示一个正方形和一个圆形
</desc>
<![CDATA[
  function comp(a, b) {
    if (a > b)
      alert("a is bigger than b");
    else
      alert("a is not bigger than b");
  }
]]>
<defs>
<rect id="myrect" width="150" height="150" fill="red" x="15" y="15" stroke="black"/>
<circle id="mycircle" r="75" fill="white" stroke="black" cx="150" cy="150"/>
</defs>
<use xlink:href="#myrect" />
<use xlink:href="#mycircle" />
</svg>

    在SVG中使用JavaScript可以写在如下几个位置:<desc/>标签之后;在<defs/>中;在<g/>标签之前。

posted @ 2006-08-31 20:06 Flyingis 阅读(4031) | 评论 (0)编辑 收藏

浏览器中的 JavaScript

    作者:Flyingis

    之前写过不少JavaScript基础的随笔,基本上都是针对其语法、语言结构来论述的。但是,现在使用JavaScript最多的地方是在浏览器中,这里就简单谈谈浏览器中使用JavaScript。

    在浏览器中使用JavaScript分为内联和外联两种方法,和CSS比较相似。

    内联

<html>
<head>
<title>内联</title>
<script language="JavaScript">
  
function message() {
    alert(
"Good Day !");
  }

</script>
</head>
<body></body>
</html>

    外联

<html>
<head>
<title>外联</title>
<script language="JavaScript" src="../path/external.js"></script>
</head>
<body></body>
</html>

    在external.js中,可以包含任何js代码,例如类的定义、方法函数等。相比之下,使用外联方法引用js文件可以做到更安全、代码更容易管理、节省资源开销。之所以能节省资源开销,是因为当两个页面同时使用一个js文件时,该js文件只会被下载一次,避免的相同代码重复下载增加页面的代码量。

    网页中的JavaScript源代码一般放置在<head></head>区域,当写在<body></body>中时,一旦页面加载就会执行body中的JavaScript代码,无法人工控制代码的执行。如果需要页面加载时同时执行JavaScript方法,则需要在head中定义该方法,否则系统会报错。

    JavaScript最初只有一种浏览器的支持,因此,需要一种方法将JavaScript代码隐藏在老的浏览器中,避免对JavaScript解析产生错误,这就是我们过去经常可以看到的,在代码前后加上<!--><//-->,在现在看来,这种方法已经没有必要了,一是因为使用外联方式引用JavaScript代码更加合适,二是当前主流浏览器对JavaScript的支持已经越来越多,当然也就能正确识别JavaScript代码。

    在浏览网页时,当某张图片无法显示时,可以通过文字来替换它,当网页不支持某段JavaScript代码时,我们也能通过一种替代的方式来提醒用户自己的浏览器不支持JavaScript或禁止了JavaScript,即使用<noscript></noscript>,放置在body区域中。

    随着XHTML(eXtensible HTML)标准的出现,<script>标签也出现了一些变化,过去我看到有的页面在<script>标签中使用languange属性,有的使用type属性,当时没怎么注意,其实后者正是XHTML出现后所定义的,可以为JavaScript设置mime类型为"text/javascript"。

    XHTML带来的另外一个变化就是使用CDATA,使用CDATA可以在表达式中使用一些特殊字符,增强代码的可读性,避免使用"&lt"、"&gt"来分别表示小于和大于。

<script type="text/javascript">
<![CDATA[
  
function comp(a, b) {
    
if (a > b)
      alert(
"a is bigger than b");
    
else
      alert(
"a is not bigger than b");
  }

]]
>
</script>

    代码中大于和引号均使用了我们常见的书写形式,避免了使用XML实体所带来的阅读上的困难。当然,这也存在旧的浏览器无法识别CDATA的问题,需要我们加入注释来隐藏CDATA标签。大家可以想到,最好的办法还是使用外联的方法使用JavaScript。

<script type="text/javascript">
//<![CDATA[
  function comp(a, b) {
    
if (a > b)
      alert(
"a is bigger than b");
    
else
      alert(
"a is not bigger than b");
  }

//]]>
</script>

    虽然部分浏览器还不完全支持XHTML,但我们应该尽量按照XHTML标准来书写代码,使得该标准能够获得更大更广泛的支持。

posted @ 2006-08-31 20:01 Flyingis 阅读(2730) | 评论 (0)编辑 收藏

正则表达式--简单模式

    作者:Flyingis

    正则表达式除了用来匹配一些特殊字符外,还有许多其他的作用。Metacharacters,character classes和quantifiers都是正则表达式语法中的重要组成部分,可以用来实现更强大的功能。 

    Metacharacters

    正则表达式的Metacharacters主要包括:

    ([{\^$|)?*+.

    当需要使用这些符号的时候,需要在前面加上一个反斜杠"\",例如:

var reg = /\?/;
var reg = new RegExp("\\?");

    一个字符的表示可以使用它的文字符号,也可以使用ASCII码或Unicode码来代码它。例如,当一个字符使用ASCII码表示的时候,我们需要在一个两位十六进制的编码前加上"\x"。

var name = "apple";
var regName = /\x61/;
alert(regName.test(name));  
//输出"true"

    当然,使用十进制来表示字母a。

var reg = /\141/;

    使用Unicode来表示一个字符,需要四位十六进制的编码,例如\u0062代表b。

var s = "big";
var reg = /\u0062/;
alert(reg.test(s));  
//输出为"true"

    下面一段代码可以到达同样的效果:

var s = "big";
var reg = new RegExp("\\u0062");
alert(reg.test(s));  
//输出为"true"

    另外,有一些预定义好的特殊字符,用来表示特殊的含义。如:“\t,\n,\r,\f,\a,\e,\cX,\b,\v,\0”。

//将用户输入的新一行的所有字符都删除
var str = strWithNewLines.replace(/\n/g, "");

    Character classes
 
    Character classer代表着需要匹配的一组字符,将需要匹配的字符放在一对中括号里,正则表达式将能有效的识别第一个字符,第二个字符,等等。

    Simple classes

    如果需要同时匹配"pig"和"big",可以使用simple character class来实现:

var str = "pig, big";
var reg = /[pb]ig/gi;
var arr = str.match(reg);

    此时,arr中的数据包括"pig"和"big"。当然,使用ASCII或Unicode来表示p或b同样可行。

    Negation classes

    有时我们需要匹配除了少数几个字符外的所有字符,在这种情况下,我们可以使用negation class来进行匹配。例如,匹配除了a和b之外所有的字符,可以表示为[^ab]。在上一个例子中,将reg表示为/[^p]ig/gi,则结果中将过滤掉pig。

    Range classes

    顾名思义,range class就是用来指定某个范围的匹配字符,例如从a到z可以表示为[a-z],从1到10可以表示为[1-10]。如果将range class指定的字符排除在外,可以使用[^1-10],表示除了1到10范围外的所有字符。

    Combination classes

    举一个例子就清楚了,现在需要匹配从1到10,从a到g,并且加上新一行的所有字符,可以表示为[1-10a-g\n]。注意,在[]里不允许再嵌套[]
  
    Predefined classes

    因为有许多样式都不停在重复使用,因此一组预定义好的character classes可以用来简化一些比较复杂的类型。具体的可以参考相关资料,下面举个简单的例子:
  
var str = "8743 apple";
var reg = /[0-9][0-9][0-9]/;
alert(reg.test(str));  
//输出为"true"
  
    使用predefined class可以写成:

var str = "8743 apple";
var reg = /\d\d\d/;
alert(reg.test(str));  
//输出为"true"

    Quantifiers
 
    Quantifiers能够指定某种匹配方式需要进行多少次,包括指定确定的次数,或不确定的次数如至少多少次。

    Simple quantifiers

    下面列表中,指定了某种模式需要重复进行的次数,部分符号和闭包的意义一样:

simple quantifiers.gif

    例如var reg = /b?read/就可以表示bread或read。
  
    三种正则表达式的quantifiers

    Greedy quantifier: 对一个目标串进行匹配搜索,当在目标串中没有相匹配的字符串时,就删去目标串的最后一个字符,再次进行匹配,如果没有发现则再删去最后一个字符,依此类推,最后的结果要么已经将字符匹配上,要么目标串已经为空。

    Reluctant quantifier: 和greedy quantifier搜索风格相反。Reluctant quantifier从目标串的第一个字符开始对目标串进行搜索,当没有匹配时,给目标串加上一个字符,再次进行搜索,依此类推,直到在目标串上匹配成功,或整个目标串都被搜索但仍然没有完成匹配。

    Possessive quantifier: 直接对整个目标串进行匹配,要么匹配上,要么匹配失败,它只进行一次匹配。

    那么如何判断这三种不同的quantifiers呢?主要就是根据问号(?)星号(*)和加号(+)的组合来判断的,如下表所示。

three quantifiers.gif

    需要注意的是,possessive quantifier在目前主流的浏览器中都不被支持,IE和Opera在碰到possessive quantifier时将会抛出异常,Mozilla虽然不会发生错误,但会将它作为greedy quantifier来对待。


    相关链接:正则表达式--JavaScript 实现基础

posted @ 2006-08-11 16:09 Flyingis 阅读(3162) | 评论 (0)编辑 收藏

组装电脑与品牌机

     摘要: 最近开始在.NET平台下进行工作,Visual Studio 2005的高效、易用及强大的功能都给我留下了深刻的印象,但在VS2005下进行一些基础操作的时候,感觉自己好像在做工业设计,有时自己就会想,面对Java 和.NET,就好像是到电脑城去购买电脑一样,是选择DIY,还是选择品牌整机?不管怎样,充分利用已有平台进行深层次开发,把握对架构的理解,就显得更为重要。  阅读全文

posted @ 2006-08-11 09:16 Flyingis 阅读(2543) | 评论 (9)编辑 收藏

正则表达式--JavaScript 实现基础

    作者:Flyingis

    正则表达式用来从某一段字符串中匹配所需要的字符,这些字符可以非常简单,也可以非常复杂。JavaScript生来就对正则表达式有着良好的支持,在网络的字符搜索匹配中发挥着重要的作用。

    JavaScript通过RegExp类来支持正则表达式,举一个最简单的例子:
  
var regApple = new RegExp("apple");

    它可以匹配一个字符串中出现的第一个"apple"字符串,并且对大小写敏感。在构造方法中加入第二个参数"g"则代表的搜索出字符串中所有的"apple",这里"g"代表"global"。如果第二个参数为"i",则代表着case-insensitive,匹配过程中将不考虑字母的大小写。将上述两者综合起来,可以搜索出所有"apple"字符串,并且不考虑大小写问题。

var regApple = new RegExp("apple""gi"); 

    正则表达式有着并不唯一的表示方法,使用Perl语言中的语法,可以将上述表达式表示为:

var regApple = /apple/gi;

    创建了一个RegExp对象后,RegExp的方法可以构造出不同的匹配方式,因为正则表达式是对字符串进行的操作,所以String的一些方法在构造正则表达式的过程中也扮演着重要角色。

    RegExp对象的方法 

var sampleString = "Greenapple";
var regApple = /apple/;
alert(regApple.test(sampleString));

    上面代码输出的结果是"true",因为sampleString中包含了需要匹配的字符串"apple",这是最简单的检测方式。有时,我们需要知道匹配的详细结果,例如:

var sampleString = "green apples, red apples";
var regApple = /apple/g;
var arr = regApple.exec(sampleString);

    通过使用exec()方法,返回的arr是关于匹配结果的一个数组,包括每一个匹配的值及其所在的段,例如上例中是"green apples"还是"red apples"。match()方法有着和exec()相同的功能,只是表达方式不同:

var sampleString = "green apples, red apples";
var regApple = /apple/g;
var arr = sampleString.match(regApple);

    search()方法和indexOf()比较类似,返回第一个匹配的字符串所在的位置:

var sampleString = "green apples, red apples";
var regApple = /apple/gi;
alert(sampleString.search(regApple));  
//输出"6"

    String的方法

    String的replace()方法可以将指定的字符串替换为另一个字符串:

var sampleString = "There is a green apple.";
alert(sampleString.replace(
"green""red"));  //输出"There is a red apple."

    将replace()的第一个参数替换为一个正则表达式,可以达到同样的效果:

var sampleString = "There is a green apple.";
var regApple = /green/;
alert(sampleString.replace(regApple, 
"red"));  //输出"There is a red apple."

    replace()的第二个参数可以替换为一个function(),该function()接受一个匹配字符串作为参数,返回一个替换字符串。(存在疑问)

    使用正则表达式可以实现String的split()方法相同的功能。

var fruit = "apple,pear,lemon";
var arr = fruit.split(",");

    使用正则表达式:

var fruit = "apple,pear,lemon";
var reg = /\,/;
var arr = fruit.split(reg);

    以上这些都是JavaScript正则表达式最基本的一些特性,实现了一些最基本的功能,这些都不是正则表达式真正的强大之处,在作者接下来的随笔中会继续介绍。

posted @ 2006-08-10 21:04 Flyingis 阅读(5605) | 评论 (3)编辑 收藏

ArcIMS 连接器--.NET Link 使用方法

     摘要: ArcIMS各种connector的开发方式存在着一些区别,其中.NET Link连接器仅仅是对XML文件的一种搭配与组装,使用.NET Framework中对XML文件的操纵来拼装所需的ArcXML请求,并接受ArcIMS应用服务器的响应。文章附加了一个简单例子描述了整个过程。

使用.NET Link进行ArcIMS二次开发,开发人员不仅需要熟悉ArcXML_reference,还需要熟悉javascript客户端开发,因为用户在客户端进行的操作和地图服务的响应,均是由javascript脚本来完成的。  阅读全文

posted @ 2006-07-30 21:16 Flyingis 阅读(6352) | 评论 (70)编辑 收藏

ArcGIS-ArcSDE-ArcIMS 9.1 sp2 更新

    7月13日美国ESRI公司一口气放出了ArcGIS、ArcSDE和ArcIMS 9.1版本的Service Pack 2升级包,使用9.1版本的用户可以下载更新。

    ArcGIS 9.l Service Pack 2
   
http://support.esri.com/index.cfm?fa=downloads.patchesServicePacks.viewPatch&PID=43&MetaID=1162

    ArcSDE 9.1 Service Pack 2
   
http://support.esri.com/index.cfm?fa=downloads.patchesServicePacks.viewPatch&PID=19&MetaID=1163

    ArcIMS 9.1 Service Pack 2
   
http://support.esri.com/index.cfm?fa=downloads.patchesServicePacks.viewPatch&PID=16&MetaID=1164

    最近ESRI公司的核心开发人员一直忙于9.2系列产品的研发工作,这次释放出了三个9.1版本的产品的更新包,为9.1产品的用户解决了一些问题,可惜的是,.Net ADF一直都没有相应的更新,按照这个进度,很可能要等到9.2系列产品上市,.Net ADF作为其中之一才能获得bug的修复和功能的更新。

posted @ 2006-07-26 20:50 Flyingis 阅读(2058) | 评论 (2)编辑 收藏

FireFox 2 beta 1 支持 JavaScript 1.7

    Mozilla已经释放出Firefox 2 beta 1以供测试,在新增的众多功能特性中,支持最新的JavaScript 1.7是一个亮点,这使得Firefox成为了第一款支持最新JavaScript功能的浏览器。

    JavaScript 1.7中最值得关注的功能是提供了对iterator的支持,这使得在JavaScript中对数据进行迭代成为可能。使用Firefox 2 beta 1可以立即感受JavaScript 1.7所支持的新的功能。

posted @ 2006-07-25 13:59 Flyingis 阅读(1322) | 评论 (1)编辑 收藏

XMLHttpRequest 在 IE7 中将区分大小写

    一直以来本地XMLHttpRequest对象是不区分大小写的,但从IE7开始,XMLHttpRequest/ActiveX对象将对大小写敏感,这将和传统的面向对象语言例如Java、C#等保持一致,ECMAScript中也是如此

    过去在IE7版本之前使用的方法和函数不需要关心这个问题,但如果要将程序迁移到IE7中或保持所有浏览器版本的兼容性,需要对过去的程序进行修改来保证程序的正确运行。

    其实这种变化应该是发展的趋势,严格控制对象名称可以规范代码风格统一化并减少阅读代码所带来的困难,这是即使在对大小写没有任何要求的时候也应该注意的问题,能形成规约是件好事。

    IE7已经放出beta3版本,需要在Windows XP SP2操作系统下安装。

posted @ 2006-07-25 11:39 Flyingis 阅读(940) | 评论 (0)编辑 收藏

JavaScript 中的继承(下)

    作者:Flyingis

    Prototype

    在《JavaScript中的对象(下)》一文中,我们了解到任何prototype的属性和方法都会被传递到该类的所有实例中,利用这一特性,使用prototype也能实现继承。
 
function ClassA()  {
}


ClassA.prototype.id
= 1998;
ClassA.prototype.sayId
=function(){
   alert(
this.id);
}
;

functionClassB(){
}


ClassB.prototype
=newClassA();
ClassB.prototype.name
="";
ClassB.prototype.sayName
=function(){
   alert(
this.name);
}

    需要注意的是,这种实现继承的方法不能将参数传入到ClassA的构造器中,是一个缺陷。ClassB的所有属性和方法必需在将ClassB的prototype对象指向ClassA的实例之后进行附值。这样做是因为,prototype指向一个新的对象,在此之前prototype的属性和方法都被覆盖销毁。

    对代码进行测试:

var  obj1 = new ClassA();
var  obj2 = new ClassB();
obj1.id
= 1998;
obj2.id
= 2000;
obj2.name
="悉尼奥运会";
obj1.sayId();  
//输出"1998"
obj2.sayId();  //输出"1998"
obj2.sayName();  //输出"悉尼奥运会"

alert(obj2
instanceofClassA);  //输出"true"
alert(obj2 instanceofClassB);  //输出"true"

    在上述代码中可以看出,使用prototype实现继承,instanceof操作符出现了另外的用途,在用构造起定义类实现继承时,instanceof不会出现这种效果。但是使用prototype不能支持多重继承。
  
    在《JavaScript中的对象(下)》和上文的论述中可以了解到,使用构造器定义类实现继承和使用prototype实现继承均存在各自的缺陷,要避免出现这些情况,只有将两者混合使用。

    混合方法

    《JavaScript中的对象(下)》一文中曾经论述,创建一个类的最佳方法,是使用构造器的方法去定义属性,使用prototype定义方法。在继承中同样如此。

function ClassA(id) {
  
this .id = id;
}


ClassA.prototype.sayId
= function() {
   alert(
this.id);
}
;

function ClassB(id, name) {
   ClassA.call(
this, id);
  
this.name =name;
}


ClassB.prototype
=  new ClassA();
ClassB.prototype.sayName
=function(){
   alert(
this.name);
}

posted @ 2006-07-15 16:53 Flyingis 阅读(1550) | 评论 (0)编辑 收藏

JavaScript 中的继承(上)

    作者:Flyingis

    继承是面向对象语言基本特征之一,通过继承可以将父类所具有的特性遗传到子类。ECMAScript中的继承不像Java、C++等语言那么明显,直接通过关键字来实现,通常它是通过模拟方式来实现继承功能的,并且实现方式有多种。

    在继承中引入this关键字,使用构造器方法定义类来实现继承。一个构造器是一个函数,因此可以将父类的构造器作为子类的一个方法使用并进行调用。

function ClassA(id) {
  
this .id = id;
  
this .sayId = function() {
     alert(
this.id);
   }
;
}


function ClassB(id, name) {
  
this .newMethod = ClassA;
  
this .newMethod(id);
  
delete this.newMethod;

  
this.name= name;
  
this.sayName= function(){
     alert(
this.name);
   }
;
}

    注意,子类中所有新的属性和方法都必需在删除newMethod后引入,否则,可能存在用父类的属性和方法重写子类属性和方法的危险。另外,使用这种方法还可以实现多重继承,此时如果两个父类具有相同的属性或方法时,最后的类具有优先级。由于这种继承方法比较流行,ECMAScript第三版引入了两个Function对象:call()和apply()。

    call()

    call()方法是最接近上述继承方式的方法,它的第一个参数是this指向的对象,所有的其他参数都直接传到function。

function sayMessage(first, last) {
   alert(first
+ this.logic +last);
}
;

varobj =new Object();
obj.logic
= "or";

sayMessage.call(obj,
"Coffee ""Tea");  //输出"Coffee or Tea"

    用call()方法来实现继承,只需要this.newMethod相关的三行代码。

function ClassB(id, name) {
  
  //this.newMethod = ClassA;
  //this.newMethod(id);
  //delete this.newMethod;
  ClassA.call(this, id);  //this指向ClassB的对象

  
this.name =name;
  
this.sayName = function() {
     alert(
this.name);
   }
;
}

    apply()

    apply()方法需要两个参数:this所指向的对象,和传到function的由参数组成的array。

function sayMessage(first, last)  {
  alert(first 
+ this.logic +last);
}
;

var obj = new Object();
obj.logic 
= "or";

sayMessage.apply(obj, 
new Array("Coffee "" Tea"));  //输出"Coffee or Tea"
  
    同样,使用 apply() 实现继承可以通过如下方法实现。

function ClassB(id, name) {
  
//this.newMethod = ClassA;
  //this.newMethod(id);
  //delete this.newMethod;
  ClassA.apply(thisnew Array(id));  //this指向ClassB的对象

  
this.name = name;
  
this.sayName = function() {
    alert(
this.name);
  }
;
}

    当父类构造器的参数和子类构造器参数的顺序一致时,可以使用子类的arguments对象作为第二个参数。否则,必需创建一个array来传递参数,或是使用call()方法。

    文章待续……

posted @ 2006-07-15 10:38 Flyingis 阅读(1602) | 评论 (0)编辑 收藏

ArcIMS 体系结构

    作者:Flyingis

    ArcIMS可以运行在一个分布式环境中,包含客户端和服务器组件。一个完整服务的运行过程可以简单的描述为:一个客户端向服务器发送请求信息,服务器处理请求并返回信息到客户端,客户端将所获取的信息展现给终端用户。

architecture.gif

    ArcIMS空间服务器(ArcIMS Spatial Server)

    ArcIMS空间服务器是ArcIMS 的中心枢纽,承载着高负荷的计算任务,对地图数据的请求和相关信息进行处理。当接收到一个服务请求, ArcIMS空间服务器主要可以完成以下功能:

    Image—从在ArcIMS Author或ArcMap中创建的地图数据中创建影像文件
    Feature—缓冲地图特征数据
    Query—查找和搜索条件相匹配的特征数据
    Geocode—执行地址匹配操作
    Extract—从选择的地图特征数据中创建shapefile
    Metadata—打印出metadata 数据
    Route—在一系列的点之间计算路径距离

spatialserver.gif

    两个后台的进程支持着ArcIMS空间服务器的运行: ArcIMS Monitor和ArcIMS Tasker ,在Windows中它们作为后台服务运行,在Unix和Linux中作为daemon进程。

    ArcIMS Monitor跟踪ArcIMS空间服务器的状态。当系统重启时,ArcIMS Monitor将自动恢复ArcIMS服务。

    ArcIMS Tasker清除output目录中的文件。这些由空间服务器创建,以支持ArcIMS服务的文件,将在用户定义的时间间隔后被清除。当前服务为地图服务时,用户发送请求得到的数据均是由ArcIMS空间服务器对请求产生响应,返回的数据是图片,保存在output目录中, ArcIMS Tasker会在一定时间后清除这些图片数据。

ArcIMS应用服务器(ArcIMS Application Server)

    ArcIMS应用服务器控制着传入请求,跟踪当前哪些服务运行在哪些ArcIMS空间服务器中。ArcIMS应用服务器将请求传输到适合的空间服务器。应用服务器是一个Java应用程序,在Windows操作系统中作为一个Windows服务,在Unix和Linux中作为一个daemon进程。

ArcIMS应用服务连接器(ArcIMS application server connectors)

    ArcIMS应用服务连接器将Web服务器和ArcIMS应用服务器连接在一起。ArcIMS Servlet Connector是ArcIMS的默认连接器。它使用ArcXML在Web服务器和ArcIMS应用服务器之间传递信息。

    相对于ArcIMS Servlet Connector,还有几种其他的连接器可供选择:

    ColdFusion Connector
    ActiveX Connector
    ArcIMS Java Connector
    ArcIMS .NET Link

    ColdFusion和ActiveX连接器配合自定义的客户端工作,并且将自己的语言转换成ArcXML。ArcIMS Java Connector通过 JSP客户端或独立的Java应用程序和ArcIMS应用服务器保持通信。.NET Link提供TCP/IP或HTTP连接到应用服务器。

    关于连接器的相关资料,在 ArcIMS Help 中搜索主题:

    More about the ArcIMS Servlet Connector
    Connectors and ArcMap Server
    The ArcIMS documentation set
    ArcIMS Viewers

    当使用ArcIMS Designer创建了一个为用户提供地图内容的网站时,可以选择三种ArcIMS Viewers:HTML、 Java Standard、或Java Custom。通过定制这些Viewers或定制客户端可以达到基本相同的效果。另外,还可以使用比较成熟的客户端,如ArcMap、ArcExplorer和Metadata Explorer。

    从本质上说,viewer或客户端就是Internet GIS 应用或网络应用的网站,提供用户需要的地图服务。当用户访问这些网站的时候,他们可以在viewer中看到嵌入在网站中的定制地图。整个viewer决定了网站的外观和功能。

    相关viewer的相关资料,在ArcIMS Help中搜索主题:

    Choosing a viewer for your Web site
    Designing a Web site
    Overview of using the ArcIMS Viewers

    关于连接器、客户端的选择,可以参考
这篇文章

    ---- 参考资料:ArcIMS Help

posted @ 2006-07-09 11:50 Flyingis 阅读(9642) | 评论 (12)编辑 收藏

JavaScript 中的对象(下)

    作者:Flyingis

5  自定义类和对象

5.1  工厂方法

    在ECMAScript中创建工厂方法,返回一个特定类型的对象,以此实现代码的简洁适用。

function createFruit() {
  
var tempFruit = new Object;
  tempFruit.name 
= "apple";
  tempFruit.number 
= 5;
  tempFruit.showName 
= function() {
    alert(
this.name);
  }
;
return tempFruit;
}


var Fruit1 = creatFruit();
var Fruit2 = creatFruit();

    在createFruit()中可以加入形参来传入参数的值。随着ECMAScript不断被规范化,这种创建对象的方法已不再流行,一部分原因是语法上的,一部分原因是功能上的,如每个对象的实例都拥有属于自己的showName方法,给内存管理带来一定的开销。

5.2  构造函数

    选择一个类名,第一个字母大写,该类名即是构造函数的名称。创建一个构造函数和工厂方法比较类似,不同的是需要使用关键字new来创建对象的引用。使用构造函数的方式来创建对象和使用工厂方法有着相同的弊端。

function Fruit(name, number) {
  
this.name = name;
  
this.number = number;
  
this.showName = function() {
    alert(
this.name);
  }
;
}


var Fruit1 = new Fruit("apple"5);
var Fruit2 = new Fruit("pear"3);

5.3  使用 Prototype

    使用prototype属性可以用来创建新的对象,首先需要一个空的构造函数建立类的名称,然后所有的属性和方法都直接分配到prototype属性中。

function Fruit() {
}

Fruit.prototype.name 
= "apple";
Fruit.prototype.number 
= 5;
Fruit.prototype.showName 
= function() {
  alert(
this.name);
}
;

var fruit1 = new Fruit();
var fruit2 = new Fruit();

    但是,这样同样存在一些缺点。首先,构造函数中没有参数,给初始化带来一些麻烦,其次,当一个属性指向的是一个对象而非方法时,该对象会被所有的实例所共享,任何一点改动都会影响到其他对象引用的使用。

5.4  混合使用工厂方法和Prototype

这个概念很简单:使用构造函数定义所有除方法外的属性,使用 prototype 定义对象的方法。这样每个方法只会被创建一次,每个对象都能拥有自己对象实例的属性。

function Fruit(name, number) {
  
this.name = name;
  
this.number = number;
  
this.owner = new Array("Jerry""Terry");
}

Fruit.prototype.showName 
= function() {
  alert(
this.name);
}
;

var Fruit1 = new Fruit("apple"5);
var Fruit2 = new Fruit("pear"3);

5.5  动态 prototype

    简单来说,这种方法就是使用了一个标识符来判断 prototype 是否已经被指向某个方法,从而保证这些方法只会被创建并指向一次。

5.6  混合工厂方法

    这种方法和经典的工厂方法及构造函数方法在对象方法内存管理上存在同样的问题,一般不建议使用该方法,除了某些特殊情况(XML in JavaScript中有这样的例子)。

6  修改对象

    使用prototype对象可以对对象进行修改。除了用户自定义的对象外,ECMAScript原始对象也有prototype属性。直接使用 prototype可以给对象创建新的方法。

Number.prototype.toHexString = function() {
  
return this.toString(16);
}
;
var iNum = 10;
alert(iNum.toHexString());  
//输出A

    另外,使用prototype可以轻松修改已有的方法,让方法名指向新的方法。需要注意的是,指向新的方法后,原有的方法不再被任何对象使用,将会被垃圾回收器销毁,使得原有方法不再存在。比较安全的解决办法是,建立一个新的引用来保存原有的方法,然后再将原方法覆盖。

    比较特殊的是,ECMAScript中创建对象,在对象引用被创建后,可以给对象加入新的方法,并且可以立即在对象的引用中使用。这是ECMAScript的一个特性,但不推荐这样使用,以免带来不必要的麻烦,例如阅读理解、文档资料等。

posted @ 2006-07-03 14:02 Flyingis 阅读(3955) | 评论 (3)编辑 收藏

JavaScript 中的对象(上)

    作者:Flyingis

    面向对象语言需要具备三种基本特征:继承(Inheritance)、多态 (Polymorphism) 、封装(Encapsulation and Aggregation)。和Java 、C++ 等语言一样,ECMAScript 被认为是面向对象的,因为它同时支持这些特征。
 
var obj = new Object();

    该语句创建了一个对象,当构造函数没有参数时,可以省略后面的括号。我们通常是通过对象的引用来进行对象操作,当一个对象的引用为null时,ECMAScript将启动垃圾回收程序删除该对象,释放内存。当一个对象存在多个引用时,需要将所有的引用设置为null来释放该对象所占用的空间。

早期绑定和动态绑定

    早期绑定是指在对象被实例化之前对象的属性和方法已经被定义,使得编译器或解释器能够提前编译机器码。Java和VB支持这种特性,但ECMAScript 并非强类型,不支持早期绑定。

    动态绑定是指编译器或解释器在运行时才知道该对象的具体类型,之前并不会检查,只会判断这些属性和方法是否得到该对象的支持。ECMAScript对所有的变量使用动态绑定。

对象类型

2.1  原始对象

    ECMA-262 定义不受主机环境影响的ECMAScript支持的任意对象为原始对象,简而言之,原始对象就是ECMA-262定义的引用类型,比较常用的有Object、Function、String、Boolean、Number、Array、Date。 

    Array

   
Array有许多常用的方法,很多和Java类似,在此不作介绍。需要注意的是,使用push()和pop()两个方法,可以将Array看作一个栈,遵循后进先出规则(LIFO)。使用shift()和push()两个方法,Array对象即可看作是一个队列,遵循后进后出的规则(LILO)。splice()方法非常有用,它轻松的实现了链表的一些基本功能,如删除数据项、插入数据、替换数据。

    Date

   
ECMAScript中的Date类是基于Java早期版本中的java.util.Date类的,它可以精确表示1970年1月1日(格林威治时间)前后285616年的任意时间。Date是少有的几个重写了toString()和valueOf()方法,并且两个方法并不相同的类。valueOf()通常表示精确到毫秒级的时间,toString()通常返回个性化的时间表示方法,例如相同的时间在不同浏览器下显示的效果可能不一样。

2.2  Build-in对象

    Build-in 对象除了具备原始对象的基本特性外,它在 ECMAScript 程序开始运行时就可以使用,因此可以说任何 Build-in 对象就是原始对象。目前 ECMA-262 只定义了两个 Build-in 对象: Global 和 Math 。

    Global

   
在ECMAScript里,没有函数可以单独存在,所有的函数都必须是某个对象的方法。如isNan()、isFinite()、parseInt()、parseFloat()、encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent() 等均是Global对象的方法,除此之外,Global对象还包括一些属性。

    Math

   
Math中有许多属性和方法可以用于数学计算,和Java中的比较类似。

2.3  Host 对象

    除了原始对象和Build-in对象外,其他对象均是Host对象。所有的BOM和DOM对象均被认为是Host对象。

类成员的访问方式

   
在面向对象语言程序设计中,常见的类成员访问方式有public、protected和private。在ECMAScript中,只有public一种访问方式,对象中所有的属性和方法都是可见的,因此,在程序设计时需要额外注意系统安全性的问题。在没有合理的程序规范之前,程序员在编写ECMAScript代码时,通常使用一定规范的命名方式来说明该属性或方法是私有的(仅仅是说明而已,实际上还是公有的),例如在名称前后加上下划线,或只在名称前加下划线。另外,在ECMAScript中没有static方法。

4  this
关键字

    this关键字是ECMAScript中一个非常重要的概念,通常在对象的方法中使用。

function whatFruit() {
  alert(
this.color);
}


var table1 = new Object;
table1.fruit 
= "apple";
table1.whatFruit 
= whatFruit;
var table2 = new Object;
table2.fruit 
= "pear";
table2.whatFruit 
= whatFruit;
table1.whatFruit();  
//输出apple
table2.whatFruit();  //输出pear

    当一个变量前面没有对象或this来引用时,ECMAScript认为该变量是一个本地的或全局变量,于是在本地和全局中去搜寻该变量,如果最后仍没有找到,将会在alert中输出null。

    文章待续……

posted @ 2006-06-30 15:20 Flyingis 阅读(2345) | 评论 (0)编辑 收藏