Tag Archives: Silverlight

ESRI即将推出ArcGIS Explorer在线应用

        八卦地址:New releases of ArcGIS Explorer and ArcGIS Explorer Online at FedUC
        ESRI今年的联邦用户大会又召开了,我来给大家当个场外记者。从上面的blog可以看出几点重要新闻:
1、ArcGIS Explorer build 1200即将推出。底图中,微软饼地图可以免费使用了,不需要额外的许可。我相信目前有不少无法直接提供许可但又想尝鲜的用户会认为ArcGIS中饼的底图是个鸡肋;猜想,桌面产品中以后是不是也可以直接免费使用饼地图了呢?
2、基于Silverlight的ArcGIS Explorer Online即将推出。简而言之,就是ArcGIS Explorer的在线版本。AutoDesk有在线AutoCAD(基于Flex),猜想,ESRI以后会不会有在线的ArcMap呢?至少trial version是个好主意。
        btw,既然说到了云,就跟大家推荐一下谷歌音乐的播放器,我是今天才发现它比较好用,可以用微软的live账号登陆,完全可以成为一个在线的千千静听~

免费来host你的Silverlight应用

        做好了Silverlight应用,如何免费把它发布给大伙围观呢?目前有3种办法,但是很快会变成2种,不久的将来又可能会变成3种:)

  1. 通过Dropbox利用dropbox来Host你的silverlight应用。Dropbox是非常有名的同步应用程序,利用好它基本可以丢掉你的U盘了。当然这个办法也可以用来host flex程序;
  2. 通过Windows AzureDeploy an ArcGIS Silverlight application to Windows Azure。微软的云计算平台,牌子~但坏消息是从今年2月1号起开始收费,也就是说这种免费的办法即将消失,囧;
  3. 通过Google Sites:对于flash来说,可以在页面中直接使用标签插入,但silverlight不支持embed标签。但我真的见到有人把silverlight插入到google sites的页面里了,方法目前还在研究中。。。此外,Google Sites在国内现在是访问不了的;
  4. 通过Google Docs:这种办法目前只能存储你的Silverlight程序,还不能运行。但最近google docs刚刚允许上传任何格式的文件(单个文件不超过250m,28日晚间劲爆更新:现在支持最大1g的单个文件了),并且可以在线预览office文档、pdf文件,很有可能某一天开始就可以预览html文件了,就变成将来的第三种方法了,默默期待吧。

ArcGIS API for Silverlight/WPF 1.1版本发布

        地址:http://resources.esri.com/help/9.3/arcgisserver/apis/silverlight/help/Whats_New.htm
        里面有很多重要变化,能够从各方面提高大家的工作效率:

  • 开发环境必须是Silverlight 3,Silverlight 2不再支持。这是因为sl3版本中多了很多重要的功能,arcgis api for Silverlight需要利用它们。包括behaviors,三维,element binding等。
  • 下载的API变成了可执行的安装包。之前版本的API都是大包的dll,自己引用就行,1.1版本需要在vs和blend里面进行配置,使得我们的开发工作变得更容易,比如在blend中对ArcGIS的控件进行拖拽操作。
  • 支持在Blend 3中进行可视化设计。至少大家不需要为地图等控件的布局头疼了。详见:Working with Expression Blend。
  • Silverlight程序模板。安装1.1版本API后,会自动在VS2008和Blend 3的新建工程中各创建一个模板程序,方便大家的开发工作。
  • 新的ESRI.ArcGIS.Client.Behaviors.dll库,充分利用Silverlight 3的Behavior特性。封装一些常用的鼠标操作,降低开发难度和工作量。具体请参见在线例子。
  • Toolkit命名空间中新的FeatureDataGrid和MapProgressBar控件。见其名,知其意。对于要展示图层属性表的开发者来说,前者再合适不过了。具体可参见在线例子。
  • ArcGISDynamicMapServiceLayer直接返回MIME数据,而不是生成图片的url;且输出支持PNG8,PNG24,PNG32,JPEG4中格式。这样就省去了一步获取生成图片的请求,提高效率。
  • 图层加载失败的时候自动抛出异常。Layer的InitializationFailed事件不再沉默,估计是简单的问题困扰了太多人,这算是比较贴心的一个改变。
  • ArcGISImageServiceLayer输出支持PNG8,PNG24,JPEG3中格式。
  • 全屏视图下支持鼠标滚轮操作。
  • FlareClusterer属性可在runtime时用代码进行设置;MapTip控件可设置消失的延迟时间。

        此外,还新上线一个Symbol Gallery,里面定义了很多漂亮有用的symbol,并带有xaml代码,大家可以拿来即用。

Deep Zoom(Silverlight) VS GigaPan(Flex)

        自己用相机照了照片,想与全世界的人分享,没问题,有FlickrPanoramio甚至google的street view。但通常受限于网络原因,都是把照片resize之后再上传,一些精彩的全景或者大幅的照片就没办法与他人分享了。在相机厂商疯狂追求千万像素的时代,一些大分辨率照片当然也忍不住向大伙展示了。在这方面就要RIA来做了,两大平台现在都有类似的应用,大家可以比较一下:
Flex的GigaPan.org
Silverlight的SeaDragon
        ps1:若要上传自己的照片,gigapan需要注册账户,然后下载一个客户端工具,安装后30m左右,且要求上传照片像素(长*高)在5000万以上;seadragon只需要一个图片的url即可,生成的程序可以嵌入到支持html的页面中;
        ps2:seadragon使用的是Silverlight的Deep Zoom技术;
        ps3:上传一张照片(07年许巍演唱会散场),大家看看seadragon的效果:)

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效果:

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

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的程序又多了一个强大的靠山。