码迷,mamicode.com
首页 > 其他好文 > 详细

高德地图抓路服务

时间:2019-04-26 12:43:10      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:没有   nsf   __name__   代码   gcj   direct   3.0   lan   col   

需求:根据给定的经纬度,获取对应的地图上的点,以及该点所在地段道路名称及限速

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 ‘‘‘

 

高德地图抓路服务

标签:没有   nsf   __name__   代码   gcj   direct   3.0   lan   col   

原文地址:https://www.cnblogs.com/slfh/p/10773390.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!