其他分享
首页 > 其他分享> > 基于百度地图开放平台Web服务api爬取经纬度并转换为WGS84坐标

基于百度地图开放平台Web服务api爬取经纬度并转换为WGS84坐标

作者:互联网

前言

百度地图开放平台创建web服务应用

基于web服务api爬取对应地点的经纬度

import urllib
import math
import pandas as pd
import requests
import json
def BaiduQuery(address, currentkey):
    url = 'http://api.map.baidu.com/geocoder/v2/'
    params = { 'address' : address,           
               'ak' : currentkey, # 百度密钥
               'output': 'json'     }  # 输出结果设置为json格式
    res = requests.get(url,params)
    jd = json.loads(res.text)    
    # 将json格式转化为Python字典
    #搜索不到的地点经纬度坐标设置为0,0
    if jd['status'] == 1:
        coords = {'lng': 0, 'lat': 0}
    else:
    #百度坐标转火星坐标
        coords = jd['result']['location']
        coords_1 = baidu_togcj02(coords['lng'], coords['lat'])
        coords['lng'] = coords_1[0]['x']
        coords['lat'] = coords_1[0]['y']
     #火星坐标转WGS84
        reverses_coord = gcj02_to_wgs84(coords['lng'], coords['lat'])
        coords['lng'] = reverses_coord[0]
        coords['lat'] = reverses_coord[1]
    return coords

百度坐标转换参数介绍

def baidu_togcj02(lng, lat):
    data = str(lng)+','+str(lat)
    url = 'http://api.map.baidu.com/geoconv/v1/?coords='+data+'&from=5&to=3&output=json'+'&ak=sHlqv5QdGaZzeIcpAT2gbVe8aFevOpXm'
    response = requests.get(url) #发出请求
    answer = response.json() #json化   
    coords = answer['result']
    return coords

火星坐标转WGS84

pi = math.pi  # π
x_pi = pi * 3000.0 / 180.0
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 * 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 [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.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):
    """
    判断是否在国内,不在国内不做偏移
    :param lng:
    :param lat:
    :return:
    """
    return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)
coords = BaiduQuery('碎叶', currentkey="AK")
print(coords)
df = pd.read_excel('丝绸之路城市表.xlsx')
height,width = df.shape
print(df.head(3))
for i in range(0, height):
    coords = BaiduQuery(df['city'][i], currentkey="AK")
    df['lng'][i] = coords['lng']
    df['lat'][i] = coords['lat']
#导出结果到Excel
df.to_excel('city_coords.xls')
print("数据爬取成功,已存储!")

标签:Web,开放平台,爬取,coords,坐标,lat,lng,pi,math
来源: https://blog.csdn.net/lemon_tttea/article/details/116231141