没心情

好久都没心情写东西了,这篇也是在没心情的时候应付一下。

自从去年年底就发生了很多事情,很忙碌,也许我的梦想被打乱得很彻底。从自己的生活中走出来,外面的世界我能否驾驭,我一直充满疑问。

ArcGIS API for Silverlight开发入门(0):为什么要用Silverlight API?

这一节来对Silverlight API(ArcGIS API for Silverlight,下同)的开发有个总体的认识。
欲善其事先利其器。要做开发,第一步就得搭建环境。因为是在Siverlight基础上做开发,所以先得整理好Siverlight的开发环境。Silverlight并没有内建在VS2008中,而是作为add-on的形式附加的。在这里可以找到详细的安装步骤:

说明一下,步骤1安装了Silverlight add-on(要求有IDE的SP1补丁包);步骤2安装的是ExpressionStudio中的ExpressionBlend,这个工具相当于可视 化的xaml编辑器,可以用来轻松的创建Silverlight程序的用户界面;步骤3中安装的是Silverlight一种非常华丽的图片处理效果,可 以参看这里的实例;步骤4包括一些可用的Silverlight控件和例子。接下来再去看看Silverlight API的要求。可以看出对于开发ArcGIS Silverlight程序来说,只有步骤1是必须的,其他都是可选的。之后需要从ESRI网站下载Silverlight API(需要免费注册一个ESRI Global账户),以备后用。
总结一下最常见的安装步骤:1、安装VS2008;2、安装VS2008 SP1;3、安装Silverlight Tools for Visual Studio 2008 SP1。到此,就可进行Silverlight程序的开发了。关于开发环境的搭建,还可以参考yyilyzbc版主的帖子。(做Silverlight API的开发不需要在自己的机器上安装ArcGIS Server,可直接使用ArcGIS Online上的数据;但如果要添加自己的数据,当然还是需要ArcGIS Server了)
下面就来一个Hello World吧,对于GIS来说,理所当然就是展示一张漂亮的世界地图了。具体步骤如下:
1、VS2008中,新建project,选择Silverlight Application;
2、 在出现的提示框中选择Add a new ASP.NET Web project to the solution to hostSilverlight;(Silverlight程序与flash一样,相当于网页中的一个插件。第一个选项是将Silverlight嵌入到 一个ASP.NET网站中,第二个选项是将Silverlight嵌入到一个临时的html页面中)
3、添加Silverlight API的引用:与.NET程序开发一样,add reference(注意是在Silverlight工程上而不是ASP.NET工程上),找到从ESRI下载的API,选择添加ESRI.ArcGIS.dll;
4、打开Page.xaml,在UserControl标签中添加一句引用,在Grid标签之间添加一些代码,完成后看起来像这样:

  1. <UserControl x:Class=”SilverlightApplication1.Page”
  2. xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
  3. xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
  4. xmlns:esri=”clr-namespace:ESRI.ArcGIS;assembly=ESRI.ArcGIS”
  5. Width=”400″ Height=”300″>
  6. <Grid x:Name=”LayoutRoot” Background=”White”>
  7. <esri:Map x:Name=”mymap”>
  8. <esri:Map.Layers>
  9. <esri:ArcGISTiledMapServiceLayer ID=”layerworldmap”
  10. Url=”http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer” />
  11. </esri:Map.Layers>
  12. </esri:Map>
  13. </Grid>
  14. </UserControl>

复制代码

5、按F5,运行程序,就完成了我们的hello world in
GIS可以在浏览器中看到下面的画面:

看到效果之后,再来对它进行理解吧。
先说下Silverlight的程序的基本背景。page.xaml实际上是一个控件,相当于asp.net中的default.aspx,大部分 的工作都在这里面完成(app.xaml相当于global.asax);上面的是xaml(读:[ig`zeml])代码,是微软针对 wpf/silverlight的标记语言,与flex中的mxml类似。Silverlight程序中所有的布局工作都是由xaml来完成 的;Silverlight2中,VS2008可以实时对xaml的效果做预览,但是这个预览效果是只读的,对于预览中的控件也不可选;为了弥补这个缺 陷,可以用前面提到的ExpressionBlend来可视化地设计程序界面,会自动生成对应的xaml代码,使用于复杂的布局和美化工作(可参考 Silverlight中的clock例子);再看page.xaml。usercontrol标签(页面的根元素)证明了page.xaml实际上是一 个控件类;下面的几句相当于引入了xml的特定命名空间,里面包括了我们的ESRI.ArcGIS;width和height指明了 Silverlight控件本身的尺寸,一般我们将这里的width和height属性去掉,已达到全屏的效果(你也可以试试哦);Grid标签是布局控 件,相当于html中的表格,可以进行灵活的页面布局,xaml中常用的布局控件还有Canvas和StackPanel;每一个xaml的 Control都可以有一个x:Name属性,以便在code-behind页面中对其引用。
之后是我们的主角了。Map标签(继承自xaml的Control)相当于一个Map控件,可以在其中加入图层;这里我们添加了一个 ArcGISTiledMapServiceLayer图层(在后面的文章中会专门讲到SilverlightAPI中的图层类型),对应使用的是 ArcGIS Server发布的经过cache的服务,作为客户端的API,同JavaScript与FlexAPI一样,都是通过REST方式对资源和操作进行引用 的;对这个图层,赋予了一个ID属性,因为SilverlightAPI中的图层是从xaml中的DependencyObject继承而来,所以没有 x:Name的属性,为了方便在code-behind(与asp.net类似的托管代码)的代码中找到这个图层,便使用了ID属性;URL的内容便是 ArcGIS Online发布好的一个世界地图资源。
到此,应该对这个例子理解的差不多了。如果还想再添加一个图层怎么办呢?没错,就是在Map标签中再添加一个layer,不过要注意的是,第一个加入的图层会显示在最下面,并且决定了整个Map控件的空间参考信息。
大家自然会想到叠加一个自己的数据图层来看看效果,于是对Map标签内容做了修改(china是本机发布的一个中国地图):

  1. <esri:ArcGISDynamicMapServiceLayer ID=”chinamaplayer”
  2. Url=”http://localhost/ArcGIS/rest/services/china/MapServer” />

复制代码

运行后却还是只有世界地图一个图层(已经确保拼写、大小写正确),怎么回事呢?来用事件帮助查找错误吧。
Silverlight能够利用.net的一些核心库内容,包括事件。来对刚才的那个图层添加一个事 件:InitializationFailed,当图层添加失败的时候会出发这个事件。添加这个事件的处理也非常简单:在上面的图层中加入 InitializationFailed属性,会提示你生成新的eventhandler,默认回车,看上去像这样:

  1. <esri:ArcGISDynamicMapServiceLayerID=”chinamaplayer”Initializa

    tionFailed=”ArcGISDynamicMapServiceLayer_InitializationFailed”

  2. Url=”http://localhost/ArcGIS/rest/services/china/MapServer” />

复制代码

在事件上面右键单击,Navigate to Event Handler,就会进入前面所说的code-behind页面(本例为C#),添加以下代码:

  1. private void ArcGISDynamicMapServiceLayer_InitializationFailed(object sender, EventArgs e)
  2. {
  3. ESRI.ArcGIS.Layer layer = sender as ESRI.ArcGIS.Layer;
  4. MessageBox.Show(layer.InitializationFailure.Message);
  5. }

复制代码

然后运行程序,会得到初始化图层失败的原因:

原来,为了安全原因考虑,同flash一样,Silverlight对跨域访问也做了严格的限制。要解决这个问题,可以参考帮助中的说明,将两个 xml文件保存在网站根目录,比如C:\Inetpub\wwwroot中即可(其实保存其中一个就可以了,ArcGISOnline已经将两个xml文 件都放在了网站根目录中,所以我们可以引用上面的服务)。
看下最后的效果吧。

为了更好的理解xaml和Silverlight,建议首先独立完成Silverlight帮助中的两个workthrough:hello worldclock
下一节将会在事件和Silverlight特性的基础上带给大家一个比较完整的地图实例。

左右互搏

前几天看到一个关于“最让雇员满意的公司”评比,结果国际软件巨头Google如愿获得冠军。要说当今敢于和比尔盖茨斗法的也无外乎Apple的乔布斯和Google的谢尔盖布林。随着iphone的发售,这几年Apple离中国人越来越近,而关于Windows操作系统的负面消息却使得微软的形象在中国人的心目中大打折扣。越来越多的中国人开始意识到,这个世界上不是只有wintel(Windows+Inter这对无敌组合称霸PC市场已经近20年了)。就打我们实验室来说吧,你可以看见几个哥们儿在用5台客户机和一个服务器做并行计算,这可不是Windows能胜任的活儿,Linux对这个很在行,系统的效率在这个时候起了很大的作用,可惜Windows是个笨重的家伙。当然,我在写这篇日志的时候在用safari,因为我在学Ruby,所以Mac OS是首选。

言归正传,Google在今年早些时候也提出了自己的操作系统构想,Chrome OS。其实,抛开诸多迷惑人的外壳来说,世界上所有的操作系统也就分为两个大系 Windows/Dos系列,这是微软一家独大的资本,Linux/Unix系列,苹果的Mac OS说实话是个Unix的变种,Ubuntu,Fedora,Red Hat,红旗等等都是Linux的发行版。Google号称Microsoft的最强大对手,Chrome OS会是一个重新设计,赋予创新理念的操作系统吗?当所有的开源社区都翘首以盼的时候,他们却发现Chrome OS是又一个Linux发行版,他们失望了。

我们不可否认,Google在软件业营造了一种良好的竞争氛围。Google Earth,Google Map这些应用都是大家耳熟能详的,就现在看来,他对GIS的影响不言而喻。WMF标准就是因为有无数的数据提供商效仿Google的地图服务才形成的行业标准。抛开我的专业不谈,像Google Search Engine, Gmail这些应用都是我们每天必然会触及的。Google这么做,无疑是要向世人表明开放的重要性,微软的垄断是没有出路的,而我们要用双手毁掉软件业的独裁者。

可惜啊,Google试图通过这种简陋的广告手段Rape掉大家的意志。随着Chrome OS的发布,Google帝国的所有意图都暴露了,他只是想控制开源社区,让开源社区为自己培养源源不断的人才。早些年,Google的Android手机系统的发布已经让当时不明所以的开源社区的青年们废寝忘食去钻研这个所谓的开源框架。实际上呢?这个噱头让Google未花分文就在开发者群体中赚足了人气,初次涉足手机市场,Google就旗开得胜。这些年,PC市场又流行起上网本,上网本无非就是体积小,重量轻,价格便宜,使用简便的笔记本电脑,并没有什么真正的技术含量,而Google又不失时机说服各大PC制造商,对上网本市场进行地毯式轰炸,并一度爆出要在上网本上统一使用廉价的Android或者Chrome操作系统以取代微软在这一领域的统治地位。与之形成鲜明对比的,是微软在去年年初放弃为发展中国家学生设计100美元电脑的计划。如此比较,Google在每一个方面都完全超越了微软,似乎真的看到了推倒(华丽的扑倒!O(∩_∩)O)微软的曙光。

时间是最好的武器,让那些谎言都不攻自破。马上就要进入2010年,世界又要进入一个崭新的时期。Google也许在展望自己的计划是多么完美。但是,开源社区确实愤怒了。他们发现自己被利用了,成为了Google捞金的工具。GNU自由软件创始人曾经希望开源社区集中力量统一各种Linux发行版,让大家专心对付微软而不是自己在窝里斗。这下好了,Google插一脚进来又整出一个发行版,而且所有的资金支持都被牢牢掌握在Google手里,开发者们没有得到任何的好处。但是,他们又无权声辩,因为既然是开源的,那么任何人都有权去利用这些知识和智慧,GNU框架下,开源社区的力量正在被少数大企业剥削。

看吧,Google在不远的将来,一定会面对来自开源社区和微软的双重挑战,因为他正搬起石头砸自己的脚,学会左右互搏不容易,但是小心搏倒得是自己!

纪念伟大的11.11

一人消费,没有拖累,独立自主,潇洒干脆,

所有收入,自己支配,花钱潇洒,当家绝对,

碰友搅基,乱侃胡吹,互爆菊花,偶尔暧昧,

电脑开机,GAL万岁,后宫路线,多情无罪,

傲娇最高,兄控软妹,御姐成群,等你来推,

手办一堆,抱枕一被,搂抱亲吻,无所忌讳,

右手最高,活塞疲惫,我行我素,无怨无悔,

人生短暂,自由可贵,单身最高,光棍万岁!

Languages

三个月的煎熬,算是对C#进行了“被熟悉”。开始接触C#时,我确实被那种简明的类C语法和丰富的类似Delphi的类库所折服。遇到繁琐的循环,你会得到替代它的迭代器,遇到静态数组的麻烦,你会想到用泛型的List。C#几乎包含了所有新兴的语言要素,而且都是很实用的,并不是说说而已。

不过,让C#到此为止吧。我现在确实已经厌烦了这个臃肿的东西。因为和Java一样需要把源代码编译成中间语言,然后由.Net虚拟机翻译成二进制机器语言,所以当项目繁多的时候,比如用AE开发GIS系统的时候(大规模数据操作级别),很容易就因为等待的时间而让你的耐心崩溃。我知道时间的代价是换回了丰富的调试信息,但是一次次修改作业,已经让我很无语了,每次封装前的测试,都是我最无聊的时候。

“语言不是障碍,只要有编程思想就行。”很多人都是这么想的。其实,经过这段时间的实际操作,觉得至少对于GIS的学生来讲,做项目做研发做研究,那些实际需要的编程思想是微乎其微的。对某一个算法如何去用简明的方法去实现,那都不是我们要干的事情,那都是计算机人才的事情。我们说白了,就是垒代码的。你垒的越快,就越能出成果,Boss就越高兴,Boss越高兴,你就能得到更多实惠。所以我们的关键字是速度,加快速度垒代码。

怎样加快速度呢?工具的选择是很重要的。记得以前学编程的时候只知道安装VS的时候会带一个Visual SourceSafe的东东,但是不知道是干什么的。现在有了实践的经验之后才发现它是团队协作的利器,代码版本的管理就全部靠它了。

当20W+的代码量成为家常便饭的时候,你也就顾不得那些基础的语法啊,细节的实现啊什么的。这时候你需要的就是语言的新特性。比如正则表达式,Lamda表达式,泛型,这些东西真的是很实用。考过计算机二级的人都知道,要想按照一个规则去增删改查一个字符串是多么费脑子的一件事,不过现在好了,你要是知道正则表达式,一个语句搞定。什么意思?就是说,那些别人发明出来的能让人不用思考就能用的工具不是别人发神经无聊造出来的,别人造出来就是要你提高效率的。GIS开发大量操作数据和逻辑真的是很难去考虑小的细节,这时候唯一能加快速度的方法就是采用一些好的框架,好的模式,即好的Language.

重新回到语言,C#是大杂烩,它有你想要的一切,甚至你可以拿它搞网页搞并发。但是这种庞大的机器,运转上太缺乏组织性了,里面充斥着各种语法。例如,赋值像C,C++,可是类操作又像Delphi, 数组集合那完全是Java,甚至把不论不类的动态语言也给塞进去。学了C#,我现在都有点读不懂C、Delphi、VB了。强大的过头了,就要走极端。

最近师兄提议搞一下网络富客户端的东东,于是下定决心和C#划清界限,开始啃Ruby的书。写程序的人如果死抱一种技术不放,那么他的末日也不会太远了,多掌握一门语言始终是好的,连老鼠都知道的问题,我今天也明白了。

西城男孩新单What About Now

西城的新单曲也发行了,虽然是翻唱,但是这首”What About Now”的歌词写的非常到位,多听几遍很有味道。

这次新专辑的名字叫”Where We Are”,突然想起了后街的新专辑叫做”This Is Us”。不知道是这两个组合有意为之还是纯属巧合,一呼一应,相得益彰。

不过,就现在而言,后街和西城的时代都已经逝去了,唯一不变的只有那些朗朗上口的歌词和动人的旋律。闭上眼睛,慢慢欣赏。

后街男孩新单Bigger

博客迁移

由于原先的那个textpattern的博客系统太难管理了,所以决定迁到Wordpress上面来。

感觉这个入手方便。

接下来继续学习相关的技术,还有啃啃ruby的东西。

Powered by WordPress | Shop Free Cell Phones Online & Save. | Thanks to Best CD Rates, Best Checking Rates and Homes for Sale