将mysql多边形上传并获取到python

ccrfmcuu  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(341)

我必须在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>

我得到一个点而不是一个多边形。有什么问题吗?

t9aqgxwy

t9aqgxwy1#

在不使用任何几何格式转换函数的情况下,您选择的是mysql使用的内部几何格式。为什么你会得到一个 Point 多边形的内部格式以以下开头:

b'\x00\x00\x00\x00\x01\x03\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00...'

解释为wkb是: 00 :大端 00 00 00 01 :点(2d) 03 00 00 00 02 00 00 00 :x坐标 05 00 00 00 00 00 00 00 :y坐标
解决方案是在查询中使用适当的转换函数:

df = pd.read_sql("""
    SELECT ST_AsWKB(polygon) AS polygon
    FROM geom
    WHERE id = 111;""", my_engine)

相关问题