将 MySQL 个多边形上传并提取到 Python
Upload and fetch MySQL polygons to Python
我必须在 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));
table的列是id
和polygon
,后一列的类型是POLYGON
,但是如果设置了我也有同样的问题至 GEOMETRY
。
然后我从数据库中获取多边形(使用 sqlalchemy),结果将是字节。
所以我尝试将其转换为 Shapely
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>
我得到的是点而不是多边形。可能是什么问题?
在不使用任何 geometry format conversion functions 的情况下,您选择的是 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
:点(二维)
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)
我必须在 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));
table的列是id
和polygon
,后一列的类型是POLYGON
,但是如果设置了我也有同样的问题至 GEOMETRY
。
然后我从数据库中获取多边形(使用 sqlalchemy),结果将是字节。
所以我尝试将其转换为 Shapely
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>
我得到的是点而不是多边形。可能是什么问题?
在不使用任何 geometry format conversion functions 的情况下,您选择的是 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
:点(二维)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)