2011年11月2日星期三

解读ArcGIS Runtime SDKs

  本文试图解读新的ArcGIS Runtime SDKs及其本质,与ArcGIS移动SDK,for iOS/Windows Phone/Android,之间的关系,以及这三种移动SDK后续发展的一些猜想。
  ArcGIS Runtime SDKs是随ArcGIS 10.1 beta一起发布的一套横跨桌面和移动端的,跨平台,轻量级的GIS开发SDK的总称。
image

  从上图中我们可以看出,ArcGIS Runtime SDKs家族包括了以下内容:

  • ArcGIS Runtime SDK for Android
  • ArcGIS Runtime SDK for iOS
  • ArcGIS Runtime SDK for Windows Phone
  • ArcGIS Runtime SDK for Windows Mobile
  • ArcGIS Runtime SDK for Java
  • ArcGIS Runtime SDK for Qt
  • ArcGIS Rutnime SDK for WPF

  之所以说ArcGIS Runtime SDKs横跨桌面和移动端,是因为它既包含了iOS/Windows Phone/Android等移动平台的开发SDK,也包含了可以开发传统桌面程序(C/S程序)的WPF、Java、QT等SDK;而后三种SDK则可开发出Windows和Linux平台下的具有丰富交互效果和良好体验的应用程序。其实ArcGIS Runtime还包括了一些现成的应用程序,比如iOS/Windows Phone/Android各自市场上都能下载到的“ArcGIS”程序,ArcGIS Mobile中的“ArcGIS”程序等。
  说起轻量级,首先要看看ArcGIS 10.1产品架构的一些变化。

image

  ArcGIS 10.1中,产品的划分更加明确和简单。主要分为四个部分,桌面GIS(传统的ArcMap,ArcGlobe等),ServerGIS(全新架构的ArcGIS Server),轻量级GIS(ArcGIS Explorer,Runtime SDKs及其对应的应用程序)和ArcGIS Online。前三部分都是围绕ArcGIS Online这个云GIS平台的,在不同程度上都与ArcGIS Online有交互,或可将数据直接部署上去,或作为它的客户端(云+端)。而轻量级GIS就是为了能够在任何地点,任何平台,任何设备上访问云平台提供的GIS能力。
  ArcGIS Runtime SDKs正是在这种背景下诞生的。其实它也分为狭义和广义上的两种解释。狭义的ArcGIS Runtime SDK是指桌面上的WPF,Java和Qt,它们的消息早在半年前就已经流出。它们的出现,是为了逐步替代强大而相对臃肿的ArcGIS Engine这个产品。做过Engine开发的朋友都知道,即使是最简单的显示地图的需求,理论上都必须在客户机上安装ArcGIS Engine Runtime这个运行时(注意不是ArcGIS Runtime),安装包通常400m左右。而利用新的ArcGIS Runtime SDK for WPF/Java/Qt开发出的程序,完全是绿色程序,不需要在客户机上安装任何部件(.Net Framework和JRE不计)即可运行,因为所有的依赖库直接和程序拷贝在一起即可。如果你喜欢ArcGIS Runtime SDK开发的程序的部署过程——拷贝到u盘里/插入目标计算机/运行,那么你一定也喜欢它的卸载过程——关闭程序/拔掉u盘。
  广义上的ArcGIS Runtime SDKs是上述列表中,诸多SDKs的统称。除了包含狭义的ArcGIS Runtime SDK,可以看到加入了移动端部分:ArcGIS Runtime SDK for iOS/Windows Phone/Android/Windows Mobile,而它们其实是新瓶装旧酒,分别对应以前的ArcGIS SDK for iOS/Windows Phone/Android和ArcGIS Mobile,只是换了产品名称而已。为什么会换名称?为什么还有ArcGIS Mobile这个“另类”的东西?这得从ArcGIS Runtime SDK的功能说起。
  做过ArcGIS Web API(ArcGIS API for Javascript/Flex/Silverlight)开发的朋友,应该可以很快理解狭义Runtime这个产品的所有功能。目前ArcGIS Runtime的功能与ArcGIS Web API,ArcGIS移动API(iOS/Windows Phone/Android)基本相同,都是基于ArcGIS REST API的。比如地图服务(动态/缓存)的加载,GraphicsLayer/FeatureLayer,基于FeatureService的数据编辑,Identify/Find/Query操作,GeometryService,Geoprocessing Service的调用等。它们的开发思路和代码编写几乎是一样的,比如ArcGIS API for Silverlight和目前的ArcGIS Runtime SDK for WPF,如出一辙(后者的前身就是ArcGIS API for WPF)。但狭义上的ArcGIS Runtime SDK与ArcGIS Web API不同之处在于,前者可以加载本地数据,包括Map Package/Tile Package/Locator Package/Geoprocessing Package。Map Package是包括.mxd文档和所有引用数据在内的压缩包,其余类似。最早的Package是9.3.1产品中的LayerPackage,它不仅包含了.lyr图层配置信息,还打包了图层所引用的实际数据。早期的ArcGIS Online平台允许用户上传LayerPackage以便分享,现在看来,直到此时Runtime产品的出现才将Package的概念发扬光大,并且为以后的所谓云GIS提供了更多的数据共享途径。对本地数据的读取是否破坏了基于ArcGIS REST API的框架呢?其实没有。ArcGIS API for WPF/Java/QT中,都内置了一个c++写的Web Server,读取本地数据后,会自动发布成这个Web Server上的REST服务来供Runtime SDK使用,所以一切功能,还是由REST API提供的。收起题外话,ArcGIS Runtime SDK的框架,是针对轻量级GIS产品(不包括ArcGIS Web API)的,它拥有统一的编程模型,可以用一致的开发思路,做出C/S,及移动端应用(Web API开发出B/S应用),为开发人员提供了极大的便利。这也是为什么将它们统称为ArcGIS Runtime SDKs的原因。
  在来说说ArcGIS Runtime for Windows Mobile(原来的ArcGIS Mobile)这个产品。之所以将它也归为ArcGIS Runtime SDK,是不无道理的。使用过ArcGIS Mobile的朋友一定知道,它的一个核心理念就是将数据划分为Basemap Layer和Operational Layer。前者是指起可视化参考作用的数据,一般是栅格底图或地图服务切片;后者是包含矢量信息在内的业务数据。ArcGIS Runtime中所涉及到Package,恰好与之对应。Tile Package对应Basemap Layer,Map Package对应Operational Layer。可以说,ArcGIS Mobile的设计理念,在整个ArcGIS Runtime产品家族中,得到了很好的延续。其实ArcGIS Mobile是个十分优秀的产品……
  到此,新的三个移动SDK(iOS/Windows Phone/Android)也归为ArcGIS Runtime SDKs的原因也就明了了,主要原因是都基于REST API的框架。另外基本可以肯定,它们都会使用相同的数据模型,即各种Package。由此不难推断,以后iOS/Windows Phone/Android平台上移动SDK的离线功能,也会依赖于Tile Package和Map Package。上周刚刚发布的ArcGIS API for iOS 2.1(以后要叫ArcGIS Runtime SDK for iOS)版本中,已经印证了这种猜测——加入了对Tile Package的支持,实现了原生的底图数据离线功能。其它两个移动平台的离线功能,敬请期待。
  由iPad这个产品引发的变革已经展开,移动设备数量正在爆炸性的增长,桌面设备和移动设备之间的概念会越来越模糊。Windows 8的发布预示着微软已经做出了改变,它即可以运行在桌面电脑上,也可以运行在平板设备中。有人说Windows 8的意义对于微软不亚于当年的Windows 95,我同意这个观点。Esri也做出了积极的改变,新的产品体系,新的产品命名,新的ArcGIS Runtime。

2011年10月25日星期二

在ArcGIS Web API应用程序中使用灰度地图

  上个月底,ArcGIS Online发布了一款全新风格的底图服务Light Gray Basemap。该底图服务尽可能少地使用了色彩,标注和要素内容,目的是突出地图的主题内容,把重点展示给最终用户。美化的底图固然好看,但有时我们不能为了使用地图而去使用地图,忽略了我们真正想要表达的意思,很多时候,都会回归到以简为美的原点。使用这种底图服务,我们可以很轻松的将注意力集中在业务数据上。
AGOL_LE_2_basemap_types

  可以看到,只有在右上角的Light Gray Canvas底图上,四个要素点才清晰可见。
  其实Google Maps API中就一直能够设置显示风格,以适应我们的需求。虽然ArcGIS Online已经推出了灰度底图服务,但对于自己的底图服务(尤其是国内数据用户)来说,如何能够风格化显示呢?以ArcGIS API for Silverlight为例来说明。
  缓存地图服务所对应的ArcGISTiledMapServiceLayer类中,暴露出了TileLoaded事件(继承自TiledLayer)。这个事件会在每一个切片加载完成时触发,并且事件参数中可以获得ImageSource属性,它就是切片本身,随后地图控件会对这些切片进行拼接,从而形成完整的地图。我们的工作,就是在这个事件中,对切片上的每个像素做色彩处理,从而达到风格化地图服务的效果。在Silverlight中,我们可以利用WritableBitmap来完成这项工作,代码如下,具体原理可自己参详:

   1: private void ArcGISTiledMapServiceLayer_TileLoaded(object sender, TiledLayer.TileLoadEventArgs e)
   2:         {
   3:             WriteableBitmap wb = new WriteableBitmap(e.ImageSource as BitmapSource);
   4:             for (int y = 0; y < wb.PixelHeight; y++)
   5:             {
   6:                 for (int x = 0; x < wb.PixelWidth; x++)
   7:                 {
   8:                     int pixel = wb.Pixels[y * wb.PixelWidth + x];
   9:                     byte[] dd = BitConverter.GetBytes(pixel);
  10:                     double R = dd[2];
  11:                     double G = dd[1];
  12:                     double B = dd[0];
  13:                     byte gray = (byte)(0.333 * R + 0.333 * G + 0.333 * B);
  14:                     dd[0] = dd[1] = dd[2] = gray;
  15:  
  16:                     wb.Pixels[y * wb.PixelWidth + x] = BitConverter.ToInt32(dd, 0);
  17:                 }
  18:             }
  19:             e.ImageSource = wb;
  20:         }

  下图是加载ArcGIS Online上StreetMap时的效果:
image  细心的朋友可能会发现,这个Silverlight程序并没有运行在浏览器中。这的确是一个OOB的程序,因为TileLoaded事件要求Silverlight程序必须获得提升权限才行。但是WPF和Windows Phone程序可以直接使用上述代码。
  那么在Silverlight应用中还能否显示风格化的地图服务呢?答案是肯定的。Map控件有一个Effect属性(继承自UIElement),系统提供了 BlurEffect,DropShadowEffect两个现成的效果。我们可以通过HLSL(High Level Shading Language)语言来自定义一些效果,比如灰度,通过PixelShader类应用到UIElement上,从而达到显示灰度地图的目的(此时Map控件中的所有图层都将变为灰色)。有兴趣的朋友可以动手实践一下,Windows Presentation Foundation Pixel Shader Effects Library这个项目中可以找到很多现成的效果。
  再来看看ArcGIS API for Javascript/Flex,两个API甚至都没有类似的TileLoaded事件可用。即使有,在Javascript中处理图片的颜色也是一项有难度的工作。不过不用担心,Portable Basemap Server从1.0.6版本开始,提供了风格化地图服务的功能,有灰度图和反色图两个选项,无需任何代码,即可在所有的ArcGIS REST客户端程序中,使用风格化的地图了:)
Untitled-1

2011年8月26日星期五

几个喜欢的歌手@豆瓣小站

上豆瓣不多,今天才看到豆瓣小站里有很多音乐的试听。发几个喜欢的歌手,排名不分先后~

2011年8月16日星期二

地图微博

  类似foursquare或街旁的网络应用模式主要是签到,但签到后的每条信息相对独立,没有互相的联系;LBS味道重,但该类应用发展已遇到瓶颈。
  类似twitter或微博的网络应用主要是发布信息,虽然也可在发布信息的同时标记地理位置,但这些地理位置相对孤立,只能和某条微博联系(查看地理位置必须点击该条微博)。海量信息之间可通过评论、转发、好友发生联系,但无法在真实空间范围上发生联系,缺乏lbs因素。
  设想中的地图微博是一种能够将两种应用结合起来的应用。即在发布的时候,发布者可以同时标记发布信息时的地理位置(可选或自动),这样每条信息就有了自己的地理位置。对于拥有地理位置的微博信息,可直接展示在地图上。
  这样地图微博应用的界面就主要是一张地图,地图上显示了在该可见范围内发布的所有微博信息。新信息发布时,可主动推送到客户端,弹出气泡显示。用户可设置地图上总共可显示的信息条数。当超过该条数后,最旧一条信息消失,最新一条信息气泡弹出。信息此起彼伏,蔚为壮观。。。
  可在空间和时间两个维度上对信息进行过滤。

  • 空间过滤:即地图范围过滤。地图上只显示当前可见地理范围内发布的微博信息,就达到了空间过滤的目的。对于小比例尺(大范围)的地图,微博数目过多,可采用聚类的方式显示。
  • 时间过滤:加上时间滑块的工具条,可显示指定时间范围内(且在地图可见范围内)的所有微博信息。拖动时间滑块,可动态显示/隐藏微博信息。如果只想看到自己的微博,则可看到随时间的变化,自己发布微博位置和内容的变化;如果想看其他用户(比如自己关注的人/所有人)的信息,随着时间滑块的拖动,地图上动态显示该时间范围内所有其他人的信息。

  将地图与微博应用结合的好处:

  1. 加入更多真实的地理社交(geosocial?)因素。如果查看所有人的信息,则可实时看到自己周围的陌生人说的话/自己周围正在发生什么信息,比现在微博首页(所谓的timeline)更加真实,更加有用。如果感兴趣的话,可以和自己周围的人直接发起社交活动。因为通过地图找到自己周围感兴趣的人比从一堆文字信息里找到自己周围感兴趣的人要容易的多;
  2. 非常容易发掘热点事件。某一时间段内,如果某个特定地理范围内的微博信息突然激增,则很容易判断出该地发生了社会热点事件。比如甬温线动车事件后,发布与该事件有关的信息都可标注地理位置到温州,其他网友也可为了围观目的,手动标记位置到温州(类似现场签到)。这样改地点的信息数目就会激增,可制作出相应的heatmap,来供大家参考;
  3. 地图微博能够将twitter和foursquare之类的两者应用结合起来,使信息交流通过空间性而变得更加真实和有趣。

  通过地图微博,可以把timeline中无序杂乱的信息组织在地图这个有序真实的二维世界中。新浪微博目前还没有意识到发布信息的同时,搜集地理位置的重要性。没有地理位置,地理社交应用就无法上马。google+在上线之初就意识到了这个问题(自己猜测),因为在发布每条信息的时候,都可以选择提交地理位置(信息发布框旁边有个按钮)。而新浪微博目前电脑端的应用无法提交地理位置,只有手机客户端才可以。
  补充几个应用场景:

  • 我住在东直门,要卖一辆自行车,基于地理位置发布了一条信息;某人也住东直门附近,刚好要买一辆二手车,多边形选择东直门,选择一个月之内,搜索“自行车”,便能直接找到我。发、收、搜索信息均及时免费有效。可远离58同城、赶集网;
  • 人们每天都在进行着消费行为/每天foursquare签到300w次/消费完成后有功夫的人才会去大众点评进行点评。相比于这些,年轻人更愿意在买完东西后,就地发一条微博来对商家进行评价,评价信息会自动随着时间和位置进行积累。我在东直门,想要找好吃的东西,多边形选择东直门,搜索“好吃”,即可看到大家对所有商家的真实评价。可远离大众点评网;
  • 我在东直门上班,想找恋爱对象,基于地理位置发布信息,很容易被人找到。而且也可以很轻易找到同在居然大厦上班的单身女青年,如果愿意,也可以找到隔壁中青旅的人。联系起来很方便,探索的过程本身也很有趣。可远离世纪佳缘、百合网;
  • 10年后,你可以来到东直门附近,将时间范围拉回十年前,看看当时人们在这里都在做着什么,过着什么样的生活。。。
  • 应该还会有更多意想不到的应用,颠覆目前的社交模式。

  地理社交,为各式各样的周边信息提供一个平台,让你周围的信息流动起来。

2011年7月19日星期二

vimeo转载:the mountain

from: http://www.vimeo.com/22439234
that's the reason why we should love our earth.