高德地图地理编码python(版本3.9)爬虫(含坐标转换及数据表模板)

数据表模板下载:【免费】高德地理编码-数据表模板资源-优快云文库

首先需自行注册高德地图key,注意每个key地理编码的日限额为5000,附高德地理编码说明:地理/逆地理编码-基础 API 文档-开发指南-Web服务 API | 高德地图API (amap.com)

使用说明:

1,打开数据表模板修改红框内容,可以只写企业名称或者地址,但默认先使用名称进行高德搜索,搜索不到再使用地址进行搜索

2,修改代码中的关键信息:

74行修改为对应城市名称;

76行修改为自己注册的高德地图key;

78行修改为对应县级区名称(因为同一市内可能有多个相同名称地点,这个县级区名称仅作为初步筛选,譬如我只要广州市白云区内的);

129行修改为数据表模板所在目录位置;

137、138行高德地图单个key日配额最高5000次,如果超过,请手动修改行数rows。

3,代码中自动将搜索的高德地图POI坐标(高德坐标)转换为国家2000坐标;同一县级区内也可能搜索到多个相同名称的POI坐标,代码仅返回第一个并填充到excel数据表

# -*- coding:utf-8 -*-
# ---------------------------------------------------------------------------
# Author: LGZ
# Created on: 
# Reference:
# coding:cp936 or coding:utf-8
# ---------------------------------------------------------------------------

import logging, os, pprint
import pandas as pd
import numpy as np


# logging.disable(logging.CRITICAL)  #禁用CRITICAL级别以下的日志记录
# 按此格式显示DEBUG级别以上的日志记录
# logging.basicConfig(filename=loggingfile, level=logging.DEBUG, format="%(asctime)s-%(levelname)s-%(message)s")
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s-%(levelname)s-%(message)s")

def logprint(*shape):
    return logging.debug(pprint.pformat([*shape]))

# file =
# if os.path.isfile(file):  # 判断文件是否已存在,已存在则删除
#     os.unlink(file)
# if os.path.dirname(file) == "" :  # 判断是否没有完整路径
#     file = os.getcwd()+"//"+file  # 如没有则连接工作目录制造完整路径
# file_list=os.listdir(file)  # 根据需要的文件类型获取目录下文件名列表
# file_list=[i for i in file_list if i.endswith("xlsx") and \  
# not i.startswith("~$")]

# save_fold = 
# os.makedirs(save_fold, exist_ok=True)  # 根据文件夹是否已存在制造文件夹
import math

x_pi = float(3.14159265358979324 * 3000.0 / 180.0)
# //pai
pi = float(3.1415926535897932384626)
# //离心率
ee = float(0.00669342162296594323)
# //长半轴
a = float(6378245.0)
# //经度转换
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(abs(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(abs(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
# //国测局转84
def gcj02towgs84(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 requrl(name,ADDRESS):
    params = {
        'city': '广州',  # 修改为对应城市名称
        'address': name,
        'key': '***',  # 修改为自己注册的高德地图key
        'output': 'JSON'}
    XJQ = '白云区'  # 修改为对应县级区名称
    url = "https://restapi.amap.com/v3/geocode/geo?parameters"
    j = json.loads(requests.get(url, params).content)
    # if j['status'] == '1' and int(j['count']) >= 1:
    if j['status'] == '1':
        byn = 0
        geocodeslst = j['geocodes']
        for i in range(len(geocodeslst)):
            if geocodeslst[i]['district'] == XJQ:
                byn += 1
        if byn == 0:
            params['address'] = ADDRESS
            j = json.loads(requests.get(url, params).content)
            if j['status'] == '1' and int(j['count']) >= 1:
                location = j['geocodes'][0]['location'].split(',')
                longitude, latitude = map(float, location)
                addnewname = j['geocodes'][0]['formatted_address']
                return [str("坐标不在该县级区内"), str(byn), str(None), str(None), str(addnewname), longitude, latitude]
            else:
                return [str("坐标不在该县级区内"), str(byn), str(None), str(None), str("无法查找地址"),str(None), str(None)]

        elif byn != 0:
            for i in range(len(geocodeslst)):
                if geocodeslst[i]['district'] == XJQ:
                    newname = j['geocodes'][i]['formatted_address']
                    location = geocodeslst[i]['location'].split(',')
                    longitude,latitude = map(float, location)
                    return [str(newname), str(byn), longitude, latitude,str(None),str(None),str(None)]

    elif j['status'] != '1':
        params['address'] = ADDRESS
        j = json.loads(requests.get(url, params).content)
        if j['status'] == '1' and int(j['count']) >= 1:
            location = j['geocodes'][0]['location'].split(',')
            longitude,latitude = map(float, location)
            addnewname = j['geocodes'][0]['formatted_address']
            return [str("无法查找名称"), str(None), str(None), str(None), str(addnewname), longitude, latitude]
        else:
            return [str("无法查找名称"), str(None), str(None), str(None), str("无法查找地址"), str(None), str(None)]


if __name__ == '__main__':
    """脚本单独使用时运行以下内容"""
    """----------------------------------------------"""
    """---------------------PARA---------------------"""

    try:
        logprint("start of program")
        # TODO
        import requests, json, time
        import openpyxl
        path = "G:\白云集聚区\地理编码\高德地理编码_数据表模板.xlsx"  # 修改为数据表模板所在目录位置
        wb = openpyxl.load_workbook(path)
        sheet1 = wb.active
        # # 获取工作表总行数
        rows = sheet1.max_row
        # # 获取工作表总列数
        # cols = sheet1.max_column
        # column_list = []
        # 高德地图单个key日配额最高5000次,如果超过,请手动修改行数rows
        for i in range(2, rows+1):
            name_value = sheet1.cell(row=i, column=2).value
            add_value = sheet1.cell(row=i, column=3).value
            logprint(name_value)
            urlvaluelst = requrl(str(name_value),str(add_value))
            logprint(urlvaluelst)
            time.sleep(0.5)
            sheet1.cell(row=i, column=4).value = urlvaluelst[0]
            sheet1.cell(row=i, column=5).value = urlvaluelst[1]
            sheet1.cell(row=i, column=6).value = urlvaluelst[2]
            sheet1.cell(row=i, column=7).value = urlvaluelst[3]
            sheet1.cell(row=i, column=8).value = urlvaluelst[4]
            sheet1.cell(row=i, column=9).value = urlvaluelst[5]
            sheet1.cell(row=i, column=10).value = urlvaluelst[6]
            if urlvaluelst[2] != 'None' and urlvaluelst[5] == 'None':
                wgs84lst = gcj02towgs84(urlvaluelst[2],urlvaluelst[3])
                sheet1.cell(row=i, column=6).value = wgs84lst[0]
                sheet1.cell(row=i, column=7).value = wgs84lst[1]
            elif urlvaluelst[2] == 'None'and urlvaluelst[5] != 'None':
                wgs84lst = gcj02towgs84(urlvaluelst[5], urlvaluelst[6])
                sheet1.cell(row=i, column=9).value = wgs84lst[0]
                sheet1.cell(row=i, column=10).value = wgs84lst[1]
        wb.save(path)

        # assert a != 0, "a不能为0"
        # raise Exception("XX")

    except Exception as ex:
        # If an error occurred, print line number and error message
        import traceback
        import sys

        tb = sys.exc_info()[2]
        print("捕获到的异常信息是:{}".format(ex))  # 或者使用print("捕获到的异常信息是:",ex.args[0]或者str(ex)或者直接ex);3.9版本ex.message已不可用)
        print("捕获到的异常代码行号是:Line {0}".format(tb.tb_lineno))
        print(traceback.format_exc())  # 显示完整错误路径

    # except arcpy.ExecuteError:
    # print(arcpy.GetMessages())

    # 无错误运行else后代码
    else:
        logprint("program success")
        # arcpy.AddMessage("program success")

    # 有没有错误均运行finally后代码
    finally:
        pass

欢迎使用,如发现问题欢迎指正,评论,需求和交流Q:775915005

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值