Source code for aequilibrae.project.data_loader
from os import PathLike
import pandas as pd
import shapely.wkb
from aequilibrae.utils.db_utils import commit_and_close
from aequilibrae.utils.spatialite_utils import connect_spatialite
[docs]
class DataLoader:
def __init__(self, path_to_file: PathLike, table_name: str):
self.__pth_file = path_to_file
self.table_name = table_name
[docs]
def load_table(self) -> pd.DataFrame:
with commit_and_close(connect_spatialite(self.__pth_file)) as conn:
fields, _, geo_field = self.__find_table_fields()
fields = [f'"{x}"' for x in fields]
if geo_field is not None:
fields.append('ST_AsBinary("geometry") geometry')
keys = ",".join(fields)
df = pd.read_sql_query(f"select {keys} from '{self.table_name}'", conn)
if geo_field is not None:
df.geometry = df.geometry.apply(shapely.wkb.loads)
return df
def __find_table_fields(self):
with commit_and_close(connect_spatialite(self.__pth_file)) as conn:
structure = conn.execute(f"pragma table_info({self.table_name})").fetchall()
geotypes = ["LINESTRING", "POINT", "POLYGON", "MULTIPOLYGON"]
fields = [x[1].lower() for x in structure]
geotype = geo_field = None
for x in structure:
if x[2].upper() in geotypes:
geotype = x[2]
geo_field = x[1]
break
if geo_field is not None:
fields = [x for x in fields if x != geo_field.lower()]
return fields, geotype, geo_field