python识别图片内容并获取两个地点间的距离

需求

想找一下龙岗区民办小学学校与家里的距离,我目前住宝安区,对那边不熟悉,在升学本地宝上了解到龙岗区有80所小学,但是资料是一张图片。其实后来我又找到了可复制的学校列表,但是作为一个老年萌新程序员。80个地址一个个去地图上搜索与家的距离,我内心是拒绝的!虽然菜但好歹是猿。
我不是python猿,但我听说python很强大。所以一直想学习一下。
正好拿来练练手。
人类科技的驱动力就是懒!

环境搭建就不赘述了,网上海量帖子一堆。我是windows环境,核心内容就是下载python.exe安装->配置环境变量。

语言入门添加链接描述
计算机语言入门

  • 基本语法,来个hello world
  • 变量
  • 运算符
  • 流程语句if,for,while,通用的,就是语法不一样
  • 数据类型,字符串,数字,列表
  • 函数,定义函数,函数调用,一门语言一开始都是面向过程的嘛~

以上看一遍,像我就带着demo的任务来的。不会的看下文档。如果不带着目标学的话,一是知识点太多,二是容易打击你的积极性

整理思路
  • 获取两个地点间的距离,这个好办,调用地图的api,其他web语言也可以做到。easy!
  • 这篇文章有意思的是,读取图片的内容,嗯~,不得不感叹python的扩展强大。只要pip,啥都有。
两个地点间的距离

1,先实现获取两点的距离,直接贴源码,封装了一个方法,你看,这就学到了函数的定义及调用。
这个就是调api。没啥!

#计算地址经纬度
import requests
from math import radians, cos, sin, asin, sqrt

def geocode(address,address2):
 #高德地图api获取地址坐标,这个里面的key是高德地图开发平台获取,每天有访问限制的。注意,最好自己去注册获取
 parameters = {'address': address, 'key': '72140df0945c4f78c66a50a7685572a3'}
 base = 'http://restapi.amap.com/v3/geocode/geo'
 response = requests.get(base, parameters)
 answer = response.json()
 lon1 = float(answer['geocodes'][0]['location'].split(',')[0])
 lat1 = float(answer['geocodes'][0]['location'].split(',')[1])

 parameters2 = {'address': address2, 'key': '72140df0945c4f78c66a50a7685572a3'}
 response2 = requests.get(base, parameters2)
 answer2 = response2.json()
 lon2 = float(answer2['geocodes'][0]['location'].split(',')[0])
 lat2 = float(answer2['geocodes'][0]['location'].split(',')[1])

 # 将十进制度数转化为弧度
 lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
 # haversine公式
 dlon = lon2 - lon1
 dlat = lat2 - lat1
 a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
 c = 2 * asin(sqrt(a))
 r = 6371  # 地球平均半径,单位为公里
 return (c * r)
 #测试
 print(geocode('深圳市龙岗区龙岗街道新生社区水岸新都','深圳市龙岗区龙城街道欣景路110号'))
识别图片内容并调用方法

2,识别图片内容,调用map_rang.py里的geocode方法,直接贴源码。注释都写了,作为一个小学生,注释是必须要有的。
图片识别阶段,遇到很多问题。但是他强任他强,孔子避其锋芒!

import cv2
import numpy as np
import pytesseract as pt
import matplotlib.pyplot as plt
import map_range

#识别图片内容

img = cv2.imread(r'2.png',-1)
#黑白化图片,识别更精准
ret,img2 = cv2.threshold(np.array(img), 200, 255, cv2.THRESH_BINARY)
plt.imshow(img2, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([])
#显示图片
plt.show()
#识别图片文字,chi_sim是语言包,识别中文要下载并放到相应的目录
text2 = pt.image_to_string(img2, lang="chi_sim")
#列表
text2_list = text2.split("\n")

#去掉空成员
del_step = 0
while del_step < len(text2_list):
    if(text2_list[del_step] == ''):
        del text2_list[del_step]
    del_step = del_step + 1


#循环取距离
text_len = len(text2_list)
step  = 1
while step < text_len:
    step = step +1
    if (step%2 == 0):#取模
        #因为图片中的地址是换行的,一个地址两行,所以用2取模拼接。
        final_address = ("%s%s"%(text2_list[step-2],text2_list[step-1]))
        #识别的内容,每个字中间都有个空格,先空格分割成list
        final_address = final_address.split(" ")
        #再空格链接list成员,并替换'\'
        final_address = ''.join(final_address).replace('\\','')
        #调用函数获取距离
        fast = map_range.geocode('深圳市龙岗区龙岗街道新生社区水岸新都', final_address)
        print("%s%s%f"%(final_address,' 离家(公里):', fast))







结果:

请添加图片描述

验证

深圳市龙岗区龙城街道欣景路110号 离家(公里):3.673851
深圳市龙岗区平湖辅城坳岐岭村 离家(公里):18.073649
深圳市龙岗区模股街道六约牛始埃村 离家(公里):15.474865
深圳市龙围区龙岗街道南联村龙河路 离家(公里):3.203417
深圳市龙岗区横岗街道六约麻地街33号 离家(公里):15.760627
深圳市龙岗区龙城街道盛平中路12号 离家(公里):2.852333
深圳市龙岗区横岗街道六约填坑村 离家(公里):14.530893
深圳市龙岗区龙城街道新丰路107号 离家(公里):7.826566
深圳市龙岗区坪地街道坪西告祥一路67号 离家(公里):4.608898
深圳市龙岗区龙岗街道南联根物园路320号 离家(公里):4.037268
深圳市龙岗区平湖街道平龙西路100号 离家(公里):18.027805

高德地图验证,误差在1~2公里。还是具有参考价值的。哈哈

原图

我只是识别了其中部分内容,因为地址有的是一行,有的是两行。识别出来很乱,我懒得跟它较真,打消我的积极性。哈哈
原图给你门,你也可以试试!
请添加图片描述

得瑟

这一套下来,你对这门语言,又属性了三分了吧。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值