diff --git a/exposurejapan/database.py b/exposurejapan/database.py index 991e9cbfea62d6a240ad29cb4d4dcaa13041d66c..ca94d508ca06f0c70713a713923d6fcf5119cc0d 100644 --- a/exposurejapan/database.py +++ b/exposurejapan/database.py @@ -17,7 +17,7 @@ # along with this program. If not, see http://www.gnu.org/licenses/. import logging -import sqlite3 +from exposurelib.database import SpatialiteDatabase import pandas @@ -25,57 +25,7 @@ import pandas logger = logging.getLogger(__name__) -class Database: - """The Database class represents a Spatialite database. It manages the database - connection and cursor. Upon connection, the Spatialite extension is loaded. - - Args: - database_filepath (str): - File path for the Spatialite database file. - spatialite_filepath (str): - File path of the Spatialite extension. - - Attributes: - database_filepath (str): Spatialite database file path. - spatialite_filepath (str): File path to the Spatialite extension. - """ - - def __init__(self, database_filepath, spatialite_filepath="mod_spatialite"): - self.database_filepath = database_filepath - self.spatialite_filepath = spatialite_filepath - - self.connection = None - self.cursor = None - - def create_connection_and_cursor(self, init_spatial_metadata=True): - """Create a database connection, loads the Spatialite extension and initializes it. - - Attributes: - init_spatial_metadata (bool, optional): - If set, the InitSpatialMetadata function of Spatialite is invoked - """ - - # Create SQLite database for the exposure data - logger.debug("Connecting to database at %s" % self.database_filepath) - self.connection = sqlite3.connect(self.database_filepath) - logger.debug("Connection to database established") - - self.connection.enable_load_extension(True) - sql_statement = "SELECT load_extension('%s');" % self.spatialite_filepath - self.connection.execute(sql_statement) - if init_spatial_metadata: - self.connection.execute("SELECT InitSpatialMetaData(1);") - logger.debug("Spatialite extension loaded and initialized") - - versions = self.connection.execute("SELECT sqlite_version(), spatialite_version()") - for row in versions: - logger.debug("SQLite version: %s" % row[0]) - logger.debug("Spatialite version: %s" % row[1]) - - self.cursor = self.connection.cursor() - - -class JapanDatabase(Database): +class JapanDatabase(SpatialiteDatabase): """The JapanDatabase class represents a Spatialite database for the Japan exposure model. It is derived from the generic Database class. @@ -91,12 +41,17 @@ class JapanDatabase(Database): """ def __init__(self, database_filepath, spatialite_filepath="mod_spatialite"): - Database.__init__(self, database_filepath, spatialite_filepath) + SpatialiteDatabase.__init__(self, database_filepath, spatialite_filepath) def create_tables(self): """ Creates all necessary tables in the database. These are: - District : Stores the districts with their IDs, names and geometries + District: Stores the districts with their IDs, names and geometries + DwellingNumber: Stores the number of dwellings depending on building types, + construction material and number of stories for each district + BuildingType: Stores the different types of buildings + ConstructionMaterial: Stores the construction-material types + NumberStories: Stores the classifications of numbers of stories """ # Create table District @@ -252,8 +207,8 @@ class JapanDatabase(Database): File path to the boundary file """ - boundary_db = Database(district_boundary_filepath, self.spatialite_filepath) - boundary_db.create_connection_and_cursor() + boundary_db = SpatialiteDatabase(district_boundary_filepath, self.spatialite_filepath) + boundary_db.connect(init_spatial_metadata=False) sql_statement = "SELECT key_code_ward, " sql_statement += "CITY_NAME, " diff --git a/exposurejapan/exposurejapan.py b/exposurejapan/exposurejapan.py index 44815e329bab36167b45515f1bca655a46d47525..7961d95df897fcb17b8d330b26f0489140cb8e23 100644 --- a/exposurejapan/exposurejapan.py +++ b/exposurejapan/exposurejapan.py @@ -20,7 +20,7 @@ import logging import sys import sqlite3 -from database import JapanDatabase # pylint: disable=E0611,E0401 +from .database import JapanDatabase # pylint: disable=E0611,E0401 # Add a logger printing error, warning, info and debug messages to the screen @@ -37,13 +37,13 @@ def main(): db = JapanDatabase("test.sqlite", "/usr/lib64/mod_spatialite.so.7") try: - db.create_connection_and_cursor() + db.connect() except sqlite3.OperationalError: logger.warning("Spatialite extension cannot be loaded. Exiting ...") exit() db.create_tables() - db.read_districts_and_boundaries("../data/estat_bound_municipal.gpkg") - db.import_exposure_data("../data/e008_3e.xlsx") + db.read_districts_and_boundaries("data/estat_bound_municipal.gpkg") + db.import_exposure_data("data/e008_3e.xlsx") # Leave the program sys.exit() diff --git a/setup.py b/setup.py index c5dd0f745300251782bd93989dd77f9be55ed67a..a3e63ab553e1c4d8ccd88e37ea9347523df4426f 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,10 @@ setup( keywords="exposuremodel, building", author="Helmholtz-Zentrum Potsdam Deutsches GeoForschungsZentrum GFZ", license="AGPLv3+", - install_requires=["pandas", "numpy", "scipy"], + install_requires=[ + "pandas", + "exposurelib@https://git.gfz-potsdam.de/dynamicexposure/globaldynamicexposure/exposure-lib/-/archive/master/exposure-lib-master.zip", # noqa: E501 + ], extras_require={"tests": tests_require, "linters": linters_require}, packages=find_packages(), entry_points={"console_scripts": ["exposurejapan = exposurejapan.exposurejapan:main"]},