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

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

一、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-radlngb

    return 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)))
  • 7
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Python通过访问互联网上的IP地址数据库或使用专门的API来获取经度和纬度。其中,IP地址是通过解析数据包获取的。在Python中,可使用多种库和模块来实现IP地址解析、经纬度获取等相关功能,例如: 1. requests和json库 使用requests库可以直接发送HTTP请求获取响应内容,而json库则可以解析JSON格式的响应数据。具体示例代码如下: import requests import json # 定义API接口和IP地址 api_url = "http://ip-api.com/json/" ip_address = "8.8.8.8" # 发送HTTP请求并解析响应数据 api_response = requests.get(api_url + ip_address).json() latitude = api_response["lat"] longitude = api_response["lon"] print("经度:", latitude) print("纬度:", longitude) 2. geopy库 geopy是一款常用于地理编码、地理距离计算等应用的Python库。它内置了多种地理位置API服务接口,可根据IP地址地址、地等参数获取位置信息。具体使用方法如下: from geopy import geocoders from geopy.exc import GeocoderTimedOut # 定义IP地址和地理编码服务接口 ip_address = "8.8.8.8" geo_locator = geocoders.GoogleV3() # 根据IP地址获取位置信息 try: location = geo_locator.geocode(ip_address, timeout=10) latitude = location.latitude longitude = location.longitude print("经度:", latitude) print("纬度:", longitude) except GeocoderTimedOut: print("请求超时,请重试!") 以上两种方法都可以实现通过IP地址获取经纬度的功能,具体选择哪种方法可以根据实际需求和使用条件决定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值