Flyingis

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

BlueViewer 地图加载分析(C#)

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

posted @ 2006-09-03 23:14 Flyingis 阅读(2817) | 评论 (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 阅读(1991) | 评论 (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 阅读(4131) | 评论 (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 阅读(2790) | 评论 (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 阅读(3264) | 评论 (0) | 编辑 收藏

组装电脑与品牌机

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

posted @ 2006-08-11 09:16 Flyingis 阅读(2614) | 评论 (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 阅读(5701) | 评论 (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 阅读(6508) | 评论 (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 阅读(2126) | 评论 (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 阅读(1380) | 评论 (1) | 编辑 收藏

XMLHttpRequest 在 IE7 中将区分大小写

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

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

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

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

posted @ 2006-07-25 11:39 Flyingis 阅读(988) | 评论 (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 阅读(1615) | 评论 (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(this, new Array(id));  //this指向ClassB的对象

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

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

    文章待续……

posted @ 2006-07-15 10:38 Flyingis 阅读(1668) | 评论 (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 阅读(9775) | 评论 (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 阅读(4074) | 评论 (3) | 编辑 收藏

JavaScript 中的对象(上)

    作者:Flyingis

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

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

1  早期绑定和动态绑定

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

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

2  对象类型

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对象。

3 
类成员的访问方式

   
在面向对象语言程序设计中,常见的类成员访问方式有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 阅读(2452) | 评论 (0) | 编辑 收藏

JavaScript 调试工具

    作者:Flyingis
 
    JavaScript代码看起来总是要比Java、C#乱的多,可能是自己还不熟悉JavaScript编程,因此一款优秀的JavaScript调试器就显得格外重要。目前在网络和书上见到最多的有:

    Microsoft Script Debugger: 集成在IE中的一款很原始的调试工具,具备基本的调试功能,除了可以用于调试客户端脚本,还能调试在Microsoft IIS上运行的服务器端脚本。该工具命令窗口是基于文本的,针对VBScript和IE环境进行调试会更加适用。
 
    Firefox JavaScript Console: 可以记录JavaScript中出现的所有警告和错误,诊断出大多数错误。工具比较简单实用。
 
    Venkman: 一个基于Mozilla的浏览器的JavaScript调试环境,是Mozilla浏览器的一个扩展。Venkman基于Mozilla JavaScript调试API(js/jsd),js/jsd API 构成了 Netscape JavaScript Debugger 1.1的基础,Netscape浏览器4.x系统都提供了这个调试工具。Venkman是目前比较流行的JavaScript调试工具。

    相关下载:

    http://www.hacksrus.com/~ginda/venkman/
    上面最新的版本是0.9.85,对于Firefox只能支持1.5以前的版本。

    https://dwr.dev.java.net/files/documents/2427/22010/venkman-0.9.85.jw2.xpi
    venkman-0.9.85.jw2.xpi是venkman-0.9.85xpi的修改版本,可以支持Firefox 1.5.0。 

    https://addons.mozilla.org/firefox/216/
    在Mozilla官方站点上,venkman有了另外的一个名称——JavaScript Debugger,已经发布了0.9.87版本,支持Firefox 0.9-3.0,Mozilla 1.0-1.8,Thunderbird 0.9-3.0的所有版本浏览器。
    除了官方网站外,该工具的扩展安装也可以通过链接
    http://www.blogjava.net/Files/flyingis/javascript_debugger-0.9.87.rar进行本地下载。
 
    另外有一些JavaScript专用IDE,有兴趣可以试用一下:
 
    Cardinal JavaScript IDE:
    http://home.earthlink.net/~mafriedman/ide/

    JavaScript IDE for Eclipse:
    http://www.basement.org/archives/2005/09/js_eclipse_javascript_ide for.html

    JavaScript IDE(共享软件):
    http://www.downloadjunction.com/product/software/42264/index.html

posted @ 2006-06-16 20:16 Flyingis 阅读(13429) | 评论 (3) | 编辑 收藏

ECMAScript 基础

     摘要: JavaScript三大核心之一ECMAScript语言快速入门基础。
目前已更新:ECMAScript语言基本特点;原始数据类型;数据转换;Type Casting;引用类型;操作符和语句;Functions……
最近更新日期:2006-6-16  阅读全文

posted @ 2006-06-13 15:36 Flyingis 阅读(3724) | 评论 (4) | 编辑 收藏

JavaScript 基本组成

    JavaScript的学习,以Nicholas C.Zakas的《Professional JavaScript for Web Developers》为基础材料。

    JavaScript作为一种网络客户端的脚本语言,由以下三部分组成:

1.  ECMAScript--JavaScript的核心,描述了语言的基本语法和对象。

    ECMAScript经历了三个版本的更新,现在大多数网络浏览器都支持Edition3。ECMAScript主要提供语言相关的信息与标准,如语法、类型、声明、关键字、保留字、操作运算符、对象等等。

2.  DOM--The Document Object Model,描述了作用于网页内容的方法和接口。

    DOM是HTML的一个应用程序接口,它也经历了三个版本的更新,其中以第一和第二个版本使用最为广泛,在第二个版本中,最重要的特性莫过于提供了事件响应的接口,处理CSS的接口,移动窗口的接口,并且能够控制代码树的结构等等。
    除了使用最多的DOM Core和DOM HTML标准接口外,其他的部分语言也拥有自己的DOM标准,如SVG、MathML、SMIL。

3.  BOM--The Browser Object Model,描述了和浏览器交互的方法和接口。

    例如弹出新的浏览器窗口,移动、改变和关闭浏览器窗口,提供详细的网络浏览器信息(navigator object),详细的页面信息(location object),详细的用户屏幕分辨率的信息(screen object),对cookies的支持等等。BOM作为JavaScript的一部分并没有相关标准的支持,每一个浏览器都有自己的实现,虽然有一些非事实的标准,但还是给开发者带来一定的麻烦。

posted @ 2006-06-11 11:37 Flyingis 阅读(3366) | 评论 (0) | 编辑 收藏

了解 Ajax 框架--充电开始

    作者:Flyingis
   
    这学期一直忙着找工作、毕业论文和毕业前的各种手续,学习速度放慢了不少,大多数时候只是上来看看。现在正式开始充电,补充新的知识,为了工作需要,首先从客户端技术Ajax开始。

    Ajax高手在Blogjava上有不少,还有众多潜水高手,在这里,随笔记录的仅仅是自己的学习轨迹,不足之处希望大伙能指出,和大家一起讨论,帮助我提高。“
工欲善其事,必先利其器”,首先总结一些Ajax常用的框架。

    Ajax框架有基于服务器端和客户端两种,多数是开源实现,并且发展速度很快。

    服务器端框架

    1.  Sajax
    Sajax拥有活跃的社区,支持Perl、Python、Ruby、ASP等语言,每种语言Sajax都有一个简单的库,利用Sajax可以直接从JavaScript调用服务器代码。
    官方网站:
http://www.modernmethod.com/sajax 。

    2.  JSON
    JSON作为JavaScript语言的一个子集,是一种描述数据的轻量级语法,和XML类似,用于交换数据。XML相关的有XML-RPC,JSON也有JSON-RPC远程调用协议,它在Java、Ruby、Python、Perl中都有实现。
    网上参考:http://www.crockford.com/json/ 。

    3.  DWR
    DWR这个字眼出现的频率较高,在网上搜索了一下,查到DWR全称是Direct Web Remoting,代表着可以直接从JavaScript远程调用Java方法。使用DWR需要一些额外的配置,如编辑Web应用的描述文件,编辑DWR的配置文件,来指定可以远程创建和调用的类,从这种方式可以看出其中存在一些安全隐患,但是,由于DWR支持常用的Struts/WebWork/Tapestry Web框架,在Apache协议下发布,加上丰富的文档资料,使得DWR在Java领域非常流行。
    介绍DWR的相关文章可以参考:
    http://www.blogjava.net/mstar/category/2359.html
    http://www.blogjava.net/zkjbeyond/category/11348.html
    更多信息可以访问:http://getahead.ltd.uk/dwr/index 。

    4.  Buffalo
    Buffalo是由国人开发的Ajax框架。Buffalo中定义了Web远程调用的传输基础,并且将远程调用对象完整的序列化到了本地,成为可以被JavaScript编程触及的对象。Buffalo中的重要组件-BuffaloBinding,提供了将JavaScript对象绑定到HTML元素的能力。这种绑定将是无侵入的,只需要在HTML元素中加入若干个不影响排版的属性,即可将数据与界面绑定。Buffalo1.2引入了新的众多的特性包括,新的重新改写的Spring集成,与流行JavaScript库Prototype的集成,支持浏览器前进后退按钮等等。
    下载链接:http://www.amowa.net/buffalo/ 。[引自CSDN]

    5.  Ajax.Net
    顾名思义,Ajax.Net是.Net平台下的Ajax框架,它可以从JavaScript客户端调用.Net方法。Ajax.Net所包括的DLL可以和VB.Net/C#配合使用,其相关文档也很多。参考网站:http://ajax.net/ 。

    6.  Atlas
    这是Microsoft的一个项目,其特点在于提供客户端脚本框架、ASP.Net控件及Web服务集成。微软的项目,还是值得关注的。
    相关介绍:http://blog.joycode.com/saucer/archive/2005/06/30/58284.aspx/ 。

    7.  Ruby on Rails
    这个就不用多说了,前段时间开始就炒的异常火热的一个框架,建立在Ruby语言基础上,其最显著的特性是能够快速开发Web应用,使用Rails会觉得Ajax非常简单。Rails拥有许多JavaScript库,另外有一个模块封装了Ruby的JavaScript调用。对各种Rails的介绍,可以参考江南白衣的文章各系Rails大点兵。网站参考:http://www.rubyonrails.org/ 。

    客户端框架

    1.  Dojo
    最老的框架之一,2004年9月开始开发,它具有一个独特的特性,即支持向后和向前按钮,通过注册一个回调的方法,使得用户在点击向后和向前按钮的时候调用改方法,实现后退前进的功能。Dojo是相对成熟的工具包之一。
    具体内容参考网站:
http://dojotoolkit.org/ 。

    2.  Rico
    Rico侧重点在于拖放效果、数据网格、自定义页面布局、淡入淡出等人性化效果的轻易实现,使用Rico需要Prototype.js库来支撑,
zkjbeyond有关于Prototype.js的基本介绍。
    Rico官方网站:
http://openrico.org/home.page/ 。

    3.  Flash/JavaScript集成库
    当我刚进入大学的时候,Flash技术和JavaScript特效都是当时网络中最流行的字眼,但Flash丰富的用户体验更让人印象深刻,小小系列以及雪村的网络MTV都是比较早的作品,还有众多Flash制作的网站。在现在Ajax流行的环境下,Flash的臃肿和需要安装插件机制使得它不再那么耀眼,但是如果要混合使用Flash和Ajax,则可以使用Flash/JavaScript集成库,这个工具集可以使得JavaScript和ActionScript(Flash中支持的语言)能够相互调用,传递数据。
    相关资料可以访问:
http://weblogs.macromedia.com/flashjavascript/ 。

    4.  SACK
    SACK是一个针对XMLHttpRequest的瘦包装器,可以简化Ajax开发,它由一个JavaScript文件组成,包含很少的代码,入门比较方便,它最主要的特性应该就是足够简单。
    相关信息可以访问:
http://twilightuniverse.com/projects/sack/ 。

    5.  RSLite
    RSLite是远程脚本的一个实现,从2000年开始发展。它的特性在于拥有广泛浏览器的支持(因为没有利用XMLHttpRequest对象),它是一个轻量级的框架。
    网站信息:
http://www.ashleyit.com/rs/rslite/ 。

    6.  Google AJAXSTL
    Google AJAXSTL是使用XPath的XSL转换(XSLT)的JavaScript实现。该工具包很小,并且还不完善,但作为使用AJAX的先驱,还是应该给予一定的关注。
    开源链接:http://goog-ajaxslt.sourceforge.net/ 。

    这些是个人最初所关注的一些框架,
Computerboy的Ajax框架汇总和Ajax Resources有更多的对Ajax框架及相关资源的介绍。

posted @ 2006-06-10 17:42 Flyingis 阅读(4735) | 评论 (0) | 编辑 收藏

学术与工作

    作者:Flyingis

    在校园里我已经度过了第二十四个年头,一直还没有机会踏入到社会中去经历工作的锻炼。在大学校园里六年,我感受的是学术的氛围,学习的是做学问的方法。只是在硕士期间参与导师的一个横向项目,让我第一次有机会在实际工程项目中施展拳脚,也亲身感受到了学术与项目工作之间的差异。

    做学术和实际工作有一些共同点,它们都需要有踏实认真的学习态度,都需要循序渐进不断积累,它们对参与者态度的要求是一致的。并且都需要有良好的合作团队来使得大家共同提高,事半功倍。但是它们又存在太多的不同,主要体现在以下几个方面:

    1. 学术上对理论强调的比较多,任何发表在高水平期刊上的论文,没有厚实的理论基础作为支撑根本不可能发表,即使是在Nature&Science上发表的原创性论文,也是“站在巨人的肩膀上”完成的,因此,做学术需要看大量的相关文献资料,在前人的基础上做研究。工作侧重的是实际工作经验,和完成工作的能力,在工作中,老板基本不会过问你采用什么技术来实现这一目标,他需要了解的是你能否达到他的目标,需要多长时间,预计完成的效果如何,能否满足客户要求等等,有时候碰到一个难点可能有多种方法来解决,当技术人员所具备的技术并不是最高效的方法,但也能解决问题,如果基本不影响结果往往会采用自己所熟悉的方法来完成,因为客户他们一般是不怎么太关心中间的技术细节的,但在学术中讲究的就是最好,要求的是突破前人的研究成果,否则你的成果只能说是一个应用,而不是创新。

    2. 做学术,在中国注重的还是发表的文章,期刊的质量越高越好,这种评判一个人学术水平的高低既合理,但又存在问题。合理体现在,一篇高质量或至少是自己精心研究完成的论文,代表的是自己研究的精华,垃圾论文不说,写一篇好的论文其实真的不是件容易的事情,特别是理学的学科,一篇短短的万字不到的论文,需要你阅读的可能是百万字的文献,以及对文献的思考,再加上自己在该领域的实际工作的提炼,文字、排版、制图、分析、投稿、修改,每个过程都不省事,在SCI特别是外文的SCI上发表一篇文章的确是自己的精心之作。但其中存在的问题,就是急功近利的人太多,不仅是在实际工作中,在学术上浮躁的人也太多太多,使得现在国内垃圾刊物靠论文赚钱,一般的核心期刊靠专辑来盈利,并靠有国家自然科学基金、985、973重大项目支撑的论文撑门面,减少了对学术本质的专注,使得学术领域也渐渐成为了中国最腐败的领域之一。做项目,注重的是最后的运行效果能否满足客户需要,中间的过程和技术框架只是项目完成报告中的例行公事,只要软件能够运行起来,并在功能、效率、安全、界面上都符合要求,用.net还是Java,用WebWork还是JSF其实都是次要的了,更不用去过多的考虑我采用的技术在理论上是否达到了国内领先、国际先进了,关键还是结果。工作中,当然也逃不掉浮躁之风,特别是政府的政绩工程项目,往往是烂掉不能用的。

    3. 做学术,从理论上说,在某些领域可能不需要太多的资金支持,当自己研究成果出来了就可以名利双收,这样的学者在国外可能更多一些。做项目工作,没有钱是肯定不行的,否则怎么能让这么多员工安家乐业,只有资金才能创造好的工作环境,才能吸引人才。

    前段时间忙自己的毕业论文,确实让我着急了几天,因为自己两年毕业时间比较仓促,论文的题目和自己先前做的项目又没有任何关系,只能从一个应用的角度,加上一些理论经验的支撑,完成了论文,硕士论文总共所花的时间是一个半月,真正紧张从早到晚忙论文的时间是半个月,自己不是贬低自己论文的水平,至少能够符合现在对硕士论文的要求,但我知道自己能做的更好,并且能好不少,如果我有一个更好的平台,自己所做的项目能支撑自己的论文。还好我完成了论文,我之前的项目经验也让我在找工作的时候没有碰到什么困难,但看着BlogJava上众多高手对技术的痴迷和丰富的工作经验,有时我在想我在学校里获得了什么,一点项目经验和一个学位证,但两者根本就是脱离的,在我们这批学生中,我还算是比较幸运的,那其他的人怎么办呢?因此才会出现现在企业招人难,但学生也过剩的问题,看到这两天BlogJava中也有
对企业招人的讨论 。一位博士对我说过,在硕士、博士阶段,如果学术上没有什么成就,你获得的就是交际层面的提高、扩大,还有一个学位证,同学资源的确是宝贵的,学位证,在中国有还是比没有好,他说的没错。

    当然,不是所有的毕业生都是能力差的,出色的也不少,可以这样说,只要是在大学里认真做过事情,学习过知识的人,找工作都不难。文中所说的,只是作者自身的一些感受。马上就要奔赴工作岗位了,从学术转到工作,对我来说应该问题不大,但自己已经开始感觉到压力,踏实工作是我现在唯一能想到的事情。

    忘了一件事,今天六一,这节日早已不属于我们,但祝愿博客园中已成为父母的程序员的宝宝们节日快乐,健康成长!

posted @ 2006-06-01 11:59 Flyingis 阅读(1442) | 评论 (6) | 编辑 收藏

一幅土地资产评价简图

    近段时间在忙毕业设计,研究程序开发设计的时候少了。
   
    传一张论文中用到的图示,遥感数据的解译、编辑、空间地理计算、成图在Erdas + ArcGIS中完成,计算的理论基础是层次分析法(AHP)和Saaty提出的1~9比较标度法。图中省略了一些图层信息和基本元素。(点击标题进入可以看到图)

土地资产价值分布图.jpg

posted @ 2006-05-23 10:02 Flyingis 阅读(953) | 评论 (0) | 编辑 收藏

GeoServer 1.3.1 beta 发布(重大更新)

地理信息系统服务器 GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。

GeoServer 主要特性包括:兼容 WMS 和 WFS 特性;支持 PostGIS 、 Shapefile 、 ArcSDE 、 Oracle 、 VPF 、 MySQL 、 MapInfo ;支持上百种投影;能够将网络地图输出为 jpeg 、 gif 、 png 、 SVG 、 KML 等格式;能够运行在任何基于 J2EE/Servlet 容器之上;嵌入 MapBuilder 支持 AJAX 的地图客户端;除此之外还包括许多其他的特性。

GeoServer 最新的版本 1.3.1 beta 增加了 GeoTools 2.2.x , GeoTools 是一款基于 Java 的开源 GIS 工具集,允许用户对地理数据进行基本操作。通过 GeoTools 的各种接口和 helper 类,可以写入新的数据格式,通过 GeoTools 为 GeoServer 提供的插件,在不进行重新编译的情况下,可以让 GeoServer 支持更多的数据格式,甚至只需要通过 GUI 的 option 设置即可。

一直都比较关注 GeoServer 和 GeoTools 的发展情况, GeoServer 提供了一个相对简易的地理信息服务系统, GeoTools 包含地理信息数据基本操作的源码实现,是学习地理信息基础研发和 WebGIS 的经典资料库,两者的合并和今后的发展无疑会吸引众多地理信息开发者的目光。
     


GeoServer 主页: http://docs.codehaus.org/display/GEOS/Home

GeoTools 主页: http://www.geotools.org/

GeoServer 1.3.1 beta 下载:

http://docs.codehaus.org/display/GEOS/2006/05/06/GeoServer+1.3.1+beta+release

posted @ 2006-05-14 11:13 Flyingis 阅读(3126) | 评论 (6) | 编辑 收藏

模型与地理建模

作者: Flyingis

模型是为了理解和预测现实世界而构建的一种有效的替代物,它不是现实世界的复制,它是物体的一种简化,并能够体现物体的关键特征。地理学研究的目的是理解人类与环境间的关系,在地理建模过程中必然包含了许多人为或主观因素,但也不能随心所欲去表达所要表达的世界。一个好的模型可以把一个复杂的问题简单明了地表达出来,反之则会将问题描述的非常复杂难懂。

建模的步骤一般分为:建立概念模型;建立定量模型;模型检验(模型验证、模型确认);模型应用。目前,由于地理问题的复杂性和不确定性,地理学的量化水平还比较低,其建模主要是借鉴地质学、生态学和水文学等相关学科的模型和建模方法来研究有关地理环境问题。

地理建模一般具有复杂性、空间性、时间性和模糊性特点。在地理学中,建模的对象是地理系统,它具有明确的时间和空间特征。地理建模包含两种含义:空间实体对象建模和地理问题建模。空间实体对象是地理特征的抽象与几何表示,它的建模是地理信息系统所关注的主要内容。地理问题建模则涉及到地理学的所有领域。

在地理建模中,地理信息系统提供了数据的支持、模型库的管理和建模结果的可视化,是地理建模重要的技术支持。地理信息系统侧重于空间数据的存储、管理和制图,分析方法基本以空间位置为核心,关注的是对象之间的空间位置关系。地理建模中,空间位置是作为数据的属性来考虑,研究各个要素之间的关系以及这种关系的表现形式。归纳起来,地理信息系统的主要研究内容是空间数据的管理、空间关系的分析和表示,地理建模研究的是地理要素之间关系的建立、解释和分析。

地理建模针对地理问题,使用系统分析方法、物理方法和数学方法建立模型,对模型进行分析,以便为政府或经济、社会发展的决策提供基础支持。地理建模应用的方法,不同于决策分析中应用的方法,决策分析主要涉及信息论和控制论的内容,如规划方法、投入产出方法等。

posted @ 2006-05-09 10:35 Flyingis 阅读(1446) | 评论 (1) | 编辑 收藏

网站项目管理(二)

     摘要: 网站项目管理中的团队氛围,项目文档,和其他要求。  阅读全文

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

网站项目管理(一)

     摘要: 网站项目管理中的网站界面,项目进度,和人力资源。  阅读全文

posted @ 2006-04-25 11:14 Flyingis 阅读(2115) | 评论 (1) | 编辑 收藏

GIS 缓冲区应用及算法实现

作者: Flyingis

地理信息空间几何关系分析主要包括邻近度 (proximity) 分析、叠加分析、网络分析等。缓冲区分析是邻近度分析的一种,缓冲区是为了识别某一地理实体或空间物体对其周围地物的影响度而在其周围建立具有一定宽度的带状区域。缓冲区作为独立的数据层进行叠加分析,可应用到道路、河流、环境污染源、居民点、辐射源等的空间分析,为某种应用目的提供科学依据,另外,结合不同的专业模型,可以在生活、军事、城乡规划等领域发挥重要的作用。

针对点、线、面不同的几何类型,建立缓冲区的方式相互有所不同。建立点缓冲区比较简单,即以某点要素为圆心,以缓冲半径 R 作圆,得到点要素的缓冲区;线要素的缓冲区是以线为轴,以 R 为距离作两侧的平行线,在线的两端构建两个半圆弧段,和平行线一起组成缓冲区;面缓冲区的建立,是以面要素的边界为基线向内外侧作平行线,平行线和基线里的区域就是面缓冲区。除此之外,还可以对栅格数据建立缓冲区,根据不同的模型方程建立动态缓冲区,不论对什么样的数据建立缓冲区,其基本方法都是相似的。

缓冲区实现算法有矢量方法和栅格方法两种。其中矢量方法数据量小,方法相对成熟,栅格图像需要进行栅格像元之间进行布尔运算,当缓冲区较大时会带来较重的运算负荷,实际运用中存在一定的局限性。矢量方法算法一般遵循以下步骤:

点 :确定中心点——以中心点为圆心、 R 为半径生成一个圆——得到缓冲区边界

线、面 :确定轴线——以距离 R 生成中心轴线的平行曲线——处理转角弧段——对生成的弧段进行求交、合并运算——生成缓冲区边界

常用的矢量数据中心线扩张算法:

角分线法

基本思想:即“简单平行线法”,在轴线的两边作出平行线,在转角处形成尖角,两端形成弧段,组成缓冲区。

缺陷:难以保证在尖角处缓冲区左右边线等宽;校正过程复杂,主要体现在轴线折角很大和很小时的情况;算法模型复杂,主要是因为几何生成过程中需要处理较多的异常。

凸角圆弧法

基本思想:顾名思义,即是在转角外侧用圆弧来代替尖角,内侧仍然使用尖角的方法,生成缓冲区。

实施步骤:

1.        直线性判断,判断相邻三点是否在同一直线上;

2.        折点凸凹性判断,确定转角的地方哪侧使用直线求交,哪侧使用圆弧连接;

3.        凸点圆弧的嵌入,即将转角外侧形成的圆弧和两边的线段相连;

4.        边线关系的判别与处理,岛屿多边形参与缓冲区边界的构成,重叠多边形不参与缓冲区边界的构成;

5.        缓冲区边界的形成,具体是将重叠区域进行合并,绘制外围的边线,包括岛屿多边形的轮廓,形成最终的缓冲区边界。

在缓冲区算法中,需要注意的一个问题是缓冲区多边形的重叠与合并,包括同一要素缓冲区的重叠和多个要素之间缓冲区的重叠。栅格数据缓冲区内的栅格具有一个与其影响度对应的一个值,如果重叠区域具有相同影响度则任取一值,如果不同则采取影响度大的代替影响度小的方法处理。对于矢量数据的处理算法有三种:数学运算法;矢量-栅格转换法;矢量-栅格混合法。 

posted @ 2006-04-17 15:25 Flyingis 阅读(7907) | 评论 (9) | 编辑 收藏

地理网格


    作者:Flyingis

地理网格是将平面以某种规则分级的空间数据结构,具有较高的标准化程度,它有利于面向空间数据库和几何操作算法的研究和开发。使用地理网格可以将地理空间定位和地理特征描述关联起来,以网格单位作为基本分辨率,控制在允许的误差范围内。

最常见的地理网格是经线和纬线组成的网格系统,网格由等度数间隔的经线和纬线交叉组成,空间数据的属性与经纬网格内的点相关联,方便网格内空间数据的获取与处理。网格系统可以在原有较小分辨率网格的基础上创建更细的子网格,增大其分辨率。一个网格可以被分成 n­ 2 个子网格,最常见的网格结构即是n=2的四叉树网格结构。更普遍的,可以定义 nd 树结构的网格系统,其主要特性有:

1.        在空间数据库理论中,二维空间域便许存储在存储器的一个线性地址空间里,因此空间位置信息必须经过一定的转换才能存储在计算机中,使用 nd 树可以拓展线性空间的排序方法,便于计算机存储。

2.        创建分级的一维地址。如果较大范围的空间区域内某种属性值一致,则以较低分辨率的网格来表示,如果属性值经常变化,则用较高分辨率的网格来表示,这样可以节省存储空间。

因此,用地理网格来模拟地球曲面的时候,最为关键的问题是分辨率和网格。使用地理网格的目的就在于对空间格局的一种表达,并且提供简单有效的空间数据结构算法。在空间数据结构中,它既可以像栅格数据一样用最小单元格来表达空间区域对象,也可以像矢量数据一样用点代替传统的坐标点来表达空间实体的几何特征,这两种数据结构分别对应于存储区域信息的网格系统和存储位置信息的网格系统。

目前,建立全球地理网格模型还面临许多困难,这些困难主要来自于基于地理坐标系统的地理网格还存在一些缺陷,例如网格单元面积不等所带来的复杂性,网格的各种形式的变形,网格复杂的邻接特性,这些都给实际应用带来了困难。

参考资料:
GIS空间分析原理与方法
 

posted @ 2006-04-13 23:19 Flyingis 阅读(1783) | 评论 (0) | 编辑 收藏

GIS空间分析

    作者:Flyingis

    空间分析是为了解决地理空间问题而进行的数据分析与数据挖掘,是从GIS目标之间的空间关系中获取派生的信息和新的知识,是从一个或多个空间数据图层中获取信息的过程。空间分析通过地理计算和空间表达挖掘潜在的空间信息,其本质包括探测空间数据中的模式;研究数据间的关系并建立空间数据模型;使得空间数据更为直观表达出其潜在含义;改进地理空间事件的预测和控制能力。

    空间分析主要通过空间数据和空间模型的联合分析来挖掘空间目标的潜在信息,而这些空间目标的基本信息,无非是其空间位置、分布、形态、距离、方位、拓扑关系等,其中距离、方位、拓扑关系组成了空间目标的空间关系,它是地理实体之间的空间特性,可以作为数据组织、查询、分析和推理的基础。通过将地理空间目标划分为点、线、面不同的类型,可以获得这些不同类型目标的形态结构。将空间目标的空间数据和属性数据结合起来,可以进行许多特定任务的空间计算与分析。

    现在不少空间分析方法已经在GIS软件中实现,ArcGIS ToolsBox中就集成了大量的空间分析工具,例如空间信息分类、叠加、网络分析、领域分析、地统计分析等等,另外,还有一系列适应地理空间数据的高性能计算模型和方法,例如人工神经网络、模拟退火算法、遗传算法等等。但总的来说,目前在GIS软件中实现的专业空间分析模块还比较少,由于空间分析理论自身的不完善,也使得还没有比较全面、权威的软件包集成于GIS软件中。目前GIS软件与空间分析软件相结合的方式有两种,一种是高度耦合,一种是松散耦合。

    高度耦合结构即把空间分析模块嵌入到GIS软件包中,供用户直接从图形界面中选择各种功能,GIS中相关的数据直接可以参与到空间分析计算中,这种方式方便了用户,但代价是开发费用较高,实现周期长。目前也只有少数的大型GIS公司才会深入的涉足到高耦合结构GIS软件的设计与开发中,例如美国ESRI公司。

    松耦合结构则是在相对独立的GIS软件和空间分析软件之间使用一个数据交换接口,GIS软件中的数据通过接口为空间分析软件提供基本的分析数据源,经空间分析软件计算出的结果通过接口以图形的方式显示在GIS软件中,实现这种架构方式相对容易,费用也相对较低,一般可以使用开源的GIS软件即可实现这种结构。

    在GIS中开发有效的空间分析工具相对难度较大,《地理空间数据分析与GIS》中将GIS环境下空间分析方法分为六种:

1.  确定性空间分析
2.  探索性空间数据分析
3.  时空数据分析
4.  专业模型集成分析
5.  智能化空间分析
6.  可视化空间分析

posted @ 2006-04-07 16:13 Flyingis 阅读(5280) | 评论 (4) | 编辑 收藏

地理空间数据挖掘

    作者:Flyingis

    数据挖掘是一个由数据库、人工智能、数理统计和可视化等多学科与技术交叉、渗透、融合形成的交叉学科。地理空间数据挖掘(Geospatial Data Mining)是数据挖掘的一个研究分支,即从地理空间数据库中挖掘时空系统中潜在的、有价值的信息、规律和知识的过程,包括空间模式与特征、空间与非空间数据之间的概要关系等。数据挖掘可以用来模拟事物的一种变化方式,通过一些先验的知识或样本来判断事物未来的发展状况或某种状态。地理空间数据挖掘则可以作为一种可用的科学方法来解决一些地学相关的问题,对地学状况的变化作出分析和预测,这些分析很多都是基于对空间分析的基础上的,因此地理空间数据挖掘的根本是事物的空间特性,例如方位、距离、拓扑关系等等。

    数据挖掘需要通过访问正确、完整和集成的数据库才能进行深层次的分析,挖掘出有用的信息,而这些正确的、完整的数据信息则是由数据立方体所提供的,其联机分析功能OLAP为数据挖掘提供了一个良好的操作平台。

    地理空间数据挖掘典型方法主要有以下几种:
1.  地理空间统计方法
    地理空间统计是指分析地理空间数据的统计方法,主要是利用了空间中邻近的要素通常比相距较远的要素具有较高的相似性这一原理。该模型可以分为三类:地统计、格网空间模型和空间点分步形态。
2.  地理空间聚类方法
    地理空间数据聚类是按照某种距离度量准则,在大型、多维数据集中标识出聚类或稠密分布的区域,从而发现数据集的整体空间分步模式。该方法主要分为四类:分割法、层次法、基于密度的方法及基于网格的方法。
3.  地理空间关联分析
    地理空间关联分析利用空间关联规则提取算法发现空间数据库中空间目标间的关联程度,从而进行空间数据关联分析的知识发现研究,其核心内容是挖掘空间关联规则。
4.  地理空间分类与预测分析
    地理空间分类与预测是根据已知的分类模型把数据库中的数据映射到给定类别中,进行数据趋势预测分析的方法。人工神经网络可以作为该方法的典型技术应用于实际研究中。
5.  异常值分析
    顾名思义,异常值分析即将数据库中与通常的行为或数据模型不一致的数据提取出来的分析方法。通过这种方法可以提取出数据库中的异常信息或噪声数据,有时也会导致隐藏的重要数据丢失。异常值分析方法主要有三种:基于统计的异常值分析、基于距离的异常值探测、基于偏差的异常值探测。

    使用地理空间数据挖掘方法进行数据分析、信息提取时,Mathlab是一个非常好的辅助工具,很多函数库和可视化界面可以方便的使用,也可以很好的判断算法是否达到了应用要求,同时还可以作为其他语言实现数据挖掘方法的一种对比参考。

参考资料:
GIS空间分析原理与方法

posted @ 2006-04-05 19:58 Flyingis 阅读(2078) | 评论 (2) | 编辑 收藏

仅列出标题
共6页: 上一页 1 2 3 4 5 6 下一页