起因

最近做规划项目,领导让查出某几个市的所有乡镇级行政区域,距离所在县级行政中心的交通运输距离。想着也不是啥难事儿,高德地图一搜就有。

当我把各市行政区划统计完,发现一共有五百多个乡镇,意味着要在地图上搜索五百多次,立马脑仁疼。

于是我把任务分工给了其他同事,几个人同时查,能快点。

看看,思维就是这么僵化,没有立刻意识到重复劳动也许可以借助计算机来自动完成。

边查数据边想,以后还会有此类任务,到时候没同事帮忙可咋办,虽然不费脑力,却消耗大量时间。忽然意识到,我会基本的 Python 啊,搜搜网上有没有自动查距离的教程。

果然搜到一篇文章,《Python 批量获取高德地图地理信息数据》。然后参考博主的代码,写了一个自动从高德地图获取地理经纬度和运输距离的 Python 脚本,配合 xlxs 格式文件使用,可批量查找数据并存储进 xlxs 格式文件。

准备工作

1. 获取高德开放平台的应用密钥

在 高德开放平台 上注册一个帐号,然后创建一个 web 服务类型的应用,再给该应用添加一个密钥 key,记住这个 key。

2. 处理 workbook.xlsx 文件

创建一个 xlsx 格式文件,命名为 workbook。将需要查询的地名放进 workbook.xlsx 的 Sheet1 工作表中,Python 脚本自动获取的经纬度和运输距离将写入 Sheet2 工作表中。因此该文件中需已存在 Sheet1 和 Sheet2 两个工作表。

Sheet1 中按下图格式填写地名。每个县级行政区域内的地名放置一列,第一行为该县级行政区域名称,第二行及之后为其下乡镇级行政区域名称。写入的地名必须全部属于一个地级市。如果要获取多个市的数据,只能先写入一个市,运行完脚本后,再对另一个市重复操作。

image

3. 安装 Python 环境和 openpyxl 库

安装 Python 环境不表。

利用 Python 的 openpyxl 库从 xlsx 格式文件中读写数据,因此先安装此库。

pip install openpyxl

4. 创建 Python 脚本

新建一个 py 脚本文件,名称随意,如 workscript.py,用文本编辑器打开,将以下代码复制进去保存。该脚本文件应与 workbook.xlsx 在同一目录中。

# 对 Sheet1 中多列数据求值,并将结果输出为 Sheet2 中一列

import urllib.request # 发送请求

from urllib import parse # URL 编码

import json # 解析 json 数据

from openpyxl import load_workbook # 从 Excel 中读取乡镇名称

def city_location(localname, somewhere, thekey):

url1 = (

'http://restapi.amap.com/v3/place/text?keywords=' + localname +

'&city=' + somewhere +

'&citylimit=true&output=json&offset=1&page=1&key=' + thekey

)

# 将一些符号进行 URL 编码

newUrl1 = parse.quote(url1, safe="/:=&?#+!$,;'@()*[]")

# 发送请求

response1 = urllib.request.urlopen(newUrl1)

# 读取数据

data1 = response1.read()

# 解析 json 数据

jsonData1 = json.loads(data1)

# 从 json 文件中提取座标

try:

a = jsonData1['pois'][0]['location']

except:

return '查询不到坐标'

else:

return a

def road_long(origin, destination, thekey):

url2 = (

'https://restapi.amap.com/v3/direction/driving?origin=' + origin +

'&destination=' + destination +

'&extensions=all&strategy=1&output=json&key=' + thekey

)

# 将一些符号进行 URL 编码

newUrl2 = parse.quote(url2, safe="/:=&?#+!$,;'@()*[]")

# 发送请求

response2 = urllib.request.urlopen(newUrl2)

# 接收数据

data2 = response2.read()

# 解析 json 文件

jsonData2 = json.loads(data2)

# 从 json 文件中提取距离

try:

a = jsonData2['route']['paths'][0]['distance']

except:

return '查询不到距离'

else:

return a

somewhere = input('地点所在地级市名称:')

thekey = input('高德开放平台密钥:')

book = load_workbook('workbook.xlsx')

nameSheet = book["Sheet1"]

locationsheet = book['Sheet2']

tol = 0

for index1 in range(ord('A'), ord('A')+nameSheet.max_column):

index1 = chr(index1)

nameList = []

for row in range(1, nameSheet.max_row+1):

nameList.append(nameSheet[index1+str(row)].value)

nameList = [x for x in nameList if x is not None] # 删除空字符

print(nameList)

dict1 = {} # 创建一个字典用于接收坐标数据

dict2 = {} # 创建一个字典用于接收距离数据

for cityname in nameList:

dict1[cityname] = city_location(cityname, somewhere, thekey)

for cityname in nameList[1::]:

if dict1[cityname] == '查询不到坐标':

dict2[cityname] = '此地查询不到坐标值'

else:

dict2[cityname] = road_long(

dict1[cityname], dict1[nameSheet[index1+'1'].value], thekey

)

dict2[nameSheet[index1+'1'].value] = '行政中心'

print(dict1)

print(dict2)

list1 = []

for cityname in nameList:

list2 = [cityname, dict1[cityname], dict2[cityname]]

list1.append(list2)

print(list1)

for row in range(len(nameList)):

(

locationsheet['A%d' % (row+1+tol)],

locationsheet['B%d' % (row+1+tol)],

locationsheet['C%d' % (row+1+tol)]

) = list1[row]

tol += len(nameList)

book.save('workbook.xlsx')

运行脚本获取数据

使用终端在脚本目录下运行该脚本。会提示输入「地点所在地级市名称」和「高德开放平台密钥」。为避免全国范围内地名重复导致查询距离偏差,脚本将查询范围约束到乡镇所在的地级市,因此需要输入「地点所在地级市名称」。「高德开放平台密钥」则为之前创建的高德平台 web 服务应用 key。

输入完毕后,脚本开始从 workbook.xlsx 文件中读取地名,然后自动发送至高德地图查找经纬度和运输距离,再将数据保存到 workbook.xlsx 文件中。正常运行下,终端中也会显示获取到的数据。

待脚本运行完,打开 workbook.xlsx,所需要查找的运输距离就在工作表 Sheet2 中。如下图所示,第一列为地名,第二列为经纬度,第三列为该乡镇到所在县级行政中心的运输距离。如果是县名,第三列则标注「行政中心」。

image

说明

高德地图查询两个地点之间的运输距离,需要提交两个地点的经纬度,因此脚本先从高德地图获取各个地点的经纬度,顺便保存在 Sheet2 中。

高德地图查询两个地点之间的运输距离,驾车路径规划有「距离有线」、「速度有线」、「费用优先」等策略,该脚本选择的是「费用优先」,即不走收费路段,且耗时最少的路线。

所查询距离单位为米。

一个高德开放平台 key,一天只能查询 2000 次经纬度,2000 次驾驶距离。所以如果查询地点超过 2000 个,要么多创建几个 key,要么等第二天再查。

欢迎关注微信公众号:[桃源乡吃桃](kktaoyuanxiang)

python经纬度获取县名_利用 Python 批量获取县镇运输距离相关推荐

  1. pyqt5如何循环遍历控件名_利用Python的PyQt5编写GUI界面教学,QT5还是比较难的

    由于学校课程的项目,最近最近在学习如何利用Python语言和SQL Server编写一个读者图书借阅.查询管理的小程序.以此为契机吧,自己便开始了学习之路~ 这篇文章主要介绍自己如何使用PyQt5编写 ...

  2. python自动保存ping结果_利用python获取Ping结果示例代码

    前言 本文主要跟大家分享了关于利用python获取Ping结果的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧. 示例代码: # -*- coding: utf-8 -*- i ...

  3. python获取计算机配置_利用python写一段读取电脑配置信息的程序

    展开全部 主要利用python的wmi模块,提供非常多的信息.import wmi def sys_version(): c = wmi.WMI() # 操作系统版本,版本号,32位/64位 prin ...

  4. 利用python从网页查找数据_利用Python模拟淘宝的搜索过程并对数据进行可视化分析...

    数据挖掘入门与实战 公众号: datadw 本文讲述如何利用Python模拟淘宝的搜索过程并对搜索结果进行初步的数据可视化分析. 搜索过程的模拟:淘宝的搜索页面有两种形式, 一种形式是, 2019/2 ...

  5. python beautifulsoup抓取网页内容_利用Python和Beautiful Soup抓取网页内容

    利用Python和Beautiful Soup抓取网页内容 Posted on 2012-08-09 00:08 SamWei 阅读(381) 评论(1) 编辑 收藏 Python 3中提供了url打 ...

  6. python用户输入列表有缺陷_利用Python对Jira缺陷进行管理操作

    转自:51testing 1.1.概要 本文主要内容是教大家学习如何利用Python对Jira缺陷进行管理操作. 在平时的测试中,大家对于缺陷管理平台一定不陌生,平时的缺陷都要去平台进行操作.今天我们 ...

  7. 钉钉python 自动发消息软件_利用Python自动发送钉钉数据消息,一个简单的上手小项目...

    现在大部分公司都使用钉钉作为内部的主要沟通工具,钉钉消息基本都上都能快速有效的被阅读,打开率会比邮件高上不少.所以准备使用钉钉来播报平台每日的成交额,并附上一些鼓励的话和图片.起到一个激励团队的作用 ...

  8. python实现冒泡排序完整算法_利用python实现冒泡排序算法实例代码

    利用python实现冒泡排序算法实例代码 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数 ...

  9. python怎么去掉视频字幕_利用Python实现字幕挂载(把字幕文件与视频合并)思路详解...

    其实超简单超简单!python好现成的库,一下子省略了好多步骤! 本文在Windows环境下!linux只是不需要手动输入imagicmagick的位置! 需要用到的环境 python(基本上只要不是 ...

最新文章

  1. HDD工作原理 导图
  2. 直播 | ACL 2021论文解读:表征与结构兼备,结构化语言模型R2D2
  3. 浅谈javascript数值类型转换
  4. [Swift]LeetCode478. 在圆内随机生成点 | Generate Random Point in a Circle
  5. Java-编程规范与代码风格
  6. 机器学习中用到的概率知识_机器学习导论(附录)–概率论知识
  7. (转载)用C#实现MySQL建库及建表
  8. NSight统计数据的颜色,缩写意义是什么?来自NV Jeff Kiel 比较官方的解释!
  9. 宇视云所有故障排查思维导图
  10. 区块链获得获得华尔街的胜利:“现在我们知道它有用了”
  11. 微信群控系统源码,微信云控系统源码的升级版,一部手机操作100个微信号的核心源码实现,核心技术架构
  12. 5G时代下的人工智能发展
  13. 用树莓派都可以DIY“波士顿机器狗”!
  14. 集体照的拍摄与后期合成处理
  15. PHP 门面设计模式在laravel中的应用
  16. uniapp打包成h5页面
  17. 机器学习实战(八)——预测数值型数据:回归
  18. CPU卡程序设计实例(十三)终端向ESAM发送数据
  19. Python学习笔记:7.5.7 Django快速建站 - Web开发实战 微信公众号开发2
  20. 正大国际期货:投资外盘期货如何用布林线判断走势?

热门文章

  1. python如何并发上千个get_Python拓展21(python3X之百万并发借鉴)
  2. 计算机开机后黑屏 只有鼠标,开机黑屏只有鼠标
  3. Zookeeper(二)——安装
  4. 处理多维特征的输出(糖尿病数据)
  5. 数据科学入门与实战:Matplotlib绘图基础一
  6. linux定时器跑命令,linux下运行定时器(cron/centos/js脚本)
  7. linux 1060显卡,Steam最受欢迎显卡型号出炉:GTX 1060显卡的占有率依然排名第一
  8. uboot阶段flash分区_1.12.uboot的烧写和flash分区1
  9. 计算机关机键 自动重启,电脑按了关机键后电脑又自动重启了,怎么处理 啊
  10. it计算机知识竞赛主持稿,西安交大城市学院计算机系举办第四届“走进IT,触碰未来”计算机知识竞赛...