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

标签 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));

表格的列是idpolygon,后一列的类型是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:横坐标
  • 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)

关于python - 将 MySQL 多边形上传并获取到 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51346083/

相关文章:

PHP-更新表时出错

mysql - 防止 CakePHP3 全文索引匹配中的 SQL 注入(inject)

python - Pandas /sqlalchemy/pyodbc : Result object does not return rows from stored proc when UPDATE statement appears before SELECT

Python Eve、SQLalchemy 和 ForeignKey

python - opencv python比c++快吗?

python - bottle_mysql 编码失败

php - 为什么我的日期没有显示在此图表上(drupal、php、mysql)?

python - SQLAlchemy:排除从查询的子查询中获取的行

Python lxml XPath : preceding keyword does not give expected result

python - 如何合并数据框和填充值