Monthly Archives: November 2009

This is it

        即使你一直很努力,极力想要改变一些东西,但最终不得不屈服于弄人的命运。        Iverson走到了自己的一个十字路口。        真正喜欢上篮球这个运动是在2000年的时候。中考前的几天,看到了76人与湖人的总决赛,看到了传说中的Allen Iverson。NBA中190以下的控卫并不多,虽然作为96年状元,但身高只有183的Allen,进入联盟的时候就注定了他与别人差了一大截,更别说其他位置的球员了。但他不服输的性格时刻提醒着自己一直在努力,甚至是拼命,往往要不顾一切的冲入禁区,直面身高甚至超过自己半米的中锋,然后把球送入篮筐。勤奋的练习加上顽强的性格,吸引了很多上进的年轻人。        但也是因为他的性格,给了他一路走来的寂寞。他会靠自己的努力去带动全队,落后时把责任都抗在自己肩上,拼尽全力去和敌人肉搏,勇气可嘉,但结果有好有坏。有人批评他不信任队友,但在他看来是没有找到能够依靠的人。如果他只想做一名角色球员,放弃自己对总冠军的追求,那凭他的能力应该很容易获得满足。但13年如一日他坚持着自己对冠军的追求,大家看到的是他耀眼的数据,但只有他自己知道一路走来吞咽了多少苦果。        他也曾与自己的梦想无限接近过。只有一次机会,他站在了总决赛的舞台上,眼前的奥布莱恩奖杯对于他来说就是莫大的幸福,触手可及。但他没能完成the one shot。因为:1、他不够成熟。他之前没有任何总决赛经验,仅凭着自己的想象去努力,拥有更多经验的OK组合变将梦想从他手上抢走了;2、客观条件严重限制了他的发挥。虽然穆托姆博正值当打之年,但与斯诺一样缺乏进攻能力,麦基也只能给他有限的帮助,对手又丝毫不给他更多的机会,注定了他只能败走洛杉矶。也许他在退役时也不能再拿到总冠军了,没有抓住那次绝好的机会,以后留给他的便是无限的遗憾。        从今往后,他也许会在继续打球,但已经没有当初的决心和激情。即使他在某个队做替补,拿到了总冠军,那种感觉也会与他当初的追求相去甚远。一个对冠军如此渴望的人,虽然努力和拼搏,但终究还是只能眼睁睁看着别人捧走奖杯…        对于他,扼腕痛惜,但命运不会同情他,像MJ的纪录片名一样,this is it,到此为止吧。        贴上CCTV5的制作的片段,《离歌》作为bgm,再合适也不过了。 [youtube=http://www.youtube.com/watch?v=hcZD4X_pfhg]         在命运面前,你不得不跪下。

Python魅力之地理数据快速处理方法

        Python作为一种成熟的脚本语言,发展势头迅猛,长期徘徊在“编程语言谱”排行前5的位置,在脚本语言中仅次于php。通过Python,开发人员可以快速试验一个想法、研究一种对象属性或不同算法,而无需编译、执行和测试任何代码。正是因为跨平台、简洁、优美的特点,它也如同GIS应用渗透于各各个行业一样,渗透在科学计算的各个领域。在GIS领域,几乎可以说开源言必称Python;而ArcGIS则将Python称为the scientific programming language for GIS:ArcGIS Server的猛将Geoprocessing Service依赖于Python,从9.4将Python IDE集成到ArcMap中也可见一斑。        前一阵Flyingis贴出了一篇类似的文章,不过还是通过动手完成一个实例,来看看它在ArcMap中的数据快速处理能力吧。描述:上传到Panoramio的照片都会有位置信息(经纬度坐标),有些朋友非常可敬,上传的照片数量可达上万张。分析一下某个用户拍照的活动范围,是件有趣和有意义的事情。思路:1、利用Panoramio的API,获取指定用户的所有照片信息;2、将关心的信息,比如作者、照片名称、照片文件链接提取出来,并将其存储到地理数据库中。        第一步:获取照片信息。先看一下Panoramio的API,REST风格,返回JSON字符串。比如通过http://www.panoramio.com/map/get_panoramas.php?order=popularity&set=public&from=0&to=20&minx=-180&miny=-90&maxx=180&maxy=90&size=medium,即可按点击次数排序获得世界范围内所有受欢迎的照片。{ “count”: 773840,”photos”: [ { “photo_id”: 532693, “photo_title”: “Wheatfield in afternoon light”, “photo_url”: “http://www.panoramio.com/photo/532693”, “photo_file_url”: “http://static2.bareka.com/photos/medium/532693.jpg”, “longitude”: 11.280727, “latitude”: 59.643198, “width”: 500, “height”: 333, “upload_date”: “22 January 2007”, “owner_id”: 39160, “owner_name”: “Snemann”, “owner_url”: “http://www.panoramio.com/user/39160”, }, { “photo_id”: 505229, “photo_title”: “Etangs près de Dijon”, “photo_url”: “http://www.panoramio.com/photo/505229”, “photo_file_url”: “http://static2.bareka.com/photos/medium/505229.jpg”, “longitude”: 5.168552, “latitude”: 47.312642, “width”: 350, “height”: 500, “upload_date”: “20 … Continue reading Python魅力之地理数据快速处理方法 »

哥斯拉拉拉拉拉拉

        为了弥补前两天看《2012doomsday》造成的精神损失,今天又找了同学推荐的《哥斯拉》来看,看的我好开心!从头笑到尾…《阿波罗13》《独立日》《哥斯拉》简直是一个模子里刻出来的,结局都是众人鼓掌,拥抱,一点悬念也没有。跟所有的动作片一样,开始好人很厉害,遇到一个boss,被打,爆发然后小宇宙,灭掉boss,或附加营救美女。我总想有这么一部影片,开始好人很厉害,遇到一个boss,被打,然后小宇宙没能爆发,壮烈牺牲,或附加美女被擒…也许这样的电影更能教育人们消灭坏人的重要性,或者大家都努力做个好人也不一定呢。

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代码,大家可以拿来即用。

豆瓣里的直角三角形

        为了证明自己还没有out,今天找了《2012》来看,结果越看越难看,上豆瓣看评论,发现自己搞错了,看的是《2012 Doomsday》。居然还有这样两个电影名。。。后者在豆瓣上的评分是个直角在下的直角三角形,这个三角形表达的含义就是:差到家了。        浪费了1个多小时的时间,要不然我会用这些时间来玩《植物大战僵尸》。

地理信息的另一种表达方式–Cartogram地图

        先来看一则旧闻:英科学家绘制新世界人口地图 中印两国最突出        下面是几张新闻里的地图:        第一张图中可以看出,目前时间上人口最多的中国和印度被表达的很夸张,但这种图形上的夸张恰恰很好的表达了两国人口与其他国家人口数量的相对关系。这种地图被称为Cartogram: The geometry or space of the map is distorted in order to convey the information of this alternate variable.         为了要强烈表达地图中某种属性信息,而将图形进行一些扭曲,而扭曲的重要原则就是不改变原图形的拓扑关系。        那么在ArcGIS Desktop中如何做出这种地图呢?请到ArcScripts网站下载这个免费的工具,安装好后它会出现在ToolBox中。它由密歇根大学的 Mark Newman和Michael Gastner开发完成。压缩包中已经包含了详细的使用说明和实例数据,下面是自带数据做出的一张2007年世界各国GDP总量地图:        再次提醒,当你想突出地图上的某个属性信息而制作一张令人印象深刻的专题图时,记得试试这个工具。别忘了它适用矢量、栅格两种数据,而且可以做出经过两个或多个属性变量影响的cartogram地图。        利用ArcGIS Desktop和这个工具,我们不是也作出了英国科学家才做出的地图吗:)

ArcGIS中的线性参考/动态分段技术(三)几个Linear Referencing应用场景在AGS中的实现

        现在来实现上面提到的3个功能。1、对于某条公路上的一点进行Identify操作,要求返回该点在公路上的桩号值:        以Silverlight API为例。为了在服务器端使用ArcObjects,在Asp.net工程中添加一个名为LinearRef的Silverlight-Enabled WCF Service,在LinearRef.svc.cs文件中添加以下代码:namespace RoadDycSeg.Web.WCF{ [ServiceContract(Namespace = “”)] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class LinearRef { public IRouteLocator2 pRtLocator = null; ESRI.ArcGIS.Server.IServerObjectManager pSOM = null; public ESRI.ArcGIS.Server.IServerContext pServerContext = null; public LinearRef() { ESRI.ArcGIS.ADF.Identity identity = new ESRI.ArcGIS.ADF.Identity(“ArcGISWebServices”, “yourpassword”, “”); ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection agsconn = new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection(“localhost”, identity); agsconn.Connect(); pSOM = agsconn.ServerObjectManager; pServerContext = pSOM.CreateServerContext(“shaanxi”, “MapServer”); ESRI.ArcGIS.Carto.IMapServer2 pMapServer = pServerContext.ServerObject as ESRI.ArcGIS.Carto.IMapServer2; ESRI.ArcGIS.Carto.IMapServerObjects2 pMapServerObjects = pMapServer as ESRI.ArcGIS.Carto.IMapServerObjects2; … Continue reading ArcGIS中的线性参考/动态分段技术(三)几个Linear Referencing应用场景在AGS中的实现 »

利用免费的地图来解决实际问题

        Google Map的API虽然免费,好用,但终究需要那么一些Javascript基础;ESRI最近推出的Mapping for Everyone使用起来就更简便,内容也更丰富,能够让大家轻松地在自己网页里嵌入一张可互动的地图,比如这样就可以查看美国09年的失业率统计:        它能够帮助我们做什么呢?这就有个例子,这位老兄正利用一张地图,劝说他的好友卖掉房子,准备搬家呢:)

ArcGIS中的线性参考/动态分段技术(二):Linear Referencing在ArcGIS Server中的实现原理

        首先来思考几个Linear Referencing的应用场景(后面会对这些场景一一实现):        1、对于某条公路上的一点进行Identify操作,要求返回该点处在公路上的里程值;        2、输入起始和终止桩号,要求将其间的路段显示在地图上;        3、类似GoogleMap的交通流量地图。        要将这些功能在ArcGIS Server中“落地”,首先决定采用哪种开发方式:客户端API还是Web ADF?两者皆可。但是稍加思考,两种方式的API中都没有提供有关Linear Referencing的解决办法。所以,Linear Referencing在ArcGIS Server中的实现原理还是得依靠ArcObjects了。        ArcObjects中,Linear Referencing的功能在ESRI.ArcGIS.Location库中,请见:http://resources.esri.com/help/9.3/ArcGISEngine/dotnet/10745641-b5e3-4600-979f-cdf9d2bbc7ce.htm#About%20linear%20referencing。        为了实现上述功能,其中比较关键的有两个类:RouteLocator和RouteEventSource。RouteLocator的IRouteLocator2接口有Identify和Locate两个方法,前者可根据地理坐标识别出Route上的位置(M值);后者可根据M值来定位出Route上相应的Geometry。如果已有EventTable,需要对上面的每个Event进行定位,除了重复使用IRouteLocator2.Locate方法(或者LocateRow方法)外,也可通过构建RouteEventSource来实现。它是一种特殊的FeatureClass(继承自FeatureClass),其中的每个Feature代表了EventTable中的一个Event,而这个Feature的Shape字段内容则是根据EventTable和Route FeatureClass,利用Dynamic Segmentation技术实时计算出来的。        关于如何获得可用的IRouteLocator2接口和RouteEventSource,文档中已经讲的很清楚;另外ESRI.ArcGIS.Location中还提供了实现ArcMap中Linear Referencing里所有功能的接口,有兴趣的朋友可以仔细阅读。

ArcGIS中的线性参考/动态分段技术(一):Linear Referencing背景

Linear Referencing背景        定位:介绍Linear Referencing背景;在ArcMap中关于Linear Referencing的结构和功能;以及ArcGIS Server中几个应用场景的实现。        注:有关更详细的操作可查看在线帮助,或搜索论坛。什么是Linear Referencing        Linear Referencing(下文引用为LR)翻译过来是线性参考,在公路,管网等行业的GIS应用中时常提到。LR是一种利用沿着可测量的线要素的相对方位来存储地理位置的方法。比如下图中:        下面线的长度一次标为0,10,20,30,40……,而沿着这条线,我们看到上面有: 一个位于坐标12处的点; 一个位于坐标10东侧4个坐标的点; 一段起始坐标分别为18和26的线段; 一段起始坐标为28,长度为12的线段。         为什么要用到LR技术?主要有两个原因:1、很多事件,像上边的例子一样,是通过沿着(曲)线的相对位置来记录的;2、要显示一条线上的多个属性集合时,由于各个属性在(曲)线上所对应的位置不同,同一数据源如果不做处理,很难达到要求。使用LR技术可解决此问题。        以公路方面的一个应用场景为例说明。我们要显示一条公路的4种不同属性:道路管辖情况、路面材料、路段限速情况和路况,假设该公路长100公里:1、前40公里为交警2大队管辖,后60公里为交警4大队管辖;2、30至70公里为水泥路面,其余为沥青路面;3、0-20公里的路段限速45km/h,20-40公里的路段限速35km/h,40-70公里路段限速45km/h,70-100公里路段限速55km/h;4、0-20公里路况一般,20-40公里路况很好,40-60公里路况很差,60-100公里路况很好。        属于同一数据源对应多个属性(且属沿线分布)的情况。如果不使用LR技术,那么需要4个公路图层,每个图层的公路根据属性分成长短不同的段落(Feature),才能够将这些属性展示出来;而是用了LR技术后,只需要一个公路数据(Feature数量不限),和四个事件表即可在不改变实际公路数据的情况下,按要求显示上述四种属性。        Dynamic Segmentation:动态分段,属于LR采用的一种技术(一般应称之为线性参考问题中的动态分段技术)。是根据属性表中存储的相对位置信息,以及相应的线性数据,动态计算出线性数据上相对位置所对应的实际地理坐标的过程。动态分段正是因为表达不同属性时,不用去分割实际的地理数据,而是动态计算出该属性对应的地理位置而得名。ArcGIS中Linear Referencing的实现原理        ArcGIS中实现Linear Referencing主要通过以下两种数据结构:1、Route FeatureClass2、Event Table        通过Dynamic Segmentation技术,Event Table中不同位置的Event就定位到了Route FeatureClass下对应的Line Feature上。Route FeatureClass        实际上是拥有两个特殊字段的Polyline FeatureClass:1、必须包含有M(Measure)值的Shape字段。拥有M值的Shape字段,不但能存储x,y(,z)坐标,还能够多存储一个M数值;2、必须包含有一个标识线段ID的字段,可以是Number或者Text类型。        除了上述两个字段要求,还可以有其他字段。        Route FeatureClass不同于普通的Polyline FeatureClass,是因为它具有一个测量系统,而这个测量系统的原理就是,通过存储在Feature的Vertice中的M值以及该Feature实际的ShapeLength,来动态插值出线上每一点的相对位置。比如一条公路数字化时,有两个节点(Vertice),分别表示该公路的起始桩号0公里和结束桩号100公里,该Feature存储在WGS1984坐标系中,ShapeLength为2.00,那么该公路上40公里处的位置,就应该位于图上该Feature的40%的位置,也就是ShapeLength为0.80的位置。        而ArcGIS中,不要求每个节点都必须有M值。对于没有M值的节点其M值会标记为NaN(not a number):        此外在不违反逻辑错误的情况下,M值可以随意设置。比如上图左边的图形,0-10段的实际ShapeLength看起来比10-20段的ShapeLength明显要长,也可以将上述四个节点的M值随意地设置为0,3,7,30。但是如果设置为0,10,5,30的话就产生了逻辑错误(route measure anomalies),ArcMap中会将其突出显示,提醒用户使用工具修改。Event Table        实际上是拥有2-3个特殊字段的表(ArcGIS支持的表均可,甚至可以是有特定格式的text文件):1、类似Route FeatureClass中RouteID的一个字段。用来存储与Route FeatureClass中哪个线Feature对应。可以是Number或Text类型;2、根据Event类型不同而必须的1-2个字段: Point Event:比如108国道1900公里处发生了交通事故这个Event,需要一个Number类型的字段来记录1900这个相对位置; Line Event:比如108国道1850到1950公里段的路况很差这个 Event,需要两个Number类型的字段来分别记录1850、1950这两个起止位置。         除了上述两个字段要求,还可以有其他字段。        Event Table中一条记录就对应了需要在线上定位的一个点或一段距离,可以用来标识事件或属性等。下图描述了Dynamic Segmentation技术利用Route FeatureClass和Event Table产生的结果:ArcGIS桌面中对Linear Referencing的实现        ArcGIS桌面中不仅提供了专门的Linear Referencing Toolbox,对于产生的结果图层,也能像普通图层一样进行各种操作,而针对Linear Referencing的方方面面也提供了非常细粒度的操作供用户调整。 对Route FeatureClass的创建与修改。包括:通过Catalog或Tool或向导创建RouteFeatureClass;利用Tool从已有的Polyline FeatureClass创建Route FeatureClass;通过Tool或向导利用已有的Point FeatureClass来校准Route FeatureClass的M值(注:通过对RouteID字段建立索引,可提高Dynamic Segmentation的效率); 利用Route Editing Toolbar对其进行修改; 将Route FeatureClass作为图层显示,并对其进行查询。包括:对Route进行Identify。查询出线上任意点的M值(Identify Route Locations工具需从Customize中调出);查找某条线上指定M值的位置(包括Point和Line两种),通过Find工具实现;自定义符号显示M值的异常。包括逻辑错误等,可通过Route图层的属性对话框实现;在地图上像刻度尺一样任意显示Route的M值(Hatch)。通过将定义Hatch Definition(可多个),将其组织在Hatch Class(可多个)下,并附加SQL Query和Range Scale操作,基本实现任意复杂的“道路标尺”,而“标尺”的Label也可进行Script的高级控制,最终还能将“标尺”转换为Graphics,或将“标尺”风格另存为Style。在Route图层的属性对话框中实现; 通过Tool和Attribute … Continue reading ArcGIS中的线性参考/动态分段技术(一):Linear Referencing背景 »