将MySQL中POINT类型SQL数据转换为Python可识别格式的方法
解决MySQL POINT类型数据转Python可处理格式的问题
嘿,我来帮你搞定这个POINT类型数据转换的事儿!你现在拿到的二进制字节串是MySQL存储POINT类型用的WKB(Well-Known Binary)格式,下面给你几个实用的解决办法:
方法1:在SQL查询时直接转换为可读格式
这是最省心的方式,直接让MySQL把POINT转换成文本或者GeoJSON格式,Python拿到就能直接用。
修改你的查询语句,用ST_AsText()函数:
k = db.cursor() # 用ST_AsText把POINT转成字符串格式 k.execute("SELECT ST_AsText(location) FROM api_server.Measurement WHERE userid = 18") rows = k.fetchall() # 输出会是类似 'POINT(116.397428 39.90923)' 的字符串 print(rows[0][0])
如果需要GeoJSON格式,可以用ST_AsGeoJSON():
k.execute("SELECT ST_AsGeoJSON(location) FROM api_server.Measurement WHERE userid = 18") rows = k.fetchall() # 输出是类似 '{"type": "Point", "coordinates": [116.397428, 39.90923]}' 的JSON字符串 import json point_json = json.loads(rows[0][0]) print(point_json['coordinates']) # 直接拿到坐标列表
方法2:用Python库解析WKB二进制数据
如果已经拿到了二进制数据(就是你现在输出的b'\x00\x00...'),可以用专门的GIS库来解析,比如shapely:
- 先安装库:
pip install shapely
- 然后解析二进制数据:
from shapely import wkb k = db.cursor() k.execute("SELECT location FROM api_server.Measurement WHERE userid = 18") rows = k.fetchall() # 解析WKB数据 point = wkb.loads(rows[0][0]) # 直接获取坐标 print(f"经度:{point.x},纬度:{point.y}")
方法3:手动解析WKB格式(无需额外库)
如果你不想装第三方库,也可以手动解析WKB的结构。MySQL的POINT类型WKB格式规则是:
- 第1字节:字节序(1=小端,0=大端)
- 第2-5字节:类型ID(POINT对应1)
- 第6-13字节:X坐标(双精度浮点数)
- 第14-21字节:Y坐标(双精度浮点数)
用struct模块来解析:
import struct k = db.cursor() k.execute("SELECT location FROM api_server.Measurement WHERE userid = 18") rows = k.fetchall() binary_data = rows[0][0] byte_order = binary_data[0] if byte_order == 1: # 小端序解析 type_id = struct.unpack('<I', binary_data[1:5])[0] x = struct.unpack('<d', binary_data[5:13])[0] y = struct.unpack('<d', binary_data[13:21])[0] else: # 大端序解析 type_id = struct.unpack('>I', binary_data[1:5])[0] x = struct.unpack('>d', binary_data[5:13])[0] y = struct.unpack('>d', binary_data[13:21])[0] print(f"坐标:({x}, {y})")
个人推荐方法1或者方法2,简单又不容易出错~
内容的提问来源于stack exchange,提问作者Jipolie01
相关产品推荐
相关产品推荐

