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
Category Archives: Blogger搬过来的
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接口。
是否该考虑挪窝了?
据传,之前blogspot被封杀的时间段都是以“年”计的,从5月开始到现在2个月还不到。在感叹河蟹强大的同时,是不是也该考虑挪窝了?
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.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的程序又多了一个强大的靠山。
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,下雨的清晨,湿漉的街道,没有行人。扫扫记忆,像歌中唱的那样:出发啦,不要问那路在哪,迎风向前,是唯一的方法……
China mobile
昨晚打10086,里面说现在是23点以后,您确定要使用紧急服务吗?紧急服务只能停开机云云,难道他们赚的比以前少了,把值夜班的人都撤了?害的今天占用23点以前的宝贵时间继续打10086,就问个关于机器呼叫转移设置的问题,说了半天都不清楚,给人感觉打10086只能单向办理收费业务,就是只能办理,不能退办。果然,我说要取消短信业务,结果被告知只能拿身份证去营业厅办……办的时候怎么那么痛快啊,电话,网上,短信一不小心就办成功了,退的时候就只能去营业厅……我半年才给你们打一次电话,这点要求都不能满足,哎!
移动去年营业额800亿人民币。前阵子3G的广告是挺好,但是和人一样啊,不能光穿衣服漂亮,主要还得心灵美。不得不让我觉得它跟学校网络中心一样恶心,就是只收钱不办该办的事。
Bright Star
金棕榈奖唯一的女得主Jane Campion(获奖作品是反映女性细腻心理的《钢琴课》,是部好电影),携19世纪诗人John Keats的爱情诗《Bright Star》的同名电影又去戛纳了……还没看过电影,到是对这首诗比较感兴趣。
写作背景就是电影情节,关键是作者只有25岁不到的年龄(就去世了)。找到了一个比较完整的注释版本,也有明喻暗喻之类的分析,估计是外国语文课上的内容。从深蓝夜空中的星星,到宗教隐士洗礼的流水,还有柔软飘落的新雾,山顶上的白雪,爱人的tender breath,仿佛一次优美的时空旅行……但最后还是没能避开永远的话题:永恒和死亡。
Bright star,would I were stedfast as thou art—
Not in love splendor hung aloft the night,
And watching,with eternal lids apart,
Like nature’s patient,sleepless eremite,
The moving waters at their priestlike task
Of pure ablution round earth’s human shores,
Or gazing on the new soft-fallen mask
Of snow upon the mountains and the moors;
No—yet still stedfast,still unchangeable,
Pillow’d upon my fair love’s ripening breast,
To feel for ever its soft swell and fall,
Awake for ever in a sweet unrest,
Still,still to hear her tender-taken breath,
And so live ever-or else swoon to death.
注释:
stedfast:永恒的,不变的
aloft:高高在上的,夜空中的
lids:眼皮
Eremite:有宗教背景的隐士
pure ablution:洗礼
想起一首同样想象空间极大的情诗,作者是木子。《我纷纷的情欲》:
尤其静夜
我的情欲大
纷纷飘下
缀满树枝窗棂
唇涡,胸埠,股壑
平原远山,路和路
都覆盖我的情欲
因为第二天
又纷纷飘下
更静,更大
我的情欲
ArcGIS API for Silverlight开发入门(8):在程序中使用Virtual Earth的服务
Silverlight API中还包括了一个ESRI.ArcGIS.VirtualEarth.dll类库,让我们可以方便的访问到老东家的VirtualEarth服务。目前Silverlight API中提供的VirtualEarth服务有三种:Map,Geocode和Routing,不过一看就知道后两种服务对于国内的数据来说又无缘了。
直接看如何使用它的Map服务获取地图数据吧。同前,新建一个Silverlight工程,添加ESRI.ArcGIS.dll和ESRI.ArcGIS.VirtualEarth.dll的引用,引入xml命名空间,在xaml里面这样写:
可以看出,和添加其他图层基本是一样的。SIlverlight API中针对VE地图的图层类型是TileLayer,LayerStyle有三种:Road,Aerial和AerialWithLabels,分别对应矢量图,影像图和带街道标注的影像图。ServerType就比较特殊了,有两种:Staging和Production,分别对应访问VE服务的账户类别,前者是免费的,后者是收费的。如果你此时运行程序的话,那是看不到地图的,因为TileLayer还有个关键的token属性没有设置。
VE的服务那是相当安全,每次访问VE的服务,都要提供一个token(一个加密字符串)来进行身份验证,而这个token又是根据TokenService自动生成的,要通过TokenService生成一个token,又需要一个合法的Microsoft Virtual Earth Platform developer account……明白了这个过程,就来做我们的工作吧。
首先,去申请一个Microsoft Virtual Earth Platform developer account,当然之前你还得有一个Windows Live账号。申请的这个账号是Evaluation版的,所以决定了以后我们只能使用Staging的服务,如果要把它变成Production版本,可以通过邮件联系微软,然后缴费;
之后到注册时所填的邮箱去激活申请的Microsoft Virtual Earth Platform developer account账号,然后为其设置密码(必须是8-14为之间,包括大、小写字母,数字,且还要有非字母数字的字符,和windows server 2008是一样的),我们平常肯定不会这样设置密码,为了以防万一,建议赶紧把设置好的密码记录下来,
没准哪天就忘了。现在就可以用这个账户和密码来访问TokenService,通过它生成token,交给TileLayer的token属性。
为了安全目的考虑,token是不建议也不能直接在Silverlight程序中进行设置的。那么怎么办呢?这样办:1、通过装载Silverlight的aspx页面的Page_Load方法,来申请我们的token,并把它添加到Silverlight的初始参数中,2、然后当Silverlight插件载入的时候,把token读出来,3、在Map_Loaded事件中,赋给TileLayer。
1、通过TokenService申请token:
在web app中add web reference,url用https://staging.common.virtualearth.net/find-30/common.asmx?wsdl,起个名字叫VirtualEarthService.TokenService。
其中Xaml1是Silverlight插件的ID:
2、Silverlight插件载入时读出这个token。在App.xaml.cs中:private void Application_Startup(object sender, StartupEventArgs e)
{
VEtoken = e.InitParams["token"];
this.RootVisual = new Page();
}
3、最后在加载地图控件后,交付token:private void Map1_Loaded(object sender, RoutedEventArgs e)
{
foreach (Layer layer in Map1.Layers)
if (layer is TileLayer)
(layer as TileLayer).Token = (Application.Current as App).VEtoken;
}
终于能看见VE的图了。当然,我们的开发账户是免费的,所以地图上有很多“Staging”麻点(每个tile一个):
至此,ArcGIS API for Silverlight的开发入门已经讲完了,我和大家一样也是边学边写的,刚好这两天SIlverlight API又升级了第二个Beta版。其实Silverlight和Flex一样,能使传统的WebGIS散发出全新的魅力,从而使我们的程序在RIA的道路上大踏步前进,能够做出什么样的效果也基本只受想象力的制约了。随着Silverlight 3的推出,我们也有理由相信Silverlight的明天会更好。
Last Chance Harvey
《哈维最后的机会》,看着看着我就觉得像是老年温馨版的《日出之前》,最后的结局又比《幸福终点站》来的要舒服。
Harvey Shine,笑容就和他的last name一样,辛勤工作的他为了去伦敦参加女儿的婚礼,丢了工作,到了伦敦后先被前妻数落一番,后被女儿告知决定让继父代替他参加婚礼……事实证明,不是老哈维人不好,只是别人比他更适合那个家庭。Kate Walker伤心哭诉的时候,老哈维也没有去给一个可靠男人的拥抱,还是让她自己做出了决定。
“我能把这当做是还有希望吗?
如果是的话,给我个明确的微笑。”
musicman说,青春还没有掏出手枪我们就倒下了,永远的倒下。但这不也是在生活之路上的重生吗?没有了青春,但我们的生命还在继续。
和《日出》《日落》一样,这种片子好像只适合在欧洲拍摄,不管是欧洲小镇还是大城,阳光总是显得特别充足,即使是在一天中最冷的日出前后,也感觉不到一点寒意。整个城市都非常干净,路边的落叶也只会让画面显得更加清新,看了就让人直想去哪里呆一段时间。
另插一句,在L world里头也看见人家老外掏钱上作文课。我觉得一个小孩,要是不要让他在中小学写12年的作文,把娃一直憋着,等他长大了,抛开他掏钱去上writing class不说,肯定会写一篇丰富感情自然流露的好文章出来,为啥?憋的慌么,就跟那啥道理是一样的,至少也会保有对写作这一美好事物的兴趣。
其实看到这个片子的介绍是去年冬天一个早晨,最近发现它的时候才想起来还有这么一茬事,又让我想起了当时的情景,挺有意思。