Spaces:
Build error
Build error
pgzmnk commited on
Commit ·
29ff8b7
1
Parent(s): 8c07762
Format.
Browse files- app.py +1 -1
- utils/duckdb_queries.py +6 -2
- utils/indicators.py +13 -11
app.py
CHANGED
|
@@ -5,7 +5,7 @@ from utils.gradio import get_window_url_params
|
|
| 5 |
from utils.indicators import IndexGenerator
|
| 6 |
|
| 7 |
# Instantiate outside gradio app to avoid re-initializing GEE, which is slow
|
| 8 |
-
indexgenerator = IndexGenerator(indices=[
|
| 9 |
|
| 10 |
with gr.Blocks() as demo:
|
| 11 |
with gr.Column():
|
|
|
|
| 5 |
from utils.indicators import IndexGenerator
|
| 6 |
|
| 7 |
# Instantiate outside gradio app to avoid re-initializing GEE, which is slow
|
| 8 |
+
indexgenerator = IndexGenerator(indices=["NDWI", "Water", "Protected", "Air"])
|
| 9 |
|
| 10 |
with gr.Blocks() as demo:
|
| 11 |
with gr.Column():
|
utils/duckdb_queries.py
CHANGED
|
@@ -28,12 +28,16 @@ def get_project_geometry(project_name):
|
|
| 28 |
"SELECT geometry FROM project WHERE name = ? LIMIT 1", [project_name]
|
| 29 |
).fetchall()
|
| 30 |
|
|
|
|
| 31 |
def get_project_centroid(project_name):
|
| 32 |
# Workaround to get centroid of project
|
| 33 |
# To-do: refactor to only use DuckDB spatial extension
|
| 34 |
_geom = get_project_geometry(project_name)
|
| 35 |
-
_polygon = json.dumps(json.loads(_geom[0][0])[
|
| 36 |
-
return con.sql(
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
def get_project_scores(project_name, start_year, end_year):
|
| 39 |
return con.execute(
|
|
|
|
| 28 |
"SELECT geometry FROM project WHERE name = ? LIMIT 1", [project_name]
|
| 29 |
).fetchall()
|
| 30 |
|
| 31 |
+
|
| 32 |
def get_project_centroid(project_name):
|
| 33 |
# Workaround to get centroid of project
|
| 34 |
# To-do: refactor to only use DuckDB spatial extension
|
| 35 |
_geom = get_project_geometry(project_name)
|
| 36 |
+
_polygon = json.dumps(json.loads(_geom[0][0])["features"][0]["geometry"])
|
| 37 |
+
return con.sql(
|
| 38 |
+
f"SELECT ST_X(ST_Centroid(ST_GeomFromGeoJSON('{_polygon}'))) AS longitude, ST_Y(ST_Centroid(ST_GeomFromGeoJSON('{_polygon}'))) AS latitude;"
|
| 39 |
+
).fetchall()[0]
|
| 40 |
+
|
| 41 |
|
| 42 |
def get_project_scores(project_name, start_year, end_year):
|
| 43 |
return con.execute(
|
utils/indicators.py
CHANGED
|
@@ -13,7 +13,9 @@ from utils import duckdb_queries as dq
|
|
| 13 |
|
| 14 |
from . import logging
|
| 15 |
|
| 16 |
-
GEE_SERVICE_ACCOUNT =
|
|
|
|
|
|
|
| 17 |
INDICES_FILE = "indices.yaml"
|
| 18 |
|
| 19 |
|
|
@@ -36,7 +38,6 @@ class IndexGenerator:
|
|
| 36 |
self.indices = self._load_indices(INDICES_FILE)
|
| 37 |
breakpoint()
|
| 38 |
|
| 39 |
-
|
| 40 |
def _cloudfree(self, gee_path, daterange):
|
| 41 |
"""
|
| 42 |
Internal method to generate a cloud-free composite.
|
|
@@ -141,7 +142,6 @@ class IndexGenerator:
|
|
| 141 |
return out
|
| 142 |
|
| 143 |
def generate_composite_index_df(self, year, project_geometry, indices=[]):
|
| 144 |
-
|
| 145 |
data = {
|
| 146 |
"metric": indices,
|
| 147 |
"year": year,
|
|
@@ -175,22 +175,26 @@ class IndexGenerator:
|
|
| 175 |
project_geometry = dq.get_project_geometry(project_name)
|
| 176 |
project_centroid = dq.get_project_centroid(project_name)
|
| 177 |
# to-do: refactor to involve less transformations
|
| 178 |
-
_polygon = json.dumps(
|
|
|
|
|
|
|
| 179 |
# to-do: don't use self.roi and instead pass patameter strategically
|
| 180 |
-
self.roi = ee.Geometry.Polygon(json.loads(_polygon)[
|
| 181 |
|
| 182 |
# to-do: pararelize?
|
| 183 |
for year in years:
|
| 184 |
logging.info(year)
|
| 185 |
self.project_name = project_name
|
| 186 |
-
df = self.generate_composite_index_df(
|
|
|
|
|
|
|
| 187 |
dfs.append(df)
|
| 188 |
|
| 189 |
# Concatenate all dataframes
|
| 190 |
df_concat = pd.concat(dfs)
|
| 191 |
-
df_concat[
|
| 192 |
-
df_concat[
|
| 193 |
-
df_concat[
|
| 194 |
breakpoint()
|
| 195 |
return df_concat
|
| 196 |
|
|
@@ -299,5 +303,3 @@ class IndexGenerator:
|
|
| 299 |
logging.info("upserted records into motherduck")
|
| 300 |
scores = dq.get_project_scores(project_name, start_year, end_year)
|
| 301 |
return scores
|
| 302 |
-
|
| 303 |
-
|
|
|
|
| 13 |
|
| 14 |
from . import logging
|
| 15 |
|
| 16 |
+
GEE_SERVICE_ACCOUNT = (
|
| 17 |
+
"climatebase-july-2023@ee-geospatialml-aquarry.iam.gserviceaccount.com"
|
| 18 |
+
)
|
| 19 |
INDICES_FILE = "indices.yaml"
|
| 20 |
|
| 21 |
|
|
|
|
| 38 |
self.indices = self._load_indices(INDICES_FILE)
|
| 39 |
breakpoint()
|
| 40 |
|
|
|
|
| 41 |
def _cloudfree(self, gee_path, daterange):
|
| 42 |
"""
|
| 43 |
Internal method to generate a cloud-free composite.
|
|
|
|
| 142 |
return out
|
| 143 |
|
| 144 |
def generate_composite_index_df(self, year, project_geometry, indices=[]):
|
|
|
|
| 145 |
data = {
|
| 146 |
"metric": indices,
|
| 147 |
"year": year,
|
|
|
|
| 175 |
project_geometry = dq.get_project_geometry(project_name)
|
| 176 |
project_centroid = dq.get_project_centroid(project_name)
|
| 177 |
# to-do: refactor to involve less transformations
|
| 178 |
+
_polygon = json.dumps(
|
| 179 |
+
json.loads(project_geometry[0][0])["features"][0]["geometry"]
|
| 180 |
+
)
|
| 181 |
# to-do: don't use self.roi and instead pass patameter strategically
|
| 182 |
+
self.roi = ee.Geometry.Polygon(json.loads(_polygon)["coordinates"])
|
| 183 |
|
| 184 |
# to-do: pararelize?
|
| 185 |
for year in years:
|
| 186 |
logging.info(year)
|
| 187 |
self.project_name = project_name
|
| 188 |
+
df = self.generate_composite_index_df(
|
| 189 |
+
year, project_geometry, list(self.indices.keys())
|
| 190 |
+
)
|
| 191 |
dfs.append(df)
|
| 192 |
|
| 193 |
# Concatenate all dataframes
|
| 194 |
df_concat = pd.concat(dfs)
|
| 195 |
+
df_concat["centroid"] = project_centroid
|
| 196 |
+
df_concat["project_name"] = project_name
|
| 197 |
+
df_concat["geojson"] = project_geometry
|
| 198 |
breakpoint()
|
| 199 |
return df_concat
|
| 200 |
|
|
|
|
| 303 |
logging.info("upserted records into motherduck")
|
| 304 |
scores = dq.get_project_scores(project_name, start_year, end_year)
|
| 305 |
return scores
|
|
|
|
|
|