對於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