近日做项目,有一部分要分析研究范围内的交通运行情况。传统的方法是要去现场调研数车,通过交通量和道路通行能力来计算道路的服务水平。但是因为疫情原因,不想外出,想要利用其它方法来获得区域的交通运行水平。首先想到的就是高德地图api的交通态势。

高德地图api 交通态势

有了想法之后,作为一个只会看,不会写代码的辣鸡交通规划师,就必须借助度娘的帮助了。在网上发现很多介绍高德api交通态势爬取的方法,下面就列举一个我看完之后能够实现的方法。(写这篇文章的原因主要是为自己加深印象,小伙伴们也可以去网上搜索,很容易获得方法和代码)

本次使用的工具

Spyder(python3.7)编辑器、arcgis10.2主要是这两个。(当然会用到记事本、excel之类的了)

主要思路

根据高德api提供的接口,利用python的requests库get到高德返回到交通运行信息。将其保存成csv文件,导入到arcgis中,进行可视化展示分析。

方法分析

高德提供了两种获取区域交通态势的方法,一种是矩形区域查询(需要矩形的左下角和右上角经纬度坐标,注意是高德经纬度格式),另一种方法是圆形区域查询(需要圆形中心的经纬度和半径)。本次就采用了矩形区域的交通态势查询,但是高德对于查询的区域范围进行了限制(矩形对角线的距离在10公里之内),但是这也难不住网上的各位大神,利用网格的方法突破了这种限制。

将要分析的区域分割成多个网格,每个网格对角线距离不要超过10公里,然后利用for循环对网格的数据依次进行调用,这样虽然增加api调取的次数,但也不失为一个好的方法。

方格画的不规则,大家不要介意了,主要是示意

主要代码

代码主要来源于网上,不是本人撰写(主要是自己太笨),部分有所改动,经过我的实践,代码好用。下面这些代码主要是用来爬取及保存交通态势数据。

# -*- coding: utf-8 -*-
"""
Created on Thu May  7 10:43:18 2020@author: user
"""import requests
import pandas as pd
import json
import time#初始API的URL
url="https://restapi.amap.com/v3/traffic/status/rectangle?key=申请的ak&extensions=all&rectangle="#设定整个网格左下角坐标的经纬度值
baselng=120.320805
baselat=36.098401
#设定每个网格单元的经纬度宽
widthlng=0.04
#同一维度,lng=0.01≈1000米
widthlat=0.03
#同一经度,lat=0.01≈1113米
#用于储存数据
x=[]
#用于标识交通态势线段
num=0#爬取过程可能会出错中断,因此增加异常处理
try:#循环每个网格进行数据爬取,在这里构建了3X3网格for i in range(0,3):#设定网格单元的左下与右上坐标的纬度值#在这里对数据进行处理,使之保留6位小数(不保留可能会莫名其妙出错)startlat=round(baselat+i*widthlat,6)endlat=round(startlat+widthlat,6)for j in range(0,3):#设定网格单元的左下与右上坐标的经度值startlng=round(baselng+j*widthlng,6)endlng=round(startlng+widthlng,6)#设置API的URL并进行输出测试locStr=str(startlng)+","+str(startlat)+";"+str(endlng)+","+str(endlat)thisUrl=url+locStrprint(thisUrl)#爬取数据data=requests.get(thisUrl)s=data.json()a=s["trafficinfo"]["roads"]#注意,提取数值需要使用XXX.get()的方式来实现,如a[k].get('speed')#若使用a[k]['speed']来提取,或会导致KeyError错误for k in range(0,len(a)):s2=a[k]["polyline"]s3=s2.split(";")for l in range(0,len(s3)):s4=s3[l].split(",")x.append([a[k].get('name'),a[k].get('status'),a[k].get('speed'),num,float(s4[0]),float(s4[1])])num=num+1time.sleep(0.1)#若爬取网格较多,可使用time.sleep(秒数)来避免高德的单秒API调用次数的限制
except Exception  as e:pass#将数据结构化存储至规定目录的CSV文件中
c = pd.DataFrame(x,columns=['name','status','speed','roadID','x','y'])
c.to_csv('C:/Users/user/Desktop/panchong/交通态势/traffic.csv',encoding='utf-8-sig')

得到的数据主要包括6列,分别是道路名称、道路运行状态、运行速度、道路编号、道路点x坐标,道路点y坐标。

得到的数据格式

但是要注意的是返回的道路坐标是高德坐标也就是gcj02坐标,并不是我们常用的wgs_84坐标,因此要想导入进arcgis中展示,还需要进行坐标转换。下面这些代码,就是将gcj02转wgs_84。经过我的实践,好用。

# -*- coding: utf-8 -*-
"""
Created on Thu May  7 11:22:31 2020@author: user
"""#1.导入库
# -*- coding: utf-8 -*-import jsonimport urllibimport mathimport pandas as pd
import numpy as npx_pi = 3.14159265358979324 * 3000.0 / 180.0pi = 3.1415926535897932384626  # πa = 6378245.0  # 长半轴ee = 0.00669342162296594323  # 偏心率平方def gcj02_to_wgs84(lng, lat):"""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 retdef out_of_china(lng, lat):"""判断是否在国内,不在国内不做偏移:param lng::param lat::return:"""return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)#2.点坐标转换
z=[]
st=pd.read_csv('C:/Users/user/Desktop/panchong/交通态势/traffic.csv')
for i in range(0,len(st)):lng=st['x'][i]lat=st['y'][i]z.append(gcj02_to_wgs84(lng,lat))
D=pd.DataFrame(z)
st['x84']=D[0]
st['y84']=D[1]
st.to_csv('C:/Users/user/Desktop/panchong/交通态势/tr84.csv')

得到数据最后两列就是道路的wgs_84坐标。

数据最后两列就是转换得到的wgs_84坐标

可视化分析

1、打开Arcmap,在右侧的catlog(目录)中找到爬取的CSV文件直接拖入左侧的内容列表中,如图:

2、右键点击该CSV数据,选择“显示XY数据”:

3、在弹出的设置框中,进行如下设置:

4、接下来的一步十分重要,打开生成要素的属性表可以发现,属性表并没有FID(objectID)字段,若无该字段,该点要素将无法转换为线要素,因此需要将该要素导出为SHP文件,方法是右键单击该要素,选择数据->导出数据,如下图:

5、接下来是将交通态势点转换为线,在toolbox中找到“点集转线”工具(数据管理工具->要素->点集转线),在弹出的设置界面进行如下设置:

注意线字段选择roadID(即代码中的num变量),排序字段选择FID。

6、等待片刻,完整的路网呈现在眼前:

看到了路网是不是一阵狂喜,但是打开属性表,似乎笑不出来了,原来的交通态势属性去哪了?

不要着急,接下来一步,将属性完美的找回来。

7、右键路网数据,选择连接和关联->连接,如下图:

在弹出的设置框中进行如下设置:

第二个选项可以是原始的CSV表,也可以是用来转线的点文件(即本文的dian.shp),点击确定,再打开属性表,属性是不是回来了呢?

8、分级渲染可视化一下

arcgis公里坐标转经纬度_高德api交通态势爬取及可视化利用 python+arcgis相关推荐

  1. 高德地图交通态势爬取并存入MySQL数据库

    高德地图交通态势爬取并存入mysql数据库 高德地图交通态势开放api链接: 高德交通态势 高德地图交通态势使用流程: 第一步,申请"Web服务API接口"密钥(Key): 第二步 ...

  2. 高德地图交通态势爬取

    高德Web服务API提供了交通态势的http接口,使用时分为以下3个过程: 第一步,申请"Web服务API接口"密钥(Key): 第二步,拼接HTTP请求URL,第一步申请的Key ...

  3. python 高德地图交通态势爬取(存入mysql)

    高德Web服务API提供了交通态势的http接口,使用时分为以下3个过程: 第一步,申请"Web服务API接口"密钥(Key): 第二步,拼接HTTP请求URL,第一步申请的Key ...

  4. python爬取高德poi数据_Python突破高德API限制完全爬取POI兴趣点数据

    一.背景 爬取POI数据,基本上是个老生常谈的话题了,现在市面上随处可见各路大神制作的获取POI数据的工具,但是当我将从高德地图中实际获取的POI数据与工具爬取的POI数据进行对比之后发现,市面上流行 ...

  5. python爬虫爬当当网_爬虫实战一:爬取当当网所有 Python 书籍

    本文转载自微信公众号[ 极客猴 ],作者知乎主页 此前错误标注来源导致侵权,在此表示歉意. 我们已经学习 urllib.re.BeautifulSoup 这三个库的用法.但只是停留在理论层面上,还需实 ...

  6. CAD 坐标转经纬度(Arcgis)

    CAD 坐标转经纬度(Arcgis) 1.CAD坐标识别 工具-坐标信息识别,手动复制输出到excel表,格式大致如下: 2.Arcgis 转换 文件-添加数据-添加XY数据,找到对应的excel表格 ...

  7. 平面投影坐标转经纬度坐标

    平面投影坐标转经纬度坐标 本人在进行开发时,使用geotools的GeoTiffReader类读取卫星影像的顶点坐标,得到的是平面坐标,单位是米,打开arcGIS,加载影像,右下角会有坐标,在视图-& ...

  8. 墨卡托坐标以及墨卡托坐标转经纬度

    Google Maps.Virtual Earth等网络地理所使用的地图投影,常被称作Web Mercator或Spherical Mercator,它与常规墨卡托投影的主要区别就是把地球模拟为球体而 ...

  9. 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版...

    转自:https://www.cnblogs.com/fwc1994/p/5884115.html 火星坐标.百度坐标.WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版 火星坐标 ...

最新文章

  1. 13分页和shell命令行模式
  2. android surfaceview 图片,为啥从SurfaceView中获取不到图片?
  3. 【Python】忘记登录密码?遍历数字字母组合密码+模拟提交表单
  4. 小程序如何传数组数据到vs后台中
  5. MSCRM二次开发实现自动编号功能
  6. git 发布android 系统版本 修改版本型号 查看指定文件的修改记录
  7. 【Pytorch神经网络理论篇】 06 神经元+神经网络模型+全连接网络模型
  8. 无盘服务器磁盘缓存,云更新无盘服务器磁盘缓存器
  9. mvc图片上传到服务器
  10. 基于matlab的不规则面积图像测量,基于matlab的不规则面积图像测量.doc
  11. Android百度离线地图
  12. 工作第一年的所见所闻所学所想
  13. 水果 hdu 1263 模拟
  14. 滴滴Uber又打起来了!外卖领域C位花落谁家?
  15. 计算机考研380分能上什么学校,考研总分500考380难吗 能上什么学校
  16. Mathematica:向量、矩阵之间的区分
  17. 【新年呈献】高性能 Socket 组件 HP-Socket v3.1.2 正式发布
  18. 数字病理切片处理---------组织学处理学习
  19. Android获取屏幕信息的几种方式
  20. 通过tftp在ubuntu和LS1B开发板之间传输文件

热门文章

  1. 6年Microsoft MVP,是否还能坚持4年?
  2. maven打包jar上传到nexus
  3. oracle数据文件移动方法
  4. 9个必须时刻警惕的Linux命令代码
  5. Eucalyptus系统部署
  6. Windows XP字体模糊
  7. (转)青春有限,走红有年
  8. SAP ABAP F4的检索帮助(包括自定义检索帮助)
  9. SAP成本会计分录大全
  10. 凭证 90000000 保存(帐户确定出错)