GIS中公交数据的下载和处理

  前两天讲座的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工具,就可生成西安市公交线路的地理数据。
image
imageimage
image  当然你也可以把它导出成shapefile,方便其他同事,同学或老板使用。
  GP工具,Python脚本,示例FeatureClass可在这里下载:http://arcgis.com/home/item.html?id=e0f8316d91fb43d49a81a76946f9a03c

15 thoughts on “GIS中公交数据的下载和处理”

  1. david

    请问,这个GPTool & gdb中的BusData.gdb是如何得到的?另外一个问题是您的python脚本运行有错误提示信息:
    Traceback (most recent call last):
    File “D:MyProjectArcGisotherGPTool & gdbgetbusdata.py”, line 8, in
    if cmp(arcpy.Describe(roadFC).spatialReference.name,”GCS_WGS_1984″) != 0:
    File “D:Program Files (x86)ArcGISDesktop10.1arcpyarcpy__init__.py”, line 1190, in Describe
    return gp.describe(value)
    File “D:Program Files (x86)ArcGISDesktop10.1arcpyarcpygeoprocessing_base.py”, line 374, in describe
    self._gp.Describe(*gp_fixargs(args, True)))
    IOError: “” does not exist

      1. david

        “gdb”是使用“bustool.tbx”把json数据转换为featureclass吧?我按照你的方法转换好了,但是不知道怎么利用“gdb文件”生成“mxd文件”,你可以把QQ号或者邮箱给我吗,不会太耽误您的时间的。

  2. Yiling

    使用您的ARCGIS工具和西安数据将json数据转换为featureclass是遇到问题:Messages

    Traceback (most recent call last):
    File “D:ArcgisGPTool & gdbgetbusdata.py”, line 18, in
    buslines = json.loads(open(jsonFile,’r’).read())
    File “C:Python27ArcGIS10.2Libjson__init__.py”, line 326, in loads
    return _default_decoder.decode(s)
    File “C:Python27ArcGIS10.2Libjsondecoder.py”, line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File “C:Python27ArcGIS10.2Libjsondecoder.py”, line 384, in raw_decode
    raise ValueError(“No JSON object could be decoded”)
    ValueError: No JSON object could be decoded

    请问是什么原因?谢谢

    1. Yiling

      不好意思,我直接将线路名称当成json进行转换了,所以遇到了上述问题。现在已经成功了,非常好用。

    1. 菩提老王 Post Author

      去这http://www.arcgis.com/home/item.html?id=e0f8316d91fb43d49a81a76946f9a03c下载gp工具,在arcmap中运行,以得到的json数据作为输入即可得到最终的结果。
      文章中已经讲的比较清楚了。

  3. abc3030

    你好,我到上面的网址下载GP工具,应该就是上面评论中说的bustool.tbx,显示错误信息“您没有访问此资源的权限”,可否发送一份到我的邮箱?万分感激!!!

  4. xyz

    你好,我下载GP工具后,在10.2版本的工具箱中添加,添加完Json txt后,总是一直显示忙碌状态,之后就没有反应了,界面卡死,不能进行下一步操作。请问这会是什么情况,是版本问题吗

  5. xyz

    程序是可用的,不过遇到发生错误时,可以考虑图层字段的长队是否已经超出了规定的长度,导致出错。此外,在加载过程中,会比较慢,有时候比较快,不知道是什么原因

Leave a Comment

Your email address will not be published. Required fields are marked *