cetk 0.0.6.dev0__tar.gz → 0.0.7.dev0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/PKG-INFO +2 -2
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/pyproject.toml +1 -1
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/__init__.py +1 -1
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/const.py +1 -1
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/fleets.py +0 -1
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/rasterize/rasterizer.py +17 -13
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/filters.py +0 -2
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/queries.py +23 -8
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/roadsource_emissions.sql +4 -2
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/views.py +1 -1
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/tools/cetk_command.py +2 -7
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/PKG-INFO +2 -2
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/requires.txt +1 -1
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_common_models.py +0 -1
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_aggregate_emissions.py +1 -1
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_calculate.py +6 -2
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/.pre-commit-config.yaml +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/CONTRIBUTING.md +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/LICENSE +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/MANIFEST.in +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/README.md +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/constraints-lowest.txt +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/flatpak_install.sh +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/manage.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/noxfile.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/requirements-dev.in +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/requirements-dev.txt +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/setup.cfg +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/db.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/__init__.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/apps.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/cache.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/copy.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/exporters.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/fixtures/edb-ref.json +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/__init__.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/activity_import.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/codeset_import.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/gridsource_import.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/roadsource_import.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/source_import.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/timevar_import.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/utils.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/importers/validation.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/ltreefield.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/migrations/0001_initial.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/migrations/0002_data.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/migrations/0003_create_gpkg_tables.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/migrations/__init__.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/__init__.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/base.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/common_models.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/gridsource_models.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/road_classes.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/road_models.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/source_models.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/models/timevar_models.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/rasterize/__init__.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/signals.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/traffic.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/units.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/edb/utils.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/__init__.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/aggregate_emissions.sql +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/areasource_emissions.sql +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/calc.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/gridsource_emissions.sql +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/pointsource_emissions.sql +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/emissions/used_substances.sql +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/logging.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/settings.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/tools/__init__.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/tools/manage.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/tools/utils.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk/utils.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/SOURCES.txt +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/dependency_links.txt +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/entry_points.txt +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/src/cetk.egg-info/top_level.txt +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/conftest.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/TrafficImportFormat.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/__init__.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/all_sources.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/areasourceactivities.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/areasources.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/congestion_profiles.json +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/fleets.json +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/fleets.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsource_rasters/vasterbotten_conc_NOx_1990010100_1991010100.tif +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsource_rasters/vasterbotten_conc_PM25_1990010100_1991010100.tif +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsource_rasters/vasterbotten_conc_PM25_2000010100_2001010100.tif +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsource_rasters/vasterbotten_conc_PM25_2011010100_2012010100.tif +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsources.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/gridsources_tmp.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/pointsourceactivities.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/pointsources.csv +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/pointsources.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roadclass_settings.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roadclasses.csv +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roadclasses.json +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roadclasses_1attr.csv +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roadclasses_1attr.json +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roaddata.gpkg +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roads.json +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/roads.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/sinuous_road.geojson +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/timevars.json +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/vehicle_settings.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/vehicles.csv +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/vehicles.json +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/data/vehicles.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_fleets.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_gridsource_models.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_importers.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_ltreefield.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_rasterize.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_road_classes.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_road_importers.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/edb/test_road_models.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/__init__.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_areasource_emissions.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_custom_sqlite_functions.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_gridsource_emissions.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_pointsource_emissions.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_roadsource_emissions.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/emissions/test_utils.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/test_db.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/conftest.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/data/__init__.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/data/inventory.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/data/validation.xlsx +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_create.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_delete.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_exports.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_imports.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/tests/tools/test_info.py +0 -0
- {cetk-0.0.6.dev0 → cetk-0.0.7.dev0}/windows_find_gdal.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cetk
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.7.dev0
|
|
4
4
|
Summary: CLAIRs Emission ToolKit cetk
|
|
5
5
|
Author: Christian Asker, Mattias Jakobsson, David Segersson, Eef van Dongen
|
|
6
6
|
Maintainer-email: FO Luft <foluftadmin@smhi.se>
|
|
@@ -18,7 +18,7 @@ Requires-Dist: numpy>=1.20.3
|
|
|
18
18
|
Requires-Dist: openpyxl>=3.0.7
|
|
19
19
|
Requires-Dist: pandas>=2.0
|
|
20
20
|
Requires-Dist: pyogrio>=0.4.2
|
|
21
|
-
Requires-Dist:
|
|
21
|
+
Requires-Dist: rastafari2>=0.4
|
|
22
22
|
Requires-Dist: rasterio>=1.3
|
|
23
23
|
Requires-Dist: shapely>=2.0
|
|
24
24
|
Dynamic: license-file
|
|
@@ -31,7 +31,7 @@ dependencies = [ # Release date Comment
|
|
|
31
31
|
"openpyxl >=3.0.7", # 2021-03-09 required by pandas 2.0.0
|
|
32
32
|
"pandas >=2.0", # 2023-04-03 cetk import test fails with earlier versions
|
|
33
33
|
"pyogrio >=0.4.2", # 2022-10-06 cetk export test fails with earlier versions
|
|
34
|
-
"
|
|
34
|
+
"rastafari2 >=0.4",
|
|
35
35
|
"rasterio >=1.3", # 2022-07-06 rasterio.CRS is missing in earlier versions
|
|
36
36
|
"shapely >=2.0", # 2022-12-12 cetk calc --rasterize fails with earlier versions
|
|
37
37
|
]
|
|
@@ -25,7 +25,6 @@ class FleetManager(models.Manager):
|
|
|
25
25
|
for f in data:
|
|
26
26
|
for m in f["members"]:
|
|
27
27
|
for fu in m["fuels"]:
|
|
28
|
-
# breakpoint()
|
|
29
28
|
if (m["vehicle"], fu["fuel"]) not in validcombinations:
|
|
30
29
|
raise ValueError(
|
|
31
30
|
f"{m['vehicle']}/{fu['fuel']} is not a valid vehicle/fuel"
|
|
@@ -318,15 +318,7 @@ class EmissionRasterizer:
|
|
|
318
318
|
"""Get querysets for emissions."""
|
|
319
319
|
|
|
320
320
|
sourcetypes = sourcetypes or SOURCETYPES
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
# if ac1 is not None or ac2 is not None or ac3 is not None:
|
|
324
|
-
# breakpoint()
|
|
325
|
-
# # raise ValueError(
|
|
326
|
-
# # "filtering for ac not implemented in source_emissions_query yet!"
|
|
327
|
-
# # )
|
|
328
|
-
# if activity codes are given as strings, get the corresponding
|
|
329
|
-
# activity code instances
|
|
321
|
+
|
|
330
322
|
if ac1 is not None and len(ac1) > 0 and isinstance(ac1[0], str):
|
|
331
323
|
# TODO why code__in= not code= ?
|
|
332
324
|
codeset1 = Settings.get_current().codeset1
|
|
@@ -708,10 +700,12 @@ class EmissionRasterizer:
|
|
|
708
700
|
name=var_name,
|
|
709
701
|
unit=self.unit,
|
|
710
702
|
instance=self.instance,
|
|
703
|
+
substance=substance.slug,
|
|
711
704
|
cell_methods=cell_methods,
|
|
712
705
|
parameter=param.name,
|
|
713
706
|
time=time,
|
|
714
707
|
chunksizes=chunking,
|
|
708
|
+
quantity="emission",
|
|
715
709
|
)
|
|
716
710
|
subst_vars["field2d"] = {"emission": var_name}
|
|
717
711
|
else:
|
|
@@ -890,6 +884,7 @@ class EmissionRasterizer:
|
|
|
890
884
|
# rasterizing chunks and writing to dataset
|
|
891
885
|
chunk_begin = begin
|
|
892
886
|
chunk_end = begin
|
|
887
|
+
chunk_time_ind = 0
|
|
893
888
|
while chunk_end < end:
|
|
894
889
|
if min_time_chunksize == 1e9:
|
|
895
890
|
# means no result_files exist
|
|
@@ -934,13 +929,19 @@ class EmissionRasterizer:
|
|
|
934
929
|
substance,
|
|
935
930
|
emis_chunk,
|
|
936
931
|
timestamps=[chunk_begin, chunk_end],
|
|
932
|
+
chunk_time_ind=chunk_time_ind,
|
|
937
933
|
)
|
|
938
934
|
# update time-span of variable and dataset
|
|
939
935
|
|
|
940
936
|
# update chunk time interval
|
|
937
|
+
chunk_time_ind = (
|
|
938
|
+
chunk_time_ind
|
|
939
|
+
+ int((chunk_end - chunk_begin).total_seconds() / 3600)
|
|
940
|
+
+ 1
|
|
941
|
+
)
|
|
941
942
|
chunk_begin = chunk_end + datetime.timedelta(hours=1)
|
|
942
943
|
|
|
943
|
-
def set_data(self, dset, substance, data, timestamps=None):
|
|
944
|
+
def set_data(self, dset, substance, data, timestamps=None, chunk_time_ind=0):
|
|
944
945
|
"""Add chunk of data to variable."""
|
|
945
946
|
|
|
946
947
|
var = dset[f"emission_{substance.slug}"]
|
|
@@ -951,12 +952,12 @@ class EmissionRasterizer:
|
|
|
951
952
|
else:
|
|
952
953
|
time_var = dset["time"]
|
|
953
954
|
# map_oriented, np.fliplr flips 3d data along second dimension
|
|
954
|
-
var[:, :, :] = np.fliplr(data)
|
|
955
|
+
var[chunk_time_ind:, :, :] = np.fliplr(data)
|
|
955
956
|
times = pd.date_range(timestamps[0], timestamps[1], freq=self.time_step)
|
|
956
957
|
hours_since_1970 = (
|
|
957
958
|
times - pd.to_datetime("1970-01-01").tz_localize(self.timezone)
|
|
958
959
|
).total_seconds() / 3600
|
|
959
|
-
time_var[:] = hours_since_1970
|
|
960
|
+
time_var[chunk_time_ind:] = hours_since_1970
|
|
960
961
|
|
|
961
962
|
def _timeseries_emis(self, substance, begin, end, sourcetype):
|
|
962
963
|
"""Get emission timeseries data chunk for sources.
|
|
@@ -1398,7 +1399,7 @@ class EmissionRasterizer:
|
|
|
1398
1399
|
self.log.info(
|
|
1399
1400
|
f"No exact match for EPSG and spatial ref, using best guess: {epsg}"
|
|
1400
1401
|
)
|
|
1401
|
-
|
|
1402
|
+
grid_mapping.srid = epsg
|
|
1402
1403
|
grid_mapping.crs_wkt = crs.to_wkt() # for CF Conventions 1.7
|
|
1403
1404
|
return grid_mapping
|
|
1404
1405
|
|
|
@@ -1409,6 +1410,7 @@ def create_variable(
|
|
|
1409
1410
|
name: str,
|
|
1410
1411
|
unit: Optional[str] = None,
|
|
1411
1412
|
quantity: Optional[str] = None,
|
|
1413
|
+
substance: Optional[str] = None,
|
|
1412
1414
|
instance: Optional[str] = None,
|
|
1413
1415
|
cell_methods: Optional[str] = None,
|
|
1414
1416
|
parameter: Optional[str] = None,
|
|
@@ -1437,6 +1439,8 @@ def create_variable(
|
|
|
1437
1439
|
var.parameter = parameter
|
|
1438
1440
|
if quantity is not None:
|
|
1439
1441
|
var.quantity = quantity
|
|
1442
|
+
if substance is not None:
|
|
1443
|
+
var.substance = substance
|
|
1440
1444
|
if instance is not None:
|
|
1441
1445
|
var.instance = instance
|
|
1442
1446
|
if cell_methods is not None:
|
|
@@ -50,6 +50,7 @@ def create_source_emis_query(
|
|
|
50
50
|
"""
|
|
51
51
|
|
|
52
52
|
sql = load_sql(f"{sourcetype}source_emissions.sql")
|
|
53
|
+
ac_filter = ""
|
|
53
54
|
source_filters = []
|
|
54
55
|
if tags is not None:
|
|
55
56
|
source_filters.append(create_tag_where_clause(tags))
|
|
@@ -60,7 +61,11 @@ def create_source_emis_query(
|
|
|
60
61
|
if polygon is not None and sourcetype != "grid":
|
|
61
62
|
source_filters.append(create_polygon_where_clause(polygon))
|
|
62
63
|
if ac1 is not None or ac2 is not None or ac3 is not None:
|
|
63
|
-
|
|
64
|
+
if sourcetype != "road":
|
|
65
|
+
source_filters += create_activitycode_where_clauses(ac1, ac2, ac3)
|
|
66
|
+
else:
|
|
67
|
+
ac_filter = create_activitycode_where_clauses(ac1, ac2, ac3)
|
|
68
|
+
ac_filter = "AND " + ac_filter[0]
|
|
64
69
|
|
|
65
70
|
if len(source_filters) > 0:
|
|
66
71
|
source_filter_sql = "WHERE " + " AND ".join(source_filters)
|
|
@@ -81,13 +86,23 @@ def create_source_emis_query(
|
|
|
81
86
|
emis_subst_filter = ""
|
|
82
87
|
|
|
83
88
|
# replace place-holders by generated sql
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
if sourcetype != "road":
|
|
90
|
+
sql = sql.format(
|
|
91
|
+
srid=srid,
|
|
92
|
+
source_filters=source_filter_sql,
|
|
93
|
+
ef_substance_filter=ef_subst_filter,
|
|
94
|
+
emis_substance_filter=emis_subst_filter,
|
|
95
|
+
traffic_work_subst_id=traffic_work.id,
|
|
96
|
+
)
|
|
97
|
+
else:
|
|
98
|
+
sql = sql.format(
|
|
99
|
+
srid=srid,
|
|
100
|
+
source_filters=source_filter_sql,
|
|
101
|
+
ef_substance_filter=ef_subst_filter,
|
|
102
|
+
emis_substance_filter=emis_subst_filter,
|
|
103
|
+
traffic_work_subst_id=traffic_work.id,
|
|
104
|
+
ac_filter=ac_filter,
|
|
105
|
+
)
|
|
91
106
|
return sql
|
|
92
107
|
|
|
93
108
|
|
|
@@ -65,7 +65,7 @@ fleet_veh as (
|
|
|
65
65
|
LEFT JOIN edb_activitycode as ac1 ON vfc.activitycode1_id=ac1.id
|
|
66
66
|
LEFT JOIN edb_activitycode as ac2 ON vfc.activitycode2_id=ac2.id
|
|
67
67
|
LEFT JOIN edb_activitycode as ac3 ON vfc.activitycode3_id=ac3.id
|
|
68
|
-
WHERE veh_ef.substance_id != {traffic_work_subst_id}
|
|
68
|
+
WHERE veh_ef.substance_id != {traffic_work_subst_id} {ac_filter}
|
|
69
69
|
GROUP BY fm.fleet_id, fm.id, veh_ef.traffic_situation_id,
|
|
70
70
|
fm.vehicle_id, veh_ef.substance_id
|
|
71
71
|
UNION
|
|
@@ -89,6 +89,7 @@ fleet_veh as (
|
|
|
89
89
|
LEFT JOIN edb_activitycode as ac1 ON vfc.activitycode1_id=ac1.id
|
|
90
90
|
LEFT JOIN edb_activitycode as ac2 ON vfc.activitycode2_id=ac2.id
|
|
91
91
|
LEFT JOIN edb_activitycode as ac3 ON vfc.activitycode3_id=ac3.id
|
|
92
|
+
WHERE 1=1 {ac_filter}
|
|
92
93
|
) as ef
|
|
93
94
|
JOIN edb_fleetmember fm ON ef.fleetmember_id = fm.id
|
|
94
95
|
JOIN edb_vehicle veh ON ef.vehicle_id=veh.id
|
|
@@ -101,7 +102,8 @@ fleet_veh as (
|
|
|
101
102
|
ef.stopngo_ef != 0 OR
|
|
102
103
|
ef.heavy_ef != 0 OR
|
|
103
104
|
ef.saturated_ef != 0
|
|
104
|
-
)
|
|
105
|
+
)
|
|
106
|
+
{ef_substance_filter}
|
|
105
107
|
),
|
|
106
108
|
/*
|
|
107
109
|
Calculate weight of each LOS (Level Of Service) for all valid combinations
|
|
@@ -293,6 +293,7 @@ class Editor(object):
|
|
|
293
293
|
srid=srid,
|
|
294
294
|
basename=basename,
|
|
295
295
|
)
|
|
296
|
+
kwargs = {f"ac{codeset_index}": code}
|
|
296
297
|
rasterizer = EmissionRasterizer(output, nx=nx, ny=ny)
|
|
297
298
|
rasterizer.process(
|
|
298
299
|
substances,
|
|
@@ -304,14 +305,8 @@ class Editor(object):
|
|
|
304
305
|
area_ids=area_ids,
|
|
305
306
|
grid_ids=grid_ids,
|
|
306
307
|
road_ids=road_ids,
|
|
307
|
-
|
|
308
|
+
**kwargs,
|
|
308
309
|
)
|
|
309
|
-
# except Exception as err:
|
|
310
|
-
# print(f"could not rasterize emissions: {str(err)}")
|
|
311
|
-
# breakpoint()
|
|
312
|
-
# continue
|
|
313
|
-
# log.error(f"could not rasterize emissions: {str(err)}")
|
|
314
|
-
# sys.exit(1)
|
|
315
310
|
else:
|
|
316
311
|
try:
|
|
317
312
|
output = Output(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cetk
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.7.dev0
|
|
4
4
|
Summary: CLAIRs Emission ToolKit cetk
|
|
5
5
|
Author: Christian Asker, Mattias Jakobsson, David Segersson, Eef van Dongen
|
|
6
6
|
Maintainer-email: FO Luft <foluftadmin@smhi.se>
|
|
@@ -18,7 +18,7 @@ Requires-Dist: numpy>=1.20.3
|
|
|
18
18
|
Requires-Dist: openpyxl>=3.0.7
|
|
19
19
|
Requires-Dist: pandas>=2.0
|
|
20
20
|
Requires-Dist: pyogrio>=0.4.2
|
|
21
|
-
Requires-Dist:
|
|
21
|
+
Requires-Dist: rastafari2>=0.4
|
|
22
22
|
Requires-Dist: rasterio>=1.3
|
|
23
23
|
Requires-Dist: shapely>=2.0
|
|
24
24
|
Dynamic: license-file
|
|
@@ -34,7 +34,6 @@ class TestActivityCodes:
|
|
|
34
34
|
ac1 = code_set.codes.get(code="1")
|
|
35
35
|
ac13 = code_set.codes.get(code="1.3")
|
|
36
36
|
ac131 = code_set.codes.get(code="1.3.1")
|
|
37
|
-
# breakpoint()
|
|
38
37
|
assert ac13 in list(ac1.get_children())
|
|
39
38
|
assert ac131 not in list(ac1.get_children())
|
|
40
39
|
assert ac131 in list(ac13.get_children())
|
|
@@ -155,5 +155,5 @@ def test_aggregate_emissions_all_sourcetypes(
|
|
|
155
155
|
assert df.index[0] == ("3", "Diffuse sources")
|
|
156
156
|
assert df.columns[0] == ("emission", "SOx")
|
|
157
157
|
# reference emission: "seconds of year" * "grid fraction in polygon"
|
|
158
|
-
ref_emis = 1.0 *
|
|
158
|
+
ref_emis = 1.0 * raster_share
|
|
159
159
|
assert ref_emis == pytest.approx(df.iloc[0, 0], 1e-5)
|
|
@@ -45,8 +45,12 @@ def test_aggregate(inventory, tmpdir):
|
|
|
45
45
|
assert np.all(df.columns.levels[0] == ["emission"])
|
|
46
46
|
assert np.all(df.columns.levels[1] == ["CO", "NMVOC", "NOx", "PM10", "PM25", "SOx"])
|
|
47
47
|
assert df.index.names == ["activity"]
|
|
48
|
-
assert df.loc["total", ("emission", "NOx")].item() == pytest.approx(
|
|
49
|
-
|
|
48
|
+
assert df.loc["total", ("emission", "NOx")].item() == pytest.approx(
|
|
49
|
+
45108 / (365.25 * 24 * 3600)
|
|
50
|
+
)
|
|
51
|
+
assert df.loc["total", ("emission", "PM25")].item() == pytest.approx(
|
|
52
|
+
5.411264e6 / (365.25 * 24 * 3600)
|
|
53
|
+
)
|
|
50
54
|
|
|
51
55
|
|
|
52
56
|
@pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|