Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将MySQL多边形上传并获取到Python_Python_Mysql_Sqlalchemy_Shapely - Fatal编程技术网

将MySQL多边形上传并获取到Python

将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从数据库中获取多边

我必须在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从数据库中获取多边形,结果将是字节。 所以我试着把它转换成匀称的形状

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)