热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Python】根据地名获取经纬度

本文是通过调用百度开放平台的API实现的经纬度查询。因此在使用前需要你去注册一个应用。文章目录一、API调用说明源码1.数据准备二、根据地名计算经纬度的代码二、通过经纬度计算两地之

本文是通过调用百度开放平台的API实现的经纬度查询。因此在使用前需要你去注册一个应用。


文章目录

  • 一、API 调用说明
  • 源码
    • 1. 数据准备
  • 二、根据地名计算经纬度的代码
  • 二、通过经纬度计算两地之间的距离


一、API 调用说明
  1. 打开链接

    百度地图开放平台

  2. 创建应用

    创建应用

  3. 获取AK

    获取AK

  4. 替换程序中的AK,运行就能得到返回的JSON字符串


源码

源码被我拆成了三个小节,分别是 数据准备计算经纬度计算两地距离,其他中间的处理代码则可能需要读者手动完善。

# 导入相关的包
import requests #HTTP请求
import time
import re
import json # 用于解析Json
import pandas as pd # 用于处理数据(数据分析相关的同学必须会的包)

1. 数据准备

CSV文件中有一列是city,使用pandas直接读取即可:

df = pd.DataFrame()
df = pd.read_csv(r'./city.csv',encoding="gbk")
df['city']

得到的数据如下所示,总共有一百条,是我国2020年百强县的名单:

0 昆山市
1 江阴市
2 张家港市
3 晋江市
4 常熟市...
95 福安市
96 射阳县
97 邹平县
98 海城市
99 青州市
Name: city, Length: 100, dtype: object



user_geohashnumcity
094ek6ke1028昆山市
194ek6lj980江阴市
294ek6lw919张家港市
394ek6kn908晋江市
494ek6l5517常熟市
............
959q0ltaw243福安市
9699s4avh242射阳县
979519pwt240邹平县
9894jrlp3240海城市
99946hodd240青州市

100 rows × 3 columns


因为使用的是API,因此得到是上述的Json字符串。

二、根据地名计算经纬度的代码

/**/
def calc_ll(x):# 获取自己的AK替换Post_url中 中文括号 的内容即可Post_url = "http://api.map.baidu.com/geocoding/v3/?address=" + x + "&output=json&ak=(百度API开放平台获取的AK)&callback=showLocation"Post_data = {'address': x}Text = se.post(Post_url, data=Post_data).text.replace("'", '"').replace('/ ', '/')[27:-1] # 提取为Json格式,去掉‘showLocation&&showLocation()’这些额外的字符jsonValue = json.loads(Text) # 转化为Json对象# print(jsonValue) # 打印Json值if('result' in jsonValue):print(jsonValue['result']['location']['lng'])return [jsonValue['result']['location']['lng'],jsonValue['result']['location']['lat']]else:return ' '# 通过这行的代码去调用的获取经纬度的 API 接口
address = df['city'].apply(calc_ll) # 这里的address是可以直接导入pandas的,详细的可以查看apply的返回值
se = requests.session()


执行calc_ll后返回的值如下所示:

showLocation&&showLocation({"status":0,"result":{"location":{"lng":120.98745249794995,"lat":31.390863425081866},"precise":0,"confidence":20,"comprehension":100,"level":"区县"}})


上述百强县执行代码后的结果:

{'status': 0, 'result': {'location': {'lng': 120.98745249794995, 'lat': 31.390863425081864}, 'precise': 0, 'confidence': 20, 'comprehension': 100, 'level': '区县'}}
120.98745249794995......
{'status': 0, 'result': {'location': {'lng': 120.26444564891948, 'lat': 33.78101359213001}, 'precise': 0, 'confidence': 20, 'comprehension': 100, 'level': '区县'}}
120.26444564891948
{'status': 0, 'result': {'location': {'lng': 117.74947848721935, 'lat': 36.8700322166973}, 'precise': 0, 'confidence': 20, 'comprehension': 100, 'level': '区县'}}
117.74947848721935
{'status': 0, 'result': {'location': {'lng': 109.12452136754654, 'lat': 21.481065838235963}, 'precise': 0, 'confidence': 20, 'comprehension': 100, 'level': '区县'}}
109.12452136754654
{'status': 0, 'result': {'location': {'lng': 118.48653672086745, 'lat': 36.690416508705376}, 'precise': 0, 'confidence': 20, 'comprehension': 100, 'level': '区县'}}
118.48653672086745

查看address的值:

address

0 [120.98745249794995, 31.390863425081864]
1 [120.29156800752115, 31.926044909769043]
2 [120.56155363871446, 31.88114053634028]
3 [118.55843052000408, 24.787824575144548]
4 [120.75949588665195, 31.65953827674108]...
95 [119.65440636047963, 27.094323508059915]
96 [120.26444564891948, 33.78101359213001]
97 [117.74947848721935, 36.8700322166973]
98 [109.12452136754654, 21.481065838235963]
99 [118.48653672086745, 36.690416508705376]
Name: city, Length: 100, dtype: object

df['pos'] = df1 # 保存到df文件中

user_geohashnumcitypos
094ek6ke1028昆山市[120.98745249794995, 31.390863425081864]
194ek6lj980江阴市[120.29156800752115, 31.926044909769043]
294ek6lw919张家港市[120.56155363871446, 31.88114053634028]
394ek6kn908晋江市[118.55843052000408, 24.787824575144548]
494ek6l5517常熟市[120.75949588665195, 31.65953827674108]
...............
959q0ltaw243福安市[119.65440636047963, 27.094323508059915]
9699s4avh242射阳县[120.26444564891948, 33.78101359213001]
979519pwt240邹平县[117.74947848721935, 36.8700322166973]
9894jrlp3240海城市[109.12452136754654, 21.481065838235963]
99946hodd240青州市[118.48653672086745, 36.690416508705376]

100 rows × 4 columns


二、通过经纬度计算两地之间的距离

在得到相关地名的经纬度之后,进一步就可以根据经纬度计算两点之间的距离,输入的是度数(°)


根据经纬度计算实际距离的代码:

import math
Earth_Radius=6378.137
def sin_square(a):result=math.sin(a)return result*result
def rad(ang):return math.pi*ang/180.0
#a,b参数是数组
def distance_calculate(a,b):lata,lnga=a[0],a[1]latb,lngb=b[0],b[1]radlata,radlnga=rad(lata),rad(lnga)radlatb, radlngb = rad(latb), rad(lngb)#纬度差minus_a=radlata-radlatb#经度差minus_b=radlnga-radlngbreturn 2*math.asin( math.sqrt(sin_square(minus_a/2) + math.cos(radlata)*math.cos(radlatb)*sin_square(minus_b/2)))*Earth_Radius#坐标测试
#google
print(1000*distance_calculate((30.26848247,119.9499548338),(30.2688658749,119.9628533571)))
#baidu
print(1000*distance_calculate((30.274671,119.969392),(30.274261,119.956631)))


推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
author-avatar
用户d4k2wd8en1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有