Author: 菩提老王

ArcGIS API for Silverlight 1.0兼容Silverlight 3

        silverlight api 1.0正式版(build 269)可以使用silverlight 3,在silverlight 2的开发环境下直接下载silverlight 3 tools安装即可。
        silverlight 3 RTW版是7月10号发布的,关于新特性,网上有很多文章,相比以前的版本,怀疑的声音已经听不到了,只有褒奖和期待,而其中更有被誉为神作的.NET RIA Service,使得在.NET框架下的前后台通信变得更加方便。拭目以待吧:)
        截个图,体验一下sl3中非真正3d引擎的3d效果:

近来

        1;、刚刚把电脑彻彻底底清理了一遍,风扇拿出来水洗,又滴了一滴香油。上会没有把风扇拆开,两年的灰尘看样子也够做个黑色棉花糖了。对于我这个型号的机器,都有那个“万恶的U型框”,上回拆它用了近10分钟,这回估计花了20分钟,拆了半天发现有两颗螺丝没有卸,险些酿成大祸。这回总结下经验:把无线上方的两颗螺丝卸掉后,右侧和上侧可以轻易去掉,左侧首先往掌托方向退,然后往键盘中间和向上同时用力,1分钟包卸,屡试不爽。温度从60多度降到了50度……哇,感觉真个世界都凉快下来了;
        2;、家里的网速又恢复正常了,飞快~前两天回来发现网速很慢,打电话问1w是谁的原因,1w说不是电信的事,但会派人上门查看,让我报告地址。这不明摆着是电信的事吗?而且很可能就是上门的人员业务还不如我熟练,把自己的这个戳戳那个按按,还是耐心等两天吧,果然今天就好了。哇,感觉整个网络都飞起来了;
        3;、昨天和lz还有ny骑车去风峪口转了一圈,达到了他俩锻炼身体的目的。凉皮稀饭大西瓜,都还是蛮爽的……结果发现还是我的体力最强,回来后又和小熊和阿家去游了个泳。这是今年第二次游泳,也是近7、8年来第二次游泳,奇怪的是自己的游泳本领不降反升,从原来淹不死的水平一跃成为准健将,哇哈哈哈!就是上了天气预报的当,今天两只胳膊变成了红烧鸡翅;
        4;、想清楚了,不准备再去上班,两方面原因,一是能力锻炼有限,劳动强度太大,经济收入明显不成正比;二是回来发现自己还有太多东西要学,休息几天,好好整理下计划。不过往后一段时间和室内练车一样,对自己是一个不小的挑战,制定好计划表,严格执行,立此为证。抓紧享受最后的校园生活吧~

趁着还年轻,感受一把加班

        以前看同学加班,他加的越晚,我就越高兴,因为自己总是非常准时的下班,每听他说下班要赶最后一班地铁时,还说要帮他报警,为啥?因为站着说话真的腰不疼。
        这两天主任发飙上瘾,对系统的验收工作到了十分饥渴的地步,下午从单位走都快8点了。和我同屋的三位,石工结婚不到1月,曲工结婚不到3月,李工女儿还不满月,他说回家连抱小孩的时间都没有,只能远远地看上一眼……我说你至少得抽出一个小时把她抱着摇一摇么…深表同情。抽烟,咖啡,中药,拼椅子,都是为了更快更好地满足主任,为了表忠心,李工表示已经做好了通宵的姿态。算上我4个人,一个多月做完一个省(省市县三级)的系统,用项目小强曲工的话说,咱随便到哪个公司都是轻松的。虽然说吧,什么东西都去感受一把,总归是好的,但我觉着加班这个东西,尤其做我们这一行的,就和别人伸手挖你鼻孔一样,非常的不爽……把握现在,珍惜生命,远离加班。
        lt也要离校了,虽然交情不算深,但他从来不说虚话,让人想念。teacher shen还说,“虽然你人已经走了,但将来劳务费还是要给你的,放心。”要给就现在给啊!说这些话来恶心人……我以后要是当老师,做项目,经费100块,认真点,拿出60块做项目,自己赚20块,20块分学生,大家皆大欢喜!不过也终于明白为什么专家们一直我行我素的原因之一了,内行忽悠外行,虚荣心得到极大的满足,那叫一个暗爽……
        这两天比较欣慰的是上礼拜吃泡馍时嘴里咬烂的泡总算快好了,那天见口香糖,着实有点意外:)

太阳升起在北边了

        北半球的太阳应该在南边,即使是北回归线最多也是直射。可是今早发现太阳居然出现在北边了,而且还偏北有好几度,地球是不是快完蛋了?……中午那叫一个热啊,出去一趟就减肥,好几斤……为啥?出汗啊……
        “你有左手,我有你们”(晚上做梦,一封信上写的)

ArcGIS API for Silverlight/WPF RC版本发布

        ArcGIS API for Silverlight/WPF RC(release candidate)版本发布,正式版也倒计时了。
        bug:修正的一个最大bug就是在vs2008中使用design mode时十开九死的状况。
        几个比较大的变化:
1、所有的assembly和namespace都添加“Client”后缀,比如ESRI.ArcGIS.*变为ESRI.ArcGIS.Client.*,就是为了区别Silverlight API和其他ESRI API,比如ArcObjects。由此可以看出,在SL程序中调用AO也是名正言顺的事情;
2、ESRI.ArcGIS.Widgets.*变成了ESRI.ArcGIS.Client.Toolkit.*;
3、ESRI.ArcGIS.VirtualEarth.*变成了ESRI.ArcGIS.Client.Bing.*;
4、Clustering属性从FeatureLayer挪到了GraphicsLayer,允许对其进行更大程度的自定义;
        另外,对于209版本中,用QueryTask无法完成带中文字符的属性查询问题,也得到了修正。
        具体参见:What’s New

AO查询过程中对结果进行排序

        在AO中查询,通常用Search方法,传入一个IQueryFilter类型的变量,但其只有一个Whereclause可选,要对查询结果按照某列排序的话还需要用IQueryDefinition接口。一个例子:
IQueryFilter pQF = new QueryFilterClass();
IQueryFilterDefinition queryFilterDef = (IQueryFilterDefinition)pQF;
queryFilterDef.PostfixClause = "ORDER BY " + (axMapControl1.get_Layer(0) as IFeatureLayer).DisplayField;
IFeatureCursor pFeatureCursor = pFC.Search(pQF, true);//pFC,featureclass

        还需要注意一点,此属性不适用与FileGDB:Please note, file geodatabases do not support the PostFixClause property, and any specifications within the PostFixClause will be ignored。
        结果curcor里面的feature就已经按照displayfield排好序了。另外,如果要对已有表进行排序的话可以使用ITableSort接口。

ArcGIS API for Silverlight开发入门外传:在程序中调用AO

        Silverlight API的开发入门系列的文章上回已经结束,但其实能讲的东西还有很多,实在不能面面俱到。这次再补充一个比较重要的功能,就是在Silverlight API程序中调用ArcObjects,来完成一些复杂的geoprocess功能。
        ADF之所以强大,除了其本身的类库外,它还能在服务器端调用AO,来完成比如在线编辑或者Geoemtry的处理工作;而ESRI官方的说法,建立在REST服务基础上的程序目前都不具备在线编辑的功能(因为要与服务器端的数据库打交道),但他们把这项功能作为日程,提到了研发计划内。目前而言,要在Silverlight API中完成数据编辑工作,他们的劝告是,“如果你不怕把你的双手弄脏,那就去做吧”。
        言归。AO本身是COM组件,.NET是利用COM Interop技术与其打交道的,这显然是Silverlight的客户端环境办不到的。这就需要与服务器端进行通信。Silverlight与服务器端通信,最常用的是WebClient类,稍复杂的还有HttpWebRequest类,而传统的ASP.NET Web Service与更强大的WCF则为远程调用AO提供了可能。下面还是来看一个实例,功能是在程序中向数据库中添加一个点,以Web Service为例(关于如何使用Web Service可以查资料,这里不做讲解)。
        在Silverlight所在的ASP.NET工程中新建一个ASP.NET Web Service,添加一个WebMethod,如下:
public class WS_AOAddPoint : System.Web.Services.WebService
{

[WebMethod]
public string HelloWorld()
{
return "Hello World";
}

[WebMethod]
public bool AddPointToFileGDB(double x, double y)
{
IAoInitialize aoInit = new AoInitializeClass();
aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);

IWorkspaceFactory pWSF = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass() as IWorkspaceFactory;
ESRI.ArcGIS.esriSystem.IPropertySet pPropertySet = new ESRI.ArcGIS.esriSystem.PropertySetClass();
pPropertySet.SetProperty("DATABASE", @"E:arcgisserveragsedit_simpleaddpointchina_airlines.gdb");
IFeatureWorkspace pFW = pWSF.Open(pPropertySet, 0) as IFeatureWorkspace;

IPoint pPoint = new PointClass();
pPoint.X = x;
pPoint.Y = y;

IFeatureClass pFC = pFW.OpenFeatureClass("省会城市");
IFeature pF = pFC.CreateFeature();
pF.Shape = pPoint;
pF.Store();

return true;
}
}

        该方法传入两个double参数,作为新建点的坐标,这两个参数可在客户端的Draw_Complete事件中获取。为该工程设置一个固定的端口,然后在Silverlight程序中添加对该Web Service的引用。之后在Page.xaml.cs中,添加如下代码:
private void Draw1_DrawComplete(object sender,DrawEventArgs args)
{
GraphicsLayer glayer = Map1.Layers["glayer"] as GraphicsLayer;
Graphic g = new Graphic()
{
Symbol = markerSymbol,
Geometry = args.Geometry
};
glayer.Graphics.Add(g);

WS.WS_AOAddPointSoapClient client = new WS.WS_AOAddPointSoapClient();
client.AddPointToFileGDBCompleted+=new EventHandler(client_AddPointToFileGDBCompleted);
client.AddPointToFileGDBAsync((args.Geometry as ESRI.ArcGIS.Geometry.MapPoint).X, (args.Geometry as ESRI.ArcGIS.Geometry.MapPoint).Y);
}

private void client_AddPointToFileGDBCompleted(object sender, WS.AddPointToFileGDBCompletedEventArgs args)
{
MessageBox.Show(args.Result.ToString());
}

        最后看看效果:

        需要补充一下,在Web Service的方法中,如果不添加AO初始化的语句,会报The remote server returned an error: NotFound的错误;而调试该Web Service的方法,返回http 500 错误;在ie,将高级里面的“显示友好错误提示”勾掉,返回真正的错误是System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x80040228,由此断定需要对AO license进行初始化工作。
        可以看出,这里对AO的调用甚至比ADF里都要简单,创建对象直接用new关键字即可。此例中仅仅添加了一个点,但线和面的编辑工作也可以通过点来完成;一些简单的Geoprocessing工作也可以通过代码而不是GP Service来完成了。
        svc与asmx的调用大同小异。至此,Silverlight API的程序又多了一个强大的靠山。

恍如隔年

又是一年答辩时。即使去年答辩那天没有地震,其他情景也都历历在目,偷吃着给专家评委准备的水果,忙着打拨不通的电话,和老魏小崔走过育才路的转角,zw宣布他荣登大师兄宝座,晚上唱歌拿了把伞……一年的时间一晃就过去了,想想发生过的事情,仿佛都在昨天一样。
其实很佩服和羡慕小李他爸。为了自己精神上的追求,只身一人云游四方,与陌生人交谈,与自己的思想沟通,路途中会有无数经历,主要是思想境界的升华。也不用和这个主任那个领导打交道,虽然没有路虎开,但远胜过那些呼风唤雨,拍板拿事的人。有时候也在想,面朝大海春暖花开。但没有经历过,即使在背靠大海,有小桥流水绿树青草的山间,过着天天耕地喝酒的日子也会觉得烦。努力工作,换来好的生活,是一件再也正常不过的事情。但最后的追求到底是什么?金钱?荣誉?幸福?想起一句歌词:阿拉善突然来了沙尘暴,把所有白领吹成黑领了……前一阵子李文华老先生去世,感动之余留给我印象最深的是为人低调,淡泊名利这八个字。
If you really want it, push the past pain, use it, control it, feed everything to your fire, pains, failures, critics, glories…if you really want it.我的fire大概已经在错误的追求中熄灭了吧。
5:30,下雨的清晨,湿漉的街道,没有行人。扫扫记忆,像歌中唱的那样:出发啦,不要问那路在哪,迎风向前,是唯一的方法……