高德地图抓路服务
需求:根据给定的经纬度,获取对应的地图上的点,以及该点所在地段道路名称及限速
1、相关信息
(1)WGS84与GCJ02
WGS84:世界标准地理坐标系
GCJ02:中国国测局地理坐标系
当前所有的经纬度数据使用的坐标系是WGS84,高德地图经纬度数据使用的坐标系是GCJ02,因此若想获取高德地图上相对应的经纬度坐标处的相关信息就需要进行WGS84到GCJ02坐标系的转换
(2)高德地图抓路服务相关使用
抓路服务API:https://lbs.amap.com/fn/autograsp/
根据页面介绍,首先需要注册账号,此处略过,若已有账号,如何申请key值,此处简单介绍一下。点击申请Key跳转到应用管理页面
创建一个新应用,按照个人所需输入应用名称和应用类型。新创建的应用如下,没有key值
点击当前应用右上角的”+“添加key值,在出现的页面选择自己需要的服务,输入相关信息,点击提交之后,即可创建该应用对于该服务的key值
2、简单尝试
(1)坐标转换
#import urllib import math x_pi = 3.14159265358979324 * 3000.0 / 180.0 pi = 3.1415926535897932384626 # π a = 6378245.0 # 长半轴 ee = 0.00669342162296594323 # 偏心率平方 def wgs84_to_gcj02(lng, lat): """ WGS84转GCJ02(火星坐标系) """ 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 * pi magic = math.sin(radlat) magic = 1 - ee * magic * magic sqrtmagic = 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 + dlat mglng = lng + dlng return [mglng, 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.0 ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0 ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0 return ret def _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.0 ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0 ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0 return ret def out_of_china(lng, lat): return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55) if __name__ == \'__main__\': result84to02 = wgs84_to_gcj02(116.216516, 28.223563) print(result84to02)
(2)时间转换
要求输入时间为utc时间,因此需要转换时间
附上连接:https://time.is/Unix_time_converter
(3)示例及结果
carid:XXXX123456
locations:116.22142876920546,28.220271135633453|116.22123409873669,28.220431363983824|116.22103942943106,28.22058959349244
time:1533320970,1533320972,1533320973
direction:312,312,312
speed:93,93,93
3、代码获取
1 import requests 2 import json 3 import pandas as pd 4 r = requests.get("https://restapi.amap.com/v3/autograsp?key=&carid=XXXX123456&locations=116.22142876920546,28.220271135633453|116.22123409873669,28.220431363983824|116.22103942943106,28.22058959349244&time=1533320970,1533320972,1533320973&direction=312,312,312&speed=93,93,93") 5 obj=json.loads(r.text)#将json格式字符串转为json 6 #print(obj) 7 print(obj["roads"][0]) 8 print(obj["roads"][1]) 9 print(obj["roads"][2]) 10 \'\'\' 11 结果展示 12 {\'roadname\': \'G70福银高速\', \'crosspoint\': \'116.22143,28.22027\', \'roadlevel\': \'41000\', \'maxspeed\': \'120\', \'intersection\': [], \'intersectiondistance\': \'-1\'} 13 {\'roadname\': \'G70福银高速\', \'crosspoint\': \'116.22123,28.220427\', \'roadlevel\': \'41000\', \'maxspeed\': \'120\', \'intersection\': [], \'intersectiondistance\': \'-1\'} 14 {\'roadname\': \'G70福银高速\', \'crosspoint\': \'116.22104,28.220587\', \'roadlevel\': \'41000\', \'maxspeed\': \'120\', \'intersection\': [], \'intersectiondistance\': \'-1\'} 15 \'\'\'