Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
d1e8b91
WIP Vectorising grid results
timlinux Mar 30, 2026
0289511
WIP Vectorising grid results
timlinux Mar 30, 2026
17ae089
Implement grid-first architecture for all workflows
timlinux Mar 30, 2026
fc29768
Hide single-child factors in tree view, show indicator in their place
timlinux Mar 30, 2026
53ed4a0
Add grid vector layer visualization option alongside raster
timlinux Mar 30, 2026
a0ea50b
Fix TypeError in Add to map (Grid) menu actions
timlinux Mar 30, 2026
3b77198
Add diagnostic logging to add_grid_layer_to_map
timlinux Mar 30, 2026
5a419ce
Fix GeoE3 score column name mismatch
timlinux Mar 30, 2026
04dd4d5
Fix masked score file name mismatch
timlinux Mar 31, 2026
afe4a3d
Use geoe3 column name instead of wee_score
timlinux Mar 31, 2026
43bcf17
Change logging level from DEBUG to INFO
timlinux Mar 31, 2026
3ebd6db
Suppress PyQt uic debug messages while keeping DEBUG level
timlinux Mar 31, 2026
aa8fbe5
Add filter to exclude NULL values in grid layer visualization
timlinux Mar 31, 2026
9ad6c40
Change default map visualization to grid layer instead of raster
timlinux Mar 31, 2026
21eaf07
Merge upstream main into results-as-grid-valuesv2
timlinux Mar 31, 2026
7397e7b
Auto-create grid columns if they don't exist
timlinux Mar 31, 2026
d8a9a36
Add grid layer support for analysis (GeoE3) score
timlinux Mar 31, 2026
9b040aa
Add grid layer support for masked scores
timlinux Mar 31, 2026
e80de3d
Add grid layer support for GeoE3 by Pop and Opportunities Mask
timlinux Mar 31, 2026
b2a0a44
Fix GeoPackage initialization error during project creation
timlinux Mar 31, 2026
f59dc42
Merge remote-tracking branch 'origin/main' into results-as-grid-valuesv2
timlinux Apr 1, 2026
4f4187b
merge in changes from Jeff
timlinux Apr 9, 2026
628151b
feat: implement S2SClient for querying Space2Stats API with health, f…
osundwajeff Apr 10, 2026
b8b86a7
feat: add S2SDownloaderTask for downloading Space2Stats summary data
osundwajeff Apr 10, 2026
a24721b
feat: add S2SDataSourceWidget for Space2Stats data integration
osundwajeff Apr 14, 2026
77789c2
feat: add S2SNTLRasterDataSourceWidget for fetching and rasterizing n…
osundwajeff Apr 14, 2026
4be6374
Merge pull request #351 from osundwajeff/results-as-grid-valuesv2
osundwajeff Apr 15, 2026
569419a
Initial implementation of study results as vector values
timlinux Mar 29, 2026
5f792ed
feat: Integrate other S2S datasets into workflow, Fixes #352
osundwajeff Apr 16, 2026
60a865d
fix: disable manual field selection for S2S-specific hazards workflow
osundwajeff Apr 16, 2026
95770ef
fix: prevent CRS loss from stale WAL journal in GeoPackage
timlinux Apr 19, 2026
24a192e
fix: clear stale grid column values before rewriting
timlinux Apr 19, 2026
82653ab
fix: use SQL to write geoe3_masked grid values instead of raster samp…
timlinux Apr 19, 2026
2eac16d
refactor: convert GHSL and Ookla workflows to grid-first approach
timlinux Apr 19, 2026
e08e6de
fix: update AreaIterator unpacking to include area_name parameter
timlinux Apr 19, 2026
bdc4d14
fix: delete intermediate rasters not referenced by VRTs
timlinux Apr 20, 2026
65dd44d
fix: don't delete child workflow subdirectories during cleanup
timlinux Apr 20, 2026
75579b9
feat: add S2S data prefetching functionality and UI elements for regi…
osundwajeff Apr 21, 2026
73bfb4c
fix: implement canvas overlay label clearing and enhance S2S data han…
osundwajeff Apr 21, 2026
442f6a6
fix: enhance S2SNTLRasterDataSourceWidget selection based on analysis…
osundwajeff Apr 22, 2026
43b3fbc
fix template banner
osundwajeff Apr 22, 2026
d2a2bce
feat: add study area 'area' calculation and render strategy based on …
osundwajeff Apr 22, 2026
8a80573
Merge branch 'main' into results-as-grid-valuesv2-testing
osundwajeff Apr 23, 2026
5e6a5b7
Add S2S panel and refactor project creation workflow
osundwajeff May 4, 2026
50963b8
feat: enhance panel navigation and add regional project flow checks
osundwajeff May 4, 2026
6da86c8
feat: implement safer SQLite write options and integrity checks for G…
osundwajeff May 5, 2026
8d8f435
fix: update file dialog to select vector files and enhance supported …
osundwajeff May 5, 2026
a956c7d
feat: enhance grid column utilities and workflows for raster reclassi…
osundwajeff May 5, 2026
3de6b83
fix: add boundary CRS checkbox refresh logic and improve layer change…
osundwajeff May 12, 2026
1be4f0f
feat: add H3 resolution configuration and improve GeoPackage metadata…
osundwajeff May 15, 2026
5eeb75a
fix: enhance data attribution details across various UI components
osundwajeff May 15, 2026
3186a8f
docs: add data attribution and citation guidelines for external datas…
osundwajeff May 15, 2026
65c23f8
fix: enhance H3 utilities with area estimation and validation for stu…
osundwajeff May 15, 2026
b1f6849
fix: temporarily disable layer description overlay
osundwajeff May 18, 2026
bd08a8a
Add S2S Education Data Source Widget and enhance S2S Prefetching
osundwajeff May 20, 2026
6198c41
black fix
osundwajeff May 20, 2026
aa756f7
fix: escape single quotes in area name for SQL query
osundwajeff May 20, 2026
b5e048a
fix: standardize "Ghsl" to "GHSL" in module docstrings and comments
osundwajeff May 21, 2026
81e4c13
fix: add women enabling resolution logic and update education factor
osundwajeff May 21, 2026
223b5fe
fix: enhance safety polygon configuration widget with spinbox styling…
osundwajeff May 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,9 @@
"hrsh",
"pasky",
"nvimrc",
"geoe",
"eplex",
"Queryability",
"PYTHONPATH"
]
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,4 @@ geoe3/extlibs/*
geest/extlibs/*
!geest/extlibs/.gitkeep
PROMPT.log
log.txt
298 changes: 298 additions & 0 deletions .nvim.lua2
Original file line number Diff line number Diff line change
@@ -0,0 +1,298 @@
-- GEEST nvim project configuration
-- Auto-sourced by nvim when exrc is enabled, or source manually with:
-- :source .nvim.lua

-- Guard against re-sourcing
if vim.g.geest_loaded then
return
end
vim.g.geest_loaded = true

-- Helper to run commands in a floating terminal
local function float_term(cmd, opts)
opts = opts or {}
local buf = vim.api.nvim_create_buf(false, true)
local width = opts.width or math.floor(vim.o.columns * 0.8)
local height = opts.height or math.floor(vim.o.lines * 0.8)
local row = math.floor((vim.o.lines - height) / 2)
local col = math.floor((vim.o.columns - width) / 2)

local win = vim.api.nvim_open_win(buf, true, {
relative = 'editor',
width = width,
height = height,
row = row,
col = col,
style = 'minimal',
border = 'rounded',
title = opts.title or ' Terminal ',
title_pos = 'center',
})

if cmd then
vim.fn.termopen(cmd, {
on_exit = function(_, exit_code)
if opts.close_on_success and exit_code == 0 then
vim.defer_fn(function()
if vim.api.nvim_win_is_valid(win) then
vim.api.nvim_win_close(win, true)
end
end, 1000)
end
end,
})
else
vim.fn.termopen(vim.o.shell)
end
vim.cmd('startinsert')
end

-- Helper to open a bottom split terminal tailing the GEEST log file
local function open_log_tail()
local tmp_dir = os.getenv("TMPDIR") or os.getenv("TMP") or os.getenv("TEMP") or "/tmp"
local datestamp = os.date("%Y%m%d")
local log_file = tmp_dir .. "/geest_logfile_" .. datestamp .. ".log"

-- Check if GEEST_LOG env var is set
local geest_log_env = os.getenv("GEEST_LOG")
if geest_log_env and geest_log_env ~= "" and geest_log_env ~= "0" then
log_file = geest_log_env
end

-- Create a horizontal split at the bottom
vim.cmd('botright 12split')
local buf = vim.api.nvim_create_buf(false, true)
vim.api.nvim_win_set_buf(0, buf)
vim.api.nvim_buf_set_name(buf, 'GEEST Log')

-- Set buffer options
vim.bo[buf].buftype = 'nofile'
vim.bo[buf].bufhidden = 'wipe'
vim.bo[buf].swapfile = false

-- Start tailing the log file (create if it doesn't exist)
vim.fn.termopen(string.format('touch "%s" && tail -f "%s"', log_file, log_file), {
on_exit = function()
-- Buffer will be wiped automatically due to bufhidden setting
end,
})

-- Set window title
vim.wo.winfixheight = true
vim.wo.statusline = '%#StatusLine# GEEST Log: ' .. log_file .. ' %='

-- Return to the previous window
vim.cmd('wincmd p')
end

-- Helper to launch QGIS with log tail (QGIS runs in background)
local function launch_qgis_with_log(cmd, title)
-- Open the log tail panel first
open_log_tail()
-- Launch QGIS as a background job (not in a terminal)
vim.fn.jobstart(cmd, {
detach = true,
on_exit = function(_, exit_code)
if exit_code ~= 0 then
vim.notify(title .. ' exited with code ' .. exit_code, vim.log.levels.WARN)
end
end,
})
vim.notify('Started' .. title .. '(background)', vim.log.levels.INFO)
end

-- Project-specific commands
vim.api.nvim_create_user_command('GeestQgis', function()
launch_qgis_with_log('GEEST_DEBUG=0 GEEST_EXPERIMENTAL=0 RUNNING_ON_LOCAL=1 nix run .#default -- --profile GEEST2', ' QGIS ')
end, { desc = 'Launch QGIS (normal mode)' })

vim.api.nvim_create_user_command('GeestQgisDebug', function()
launch_qgis_with_log('GEEST_DEBUG=1 GEEST_EXPERIMENTAL=0 RUNNING_ON_LOCAL=1 nix run .#default -- --profile GEEST2', ' QGIS Debug ')
end, { desc = 'Launch QGIS (debug mode)' })

vim.api.nvim_create_user_command('GeestQgisExperimental', function()
launch_qgis_with_log('GEEST_DEBUG=0 GEEST_EXPERIMENTAL=1 RUNNING_ON_LOCAL=1 nix run .#default -- --profile GEEST2', ' QGIS Experimental ')
end, { desc = 'Launch QGIS (experimental features)' })

vim.api.nvim_create_user_command('GeestQgisLtr', function()
launch_qgis_with_log('RUNNING_ON_LOCAL=1 nix run .#qgis-ltr', ' QGIS LTR ')
end, { desc = 'Launch QGIS LTR' })

vim.api.nvim_create_user_command('GeestPrecommit', function()
float_term('pre-commit run --all-files', { title = ' Pre-commit ' })
end, { desc = 'Run pre-commit checks' })

vim.api.nvim_create_user_command('GeestPrecommitStaged', function()
float_term('pre-commit run', { title = ' Pre-commit (staged) ' })
end, { desc = 'Run pre-commit on staged files' })

vim.api.nvim_create_user_command('GeestTests', function()
float_term('./scripts/run-tests.sh', { title = ' Tests ' })
end, { desc = 'Run tests' })

vim.api.nvim_create_user_command('GeestClean', function()
float_term('./scripts/clean.sh', { title = ' Clean ' })
end, { desc = 'Clean build artifacts' })

vim.api.nvim_create_user_command('GeestRemovePycache', function()
float_term('./scripts/remove_pycache.sh', { title = ' Remove __pycache__ ' })
end, { desc = 'Remove __pycache__ directories' })

vim.api.nvim_create_user_command('GeestDocstrings', function()
float_term('./scripts/docstrings_check.sh', { title = ' Docstrings Check ' })
end, { desc = 'Check docstrings' })

vim.api.nvim_create_user_command('GeestEncoding', function()
float_term('./scripts/encoding_check.sh', { title = ' Encoding Check ' })
end, { desc = 'Check file encodings' })

vim.api.nvim_create_user_command('GeestGource', function()
float_term('./scripts/gource.sh', { title = ' Gource ' })
end, { desc = 'Run gource visualization' })

vim.api.nvim_create_user_command('GeestCompileStrings', function()
float_term('./scripts/compile-strings.sh', { title = ' Compile Strings ' })
end, { desc = 'Compile translation strings' })

vim.api.nvim_create_user_command('GeestUpdateStrings', function()
float_term('./scripts/update-strings.sh', { title = ' Update Strings ' })
end, { desc = 'Update translation strings' })

vim.api.nvim_create_user_command('GeestTerm', function()
float_term(nil, { title = ' Terminal ' })
end, { desc = 'Open floating terminal' })

vim.api.nvim_create_user_command('GeestLogTail', function()
open_log_tail()
end, { desc = 'Open GEEST log tail panel' })

vim.api.nvim_create_user_command('GeestGitStatus', function()
float_term('git status && echo "\\n--- Recent commits ---\\n" && git log --oneline -10', { title = ' Git Status ' })
end, { desc = 'Git status and recent commits' })

vim.api.nvim_create_user_command('GeestGitDiff', function()
float_term('git diff', { title = ' Git Diff ' })
end, { desc = 'Git diff' })

vim.api.nvim_create_user_command('GeestGitLog', function()
float_term('git log --oneline --graph --decorate -30', { title = ' Git Log ' })
end, { desc = 'Git log (graph)' })

vim.api.nvim_create_user_command('GeestLazygit', function()
float_term('lazygit', { title = ' Lazygit ' })
end, { desc = 'Open lazygit' })

-- Build & Release commands
vim.api.nvim_create_user_command('GeestBuild', function()
float_term('python admin.py build', { title = ' Build Plugin ' })
end, { desc = 'Build plugin to build/' })

vim.api.nvim_create_user_command('GeestGenerateZip', function()
float_term('python admin.py generate-zip', { title = ' Generate ZIP ' })
end, { desc = 'Generate plugin ZIP' })

vim.api.nvim_create_user_command('GeestInstall', function()
float_term('python admin.py --qgis-profile GEEST2 install', { title = ' Install Plugin ' })
end, { desc = 'Install plugin to QGIS profile' })

vim.api.nvim_create_user_command('GeestUninstall', function()
float_term('python admin.py --qgis-profile GEEST2 uninstall', { title = ' Uninstall Plugin ' })
end, { desc = 'Uninstall plugin from QGIS profile' })

vim.api.nvim_create_user_command('GeestSymlink', function()
float_term('python admin.py --qgis-profile GEEST2 symlink', { title = ' Symlink Plugin ' })
end, { desc = 'Symlink plugin to QGIS profile' })

vim.api.nvim_create_user_command('GeestGenerateRepoXml', function()
float_term('python admin.py generate-plugin-repo-xml', { title = ' Generate Repo XML ' })
end, { desc = 'Generate plugin repository XML' })

vim.api.nvim_create_user_command('GeestBundleDeps', function()
float_term('python admin.py bundle-deps', { title = ' Bundle Dependencies ' })
end, { desc = 'Bundle vendored dependencies (h3, etc.)' })

vim.api.nvim_create_user_command('GeestCleanExtlibs', function()
float_term('python admin.py clean-extlibs', { title = ' Clean Extlibs ' })
end, { desc = 'Clean vendored dependencies' })

vim.api.nvim_create_user_command('GeestReleaseDraft', function()
float_term('gh release create --draft --generate-notes', { title = ' Draft Release ' })
end, { desc = 'Create draft GitHub release' })

vim.api.nvim_create_user_command('GeestReleaseList', function()
float_term('gh release list', { title = ' Releases ' })
end, { desc = 'List GitHub releases' })

vim.api.nvim_create_user_command('GeestTagList', function()
float_term('git tag -l --sort=-v:refname | head -20', { title = ' Tags ' })
end, { desc = 'List recent tags' })

vim.api.nvim_create_user_command('GeestTagCreate', function()
vim.ui.input({ prompt = 'Tag version (e.g., v2.0.1): ' }, function(tag)
if tag and tag ~= '' then
vim.ui.input({ prompt = 'Tag message: ' }, function(msg)
if msg and msg ~= '' then
float_term(string.format('git tag -a %s -m "%s" && echo "Tag %s created. Push with: git push origin %s"', tag, msg, tag, tag), { title = ' Create Tag ' })
end
end)
end
end)
end, { desc = 'Create annotated tag' })

-- Register with which-key under <leader>p (Project)
local wk_ok, wk = pcall(require, 'which-key')
if wk_ok then
wk.add({
{ '<leader>p', group = 'Project' },
-- QGIS launchers
{ '<leader>pq', group = 'QGIS' },
{ '<leader>pqq', '<cmd>GeestQgis<cr>', desc = 'Launch QGIS' },
{ '<leader>pqd', '<cmd>GeestQgisDebug<cr>', desc = 'Launch QGIS (debug)' },
{ '<leader>pqe', '<cmd>GeestQgisExperimental<cr>', desc = 'Launch QGIS (experimental)' },
{ '<leader>pql', '<cmd>GeestQgisLtr<cr>', desc = 'Launch QGIS LTR' },
-- Pre-commit / Quality
{ '<leader>pc', group = 'Checks' },
{ '<leader>pcc', '<cmd>GeestPrecommit<cr>', desc = 'Pre-commit (all files)' },
{ '<leader>pcs', '<cmd>GeestPrecommitStaged<cr>', desc = 'Pre-commit (staged)' },
{ '<leader>pcd', '<cmd>GeestDocstrings<cr>', desc = 'Check docstrings' },
{ '<leader>pce', '<cmd>GeestEncoding<cr>', desc = 'Check encodings' },
-- Tests
{ '<leader>pt', '<cmd>GeestTests<cr>', desc = 'Run tests' },
-- Clean
{ '<leader>px', group = 'Clean' },
{ '<leader>pxc', '<cmd>GeestClean<cr>', desc = 'Clean build artifacts' },
{ '<leader>pxp', '<cmd>GeestRemovePycache<cr>', desc = 'Remove __pycache__' },
-- Translations
{ '<leader>pi', group = 'i18n' },
{ '<leader>pic', '<cmd>GeestCompileStrings<cr>', desc = 'Compile strings' },
{ '<leader>piu', '<cmd>GeestUpdateStrings<cr>', desc = 'Update strings' },
-- Git
{ '<leader>pg', group = 'Git' },
{ '<leader>pgs', '<cmd>GeestGitStatus<cr>', desc = 'Status + recent commits' },
{ '<leader>pgd', '<cmd>GeestGitDiff<cr>', desc = 'Diff' },
{ '<leader>pgl', '<cmd>GeestGitLog<cr>', desc = 'Log (graph)' },
{ '<leader>pgg', '<cmd>GeestLazygit<cr>', desc = 'Lazygit' },
-- Build & Package
{ '<leader>pb', group = 'Build' },
{ '<leader>pbb', '<cmd>GeestBuild<cr>', desc = 'Build plugin' },
{ '<leader>pbz', '<cmd>GeestGenerateZip<cr>', desc = 'Generate ZIP' },
{ '<leader>pbi', '<cmd>GeestInstall<cr>', desc = 'Install to QGIS' },
{ '<leader>pbu', '<cmd>GeestUninstall<cr>', desc = 'Uninstall from QGIS' },
{ '<leader>pbs', '<cmd>GeestSymlink<cr>', desc = 'Symlink to QGIS' },
{ '<leader>pbx', '<cmd>GeestGenerateRepoXml<cr>', desc = 'Generate repo XML' },
{ '<leader>pbd', '<cmd>GeestBundleDeps<cr>', desc = 'Bundle dependencies' },
{ '<leader>pbc', '<cmd>GeestCleanExtlibs<cr>', desc = 'Clean extlibs' },
-- Release
{ '<leader>pr', group = 'Release' },
{ '<leader>prd', '<cmd>GeestReleaseDraft<cr>', desc = 'Draft GitHub release' },
{ '<leader>prl', '<cmd>GeestReleaseList<cr>', desc = 'List releases' },
{ '<leader>prt', '<cmd>GeestTagList<cr>', desc = 'List tags' },
{ '<leader>prn', '<cmd>GeestTagCreate<cr>', desc = 'Create new tag' },
-- Misc
{ '<leader>pv', '<cmd>GeestGource<cr>', desc = 'Gource visualization' },
{ '<leader>pp', '<cmd>GeestTerm<cr>', desc = 'Floating terminal' },
{ '<leader>pl', '<cmd>GeestLogTail<cr>', desc = 'Tail GEEST log' },
})
end

vim.notify("GEEST: Project commands and <leader>p menu loaded", vim.log.levels.INFO)
6 changes: 6 additions & 0 deletions docs/userguide/datacollection.md
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,12 @@ While the above table showcases data specific to Saint Lucia, similar data can b
8. <strong>Mapillary</strong>: A collaborative platform that offers street-level imagery contributed by users worldwide. Mapillary data includes vector data on street crossings, sidewalks, and public lighting, making it useful for place-based and accessibility assessments.
</p>

## Data Attribution and Citation

GeoE3 may use external datasets and services depending on the selected workflows and user-provided inputs. Typical sources include OpenStreetMap, OpenRouteService, GHSL (European Commission JRC), Ookla Open Data, Space2Stats, ACLED, and VIIRS Nighttime Lights.

When sharing outputs, always verify and include the relevant provider attribution, citation text, and license/terms for the datasets actually used in your analysis.


### Instructions for Data Collection:
- **Query the Source**: Use the query instructions provided in the table to filter and collect specific data.
Expand Down
Loading
Loading