import requests
import shapefile# -*- coding: utf-8 -*-
import json
import urllib
import math
import pandas as pd
import numpy as np#坐标转换,转WGS84
x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626  # π
a = 6378245.0  # 长半轴
ee = 0.00669342162296594323  # 偏心率平方
def gcj02_to_wgs84(lng, lat):"""坐标转化script来源于github,感谢作者的贡献!GCJ02(火星坐标系)转GPS84:param lng:火星坐标系的经度:param lat:火星坐标系纬度:return:"""#if out_of_china(lng, lat):#return [lng, lat]dlat = _transformlat(lng - 105.0, lat - 35.0)dlng = _transformlng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * pimagic = math.sin(radlat)magic = 1 - ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)mglat = lat + dlatmglng = lng + dlngreturn [lng * 2 - mglng, lat * 2 - mglat]def _transformlat(lng, lat):ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * pi) + 40.0 *math.sin(lat / 3.0 * pi)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *math.sin(lat * pi / 30.0)) * 2.0 / 3.0return retdef _transformlng(lng, lat):ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lng * pi) + 40.0 *math.sin(lng / 3.0 * pi)) * 2.0 / 3.0ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *math.sin(lng / 30.0 * pi)) * 2.0 / 3.0return ret
#获取原始数据
def get_single_line(mykey,city_name,line_name):'''下载单条地铁线路:param city_c: 城市名称:param line_c: 线路名称,如11路、地铁一号线:return: 一条公交线路数据,追加到已存的数据后面'''url = "https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key={}&output=json&" \"city={}&offset=1&keywords={}&platform=JS".format(mykey,city_name, line_name)#url = "https://restapi.amap.com/v3/bus/linename?s=rsv3&extensions=all&key={}&output=json&" \#"city={}&offset=1&keywords={}&platform=JS".format(mykey,city_name, line_name)try:print("开始获取{}数据".format(line_name))response = requests.get(url).json()dt = {}if response["buslines"]:print("服务器成功返回数据")if len(response["buslines"]) == 0:print("返回的内容没有数据")else:# 提取地铁线路名称dt["line_name"] = response["buslines"][0]["name"]#获取线路沿线的经纬度,以便生成线路dt["polyline"] = response["buslines"][0]["polyline"]#获取地铁线路的最早、最晚运营时间dt["start_time"] = response["buslines"][0]["start_time"]dt["end_time"] = response["buslines"][0]["end_time"]#获取地铁线路的首末站站点名称dt["start_stop"] = response["buslines"][0]["start_stop"]dt["end_stop"] = response["buslines"][0]["end_stop"]#获取地铁线路的首末站站点名称dt["distance"] = response["buslines"][0]["distance"]#获取地铁的起始价和全程价dt["basic_price"] = response["buslines"][0]["basic_price"]dt["total_price"] = response["buslines"][0]["total_price"]#获取站点的名称和经纬度st_name = []st_coords = []for i in response["buslines"][0]["busstops"]:station_name = i["name"]station_corrds = i["location"]st_name.append(station_name)st_coords.append(station_corrds)dt["station_name"] = st_namedt["station_coords"] = st_coords#保存数据print("{}数据爬取成功".format(line_name))data = pd.DataFrame([dt])data.to_csv(r"./{}_subway_data.csv".format(city_name), mode="a", header=False, encoding="utf_8_sig")else:print("内容返回失败")#记录失败数据with open(r"./error.txt",mode="a") as f:f.write("{}数据爬取失败".format(line_name))except:#记录失败数据print("{}数据爬取失败".format(line_name))with open(r"./error.txt", mode="a") as f:f.write("{}数据爬取失败".format(line_name))#得到站点数据
def get_station():data = pd.read_csv(r"./{}_subway_data.csv".format(city_name),encoding="gbk",engine="python",names=["id","line_name","polyline","start_time","end_time","start_stop","end_stop","distance","basic_price","total_price","station_name","station_coords"])print(data)df = data[["line_name",'station_coords', 'station_name']]#将字符串处理并分割成列表df["station_coords"] = df["station_coords"].apply(lambda x: x.replace("[", "").replace("]", "").replace("\'", "").split(", "))df["station_name"] = df["station_name"].apply(lambda x: x.replace("[", "").replace("]", "").replace("\'", "").split(", "))#将单元格的列表数值进行竖铺sta_name = np.hstack(df["station_name"])sta_coords = np.hstack(df["station_coords"])li_name = np.hstack(df["line_name"].repeat(list(map(len,df["station_name"]))))#将线路、站点名称、站点经纬度进行对应匹配station_data = pd.DataFrame(np.column_stack((li_name,sta_name,sta_coords)),columns=["line_name","station_name","station_coords"])#删除相同的站点station_data = station_data.drop_duplicates(["station_name"])#分别提取经度、纬度station_data["lng"] = station_data["station_coords"].apply(lambda x: x.split(",")[0])station_data["lat"] = station_data["station_coords"].apply(lambda x: x.split(",")[1])#重新设置索引,使得索引从0 开始,1为间隔station_data = station_data.reset_index(drop=True)#转化坐标station_data["lng84"] = 0.00station_data["lat84"] = 0.00for i in range(len(station_data)):station_data["lng84"][i] = gcj02_to_wgs84(float(station_data["lng"][i]),float(station_data["lat"][i]))[0]station_data["lat84"][i] = gcj02_to_wgs84(float(station_data["lng"][i]),float(station_data["lat"][i]))[1]#station_data.to_csv(r"./{}_subway_station_data.csv".format(city_name),encoding="gbk")#转化为shp文件w = shapefile.Writer(r"./{}/station.shp".format(city_name))w.field("line_name","C")w.field("station_name","C")w.field("lng","C")w.field("lat","C")w.field("lng84","C")w.field("lat84","C")for i in range(len(station_data)):w.point(station_data["lng84"][i],station_data["lat84"][i])w.record(station_data["line_name"][i],station_data["station_name"][i],station_data["lng"][i],station_data["lat"][i],station_data["lng84"][i],station_data["lat84"][i],encode = "gbk")w.close()#获取线路数据
def get_line():data = pd.read_csv(r"./{}_subway_data.csv".format(city_name), encoding="gbk", engine="python",names=["id", "line_name", "polyline", "start_time", "end_time", "start_stop", "end_stop","distance", "basic_price", "total_price", "station_name", "station_coords"])data["polyline"] = data["polyline"].apply(lambda x: x.split(";"))#转化坐标for i in range(len(data["polyline"])):list = []all_point = data["polyline"][i]for j in range(len(all_point)):lng = all_point[j].split(",")[0]lat = all_point[j].split(",")[1]list.append(gcj02_to_wgs84(float(lng),float(lat)))data["polyline"][i] = list# 转化为shp文件w = shapefile.Writer(r"./{}/line.shp".format(city_name))w.field("line_name", "C")w.field("start_time", "C")w.field("end_time","C")w.field("start_stop","C")w.field("end_stop","C")w.field("distance", "C")w.field("basic_price", "C")w.field("total_price", "C")for i in range(len(data)):w.line([data["polyline"][i]])w.record(data["line_name"][i],data["start_time"][i],data["end_time"][i],data["start_stop"][i],data["end_stop"][i],data["distance"][i],data["basic_price"][i],data["total_price"][i], encode="gbk")w.close()if __name__ == "__main__":key = "***" #这里请输入key值city_name = "武汉市"  #这里请输入所需要的城市名称all_line_name = ['1号线'] #这里请输入所需要的地铁线路名称for line_name in all_line_name:get_single_line(key,city_name,line_name)#get_station()#get_line()

python爬虫,矢量数据地铁线路获取相关推荐

  1. [Python爬虫] Selenium+Phantomjs动态获取CSDN下载资源信息和评论

    前面几篇文章介绍了Selenium.PhantomJS的基础知识及安装过程,这篇文章是一篇应用.通过Selenium调用Phantomjs获取CSDN下载资源的信息,最重要的是动态获取资源的评论,它是 ...

  2. python爬虫-从QQ邮箱获取好友信息并爬取头像

    本篇博客利用python爬虫实现半自动爬取好友头像 和以前一样,先上效果: 以上就是我的好友头像,怎么获取呢? 我采取的方法可能有点低级,首先打开我们的qq邮箱,按F12找见如下的包: 我们需要的好友 ...

  3. 利用Python爬虫从百度百科获取全国所有县区的地理信息

      最近因为工作需要,需要从百度百科获得全国近3000个县区的位置.地貌.气候.水文等地理信息.因为自己对爬虫有些兴趣,就尝试用Python爬虫来获得这些数据,也算是自己对爬虫的学习过程吧.因为学习爬 ...

  4. Python爬虫示例1:获取豆瓣电影正在热播的电影信息

    个人的第一个python爬虫程序,如果错误,请指正. 程序用于抓取豆瓣电影正在热播的电影信息,详细代码如下所示: #!/usr/bin/python # -*- coding: UTF-8 -*- i ...

  5. Python爬虫入门案例:获取百词斩已学单词列表

    本文首发在我的个人博客:https://jlice.top/p/6sjd1/.欢迎大家前去参观,么么哒~ 百词斩是一款很不错的单词记忆APP,在学习过程中,它会记录你所学的每个单词及你答错的次数,通过 ...

  6. Python爬虫实战—2345影视获取经典电影信息

    爬虫提前准备包 1)安装解析库lxml lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高. 命令行进行安装:pip install lxml ...

  7. python如何过获取双色球信息_2017.08.17 Python爬虫实战之BS4获取双色球中奖信息

    1.目标分析: (1)网址:http://www.zhcw.com/ssq/kaijiangshuju/index.shtml?type=0 (2)查看框架的源代码:在中奖信息表格上右击,选择弹出菜单 ...

  8. python爬虫--根据身份证号码获取户籍地、出生年月等信息

    一.背景 工作中偶尔会遇到这样的情况,给你一堆客户身份证号码,然后要你把对应的性别.生日.户籍地等信息弄出来. 最常用的方法就是用excel表套公式,这个方式如果用来取性别.生日这些信息的话问题不大, ...

  9. python爬虫(7)——获取京东商品评论信息

    本文借鉴了之前爬取天猫商品评论的思想,先通过分析网页信息来定位京东加载商品评论信息的JS页面,然后从中提取出想要的商品评论信息并存入MySQL数据库. 1.分析网页信息 本文在进行各项操作时同样以小米 ...

最新文章

  1. 禁掉人脸识别!一群音乐人正在号召,禁止在音乐节上动用人脸识别
  2. JavaScript学习篇(3)
  3. thinkphp 获取客户端ip地址方法
  4. Bootstrap3 工具提示插件的方法
  5. csapp 深入理解计算机系统 csapp.h csapp.c文件配置
  6. 助老打车暖心车站落地杭州 帮助老年人扫码一键叫车
  7. web前端基础(07style)
  8. storyboard 苹果启动图_iOS LaunchScreen.storyboard启动图更新
  9. linux nload_Linux nload命令
  10. U811.1接口EAI系列之三--采购订单生成--VB语言
  11. 单独得省级行政区数据
  12. 微信小程序比较用户微信客户端版本号
  13. 计算机及格率用什么函数,excel计算及格率函数的使用教程
  14. @ComponentScan注解
  15. 千里马android framework实战开发-binder驱动之oneway导致的transaction failed
  16. S2SH水费管理系统-JAVA【毕业设计、快速开发、源码、开题报告】
  17. 编程中经常用到的工具
  18. XLR接头(卡农头)数字音频线制作教程
  19. mysql简单数据库定期备份
  20. ps命令 查看系统进程信息

热门文章

  1. 软件工程与计算II-20-软件交付
  2. 技嘉1080显卡体质测试软件,技嘉GTX1080 Xtreme Gaming显卡评测:创新的重峦式三风扇...
  3. 【Linux 内核 内存管理】物理分配页 ⑨ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | retry 标号代码分析 )
  4. 企业成长能力分析的指标是什么
  5. 真相,为什么大厂一边裁员,一边招人?
  6. 如何解决DOSBox 0.74无法运行edit指令
  7. 第四次作业 ——吴靖瑜
  8. qq象棋棋谱格式详解及其解析
  9. 微信小程序-提交表单成功弹窗提示
  10. Codeforces Round #514 (Div. 2)