arcgis公里坐标转经纬度_高德api交通态势爬取及可视化利用 python+arcgis
近日做项目,有一部分要分析研究范围内的交通运行情况。传统的方法是要去现场调研数车,通过交通量和道路通行能力来计算道路的服务水平。但是因为疫情原因,不想外出,想要利用其它方法来获得区域的交通运行水平。首先想到的就是高德地图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坐标。
可视化分析
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相关推荐
- 高德地图交通态势爬取并存入MySQL数据库
高德地图交通态势爬取并存入mysql数据库 高德地图交通态势开放api链接: 高德交通态势 高德地图交通态势使用流程: 第一步,申请"Web服务API接口"密钥(Key): 第二步 ...
- 高德地图交通态势爬取
高德Web服务API提供了交通态势的http接口,使用时分为以下3个过程: 第一步,申请"Web服务API接口"密钥(Key): 第二步,拼接HTTP请求URL,第一步申请的Key ...
- python 高德地图交通态势爬取(存入mysql)
高德Web服务API提供了交通态势的http接口,使用时分为以下3个过程: 第一步,申请"Web服务API接口"密钥(Key): 第二步,拼接HTTP请求URL,第一步申请的Key ...
- python爬取高德poi数据_Python突破高德API限制完全爬取POI兴趣点数据
一.背景 爬取POI数据,基本上是个老生常谈的话题了,现在市面上随处可见各路大神制作的获取POI数据的工具,但是当我将从高德地图中实际获取的POI数据与工具爬取的POI数据进行对比之后发现,市面上流行 ...
- python爬虫爬当当网_爬虫实战一:爬取当当网所有 Python 书籍
本文转载自微信公众号[ 极客猴 ],作者知乎主页 此前错误标注来源导致侵权,在此表示歉意. 我们已经学习 urllib.re.BeautifulSoup 这三个库的用法.但只是停留在理论层面上,还需实 ...
- CAD 坐标转经纬度(Arcgis)
CAD 坐标转经纬度(Arcgis) 1.CAD坐标识别 工具-坐标信息识别,手动复制输出到excel表,格式大致如下: 2.Arcgis 转换 文件-添加数据-添加XY数据,找到对应的excel表格 ...
- 平面投影坐标转经纬度坐标
平面投影坐标转经纬度坐标 本人在进行开发时,使用geotools的GeoTiffReader类读取卫星影像的顶点坐标,得到的是平面坐标,单位是米,打开arcGIS,加载影像,右下角会有坐标,在视图-& ...
- 墨卡托坐标以及墨卡托坐标转经纬度
Google Maps.Virtual Earth等网络地理所使用的地图投影,常被称作Web Mercator或Spherical Mercator,它与常规墨卡托投影的主要区别就是把地球模拟为球体而 ...
- 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版...
转自:https://www.cnblogs.com/fwc1994/p/5884115.html 火星坐标.百度坐标.WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版 火星坐标 ...
最新文章
- 13分页和shell命令行模式
- android surfaceview 图片,为啥从SurfaceView中获取不到图片?
- 【Python】忘记登录密码?遍历数字字母组合密码+模拟提交表单
- 小程序如何传数组数据到vs后台中
- MSCRM二次开发实现自动编号功能
- git 发布android 系统版本 修改版本型号 查看指定文件的修改记录
- 【Pytorch神经网络理论篇】 06 神经元+神经网络模型+全连接网络模型
- 无盘服务器磁盘缓存,云更新无盘服务器磁盘缓存器
- mvc图片上传到服务器
- 基于matlab的不规则面积图像测量,基于matlab的不规则面积图像测量.doc
- Android百度离线地图
- 工作第一年的所见所闻所学所想
- 水果 hdu 1263 模拟
- 滴滴Uber又打起来了!外卖领域C位花落谁家?
- 计算机考研380分能上什么学校,考研总分500考380难吗 能上什么学校
- Mathematica:向量、矩阵之间的区分
- 【新年呈献】高性能 Socket 组件 HP-Socket v3.1.2 正式发布
- 数字病理切片处理---------组织学处理学习
- Android获取屏幕信息的几种方式
- 通过tftp在ubuntu和LS1B开发板之间传输文件