vimeo转载:homeland
from:https://vimeo.com/31413518 背景音乐:Welcome Home_Radical Face
世界上最好的SUV,就是自己的两条腿
from:https://vimeo.com/31413518 背景音乐:Welcome Home_Radical Face
前两天讲座的Demo中,演示了一个可以在等公交时查看将要到站车辆信息的移动应用,其中用到了北京若干条公交线路的数据。不少朋友都想知道这些数据是如何获取的,我把方法共享出来,希望能为大家GIS应用的道路上扫清一些不必要的障碍。 为了获取公交数据,我对比了几个具有查询公交线路功能的在线地图网站,查看http的请求结果,发现百度地图的http响应最接近成品状态,它的结果是标准的json数据,含有查询公交线路上所有的站点信息和公交路线信息等。简单验证了一下,如果从百度地图网站上发起请求,可得到所有明文信息,如果从其他站点发起请求,所有涉及到地理坐标的值会被加密。 我想完成的事情是,获取关心的公交线路数据,然后把他们做成Geodatabase中的FeatureClass来使用。只要能得到有效的JSON数据,就可以利用ArcGIS中的Python脚本来完成我想要的结果。 第一步需要获取JSON数据。为了获取批量的结果,我们需要使用百度地图的API。我学习了酸奶小妹妹写的一篇现成的文章,知道了从Javascript中可获取我想要的JSON信息。下一步就是如何将js中的JSON结果保存成文本文件。js直接写txt不太好办,借助Silverlight与html内容的交互功能,就可以办到这点。我写了一个Silverlight应用来完成这个工作,首先填写想要查询的目标城市,比如“西安”,然后填写想要查询的公交线路,多条线路间需要用英文半角逗号隔开,点击“开始下载”就会从百度得到JSON结果,保存成txt文件以备后用。 第二步需要用Python处理JSON数据以生成FeatureClass。我写了一个python脚本来完成这个工作,并把它制作成了Script Tool,这样就可以通过调用GP工具的形式来生成我们的地理数据了。 第三步数据后处理。百度API中得到的地理数据是经纬度坐标,生成FeatureClass后可利用Project工具投影到我们想要的坐标系中,比如WGS 1984 Web Mercator。对于火星坐标,一个城市范围内的偏移可以认为是线性的,只需在Arcmap中参照底图整体平移即可。 比如,我在这个网站上参照页面源码可以得到西安市所有公交线路列表,简单处理后变成这样: 地铁1号线,地铁2号线,地铁3号线,地铁4号线,地铁5号线,地铁6号线,机场快轨,环山1号线,环山2号线,二环1号线,二环2号线,高新1号线,高新草堂专线,教育专线,五龙专线,泾渭环线,1,2,4,K5,6,7,K8,9,10,11,12,13,14/K14,15,16,17/K17,K18,19,20,20区间,21,22,23,24,25,26,27,28,29/K29,30/K30,31,32,33,34,K35,36,37,38,39,40,41,42,K43,44,45,46/K46,47,48,50,102,103,104,105,106,107,108,117,118,161,162,163,201,202/K202,K203,204,K205,206,207,207区间,K208,209,K210,211,212,213,214,215/K215,215区间,216,217,218,219,220,22,222,223,224,225,226,226区间,227,K228,229,230,230区间,231,232,233,234,K235,236,237,238,239,240,241,242,243,251,252,260,260区间,261,262,263,264,265,266,300/K300,301,302,303,307,308,309,311,312,313,315,316,318(车城),318(全程),319,321,322,323,324,规划325,规划326,328,330,331,336,351,规划356,K400,401,402,403,405,406,407,408,409,410,411,416,500,501,502,503,504,506,507,508,509,510,511,512,规划513,规划515,517,518,519,521,522,523,525,526,527,528,530,600,601,602,603,604,604区间,K605,606,606区间,607,608,K609,611,612,K616,K618,619,K630,630区间,K631,K700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,728,729,800/K800,801,规划802,规划821,规划822,900,900区间,901,901区间,902,903,904,905,906,907,908,910,911,912,913,914,915,916,917,918,919,920(汤峪),920(焦岱),921,922,923,924,926,927,928,929,930,东南专线,宏华线,安运线,西高客运,规划西阎线,通宵1号线,通宵2号线,通宵3号线,通宵4号线,游1,游2,游3,游4,游5(306),游6,游7,游8(610),游9,游10,盛唐之旅,曲江新景线,曲江旅游观光轻轨,世园环线,世园1号线,世园2号线,世园3号线,世园4号线,世园5号线,世园6号线,世园7号线,世园8号线,世园9号线,世园10号线,世园12号线,世园13号线,3-18,4-04,4-05,4-06,4-07,4-08,4-09,4-10,4-11,4-12,4-13,4-14,4-15,4-16,4-17,4-18,4-19,4-20,4-21,4-22,4-23,4-25,临潼101,临潼102,临潼201,临潼301,临潼826,阎良601,阎良901,高陵101,高陵102,高陵103,高陵105,高陵106,高陵108,高陵109,高陵201,高陵801,高陵802,高陵803,户县801,户县802,户县803,户县804,户县805,户县806,户县808,户县809,户县810,户县811,户县812,户县813,户县819,户县820,咸阳13,咸阳15,咸阳21,咸阳22,咸阳28,咸阳29,咸阳59,咸阳副59, 利用这个Silverlight应用即可下载到JSON结果,再用一下GP工具,就可生成西安市公交线路的地理数据。 当然你也可以把它导出成shapefile,方便其他同事,同学或老板使用。 GP工具,Python脚本,示例FeatureClass可在这里下载:http://arcgis.com/home/item.html?id=e0f8316d91fb43d49a81a76946f9a03c
ppt,demo源码下载:http://arcgis.com/home/item.html?id=cf6c35fe15f74e69a99a2253cd72aeab Silverlight部分: Windows Phone部分:
更新内容:~为数据源类型为ArcGISDynamicMapService的PBS服务增加附加参数设置,比如layers,layerDefs等,达到控制图层可见性,按属性过滤图层内容等目的;~REST Admin API为ArcGISDynamicMapService数据源增加changeParams操作,以动态修改附加参数。详见这里;~数据源增加对ArcGISTiledMapService的支持;~增加自定义在线地图功能。可通过修改CustomOnlineMaps.xml文件内容,自行增删在线地图数据源(数据源须采用Google Maps/Bing Maps/ArcGIS Online地图的缓存策略);~增加自动保存/载入上次配置的功能;~为系统托盘图标增加右键菜单;~修复已知bug; 详见:https://blog.newnaw.com/?p=890 再加入一些功能后,Portable Basemap Server将会在下个版本开源。
可能你已经了解到了一些要随ArcGIS 10.1版本发布的新产品ArcGIS Runtime的信息,比如它的跨平台,高便携,64位,可扩展等。 Esri刚刚结束的developer summit上,以WPF为例,演示了最新的prerelease版本中ArcGIS Runtime的性能。视频中prerelease版中同时加载了10,000个带动画的复杂渲染的graphic。 Web API中一直被偏执狂们诟病的graphic性能有了长足的提升,ArcGIS Runtime更加让人期待了。 ps:期待更多有社会价值的公交车,出租车,物流监控系统出现。
总 叙 弟子规 圣人训 首孝悌 次谨信 泛爱众 而亲仁 有余力 则学文 入 则 孝 父母呼 应勿缓 父母命 行勿懒 父母教 须敬听 父母责 须顺承 冬则温 夏则凊 晨则省 昏则定 出必告 反必面 居有常 业无变 事虽小 勿擅为 苟擅为 子道亏 物虽小 勿私藏 苟私藏 亲心伤 亲所好 力为具 亲所恶 谨为去 身有伤 贻亲忧 德有伤 贻亲羞 亲爱我 孝何难 亲憎我 孝方贤 亲有过 谏使更 怡吾色 柔吾声 谏不入 悦复谏 号泣随 挞无怨 亲有疾 药先尝 昼夜侍 不离床 丧三年 常悲咽 居处变 酒肉绝 丧尽礼 祭尽诚 事死者 如事生 出 则 悌 兄道友 弟道恭 兄弟睦 孝在中 财物轻 怨何生 言语忍 忿自泯 或饮食 或坐走 长者先 幼者后 长呼人 即代叫 人不在 己即到 称尊长 勿呼名 对尊长 勿见能 路遇长 疾趋揖 长无言 退恭立 骑下马 乘下车 过犹待 百步余 长者立 幼勿坐 长者坐 命乃坐 尊长前 声要低 低不闻 却非宜 进必趋 退必迟 问起对 视勿移 事诸父 如事父 事诸兄 如事兄 谨 朝起早 夜眠迟 老易至 惜此时 晨必盥 兼漱口 便溺回 辄净手 冠必正 纽必结 袜与履 俱紧切 置冠服 有定位 勿乱顿 致污秽 衣贵洁 不贵华 上循分 下称家 对饮食 勿拣择 食适可 勿过则 年方少 勿饮酒 饮酒醉 最为丑 步从容 立端正 揖深圆 拜恭敬 勿践阈 勿跛倚 勿箕踞 勿摇髀 缓揭帘 勿有声 宽转弯 勿触棱 执虚器 如执盈 入虚室 如有人 事勿忙 忙多错 勿畏难 勿轻略 斗闹场 绝勿近 邪僻事 绝勿问 将入门 问孰存 将上堂 声必扬 人问谁 对以名 吾与我 不分明 用人物 须明求 倘不问 即为偷 借人物 及时还 后有急 借不难 信 凡出言 信为先 诈与妄 奚可焉 话说多 不如少 惟其是 勿佞巧 奸巧语 秽污词 市井气 切戒之 见未真 勿轻言 知未的 勿轻传 事非宜 勿轻诺 苟轻诺 进退错 凡道字 重且舒 勿急疾 勿模糊 彼说长 此说短 不关己 莫闲管 见人善 即思齐 纵去远 以渐跻 见人恶 即内省 有则改 无加警 唯德学 唯才艺 不如人 当自砺 若衣服 若饮食 不如人 勿生戚 闻过怒 闻誉乐 损友来 益友却 … Continue reading 弟子规-与鲶总、李总、法人共勉
依旧是Android,NDK,JNI相关的问题。 照着ndk帮助的说明,运行<ndk>/samples目录下的hello-jni工程后,你一定想知道如何在自己的项目里调用别人已经编译好的.so库文件。于是新建一个Android工程,将hello-jni例子中ndk-build后的结果:libs文件夹(包括其下所有内容)拷贝到新建工程的根目录下,仿照hello-jni的代码,调用native方法: 1: package com.my.SoTest; 2: 3: import android.app.Activity; 4: import android.os.Bundle; 5: import android.widget.TextView; 6: 7: public class SoTestActivity extends Activity { 8: /** Called when the activity is first created. */ 9: @Override 10: public void onCreate(Bundle savedInstanceState) { 11: super.onCreate(savedInstanceState); 12: 13: TextView tv=new TextView(this); 14: tv.setText(stringFromJNI()); 15: setContentView(tv); 16: } 17: public native String stringFromJNI(); 18: static { 19: System.loadLibrary(“hello-jni”); 20: } … Continue reading 在新的Android工程中调用已经编译好的so库文件代码
Sqlite数据库因其体积便携(基于单个文件,跨平台),功能完整(类似RDBMS)受到非常广泛的欢迎,在iOS,Android平台上都提供原生的支持。Spatialite是Sqlite的一个空间扩展,根据官方介绍,Spatialite之于Sqlite,相当于PostGIS之于PostgreSQL。 Spatialite扩展提供了一系列用于空间操作的SQL函数,例如基础的空间查询,缓冲区生成等,也有高级的类似ArcObjects中ITopologicalOperator,IRelationalOperator等接口的功能。 在Android平台上使用Spatialite资料比较少,主要是google上的Spatialite for Android和github上的android-spatialite两个工程。前者带有完整的编译步骤,我尝试了这个,其中遇到了些问题,记录下来,方便需要用到的朋友。后者工程似乎带有编译好的libjsqlite.so库,可直接使用。 我机器的环境是Windows 7 64bit,已经搭建好了Android Eclipse开发环境。由于Spatialite及Sqlite是C/C++的native语言编写,而Android的默认开发语言是Java,所以在Android上编译Spatialite必须用到google提供的NDK(Native Development Kit)环境。NDK环境的搭建比较简单,按照google的文档进行即可: 下载NDK压缩包(android-ndk-r7b-windows.zip)。我下载的是最新的android-ndk-r7b版本。将其解压到任意目录,下文以<ndk>指代。注意:由于后面cygwin中配置环境变量时不支持带空格的路径,所以建议将其解压到某个盘符的根目录下,比如d:android-ndk-r7b; 设置Windows的环境变量。主要是将NDK的路径添加到PATH中去,方便在任何位置调用ndk-build命令。详细操作不再赘述。此步骤只是为cmd提供了便利; 由于NDK需求中说明,必须用到GNU Make命令,所以在Windows环境上还需要提前安装Cygwin。这是在Windows上模拟Linux环境的工具。安装步骤参考此贴:Windows环境下Android NDK环境搭建。注意在cygwin的linux环境下,配置$NDK环境变量,方便在任何地方调用ndk-build编译命令。我在安装Cygwin时,只额外勾选了Devel库。 完成这个步骤后,可尝试编译运行NDK中自带的hello-jni例子,验证NDK编译环境已经搭好。具体步骤参见google的文档。可以发现,native代码需要放在与src同级的jni目录下,该目录下必须至少有Android.mk文件,向NDK系统描述源文件;编译时需要在工程的根目录下运<ndk>/ndk-build命令;利用NDK编译后,Android工程文件夹中会多出libs目录,里面会生成lib<something>.so共享库,这就是我们要用到类库,该文件也会一并打包到apk文件中去。更多的ndk知识请参考<ndk>/documentation.html文件,非常详尽。注:JNI相当于.net平台的p/invoke。 接下来就要按照Spatialite for Android上的提示,在cygwin环境中编译spatialite库了。 在windows下利用svn工具对整个project checkout(这次作者用的是Spatialite 3.0.1,PROJ 4.7.0,geos 3.2.2几个库)。会发现有两个工程spatialite-android和spatialite-android-test。我们主要对spatialite-android工程进行编译; 由于spatialite用到了geos和proj两个库,所以首先需要为该工程下载,配置两个库。具体步骤如下,在cygwin环境中执行: 1: $ cd jni 2: $ wget http://download.osgeo.org/geos/geos-3.2.2.tar.bz2 3: $ tar xvjf geos-3.2.2.tar.bz2 4: $ cd geos-3.2.2 5: $ ./configure –build=x86_64-pc-linux-gnu –host=arm-linux-eabi 6: $ cd .. 7: $ wget ftp://ftp.remotesensing.org/proj/proj-4.7.0.tar.gz 8: $ tar xvzf proj-4.7.0.tar.gz 9: $ cd proj-4.7.0 10: $ ./configure –build=x86_64-pc-linux-gnu … Continue reading 在Android上利用NDK编译并使用Spatialite库(Windows环境)
心力,可以理解为和通常所讲的“体力”相对而言。是指一个人心理的力量,精神上的能量,或者意念。当然你不可能用意念杀死别人,但你可以用心力拯救你自己。 从前有一片茫茫大海,比地球上所有大陆都变成海洋后的海洋还要大。这片海面上漂浮着唯一一个木环,直径只有杯口大小;海里面有一只乌龟,双目失明,它一直在水中游动,一万年才浮到水面上呼吸一次。 我们每个人的生命是有限的,但内心是永恒的。今生今世只不过是内心灵魂的一段短暂旅程,现在的身体只是它寄存的一种形式。上辈子你有可能是只猪,是只考拉,甚至阿凡达,下辈子你有可能是格桑花,是面包树。这些表现形式都不真正属于你,生不带来死不带去,只有内心才是真正的你。但这辈子你能获得这个人身,几率和上面的盲龟浮出海面时,头恰好能钻进木环的几率是一样的。之所以能这么幸运,是前几百世修来的福气。 每做一件好事或者一件坏事,都是你自己的“业”,好的业力多了,就会有好报。不管你在哪一世,万般带不走,唯有业随身。我们活着,除了要积攒业力,最重要的就是锻炼心力,使自己变得正直,善良,坚韧不拔,温柔如水。 路上碰到瘸腿的乞丐了,不要鄙视,给些零钱,他们或许就能多吃一碗救命的米饭;拥挤的地铁上碰到不讲卫生的农民工了,不要移动脚步躲开,他们和你一样有父母有儿女,他们盖起的高楼能让你们安居乐业,而你们做出的价值千万的系统也许没有一点实用价值,只是在浪费纳税人的血汗钱,为腐败提供了温床。 锻炼心力是需要决心和勇气的,但可以从一点一滴做起,比如早晨不赖床,或者开始学一些对人生有意义的东西。最好的办法就是挫折和困难。菩萨和天使不总是带给你好处,还可能是挫折和困难,越是逆境,就越要珍惜。因为在你得到这个磨练机会的时候,别人可能还在把时间挥霍在享乐上。享乐的时间和心力的积累通常是成反比的。 有一些人等意识到,可能也就心有余,力不足了。与各位共勉。
我们都知道,在使用ArcGIS移动客户端(已更名为ArcGIS Runtime SDK for iOS/Windows Phone/Android)API进行开发时,一般对于底图数据,需要用ArcGISTiledMapServiceLayer这个类来加载,指向一个在线的缓存地图服务。而对于移动GIS应用,通常我们又有非常强烈的离线需求。目前来说,ArcGIS移动客户端底图离线有两种实现办法:自定义图层加载离线数据或等待新版本api来加载10.1的TilePackage底图离线包(iOS API已经实现)。 这次我们来讨论另一种可以让底图离线的办法。在手机上使用过离线地图程序的朋友都知道,它们一般都会提供自动离线的功能,即当我们连接到互联网,浏览在线地图时,程序会自动将浏览过的数据缓存到本地,以便下次没有网络环境时可离线使用。新版本的Goolge Maps移动版,Android上的RMaps,OruxMaps等程序都有类似的功能。 那么如何为ArcGIS的移动程序实现类似的功能呢?因为这个图层既要能够加载在线的地图服务,又要能够自动离线,所以我们选择创建一个派生自ArcGISTiledMapServiceLayer的类。当有网络连接时,我们浏览地图的过程中,将切片自动存储到本地,没有网络连接时就可以浏览这些切片了。而且可以给用户提供若干选项,比如是否允许自动下载缓存切片,是否允许自动更新已有的缓存切片等。 请注意本文讨论内容与之前讨论的自定义图层加载离线数据不同,前者具有自动下载缓存切片的功能,下载后没有网络连接的情况下会自动变成离线图层加载离线数据,有网络连接的情况下可当做正常的在线图层使用;后者只能当做离线图层使用,不能自动下载缓存切片。 这里我以Windows Phone为例,写好了一个扩展类:OfflineableTiledMapServiceLayer(下载地址见最后)。下面对它进行一些说明。功能: OfflineableTiledMapServiceLayer是一个继承自ArcGISTiledMapServiceLayer的自定义类,在线浏览地图的过程中,会自动将缓存切片保存在Sqlite数据库文件中(存储在应用程序的IsolatedStorage空间内),无需人工干预;这样在没有网络连接的情况下,就自动加载先前保存过的切片,作为离线图层使用(程序代码无需做任何修改)。 如何使用: 与ArcGISTiledMapServiceLayer用法一致,只需额外设置一些参数即可。<esri:Map x:Name=”map1″> <my:OfflineableTiledMapServiceLayer Url=”http://services.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer” EnableOffline=”True” SaveOfflineTiles=”True” SaveTilesMode=”SaveOnly”DeleteSavedOfflineTiles=”False” LoadOfflineTileFirst=”True” /></esri:Map> 工作流程: 除了ArcGISTiledMapServiceLayer已有的功能外,OfflineableTiledMapServiceLayer可在浏览地图的过程中,自动将缓存切片保存到Sqlite数据库中。当下次加载该服务时(以URL地址识别),就可从离线的数据库中加载切片数据(没有网络连接的情况下)。 OfflineableTiledMapServiceLayer目前有以下5个属性可设置: EnableOffline: 默认为True。当设置为True时,OfflineableTiledMapServiceLayer具有自动离线的能力;当设置成False时,OfflineableTiledMapServiceLayer完全和ArcGISTiledMapServiceLayer一样。 SaveOfflineTiles: 默认为True。当设置为True时,OfflineableTiledMapServiceLayer会将浏览过的缓存切片保存到本地的Sqlite数据库中(存储在应用程序的IsolatedStorage空间);当设置为False时,OfflineableTiledMapServiceLayer不会保存任何缓存切片。只有当LoadOfflineTileFirst==false时才会生效。 LoadOfflineTileFirst: 默认为False。当设置为True时,OfflineableTiledMapServiceLayer会优先从本地Sqlite数据库中加载缓存切片(即使有Internet连接),如果处于离线状态,则会直接从本地Sqlite数据库中加载缓存切片(如果之前没有保存过任何切片,则会抛出异常);当设置为False时,则会优先从在线服务中加载缓存切片,如果处于离线状态,则只能从本地Sqlite中加载数据。 SaveTilesMode: 默认为’SaveOnly’。当设置为’SaveOnly’时,OfflineableTiledMapServiceLayer只会存储新的缓存切片(Sqlite数据库中没有的);当设置为’SaveOrUpdate’时,OfflineableTiledMapServiceLayer会存储新的缓存切片,并且更新已有的缓存切片。当在线的缓存地图服务内容更新时,此选项比较有用。只有当LoadOfflineTileFirst==false && SaveOfflineTiles==true时有效。 DeleteSavedOfflineTiles: 默认为False。当设置成True时,会首先删除Sqlite数据库中已有的本图层数据,之后重新初始化本图层。只有当EnableOffline==True时有效。 Sqlite文件结构: Sqlite在移动设备上具有广泛的应用基础,iOS和Android对其均提供原生支持。OfflineableTiledMapServiceLayer使用Sqlite Client for Windows Phone来读写Sqlite数据库。可以使用Windows Phone 7 Isolated Storage Explorer或者Isolated Storage Explorer Tool将Sqlite文件从Windows Phone的IsolatedStorage中导出,以供其它移动程序使用,比如ArcGIS Runtime SDK for iOS/Android。 OfflineableTiledMapServiceLayer创建的Sqlite数据库名称为”OfflineTiles.db”,它的内容由一张或多张表组成。 ‘MapServices’表:此表是OfflineableTiledMapServiceLayer必须使用的。具有四个字段:’url'(text), ‘spatialreference'(text), ‘fullextent'(text), ’tileinfo'(text)。存储在Sqlite中不同的OfflineableTiledMapServiceLayer由其Url属性区分(假设不同的Url代表不同的缓存地图服务)。另外三个字段分别以JSON格式存储了缓存服务对应的信息,这些信息是在离线状态下初始化图层所需要的。创建该表的SQL语句: CREATE TABLE “MapServices” (“url” TEXT PRIMARY KEY NOT NULL UNIQUE , “spatialreference” … Continue reading ArcGIS移动客户端中可以自动离线的底图图层