一、上传地理位置数据的文件并将文件中的数据存入数据库中
(1)数据文件内容
包括省份、所在市区县、具体位置名称
(2)文件上传并存入数据库
先在数据库中建表,如下所示:
注意设置主键Id和自增标识:
撰写文件上传代码,其中里面有很多注意事项,比如python连接sql server 数据的方式、限制上传文件类型、文件大小、解决上传文件名冲突等:
## 上传文件和数据存入数据库中接口
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
if (file.filename.split('.')[1] not in ("xlsx", "xls")): #限制文件类型
raise HTTPException(status_code=400, detail="上传文件类型不符合xlsx、xls")
if (file.size > 40 * 1024 * 1024): #限制文件大小
raise HTTPException(status_code=400, detail="上传文件大小超过了限制(40M以内)")
path = 'XXXXXXXXXXXXX' #上传文件保存地址
fileList = os.listdir(path)#获取文件夹下面所有文件名称
for files in fileList:
if(files==file.filename): #判断上传文件名称是否与文件夹下面的文件名称冲突,如果冲突就重命名
# file.filename.split('.')[0]获取当前上传文件名称,strftime('%Y%m%d')获取当前时间的年月日秒,
# random.choice(string.ascii_letters)随机从a-z,A-Z中获取一个字母,file.filename.split('.')[1]为文件后缀名,然后组合成新的文件名
file.filename = file.filename.split('.')[0]+strftime('%Y%m%d-%S')+random.choice(string.ascii_letters)+'.'+file.filename.split('.')[1]
else:
continue
try:
file_path = path + file.filename
#上传文件
with open(file_path, "wb") as buffer:
while True:
chunk = await file.read(1024) # 以1024字节为单位读取文件块
if not chunk:
break
buffer.write(chunk)
# 连接数据库,将上传文件数据存入表中
connect = pymssql.connect(server='XXXX', user='XXXX', password='XXXX', database='XXXX')
# 创建游标对象
cursor = connect.cursor()
List1 = []
data1 = pd.read_excel(path+file.filename)
for i in range(len(data1)):
address = data1['省份'][i] + data1['地级市'][i] + data1['县/区'][i] + data1['医院名称'][i]
#去重处理
if(address not in List1):
List1.append(address)
# 插入数据
insert_query1 = "INSERT INTO HospitalInfo(BeginTime,Province,City,County,HospitalName,InsertTime) VALUES (%s, %s, %s,%s, %s, %s)"
insert_data1 = ('{}'.format(data1["开始时间"][i]),'{}'.format(data1["省份"][i]),'{}'.format(data1["地级市"][i]),'{}'.format(data1["县/区"][i]),
'{}'.format(data1["医院名称"][i]),'{}'.format(strftime('%Y-%m-%d %H:%M:%S')))
try:
cursor.execute(insert_query1,insert_data1)
cursor.execute(insert_query2,insert_data2)
except Exception as e:
print(e)
connect.rollback()
else:
continue
connect.commit()
cursor.close()
connect.close()
return "Success"
except Exception as e:
print(e)
在这个过程中使用到的一些方法简单说明:
Python获取当前日期和时间
from time import strftime
print(strftime('%Y-%m-%d %H:%M:%S'))
#2023-12-21 14:49:42
print(strftime('%Y/%m/%d %H:%M:%S'))
#2023/12/21 14:50:32
Python随机从a-z,A-Z中获取一个字母
import random
import string
s = string.ascii_lowercase #所有小写字母(a-z)
#s=string.ascii_letters #所有大小写字母(a-z,A-Z)
#s=string.ascii_uppercase #所有大写字母(A-Z)
r = random.choice(s)
split按’.'对字符串进行分割
str1="地理坐标位置.xlsx"
print(str1.split('.')[0],str1.split('.')[1])
获取某个路径下所有的文件名
import os
path = 'XXXX'
files = os.listdir(path)
for file in files:
print(file)
python连接sql server数据库
import pymssql
# 连接数据库
conn = pymssql.connect(server='XXXX', user='XXXX', password='XXXX', database='XXXX')
# 创建游标
cursor = conn.cursor()
# 执行查询语句
cursor.execute('SELECT * FROM <table_name>')
# 获取查询结果
result = cursor.fetchall()
# 遍历结果
for row in result:
print(row)
connect.commit()
# 关闭连接
cursor.close()
conn.close()
其中在插入数据的过程中报了一些错误,如:There are fewer columns in the INSERT statement than values specified in the VALUES clause 、229, b"The SELECT permission was denied on the object ‘HospitalZb’,这些都是数据库连接的用户username对表没有select和insert的权限,因此需要在数据库中执行以下命令:
GRANT select ON HospitalZb TO sx – select赋予的权限 HospitalZb表面 sx用户名
(3)保存在数据库中的结果
二、请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库
(1)首先打开百度地图开发平台网址,进行注册登录(为后面获取请请求参数AK做准备):https://lbs.baidu.com/faq/api?title=webapi/guide/webservice-geocoding-base,再点击地理编码,如下图所示:
这里面包括了请求api接口说明,使用说明,请求参数,示例代码等详细说明,如下所示:
大家需要参考说明进行数据请求,下面是我实现的代码:
这是我建立的表来保存请求获得的数据:
#url——Api请求地址:address查询的地区,AK用户申请注册的key
url = 'http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}&callback=showLocation'.format(address, AK)
#使用get请求获取数据
res = requests.get(url)
#利用re正则提取json里面的数据
results = json.loads(re.findall(r'\((.*?)\)', res.text)[0])
#将数据存入数据库中
insert_query2 = "INSERT INTO HospitalZb(Adress,Lng,Lat,InsertTime) VALUES (%s, %s, %s, %s)"
insert_data2 = (address, results['result']['location']["lng"], results['result']['location']["lat"],'{}'.format(strftime('%Y-%m-%d %H:%M:%S')))
try:
cursor.execute(insert_query1,insert_data1)
cursor.execute(insert_query2,insert_data2)
except Exception as e:
print(e)
connect.rollback()
connect.commit()
cursor.close()
connect.close()
(2)保存在数据库中的结果
三、获取的坐标数据在百度地图中的拾取坐标系统进行验证
url地址:https://api.map.baidu.com/lbsapi/getpoint/index.html
对浙江省人民医院坐标位置进行反查验证:
发现反查的结果和数据是一致,说明数据信息是正确的!
大家可以参考代码,我会将代码资源上传,大家可以进行下载,里面还有一些其它代码!