一、上传地理位置数据的文件并将文件中的数据存入数据库中

(1)数据文件内容

包括省份、所在市区县、具体位置名称

python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_dubbo

(2)文件上传并存入数据库

先在数据库中建表,如下所示:

python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_dubbo_02


注意设置主键Id和自增标识:

python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_dubbo_03


撰写文件上传代码,其中里面有很多注意事项,比如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用户名

python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_dubbo_04

(3)保存在数据库中的结果

python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_上传_05

二、请求百度地图中地理编码Api接口,获取请求地区对应的位置坐标数据并将数据存入sql server数据库

(1)首先打开百度地图开发平台网址,进行注册登录(为后面获取请请求参数AK做准备):https://lbs.baidu.com/faq/api?title=webapi/guide/webservice-geocoding-base,再点击地理编码,如下图所示:

python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_dubbo_06


这里面包括了请求api接口说明,使用说明,请求参数,示例代码等详细说明,如下所示:

python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_上传_07


大家需要参考说明进行数据请求,下面是我实现的代码:

这是我建立的表来保存请求获得的数据:

python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_dubbo_08

#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)保存在数据库中的结果

python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_数据库_09

三、获取的坐标数据在百度地图中的拾取坐标系统进行验证

url地址:https://api.map.baidu.com/lbsapi/getpoint/index.html

对浙江省人民医院坐标位置进行反查验证:

python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_数据库_10


python dxf 解析 LWPOLYLINE顶点坐标 python获取坐标_python_11


发现反查的结果和数据是一致,说明数据信息是正确的!

大家可以参考代码,我会将代码资源上传,大家可以进行下载,里面还有一些其它代码!