Pandas從MySQL中讀取POINT空間數據

對於POINT類型的空間數據, 直接從MySQL中讀取,可以直接使用以下的
SQL語句

select * from 表名

使用Python中的pymysql讀取POINT數據, 見我的另一篇博客MySQL對空間座標數據(GEOMETRY字段)的讀寫

使用Pandas執行上述語句, 讀取POINT數據也是一樣的問題,查詢結果會顯示爲二進制
我的解決方案:
不使用*, 改爲讀取所有字段名稱, 並對POINT類型的空間數據字段COORDINATE, 進行ST_ASTEXT(COORDINATE) as COORDINATE 的操作,這樣讀取的POINT數據,正常顯示爲字符串
代碼如下:
TODO: 注意列表推導式, 寫死了if判斷字段名稱COORDINATE

import pandas as pd

from sqlalchemy import create_engine

# 從自定義的constant py文件中導入數據庫連接的IP 端口 賬號 密碼 數據庫名
from constant import DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_NAME

# 創建引擎
engine = create_engine(f"mysql+pymysql://{DB_USERNAME}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}")

def sql2df(table):
    """
    sql查詢結果 轉成dataframe
    :param table: 表名
    :return: df
    """
    # 查詢數據表所有列名
    cols_sql = f"""SELECT column_name FROM information_schema.`COLUMNS` WHERE TABLE_NAME='{table}'"""
    cols_df = pd.read_sql(cols_sql, engine)  # type: pandas.core.series.Series
    # 對POINT類型空間數據字段, 設計時字段名稱帶有COORDINATE
    # 對於POINT類型 需要加上 ST_ASTEXT(COORDINATE) 轉成字符串顯示 否則會顯示二進制
    cols = ", ".join([f"ST_ASTEXT({i}) as {i}" if "COORDINATE" in i else i for i in list(cols_df.column_name.values)])
    sql = f"""select {cols} from {table}"""
    df = pd.read_sql(sql, engine)
    return df
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章