新普金娱乐网址


【365第57天】你可知道,你转移了自我(23)地理

Windows下创办ArcGIS Server站点

Python爬虫——城市公交、地铁站点和路线数量收集

  • 十二月 26, 2018
  • 地理
  • 没有评论

  本篇博文为博主原创,转载请注解。

小说版权由作者李晓晖和果壳网共有,若转载请于显明处标明出处:http://www.cnblogs.com/naaoveGIS/

  城市公交、地铁数量展现了都会的公共交通,研讨该数据足以开掘城市的直通结构、路网规划、公交选址等。不过,这类数据往往通晓在一定部门中,很难取得。互联网地图上有大量的消息,包含公交、地铁等数据,解析其数量报告格局,可以通过Python爬虫采集。闲言少叙,接下去将详细介绍咋样行使Python爬虫爬取城市公交、地铁站点和数据。

1. 背景

     
 近期大屏幕上出示酷炫地图的需要逐步成风,大家正常的方案是拔取arcmap对数据开展配图。可是,arcmap配图的局限性比较大,并且针对不同需要,常规配图方案可能反而让工作复杂化了。那里跟我们分享六个经过美工设计的图样来缓解地图问题的案例。

  首先,爬取探究城市的兼具公交和地铁线路名称,即XX路,地铁X号线。可以通过图吧公交、公交网、8684、本地宝等网站取得,该类网站提供了按数字和字母划分类其它公交线路名称。Python写个简单的爬虫就能采访,可参照WenWu_Both的稿子,博主详细介绍了哪些利用python爬取8684上某都会具有的公交站点数据。该博主采集了站点详细的音讯,包括,可是缺失了公交站点的坐标、公交线路坐标数据。这就令人抓狂了,没有空间坐标怎么落图,怎么分析,所以,本文重点介绍的是站点坐标、线路的获取。

2. 案例1——倾斜地图

    地理 1

    地理 2

     此示例中,需求总括有两点:

    a.地图需要倾斜展示。

    b.地图上需要以不同款型显得一些POI点。

   
假设以观念方案来做,对地图配图后还亟需对二维地图框架的容器举行倾斜,并且对所需要体现的POI数据坐标点举办倾斜转换,实现相比费力。

   
仔细商量需求,其交互设计上只有针对点数据POI的交互,切交互简单,而且在大屏的全体显示中,地图不需要有缩放平移需求。于是,大家得以交给另外一种实现思路:

    a.不用地图框架,前端用DIV引入原始未倾斜图片。

    b.用CSS控制该DIV的倾斜角度。

   
c.设定图片左上角的地理坐标,确定图片的1个像素所代表的地理长度,然后针对POI地理坐标算出其在本来图片上的图形坐标。

   
d.得到POI的原始图片坐标后,再利用倾斜角度算出在倾斜图片上的图样坐标,然后同样使用DIV引入该POI的图标即可。 

地理 3

3. 案例2——复杂交互的三维效果地图

    同样,先提交设计稿:

   地理 4

   地理 5

    需求描述:

    a.带3D效果显示地图。

    b.行政区划可以选中交互。

    c.行政中心点图标可以控制。

    难点分析:

   
遵照上一个方案中的纯前端方法,在行政区划的入选高亮交互上有一定难度。这里提出了另外一个方案:

   
a.将3D效果地图当做是真正地图,进行简短纠正,处理成包含地理坐标的忠实地图。 
  

地理,    地理 6

    b.基于纠正后的图形,将行政区划矢量化。

    c.将地理图片切图,并用GIS框架加载。

    d.将处理好的矢量化行政数据以矢量图层叠加,响应交互。

    e.将行行政核心点在GIS框架上叠加显示。

   
f.鼠标移动到行政点上后获拿到行政点的屏幕坐标,利用DIV将设计好的气泡框结合自定义内容开展交互展示。

  以图吧公交为例,点击某一公交后,出现该路公交的详实站点信息和地图音信。博主顿感兴奋,觉得立刻就要打响了,各个抓包,发现并不可能分析。可能博主技术所限,如有大神能从中抓到站点和线路的坐标音信,请不宁赐教。这TM就令人绝望了啊,到嘴的肥肉吃不了。

4. 总结

   
我们做GIS的人见状地图就忍不住的想用地图框架去落实,须知针对不同需要,解决方案得以是充裕多彩的。

    a.比如现在的echarts、highcharts在解决简单地图展现上是很好用的。

    b.某些在线环境场馆下,利用百度API或者高德API也是实惠的。

    c.特定复杂现象,利用图片直接处理也是一个路线。

    d.真不行,配图加上地理框架再上。

 

   
                  —–欢迎转载,但保留版权,请于显然处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                    要是您觉得本文确实协理了你,可以微信扫一扫,举办小额的打赏和鞭策,谢谢
^_^

                                地理 7

地理 8

  天无绝人之路,尝试找找某地图的API,发现可以调用,通过分析,可以找到该数量的后台地址。熟练前端的可以试试,博主前端也就只会个hello
world,不献丑了。这是一种思路,实践申明是足以的。

地理 9

  地图API能够,那么通过地图抓包吗?打开某图主页,直接输入某市公交名称,通过抓包,成功找到站点和线路音讯。具体抓包音讯如下图所示,busline_list中详尽列出了站点和线路的音信,其中有两条,是同等趟公交不同方向的数量,略有差距,需注意。找到入口过后,接下去爬虫就要大显身手了。

地理 10

  重要爬取代码如下,其实也很简短,主函数如下。首先需要构建传入的参数,首要的统揽路线名称,城市编码,地理范围,缩放尺度。地理范围可以由此坐标拾取器获取,参数经url编码后,发送请求,判断再次来到数据是否符合要求(注:可能该线路地图上停运或不存在,也恐怕是访问速度过快,反爬虫机制亟待人工验证,博主爬取的时候遭遇过,所将来面设置了任性休眠)。接下来,就是解析json数据了。代码中的extratStations和extractLine,就是领取需要的字段,咋样,是不是很简单。最终,就是保存了,站点和路径分别存储。

 1 def main():
 2     df = pd.read_excel("线路名称.xlsx",)
 3     BaseUrl = "https://ditu.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum=1&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&"
 4     for bus in df[u"线路"]:
 5         params = {
 6             'keywords':'11路',
 7             'zoom': '11',
 8             'city':'610100',
 9             'geoobj':'107.623|33.696|109.817|34.745'
10         }
11         print(bus)
12         paramMerge = urllib.parse.urlencode(params) 
13         #print(paramMerge)
14         targetUrl = BaseUrl + paramMerge
15         stationFile = "./busStation/" + bus + ".csv"
16         lineFile = "./busLine/" + bus + ".csv"
17         
18         req = urllib.request.Request(targetUrl)
19         res = urllib.request.urlopen(req)
20         content = res.read()
21         jsonData = json.loads(content)
22         if (jsonData["data"]["message"]) and jsonData["data"]["busline_list"]:
23             busList = jsonData["data"]["busline_list"] ##busline 列表
24             busListSlt = busList[0] ## busList共包含两条线,方向不同的同一趟公交,任选一趟爬取
25             
26             busStations = extratStations(busListSlt)
27             busLine = extractLine(busListSlt)
28             writeStation(busStations, stationFile)
29             writeLine(busLine, lineFile)
30             
31             sleep(random.random() * random.randint(0,7) + random.randint(0,5)) #设置随机休眠
32         else:
33             continue

  附上博主的解析函数:

 1 def extratStations(busListSlt):
 2     busName = busListSlt["name"]
 3     stationSet = []
 4     stations = busListSlt["stations"]
 5     for bs in stations:
 6         tmp = []
 7         tmp.append(bs["station_id"])
 8         tmp.append(busName)
 9         tmp.append(bs["name"])
10         cor = bs["xy_coords"].split(";")
11         tmp.append(cor[0])
12         tmp.append(cor[1])
13         wgs84cor1 = gcj02towgs84(float(cor[0]),float(cor[1]))
14         tmp.append(wgs84cor1[0])
15         tmp.append(wgs84cor1[1])
16         stationSet.append(tmp)
17     return stationSet
18 
19 def extractLine(busListSlt):
20     ## busList共包含两条线,备注名称
21     keyName = busListSlt["key_name"]
22     busName = busListSlt["name"] 
23     fromName = busListSlt["front_name"]
24     toName = busListSlt["terminal_name"]
25     lineSet = []
26     Xstr = busListSlt["xs"]
27     Ystr = busListSlt["ys"]
28     Xset = Xstr.split(",")
29     Yset = Ystr.split(",")
30     length = len(Xset)
31     for i in range(length):
32         tmp = []
33         tmp.append(keyName)
34         tmp.append(busName)
35         tmp.append(fromName)
36         tmp.append(toName)
37         tmp.append(Xset[i])
38         tmp.append(Yset[i])
39         wgs84cor2 = gcj02towgs84(float(Xset[i]),float(Yset[i]))
40         tmp.append(wgs84cor2[0])
41         tmp.append(wgs84cor2[1])
42         lineSet.append(tmp)
43     return lineSet

  爬虫采集原始数据如下:

地理 11

  以下是某一条公交站点和路线的拍卖后的数码体现。由于不同的地图商接纳不同的坐标系,会有例外档次的偏向,需要坐标纠偏。下一步,博主将详细介绍怎么着批量将那个站点和坐标举办坐标纠正和矢量化。

 地理 12

 

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图