从 SQL 类型的地理列中绘制多边形 Python

Plotting polygons from SQL type geo column in Python

我有一个包含地理列的 table 的 Sqlite 数据库。当我将 table 作为图层添加到 QGIS 中时,它显示了一张带有多边形的芝加哥地图,如下所示。我认为,多边形点存储在名为 geo.

的列中

我正在尝试在 Python 中绘制相同的内容,以便能够使用 Matplotlib 在此布局之上添加更多内容。首先,我可以使用以下(我写的)在 Python 中加载名为“Zone”的 table:

import sqlite3  # Package for SQLite
### BEGIN DEFINING A READER FUNCTION ###
def Conditional_Sqdb_reader(Sqdb,Tablename,Columns,Condition):
    conn = sqlite3.connect(Sqdb) # Connects the file to Python
    print("\nConnected to %s.\n"%(Sqdb))
    conn.execute('pragma foreign_keys = off') # Allows making changes into the SQLite file
    print("SQLite Foreign_keys are unlocked...\n")
    c = conn.cursor() # Assigns c as the cursor
    print("Importing columns: %s \nin table %s from %s.\n"%(Columns,Tablename,Sqdb))
    c.execute('''SELECT {columns} 
                 FROM {table}
                 {condition}'''.format(table=Tablename,
                                       columns=Columns,
                                      condition=Condition)) # Selects the table to read/fetch
    Sql_headers = [description[0] for description in c.description]
    Sql_columns = c.fetchall() # Reads the table and saves into the memory as Sql_rows
    print("Importing completed...\n")
    conn.commit() # Commits all the changes made
    conn.execute('pragma foreign_keys = on') # Locks the SQLite file
    print("SQLite Foreign_keys are locked...\n")
    conn.close() # Closes the SQLite file
    print("Disconnected from %s.\n"%(Sqdb))
    return Sql_headers,Sql_columns
### END DEFINING A READER FUNCTION ###

Sqdb = '/mypath/myfile.sqlite'
Tablename = "Zone" # Change this with your desired table to play with
Columns = """*""" # Changes this with your desired columns to import
Condition = ''    # Add your condition and leave blank if no condition

headings,data = Conditional_Sqdb_reader(Sqdb,Tablename,Columns,Condition)

table上的数据以列表的形式存储在“data”中。所以,data[0][-1] 产生第一行多边形的地理,看起来像: b'\x00\x01$i\x00\x00@\xd9\x94\x8b\xd6<\x1bAb\xda7\xb6]\xb1QA\xf0\xf7\x8b\x19UC\x1bA\x9c\xde\xc5\r\xc3\xb1QA|\x03\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00Hlw\xef-C\x1bA\x9c\xde\xc5\r\xc3\xb1QA\xf0\xf7\x8b\x19UC\x1bAv\xc0u)^\xb1QA\xbcw\xd4\x88\xf1<\x1bAb\xda7\xb6]\xb1QA\xa5\xdc}n\xd7<\x1bA\x84.\xe1r\xbe\xb1QA@\xd9\x94\x8b\xd6<\x1bA\xce\x8eT\xef\xc1\xb1QAHlw\xef-C\x1bA\x9c\xde\xc5\r\xc3\xb1QA\xfe' 我不知道如何解码它并转换成一系列有意义的点,但就是这样是和 QGIS 显然可以毫不费力地做到这一点。我怎样才能在 Python 中绘制所有这些多边形,同时能够稍后在 Matplotlib 世界中添加其他东西?

在花了好几个小时学习了很多东西之后,我找到了解决方案。基本上,在 sqlite3 中使用 mod_spatialite 是每个 here 的关键。当我嵌入这个包时,它允许我使用诸如 ST_As_Text 之类的空间函数,它将 sql 二进制字符串转换为以 POLYGON((.... 开头的字符串,这是一种 geopanda 类型的条目。有很多资源可以解释我们如何绘制此类数据。本质上,这是我的代码(将其与我的问题中的代码进行比较):

import sqlite3  # Package for SQLite
### BEGIN DEFINING A READER FUNCTION ###
def Conditional_Sqdb_reader(Sqdb,Tablename,Columns,Condition):
    conn = sqlite3.connect(Sqdb) # Connects the file to Python
    conn.enable_load_extension(True)
    #mod_spatialite (recommended)
    conn.execute('SELECT load_extension("mod_spatialite.so")')   
    conn.execute('SELECT InitSpatialMetaData(1);')  
    print("\nConnected to %s.\n"%(Sqdb))
    conn.execute('pragma foreign_keys = off') # Allows making changes into the SQLite file
    print("SQLite Foreign_keys are unlocked...\n")
    c = conn.cursor() # Assigns c as the cursor
    print("Importing columns: %s \nin table %s from %s.\n"%(Columns,Tablename,Sqdb))
    c.execute('''SELECT {columns} 
                 FROM {table}
                 {condition}'''.format(table=Tablename,
                                       columns=Columns,
                                      condition=Condition)) # Selects the table to read/fetch
    Sql_headers = [description[0] for description in c.description]
    Sql_columns = c.fetchall() # Reads the table and saves into the memory as Sql_rows
    print("Importing completed...\n")
    conn.commit() # Commits all the changes made
    conn.execute('pragma foreign_keys = on') # Locks the SQLite file
    print("SQLite Foreign_keys are locked...\n")
    conn.close() # Closes the SQLite file
    print("Disconnected from %s.\n"%(Sqdb))
    return Sql_headers,Sql_columns
### END DEFINING A READER FUNCTION ###

Sqdb = '/Users/tanercokyasar/Desktop/Qgis/chicago2018-Supply.sqlite'
Tablename = "Zone" # Change this with your desired table to play with
Columns = """*,
             ST_AsText(GEO) as GEO""" # Changes this with your desired columns to import
Condition = ''    # Add your condition and leave blank if no condition

headings,data = Conditional_Sqdb_reader(Sqdb,Tablename,Columns,Condition)