热门标签 | 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)))


推荐阅读
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • Eclipse安装教程:解决Genymotion配置中的疑难杂症
    Eclipse安装教程:解决Genymotion配置中的疑难杂症 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
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社区 版权所有