将MySQL多边形上传并获取到Python
我必须在MySQL数据库中存储一些多边形。 我使用MySQL手册中的查询将多边形插入数据库将MySQL多边形上传并获取到Python,python,mysql,sqlalchemy,shapely,Python,Mysql,Sqlalchemy,Shapely,我必须在MySQL数据库中存储一些多边形。 我使用MySQL手册中的查询将多边形插入数据库 SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))'; INSERT INTO geom VALUES (111, ST_GeomFromText(@g)); 表的列是id和polygon,后一列的类型是polygon,但是如果设置为GEOMETRY,我会遇到同样的问题。 然后我使用sqlalchemy从数据库中获取多边
SET @g = 'POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))';
INSERT INTO geom VALUES (111, ST_GeomFromText(@g));
表的列是id和polygon,后一列的类型是polygon,但是如果设置为GEOMETRY,我会遇到同样的问题。
然后我使用sqlalchemy从数据库中获取多边形,结果将是字节。
所以我试着把它转换成匀称的形状
from shapely import wkb
from sqlalchemy import create_engine
import pandas as pd
my_engine = ... # sqlalchemy engine connecting to the database
df = pd.readsql('SELECT polygon FROM geom WHERE id = 111;', my_engine)
p = df.polygon[0]
wkb.loads(p)
>>> <shapely.geometry.point.Point at 0x7f1896b01b38>
我得到的是一个点,不是多边形。可能会出现什么问题?如果不使用任何选项,您将选择MySQL使用的内部几何体格式。获得点的原因是多边形的这种内部格式从以下内容开始:
b'\x00\x00\x00\x00\x01\x03\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00...'
解释为:
00:Big endian
00 01:点2D
03 00 02 00 00:X坐标
05 00:Y坐标
解决方案是在查询中使用合适的转换函数:
df = pd.read_sql("""
SELECT ST_AsWKB(polygon) AS polygon
FROM geom
WHERE id = 111;""", my_engine)