Publish curated GeoIntel source from e92b13f5511700f5410671ee9dd7476efa584d8c

This commit is contained in:
Public Source Publisher committed 2026-09-30 10:07:30 +00:00
1 parent 0aae654d6e
commit 6189612863
22 files changed
+669 -591

No files matched your search

+1 -1
View File
@@ -1,3 +1,3 @@
# Public source export # Public source export
This source snapshot was generated from the private canonical repository at revision `ac977bcd4b7b08bcce38edac2bcb9b05da0555ed`. It contains no private Git history or operational evidence. Changes are published from the canonical repository. This source snapshot was generated from the private canonical repository at revision `e92b13f5511700f5410671ee9dd7476efa584d8c`. It contains no private Git history or operational evidence. Changes are published from the canonical repository.
+140 -85
View File
@@ -1,26 +1,26 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"sourceRevision": "ac977bcd4b7b08bcce38edac2bcb9b05da0555ed", "sourceRevision": "e92b13f5511700f5410671ee9dd7476efa584d8c",
"files": [ "files": [
{ {
"path": ".dockerignore", "path": ".dockerignore",
"sha256": "525f8df7c473d7e50a23cb1ea34689a0ec9775c6e2e473af60e694a905ba2c0a", "sha256": "d6ef949ac81b034249bf8907a47d7fba1265e3cde0abd679a0884f321a57143a",
"bytes": 1116 "bytes": 1059
}, },
{ {
"path": ".env.example", "path": ".env.example",
"sha256": "2cb8c1cf2bfa9303217055251f550ee28b41ba93a2bd225a3a1b3c8fa4ef918f", "sha256": "501d5b3581a95f3671159e0828857e29f063b9e7e68c461f9a36f32ab1b484ca",
"bytes": 8878 "bytes": 8669
}, },
{ {
"path": ".gitattributes", "path": ".gitattributes",
"sha256": "8892e1aba7186571981ece777fbf9fa5dce07cbece89452c809cf519cf2230b6", "sha256": "4e368134014b280cf7228a8e43f3988c0905003c9d5fc92ce6b9f7e9cea61619",
"bytes": 428 "bytes": 411
}, },
{ {
"path": ".gitignore", "path": ".gitignore",
"sha256": "e43f0019c9f81f804755d0a2152d3e6ff48a65ff38dbd517b1682a32f7a9517a", "sha256": "17f709e5866701e38b3c1a10431f572d44a87f52e7f9da5562dd448ec53d4c6e",
"bytes": 1265 "bytes": 1197
}, },
{ {
"path": ".gitleaks.toml", "path": ".gitleaks.toml",
@@ -34,18 +34,18 @@
}, },
{ {
"path": "LICENSE", "path": "LICENSE",
"sha256": "2238305037ae93110d0ca331c81dd0e12b739fa2fda8a6486a39ec13e2f733ce", "sha256": "0641afa02003bd63e0974cf112624ab401ff7b61004bab6c44d45f95e1d0b7cf",
"bytes": 11549 "bytes": 11348
}, },
{ {
"path": "Makefile", "path": "Makefile",
"sha256": "ae9ab022cdd490375c8a08afe726ebc5fddb6c881406e60013d0c63764071a26", "sha256": "2e65188ac375b6c34762496c04dced970334325a63a7d74a7a48451b962d893d",
"bytes": 1045 "bytes": 995
}, },
{ {
"path": "README.md", "path": "README.md",
"sha256": "45257f75658fbc3ce46c3ee82438b363f7fb6c0a1130187f8d7256d86f5b07a9", "sha256": "650316a7f7a185bb0100d48e5cf092b4b624d6e3066e54f827f7aab0ee95b481",
"bytes": 651 "bytes": 4394
}, },
{ {
"path": "SECURITY.md", "path": "SECURITY.md",
@@ -54,13 +54,13 @@
}, },
{ {
"path": "VERSION", "path": "VERSION",
"sha256": "4ca8bbd3c595ee306226c6996b32b8d47a900217c55a7ed0cfc868ee444f34f1", "sha256": "59854984853104df5c353e2f681a15fc7924742f9a2e468c29af248dce45ce03",
"bytes": 7 "bytes": 6
}, },
{ {
"path": "backend/.dockerignore", "path": "backend/.dockerignore",
"sha256": "f946db7420ef136172ac82a6f5e1e03538b8715457527746a46eb7ef1efa8427", "sha256": "059bcf78088a08539b107f2fb2b4fe96e70e9e3e780d24691e28783bef3fc01c",
"bytes": 146 "bytes": 134
}, },
{ {
"path": "backend/.gitkeep", "path": "backend/.gitkeep",
@@ -89,8 +89,8 @@
}, },
{ {
"path": "backend/alembic/script.py.mako", "path": "backend/alembic/script.py.mako",
"sha256": "f109ea3dbd6c2ad06d0d9fd3beb875194fdff681e9d141575d49fd416e943baa", "sha256": "6a5ce92388f95d583aeaec7e4d6cfee91f71df26cad516100b6275b75427fbbf",
"bytes": 359 "bytes": 339
}, },
{ {
"path": "backend/alembic/versions/202601110001_initial.py", "path": "backend/alembic/versions/202601110001_initial.py",
@@ -984,28 +984,28 @@
}, },
{ {
"path": "backend/pyproject.toml", "path": "backend/pyproject.toml",
"sha256": "a796054de7bd2ca6e1328151e5eace0d59dcbd0153273588b1b051f67408e78b", "sha256": "616e61389aaab9d325926558f290959fdff338f60a30ebdb25f24255e77d295e",
"bytes": 1136 "bytes": 1156
}, },
{ {
"path": "backend/requirements-ai-linux.lock", "path": "backend/requirements-ai-linux.lock",
"sha256": "d219496969ea781dab461a1ff396e7ebe7a5bc516e4cfd86739eb99036e3cc9d", "sha256": "2361d7748b02f8da4055b54ab5deff5df4a9a5a12aeca9f2736debbf89e3d92d",
"bytes": 5784 "bytes": 5725
}, },
{ {
"path": "backend/requirements-build-tools.lock", "path": "backend/requirements-build-tools.lock",
"sha256": "57942999e9e41a1cd2e49071c0e38830f4c844fd4566627f74b8158b97883ab5", "sha256": "6932e4e0bc14d3226bb33013508522124e205cf57cfb183d989faf4e28611c71",
"bytes": 354 "bytes": 350
}, },
{ {
"path": "backend/requirements-ci.lock", "path": "backend/requirements-ci.lock",
"sha256": "e492dbe9f60c33403840e66ed9e0967016fec28a5d7cfac6b87a979a6ef4c8a6", "sha256": "e8a908f7c8ce2556d7cb9019e056a292fc41de84c67332cfa31b35feeee7ad36",
"bytes": 126127 "bytes": 139649
}, },
{ {
"path": "backend/requirements-runtime.lock", "path": "backend/requirements-runtime.lock",
"sha256": "dda6efcaebb0dab60a081c4dae377f3065318f04b053e9a6a33dfe75fa13bd44", "sha256": "c04d6b4b81e3077bc134844b0dfb6ca141c21f8e936e66909c2a937c80541807",
"bytes": 122359 "bytes": 120817
}, },
{ {
"path": "backend/scripts/cleanup_demo_artifacts.py", "path": "backend/scripts/cleanup_demo_artifacts.py",
@@ -1804,8 +1804,8 @@
}, },
{ {
"path": "backend/tests/test_sprint177_mol_primary_focus.py", "path": "backend/tests/test_sprint177_mol_primary_focus.py",
"sha256": "95f85a7eefcbd59ad146623d20999c092f4629752ed3af46541fe19590edfad2", "sha256": "d2b895c6e648ffff0324dc14b9298faa8d47b55f6f5dc8675b361e9a03cd108a",
"bytes": 2658 "bytes": 2584
}, },
{ {
"path": "backend/tests/test_sprint178_mol_operational_pack.py", "path": "backend/tests/test_sprint178_mol_operational_pack.py",
@@ -2244,8 +2244,8 @@
}, },
{ {
"path": "backend/tests/test_sprint66_live_workspace_smoke_polish.py", "path": "backend/tests/test_sprint66_live_workspace_smoke_polish.py",
"sha256": "27b2abda1d14eb9e25ed5dda7ff929021e38741bdb524329360a0eed72f2e470", "sha256": "052012b2963c90fbfe5886d6646369e35debf35c692f649399add78a0cc0ad7d",
"bytes": 723 "bytes": 860
}, },
{ {
"path": "backend/tests/test_sprint67_map_empty_state_quick_actions.py", "path": "backend/tests/test_sprint67_map_empty_state_quick_actions.py",
@@ -2499,8 +2499,8 @@
}, },
{ {
"path": "contracts/api/examples/area_create.geojson", "path": "contracts/api/examples/area_create.geojson",
"sha256": "2e3b437d732a057e895b15d1e1f196ee1c93b5ab2706dcee2dd2f0ddef88f493", "sha256": "e383785715e19820fe68552fec4ec724fc2807d9d4059b7c382ca91a4e6c873e",
"bytes": 208 "bytes": 200
}, },
{ {
"path": "contracts/api/examples/error_feature_disabled.json", "path": "contracts/api/examples/error_feature_disabled.json",
@@ -2537,6 +2537,61 @@
"sha256": "db34a08cfa4e2f57f93074b16e3dad01060170d7826d854b915733dab760c856", "sha256": "db34a08cfa4e2f57f93074b16e3dad01060170d7826d854b915733dab760c856",
"bytes": 12485 "bytes": 12485
}, },
{
"path": "docs/ASSET_PROVENANCE.md",
"sha256": "05fa2e8423e6009aa20f3354a97bd6baa910f778885757dd221c702b71fae468",
"bytes": 1593
},
{
"path": "docs/assets/portfolio/geointel-ai-pytorch-pipeline.png",
"sha256": "d51523428e1ab8556bb984cec17667ff952d49c78c0085c4f918bdc961a1ed76",
"bytes": 64790
},
{
"path": "docs/assets/portfolio/geointel-architecture.png",
"sha256": "4d9c5042300dc353528d961b2d4eabb6d9122d1ace193b50477efece04a833da",
"bytes": 68211
},
{
"path": "docs/assets/portfolio/geointel-interactive-project-chain.gif",
"sha256": "f46157c4e41c4d4b0c31f2e61238d58478de3858b3fc8cb0a2c77bd844743dff",
"bytes": 818739
},
{
"path": "docs/assets/portfolio/geointel-interactive-story.png",
"sha256": "4df1ce6dbaeb07740e71e56eb406d73927a33fb33c4a6cf18ce24ad7efd59b48",
"bytes": 74151
},
{
"path": "docs/assets/portfolio/geointel-landing-hero.png",
"sha256": "e3208861b92c7f79ab115069cdb9fd45a0b8bf5634d0837a90b637cde3293107",
"bytes": 84864
},
{
"path": "docs/assets/portfolio/geointel-landing-mobile.png",
"sha256": "2dc5438850e1c52d5d148ef6a90e153325f85b8fcbc154153e393e6df8130fe4",
"bytes": 49068
},
{
"path": "docs/assets/portfolio/geointel-workbench-map.png",
"sha256": "537e9bd8e6d8d8026ccadd25b27fae84284906810116c630c4ec0b571edfcf6f",
"bytes": 127125
},
{
"path": "docs/assets/portfolio/geointel-workbench-mobile.png",
"sha256": "6756469329b5eae08b2a647014293785bf6f14e594ce6341df9ff66567b29fdb",
"bytes": 36184
},
{
"path": "docs/assets/portfolio/geointel-workbench-quality.png",
"sha256": "6688f509c15d4c89746d7489f1a61db185823e018cd5a8380ace5e88e22df565",
"bytes": 108723
},
{
"path": "docs/assets/portfolio/geointel-workbench-wide.png",
"sha256": "b8353f3bbfc9b85f396f54d1b122339e5e715e3da7335a1ae97fcfc62e696507",
"bytes": 194448
},
{ {
"path": "fixtures/accuracy/p4/protected-baseline-cases.json", "path": "fixtures/accuracy/p4/protected-baseline-cases.json",
"sha256": "c49a9c8d74cae2062552b012d9c275f65156c81d75b3e453860f5b859c1c5473", "sha256": "c49a9c8d74cae2062552b012d9c275f65156c81d75b3e453860f5b859c1c5473",
@@ -2564,13 +2619,13 @@
}, },
{ {
"path": "fixtures/geojson/predicted_buildings_fixture.geojson", "path": "fixtures/geojson/predicted_buildings_fixture.geojson",
"sha256": "9c17ab96aa0a3d38e7c41b6ea997be1fbdd20742dd91a47bf6f714b280519a81", "sha256": "b25beefdae1566b79fb0e140c8a1a08c62c87ca714508ba5290a61efe3ec9113",
"bytes": 1430 "bytes": 1355
}, },
{ {
"path": "fixtures/geojson/reference_buildings_fixture.geojson", "path": "fixtures/geojson/reference_buildings_fixture.geojson",
"sha256": "3b8531317e489de0537fcdc012c414dc679fa86ae98e81f1e699844c2ee9de8a", "sha256": "6e9ce746cd7d8b7200c3d7a5db7e599ea10f8cefc2622e4321de1435074b49a7",
"bytes": 1416 "bytes": 1341
}, },
{ {
"path": "fixtures/golden/expected_qa_metrics.json", "path": "fixtures/golden/expected_qa_metrics.json",
@@ -2584,48 +2639,48 @@
}, },
{ {
"path": "fixtures/golden/predicted_buildings.geojson", "path": "fixtures/golden/predicted_buildings.geojson",
"sha256": "0d839e1b99dabf82c145b2596711380cb40ab09c3cf4e7e20f102044b896d695", "sha256": "6cb966306dd9537516756d59df2faf8d33f5a8b24c80ce74510b04a118ee8b78",
"bytes": 1027 "bytes": 979
}, },
{ {
"path": "fixtures/golden/predicted_buildings_multipolygon.geojson", "path": "fixtures/golden/predicted_buildings_multipolygon.geojson",
"sha256": "66239ff17aa6b12a045fa3f50f51ffa34f833e6d23e6fc371ee40505a16ee3ae", "sha256": "b30bdbf632a01774604d47a806559aeb05499559c7e57f23a0a3e042fe787ffc",
"bytes": 870 "bytes": 832
}, },
{ {
"path": "fixtures/golden/predicted_buildings_no_overlap.geojson", "path": "fixtures/golden/predicted_buildings_no_overlap.geojson",
"sha256": "1b013c840e4947a2ea701f34ab138de5a803dedd8519d93d373706425b5e960c", "sha256": "191fb94250075084db0a9c5ce20510bf9ea249575a2cd6c22a9bfe485edab33c",
"bytes": 593 "bytes": 566
}, },
{ {
"path": "fixtures/golden/predicted_buildings_perfect.geojson", "path": "fixtures/golden/predicted_buildings_perfect.geojson",
"sha256": "fd6858ff7cab9202351f6dd3321ae5d926ce44ee73991aeaac6a760281c385b5", "sha256": "8a0b43fc21e39b5a9a34220425d8a93cc802fa48e201bef0d7c31c5acadfc8e8",
"bytes": 584 "bytes": 557
}, },
{ {
"path": "fixtures/golden/reference_buildings.geojson", "path": "fixtures/golden/reference_buildings.geojson",
"sha256": "4939bd3f70c0ecae70b4ee7ba7845f4f5d43a722cbad3685caac83944e37e152", "sha256": "f1bdc374e509e568730fa3e1f04264b57df57a4315e26121897a7e2d2acbbe20",
"bytes": 1017 "bytes": 969
}, },
{ {
"path": "fixtures/golden/reference_buildings_multipolygon.geojson", "path": "fixtures/golden/reference_buildings_multipolygon.geojson",
"sha256": "e386cab34cf1e8b2c56c518054a06c41fb0d868216a4d970df651f1496675b1b", "sha256": "935d51d16142ee79ed51fd4f5c36ee87df9fae1ef7532646a668a758fdd29e93",
"bytes": 876 "bytes": 838
}, },
{ {
"path": "fixtures/golden/reference_buildings_no_overlap.geojson", "path": "fixtures/golden/reference_buildings_no_overlap.geojson",
"sha256": "a51d08a722ed3f7dc1468021d281fbfbf1f85f53a33fd271c4c7ff039258c036", "sha256": "91f1acab37fd1f896d5787c58cee0f8b443bbc67c8dd5ddecb4864ed2f7dcc02",
"bytes": 599 "bytes": 572
}, },
{ {
"path": "fixtures/golden/reference_buildings_perfect.geojson", "path": "fixtures/golden/reference_buildings_perfect.geojson",
"sha256": "06ed98f29d1240521a89ea64fc14502f93337e792c6ee82a5d0cd914c7a3ae3b", "sha256": "c3f96e058dbe64e8b091b58a9e93ad0116669616fd71b21b9440de8a0aea32a4",
"bytes": 590 "bytes": 563
}, },
{ {
"path": "frontend/.dockerignore", "path": "frontend/.dockerignore",
"sha256": "e9027d6888736ab962d9c429413de11a2b2265c643c1661b945c3200f5f7a806", "sha256": "d2da2be7efe5a0846fb43296ba292bc77077553ec0f157df9fa31290aac44e3c",
"bytes": 91 "bytes": 82
}, },
{ {
"path": "frontend/.gitkeep", "path": "frontend/.gitkeep",
@@ -2664,33 +2719,33 @@
}, },
{ {
"path": "frontend/e2e/releaseJourneys.mjs", "path": "frontend/e2e/releaseJourneys.mjs",
"sha256": "d829cf60ee0615714adf45ec351649e70eb04c8fc3c58a54b30a662c25605907", "sha256": "112620c05dfed0b44ebcbca9e97ba237b294648beb43c424f231d22b59d36b98",
"bytes": 23260 "bytes": 22762
}, },
{ {
"path": "frontend/e2e/uxAudit.mjs", "path": "frontend/e2e/uxAudit.mjs",
"sha256": "543540ebf4ae9d894a33219897deb50a7313b5d138fb274dee4bda7c9642989f", "sha256": "c413b76f66ee32b2198ed9b2a30ccbe1d2c73f687e15831205936303cf1b1659",
"bytes": 19631 "bytes": 19209
}, },
{ {
"path": "frontend/index.html", "path": "frontend/index.html",
"sha256": "afde0c92c72549df75ac564277963234e9900e706e34c5b1bc966d8bcf73d108", "sha256": "9bd1e26d90499ca4c0bbe14a7d0df26ecce6f4cfd493724fcbeafebc2128e8ec",
"bytes": 730 "bytes": 713
}, },
{ {
"path": "frontend/nginx.conf", "path": "frontend/nginx.conf",
"sha256": "51b3daf714defba5761413cb77717be4acf6d682f4ad6681f246966f1cd68aa1", "sha256": "685b9e830c13aaa2a08be8420de3d3b51cb4c0780a620743160a0c043f9aa6b5",
"bytes": 2838 "bytes": 2755
}, },
{ {
"path": "frontend/package-lock.json", "path": "frontend/package-lock.json",
"sha256": "057e7df4f11898730d3068e573f4a8f9141bc027c1dce28fc7820141babed1f2", "sha256": "bf952804817eb6725f0d6c289f5cc6eb3029f118ad5296169974b7ab85ded2d8",
"bytes": 119979 "bytes": 110543
}, },
{ {
"path": "frontend/package.json", "path": "frontend/package.json",
"sha256": "dac9052ed2ab13783c7612908010461037dfa998fd5726db18d93548e621d801", "sha256": "83b9c173c13cc99c4a628913e319aa0b5cbcf21fd27d9b5c677456ba518448d2",
"bytes": 989 "bytes": 991
}, },
{ {
"path": "frontend/public/geointel-icon-180.png", "path": "frontend/public/geointel-icon-180.png",
@@ -2704,8 +2759,8 @@
}, },
{ {
"path": "frontend/public/geointel-icon.svg", "path": "frontend/public/geointel-icon.svg",
"sha256": "75bf4e80c8986369816765e3d8d9a30b40df9d16834954646e1ad6b25d5b0462", "sha256": "23bafecb7ee870025440df650500f2ac95038f5d51edabb3adc6dd783bca7d9a",
"bytes": 1737 "bytes": 1711
}, },
{ {
"path": "frontend/public/itworx-wordmark.webp", "path": "frontend/public/itworx-wordmark.webp",
@@ -2754,8 +2809,8 @@
}, },
{ {
"path": "frontend/src/components/GeoMap.tsx", "path": "frontend/src/components/GeoMap.tsx",
"sha256": "0151a302b0e06ebd2a3c4f9f9ef97c4462ab635b278a6a8ab3ff1ebd80dbfea4", "sha256": "29bd76c182f616f588074505896d8008a974827a7447a315291cad2c63588d4c",
"bytes": 25333 "bytes": 25465
}, },
{ {
"path": "frontend/src/components/WorkbenchStatusStrip.test.tsx", "path": "frontend/src/components/WorkbenchStatusStrip.test.tsx",
@@ -3674,13 +3729,13 @@
}, },
{ {
"path": "tests/fixtures/data-contracts/vector-building-valid.geojson", "path": "tests/fixtures/data-contracts/vector-building-valid.geojson",
"sha256": "2c3bc30b46bae04eec031037d763446af7529e32ba250c9885f755a035b12df2", "sha256": "fc310197be7f4b9e21b01bf528af0ea4f418a6fa4a3d3ee1b6be9ff28b7f972c",
"bytes": 486 "bytes": 462
}, },
{ {
"path": "tests/fixtures/data-contracts/vector-lambert-mislabelled-as-4326.geojson", "path": "tests/fixtures/data-contracts/vector-lambert-mislabelled-as-4326.geojson",
"sha256": "663452ad70370b93dc9519eaf43945e1ce8355afd29378d4e374eeee03ac40dc", "sha256": "21d9ff7cb6dccc5fc54c00a06f5ac9f1029de0ca2499ecd864d52821137d957f",
"bytes": 501 "bytes": 477
}, },
{ {
"path": "tests/fixtures/geojson/README.md", "path": "tests/fixtures/geojson/README.md",
@@ -3689,18 +3744,18 @@
}, },
{ {
"path": "tests/fixtures/geojson/aoi_geel_demo.geojson", "path": "tests/fixtures/geojson/aoi_geel_demo.geojson",
"sha256": "d06a5dea8aa21666ce59864a3c9ccabe13ce3b4aa8661e8db4d025faaafb79da", "sha256": "b2acab90d8a4f222c6b68b51f4ea902bfddb266a396f13cf0e384a2b176662fd",
"bytes": 288 "bytes": 275
}, },
{ {
"path": "tests/fixtures/geojson/detected_buildings.geojson", "path": "tests/fixtures/geojson/detected_buildings.geojson",
"sha256": "87587d4e28e628bfc74bf79124e1825fe2cfb42eae1af144f5b9a7b15b2d93b1", "sha256": "a3b063d2224cde8ea711d364b65b2002eedbfbb88b76bb7f912ef3ff1eb44941",
"bytes": 496 "bytes": 489
}, },
{ {
"path": "tests/fixtures/geojson/reference_buildings.geojson", "path": "tests/fixtures/geojson/reference_buildings.geojson",
"sha256": "2a8768a0fed3b1f5f5119149b3f0d0cb2ff54d557e73615fac5d936fc44fcc00", "sha256": "c70dfbb2fedef5dbc1da9f610e9b59c8f541c965e8c5a39a9ba6c9e2fd882f95",
"bytes": 449 "bytes": 442
}, },
{ {
"path": "tests/fixtures/geospatial/.gitkeep", "path": "tests/fixtures/geospatial/.gitkeep",
+62 -4
View File
@@ -1,7 +1,65 @@
# GeoIntel · public source # GeoIntel
GeoIntel is a GeoAI workbench for Belgium and the Belgian North Sea. This repository is the curated public source snapshot. The private canonical repository contains development history and operational material; public updates are generated from reviewed source revisions. <p align="center"><img src="frontend/public/geointel-icon-180.png" width="88" alt="GeoIntel icon"></p>
<p align="center"><strong>Evidence-first geospatial analysis for Belgium and the Belgian North Sea.</strong></p>
<p align="center"><a href="#explore-the-workbench">Workbench</a> · <a href="#what-it-does">Capabilities</a> · <a href="#quick-start">Quick start</a> · <a href="#technical-overview">Architecture</a></p>
The source includes a FastAPI backend, a React frontend, API contracts, tests, and synthetic geospatial fixtures. See `docker-compose.yml` and `.env.example` for local setup. AI models and external geospatial data providers must be configured separately. GeoIntel combines official geospatial sources, map-based analysis, computer vision, QA/QC and reproducible exports. A saved result carries its source, spatial context, model revision and review evidence. The application covers Belgium and the legally distinct Belgian North Sea zones without hiding differences between regional source datasets.
Licensed under [LICENSE](LICENSE). Report vulnerabilities using [SECURITY.md](SECURITY.md). Mol and the Kempen remain golden regression areas for the Belgium-wide workbench; they do not limit its geographic scope.
![GeoIntel demo landing page](docs/assets/portfolio/geointel-landing-hero.png)
## Explore the workbench
The following captures use public or synthetic demonstration content. Select an official boundary or draw an area of interest, choose compatible layers, run an analysis, inspect object-level evidence, and export the reviewed result.
| Map workbench | Quality review |
| --- | --- |
| ![Area selection and source layers](docs/assets/portfolio/geointel-workbench-map.png) | ![QA/QC results and object evidence](docs/assets/portfolio/geointel-workbench-quality.png) |
The mobile workbench keeps the same analysis context on a narrow screen. [Asset provenance](docs/ASSET_PROVENANCE.md) describes these captures and project artwork.
<p align="center"><img src="docs/assets/portfolio/geointel-workbench-mobile.png" width="300" alt="GeoIntel mobile workbench demo"></p>
## What it does
- **Source-aware mapping:** official boundaries, vector and raster layers, orthophotos, regional and maritime sources, and explicit coverage.
- **Spatial analysis:** coordinate-system normalization, clipping, buffering, joins and raster statistics.
- **Governed GeoAI:** PyTorch, YOLO and SAM-compatible model workflows with immutable revisions and release gates.
- **Quality before publication:** precision, recall, F1, IoU, false-positive and false-negative evidence, plus human review.
- **Traceable output:** reproducible GeoJSON and artifacts linked to the selected area, input versions and model revision.
Model detections are reviewable proposal evidence until the relevant release gate passes. Official footprints are not assumed to be perfect image labels; temporal validity and spatial leakage are checked during training and calibration.
## Quick start
Requirements: Docker Engine with Compose. From the repository root:
```bash
docker compose up --build
```
Open <http://localhost:1202>. The development stack uses Python 3.11+, Node 20.19+ or 22.12+, and PostgreSQL/PostGIS. Set `GEOINTEL_AUTH_ENABLED=true` and explicitly opt in with `GEOINTEL_GUEST_ACCESS_ENABLED=true` only for a dedicated public-data demo. Guest sessions are short-lived and project-bound; administration and uploads remain restricted.
## Technical overview
```mermaid
flowchart LR
Web[React, TypeScript and MapLibre] --> API[FastAPI]
API --> GIS[GeoPandas, Shapely and Rasterio]
API --> Jobs[PostgreSQL job queue]
Jobs --> AI[PyTorch inference]
GIS --> DB[(PostgreSQL and PostGIS)]
AI --> DB
DB --> QA[QA and provenance]
QA --> Web
```
Configured AI inference can use NVIDIA/CUDA and fails closed when a required accelerator is unavailable. A deployment needs persistent PostGIS and artifact storage, authentication, HTTPS, health checks, backups and a tested restore path. Do not place private model weights, credentials or operational exports in this repository.
For source checks, run `python -m compileall backend/app`, the backend pytest suite, and the frontend typecheck, unit tests and build. `backend/` contains the API and spatial workflows; `frontend/` contains the UI; `contracts/` contains shared interfaces; `fixtures/` contains safe examples.
## Public-source provenance
This is a reviewed content-only export from a private canonical repository. `PUBLIC_SOURCE_MANIFEST.json` records the source revision and hashes; private Git history is absent. GeoIntel is licensed under [Apache 2.0](LICENSE). See [SECURITY.md](SECURITY.md) for vulnerability reporting.
+2 -2
View File
@@ -17,7 +17,7 @@ dependencies = [
"pyproj>=3.6.1", "pyproj>=3.6.1",
"python-multipart>=0.0.9", "python-multipart>=0.0.9",
"itsdangerous>=2.2.0", "itsdangerous>=2.2.0",
"PyJWT[crypto]>=2.10.1", "PyJWT[crypto]>=2.14.0",
"rdflib>=7.1,<8", "rdflib>=7.1,<8",
"alembic>=1.13.2", "alembic>=1.13.2",
] ]
@@ -39,7 +39,7 @@ ai = [
"ultralytics>=8.3,<9", "ultralytics>=8.3,<9",
"torch>=2.4", "torch>=2.4",
] ]
dev = ["pytest>=8.3.2", "httpx>=0.27.0", "httpx2>=2.0.0", "ruff>=0.6.9"] dev = ["pytest>=8.3.2", "httpx>=0.27.0", "httpx2>=2.0.0", "requests>=2.34.2", "ruff>=0.6.9"]
[project.scripts] [project.scripts]
geointel-backend = "app.main:main" geointel-backend = "app.main:main"
+188 -4
View File
@@ -4,7 +4,7 @@
# #
# pip-compile --extra=dev --extra=gis --generate-hashes --no-index --output-file=requirements-ci.lock --strip-extras pyproject.toml # pip-compile --extra=dev --extra=gis --generate-hashes --no-index --output-file=requirements-ci.lock --strip-extras pyproject.toml
# #
# geointel-input-sha256: e1dd11f5b30f4c8c902f33476282da48da386d36093cab68212edc69e75df8e3 # geointel-input-sha256: 6a94d4ca9742284c1999971e00877b765d987c551b536fd1e15c146a8626f292
affine==2.4.0 \ affine==2.4.0 \
--hash=sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92 \ --hash=sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92 \
--hash=sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea --hash=sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea
@@ -42,6 +42,7 @@ certifi==2026.6.17 \
# pyogrio # pyogrio
# pyproj # pyproj
# rasterio # rasterio
# requests
cffi==2.1.1 \ cffi==2.1.1 \
--hash=sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e \ --hash=sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e \
--hash=sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66 \ --hash=sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66 \
@@ -144,6 +145,180 @@ cffi==2.1.1 \
--hash=sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4 \ --hash=sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4 \
--hash=sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264 --hash=sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264
# via cryptography # via cryptography
charset-normalizer==3.5.2 \
--hash=sha256:01077390b03f7988f11d700a2194e69b119741a86b1a638b1db88891e3eced8e \
--hash=sha256:01b0c0d2262a9e28e8484a278c7e1b5d650e3ac8cf2683d2967e25899f208bdf \
--hash=sha256:04851f73ae72b8413dddadb16a49dfee95263553741fd42d546f7d66907e6be5 \
--hash=sha256:0521c5665880b33d603717defa76c094048900010897909952397feb3039da56 \
--hash=sha256:0774bf9bf620249fee3e0b8b9fd3065de213be30f3aa94ce2494b3b638949e26 \
--hash=sha256:0891b9d3903c5571c03771ca669a4b0ec5618ca722a5c957d3d29cd4e5062848 \
--hash=sha256:0c951d5e6dd9c2ff60609476752bee49da4206adde960ebc247766937f72e718 \
--hash=sha256:0fed1d06615f022ee3b13caf5e8b180cfea32bb2c5aded8a9d44277afc040f93 \
--hash=sha256:114e4d0c92d618409ed82a99e22b5c5e768fe995f2973f78265f4524f49d4640 \
--hash=sha256:11912e4bb14baae7c5d8791aa55ba0a3a03ec6729073307b0f57270abaa713d3 \
--hash=sha256:11a4d68a6ecda3292cb1e50239e111543ba5d709bb62a6b4ea1afcfa729d8875 \
--hash=sha256:124fbf1a8ff966d87ae05bb8bd45a71f966055ed8bba320d0c7cf450bc5f4d0e \
--hash=sha256:1461ac396c4fdb983a675f20aa555624f0ee18ac83d832b9244ffff3d8055275 \
--hash=sha256:1503bccbeb36d5527790c3930327704c39af22de3112f1b1666a9f3ce15ee204 \
--hash=sha256:15bb4005af6320d259dc7593ca84a38d7fe06a421dbcf7b910ae23979101e787 \
--hash=sha256:15c44f7edfd477b06f517a5cc317fc1707edb9de2c865f43d4b6513907473234 \
--hash=sha256:16fa0eccf81304b79c5cd87f9271c3b85dd9dd99245e4422ae9c0dd45e0f99d3 \
--hash=sha256:183b88127acdb4fabe59d951ab424faf1af7b63cdbb5f776186c1ea2ffcaed98 \
--hash=sha256:195c26fb65950f8fce54e26349852b7bdd7c5f120aeefbcc440b8a20faaed4a3 \
--hash=sha256:1afb975bd5d68d5ce9f6b6d44fdf2f7e34b895a35e95708a7a91b20a3b51d187 \
--hash=sha256:1b4cbc7c3491ccb4aa17fcd8165649d01cf39f76de1696da8631b5f71b85401d \
--hash=sha256:1bc0baf5ef96b6ede57d47f4b8fe4d9d84019c3bfcbeb20a41edc6a6ee341f1f \
--hash=sha256:1c50fe28bbc2ced33386f298650d91218076c05420e6cbd790b913adc41659e7 \
--hash=sha256:1db38f4c5496827c1a501846d64d14c3b80c7e6714e406cd7dc36a9899fa1011 \
--hash=sha256:211d5a3eb6af8f513b8d4ca19a8c1b7accab1b5f0d3175f9826b03c1a920dc1f \
--hash=sha256:23851fb4e1b85ed3f6c2a27b777cdfe2e19fb5b38429a8faf38c7542b7665869 \
--hash=sha256:254eb48b9fa5ee9898a3c445825a1f340fe53712a098904b39b0bddba8ea3cb1 \
--hash=sha256:2625388c6c754520c37abaf3b41eb34d1cc4a373f457898f08606c8e362b891d \
--hash=sha256:281cb91036248400f4cc957495cccd44c275c2e0c5854f7e45ac5cf7dc193847 \
--hash=sha256:28a15fdad492a99b6eccfaaed66ef3f74050680545ea61ec8b2f4c538f1f1320 \
--hash=sha256:28b4f0d66fb834ff90f28209ac7bce77868c45d8c93e26f906709d9b7c2e1af9 \
--hash=sha256:2a925889534b3748302dae5dead07cc13480de1dac3aea80a941b729b471ef93 \
--hash=sha256:2b7b3bbfb4fe8ef40600792d762fbaa9057559f9d3fad209525b7a22b99e91fd \
--hash=sha256:2c9ad19a6cfcd5ea5c0d41161d22f9df1dcc277e9bef2751391334546a314c00 \
--hash=sha256:2cc961b171b3f3440f410489ab3573e86aea8736134ebbb40ea1338b7f0831bc \
--hash=sha256:2ce45c6627b22c47e390bc91a41c3d13032192e699fa0bea96e9671b373d69b0 \
--hash=sha256:2e06a3a98f916dd41d27f3105e02e7a40181c98c94b9158733d03a6f80506c09 \
--hash=sha256:304d5463e65a35d7bb0850550e0780395395f6fcf452f04db7d5ca7cecc425ac \
--hash=sha256:304d8e4d493af723536393eee0c689eb7813f4a474c8b479dee63f1fdd98f621 \
--hash=sha256:30fcd120b732aa79317f08dee04d7de0847822e4cf7ee0e9f445bb958832252c \
--hash=sha256:31f3930700408d211f13378ccbe1c40845d8da54bd0681fac3a9b5aae81c7aa8 \
--hash=sha256:34276fd796040bf0993ab33a369aa572e6979c7aab225a88893667ad8eac8f7a \
--hash=sha256:355ad8011081dec5412240c087a9a0c9d4d5039f3ed11a3f13e18c2b29b56c51 \
--hash=sha256:38a873987f3be698494da8b2e3085e29da02da7b633dce73e79c699a113d7bf0 \
--hash=sha256:39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef \
--hash=sha256:3d14b50de6bf4d0edf857a9386836846f982b8f524e188e2e68b96d702bcf4aa \
--hash=sha256:3d21b8b13c7592db2ac5e544a6d83187b995257472b0c9e8351b6d507ae37ed6 \
--hash=sha256:3d31298449090ab8d47b7b1b2a555ff73cac7ed438a08b7ac160980c7ebed649 \
--hash=sha256:3ddacd27458c45bdacd6bd6db644bfb730efbf9e830310186e3045c9c5be8fb2 \
--hash=sha256:3df041de8887954562c9b261cba85ca0e9ded74048daf125f45edcfaa4832229 \
--hash=sha256:40ab6bffa02ae10a0581e6c198be7d2d8ca5c2a0c64e4ed3465d766df457573e \
--hash=sha256:4275811936e2f06feff5e598fb42a1b7ae852da8e39605211892b56b81a34efd \
--hash=sha256:443eae2bf318abeaf6f15d785138f71fd6de770e99a92158b8b814265e079115 \
--hash=sha256:447441e76ec720b15e64418d32e092297340387053047c7c694f579efb0ee1d9 \
--hash=sha256:4495c5002a7b28557e7e222e77e0b661183e432b7d6d2e788101e3f240e05b8c \
--hash=sha256:44bd4fbb29dfbeba60e7d2bd000c59e4b21ddb3cc53912b14048d37092706d7c \
--hash=sha256:4685902cf26edf013ed7a3da0f426ebba7a00ebb9541386d835afbf002c11cab \
--hash=sha256:498dc3188ca05a68231ac3fdbfc7f57eb67e1343c30e0fea17f8218c1599b253 \
--hash=sha256:4c2b5031f63e331e3839b40aed2dd6f191e9c07edbde303e7876846ea1946995 \
--hash=sha256:4d48f2d08b9de5864e2c8744d4461b862fb149a18274abc8b698c45975573438 \
--hash=sha256:4f87960d57feabfb618e4e0af6e7371645fa26a277860739d6e5d6e0012c92f0 \
--hash=sha256:50e3adfb96fc189eb27b1cf62d3b598b89b4bb0420d93a3d3e42e137409011be \
--hash=sha256:51cf45226a9b588d0d2b4880c62d686934b63ab0bd79ca23ab0e9762eb27441b \
--hash=sha256:52aa6992700996af31f375de0c6bacd402b0097fe40b53c426b9f51a90ebabc7 \
--hash=sha256:55ea99acb17b9325618de155a0cd6a2e8f5d10be008113e1d433bbb58db543b2 \
--hash=sha256:56bc200a365efb37383b7852e4cc5898d3b2da5987289b543956cf8cad71018a \
--hash=sha256:588461c2e8384d309bd63e5826019b6977bc66d629b99ac8737bb795d7b2cb5a \
--hash=sha256:58ca3755ee7ff7f59b57789ec9833c9de9ea275405cdd240eda1f193112e398a \
--hash=sha256:58f361dcbab699cf8f42db3f47c8e7fd1036f138c23a5d08de9fde5f425a730c \
--hash=sha256:598a11a2c7ebaa5334bf698bf29568c9c390abac6a154d8170fedecd1cea38c5 \
--hash=sha256:59f63901b0031c3136cf64704dcb21de0bbae62ce2c9529bc39d27665463de37 \
--hash=sha256:5cde776b7cc66e4f6c99612cea4aa7269aa65863f7a15841b2c264f103822f4e \
--hash=sha256:5e2b6b57e9733d39f0c9fd3185efa6b8e29652c4cd8fe94180272cf6ed9a78c4 \
--hash=sha256:5fb29fb8cd1a46c27a1bf9613ad5ec2599310d46b4025d9556404a6b6a292800 \
--hash=sha256:6045373d5a89a5ec71afde535db987ca28e76dfa276c2d4c818265b375d4b055 \
--hash=sha256:619799369eeef6366ed3e8755a5670f4f2f0fb6b30a0fd7264dc0fdc2357058e \
--hash=sha256:62588a277bfb59def052abd940703fa35107152bf479781a878617d60faf8fb5 \
--hash=sha256:62603db9a7caa0802eaa28c1c46fecd7b3a263a774069c24c3c28c302448721c \
--hash=sha256:65cd72beeeca9d3aaea1201e5923859f308f952f9c71de93f06063c79f0f7a3b \
--hash=sha256:68eb192d85ab8e5f6ec69c2bc6ac0179fbf04a5ac1569d12fbef74883fe102d0 \
--hash=sha256:6bd128f206a7752ae1f2ab6c61bf8a24ba28913a10df8b14c2637b973ff97a80 \
--hash=sha256:6be488a102b8cf28d0391d8c4ba7748938ae28b78ad901f8585520fca33ead1a \
--hash=sha256:7218e8f32b0956cfcd048fd42d9d5779809745ca1d86113ca56f66e7ae1549c4 \
--hash=sha256:7441d755b7ab94f8d4eb3e43ec05482d760842fd263d003a99102d742cd835e2 \
--hash=sha256:749e97e1b32313717a565abbe321bc2190bc8b35f1a67e4cdbc7c56c8d8ffe58 \
--hash=sha256:75a3ceed0724d625d64b86ca20aba182e4df462e04c2414fc941c0f523f06aac \
--hash=sha256:780fbe7cab297b81dad9fb8dc5eb003c0468ffb0d9e5f65068c53a34661a96bc \
--hash=sha256:78456a747de8dc58360ffa581f30a002baf5aa28cb262536545e91f113ed7639 \
--hash=sha256:7967d08cf06dee78443b874f98c98036f624f3a4e73e11f9f64f5be4d25393cf \
--hash=sha256:7a881931aa470808df94a8c380eed2bbbc76cd9dc622310f99665658c821eb6d \
--hash=sha256:7dcd882da75ef9adf94903b1e3b9419e8aa8fb4c7396822b834b9ef7fb96954f \
--hash=sha256:7e841fb9010836c992c9f12fcbd43a831de93a5f726fc1ccd8ca1d0268c5014c \
--hash=sha256:7fdde2c9fd9e3eca40631e024664cf2584272cc8f96308cbe5fdfc930f51d8bc \
--hash=sha256:8024d00c3faf3fc0c16e07a69f4405e8eac7cc0ab15f65fe6cf43827c4cf72b4 \
--hash=sha256:80d02b6f04e92601a081dd97b23d3128033098bff5d35d392ddcc0476ea11253 \
--hash=sha256:838dcc90063569a0448120554591a1d6c4a4ffe11babf048908793154ab86ade \
--hash=sha256:849df64e889b2e17230d58410a03dba311a65b163508fd33679b2b737d4b7858 \
--hash=sha256:87475fabc8d9996fd9c27debb395e642e8c838d78a00b6e932227a0e06b81e26 \
--hash=sha256:87e50a3e7cb90af586b6c5faf23e302a970415ac73bd7bd90a515a04b427ef96 \
--hash=sha256:89b53f3cda69831909888e0494f4fa0bcd3537e3e138dabeb620bd6ad946bae8 \
--hash=sha256:8a893cc101149f80a653f82062ebc95b34525a2614382e1da5458fe7c6997249 \
--hash=sha256:8b2bfab86aa71ae13aa41a6a26aab338e0db2b8bc75434b05aea89e011ff35a4 \
--hash=sha256:8d86d6fc60743dc916eb79e2eb1ec4818e21e427731543af40a3021851174a13 \
--hash=sha256:915563965d418f986e7e145accc592eae9e1a1be3566ff98a05d7a9ec42a76e1 \
--hash=sha256:92888bb3187c5ba50500b00b3b310c9f2c651709d28036077680cb5255450a03 \
--hash=sha256:93223adc95033dd47133a46ccfc316a0139176fd79085762e27202ec56018f03 \
--hash=sha256:9373ad13ef0d2c0fb761e04e55bfdee5a08b52cef2c882c8fbe9935b1517152e \
--hash=sha256:9409a8bf35cf78353942504b24a57de3d75b708997a1e4bd8db71ac8633ce364 \
--hash=sha256:9b7f416ff0978e2f2249330527f0ad6fa02f4932e6199692d3b52da2048c19e4 \
--hash=sha256:9bde855991b7e362c146535e3136a50bfaffc0487d38b33ca7e5edefc6e23849 \
--hash=sha256:9cae88599c7219005d879f98e5ed53341e9a122af585e1091200358a3003d2a0 \
--hash=sha256:9cf9b1a857e25c4baceeb3624e92a56df3668f398c4acba74e174d81fb4d1d3a \
--hash=sha256:9f56f72050826f63dcee7a7f55b0a77168cb3bfc553fd405e7f8f9ece75a4036 \
--hash=sha256:a090bb2c68df85450502e3e20d665e3a5af9c65a84d6508ed477badd49166fd3 \
--hash=sha256:a192e2c40070d92c3ccf777e3a5c4ff515573cd2bb7ed0c537fdadbbec5bbf21 \
--hash=sha256:a19a731138fc27d5682277d3b9df22855cea1239bce7fcec5f78f42ef2d1f3c3 \
--hash=sha256:a66c3bc5ab1f0ff2164fc9965ddd611ff0802173f4b9d24554c563f6ab7e1d6e \
--hash=sha256:a815775b6c38d4e0ff7bcffbeba67feded90202bb6a226b8dd35f1c855217413 \
--hash=sha256:a89012d6d5476ee112d20d998570ed58df2260a852afb1758809cd6900411d21 \
--hash=sha256:ae4f5fea5b8b8ccff88238cc8569303e5ee95efae67fa62922a311397a71f346 \
--hash=sha256:b6856554c4f44d79fc2307d5768854310a8f0096e501c75637542c82292b0429 \
--hash=sha256:b6b751274acb69d77b3323d6b7dbaa3c7fdfc1eb829b7eb61d262f32e1af9685 \
--hash=sha256:b736353c0a625bbd5fcec108576e2385db3496f4f771f785ff32e108d3c3bc45 \
--hash=sha256:b7fd005a73d9e657273b7a10dc71a9e03c8fb9ee6999798d6918ce095b81ac7f \
--hash=sha256:b91363207bd9dc966a691e959bb47f64b30f7ac4b072be9968b366982f7db77c \
--hash=sha256:ba0b1d2620edf869789c3879223f52bf2afc5d31b3cb47cc57b3a12c05e2aa9d \
--hash=sha256:bbbfc8e28816f19d7c0f1816664980c0a9875d01b27cdf8eedddb639d9e108ad \
--hash=sha256:bd16aabe4a02a297c23417aa17ac6299dbd8c49f673bcd645b4929b11f5a4400 \
--hash=sha256:c0afc6800ba57ccc350374c5bd6150419915d95ce93cdbab2d783d75eaf30ecb \
--hash=sha256:c6708715abcf3c73b99508253e961a9967f02fe536532834149574eda6de0d1c \
--hash=sha256:c7c9ab723cde841fefb34efbad91e87f00a674b1fe1cd0784fde742bf2c154dc \
--hash=sha256:c8f3d67aeaf55f017982b73683f0e7342ba2f6635a78f69ce89ebb26aa411e5c \
--hash=sha256:c9790464842f85f437dbbb54417eda1e0e6bfc52dd8d22d6fd1c994b73b2dc74 \
--hash=sha256:ca403d7e4798f525fdfc78e258820419cbbd0f0ecbab9de7840e3c017cf6b8cf \
--hash=sha256:d008d90a7f2471519aef0c90dfbe73b3e6e4d5e66ac48e19154c17e89e98b604 \
--hash=sha256:d19fbd981a488e22cd04883659ca6b08f50b5974f9fd7c95655ef6a043e5893f \
--hash=sha256:d1befeed746d247c81127bb14de9dc3d30edb6e5976d34f83f86ed262b1d9105 \
--hash=sha256:d2374b62878abb00cd8309b32af6c0b715cd02dec0ca74ef12e5069bdc64144a \
--hash=sha256:d376bbd28b3a8999db1a103b3b388aee6f1ddeb3e51bc2172993efdcd86e064d \
--hash=sha256:d4a7319f304a774bed22115bc891618e45f85065ab44ea6acd07d274e750519a \
--hash=sha256:d6734d2ef8a50fbf8445c139477da401f50d62a0606bf00e20ec6d87773fefb1 \
--hash=sha256:d760fe2a4d7c3b226cb9026d6a842868d52a7901bd98420e1baf14e80da85cf5 \
--hash=sha256:d913de495d90407cd859d263bee2e5d1a4ed3eb6573c04e70d9ec619a7cbed7f \
--hash=sha256:db19d07e2e0129e974a0e65d0064fc222a446cd5122c2fd4184d2af9fc734a9e \
--hash=sha256:dca9ab98072a5a54ebacebdc45f53e645336b320c667410b061be1ca588ae709 \
--hash=sha256:ddc7dacc8ece3a182e7f15cb862d1fd616b46d076cb1ae9dd232b2c38b655874 \
--hash=sha256:ddf19c062bea7a0cc80f519243d2c01dd091be0cf952a0750d4ad576709559f5 \
--hash=sha256:def79fa35ef0cef8d2accec024f4fdc7ead3012ff02f5215c783f39f03ef8cfc \
--hash=sha256:df29a0a7107f7011e77f4eebdddec4c7331e24d787a0b21a46d63bdf7445da95 \
--hash=sha256:e09a3942ecbdee5cce73ea9d42da82b81b72ac1bf031ce069b93b5adf4eac8cd \
--hash=sha256:e242bb1c5e76e97dfa9e7f209a71e93a01d7f19ffdd5cfbb2e2d55b4f08f8ab0 \
--hash=sha256:e243bd13217235fc7290c621941c3f5cc8b66e4872495be821d7436ba2fb838d \
--hash=sha256:e2af3aad578aa6bd1384bcf4750fc285e5a9de53f40b7d41e5a0bf748edeb2b3 \
--hash=sha256:e4e81e09c1578b8df602e3db08b0b3ea0a6947ad612f52bf8dc5ea8d47691f0c \
--hash=sha256:e54da4baf05720032d527874d40b65fa4d7e5c6c6a43d0c3adbeffcaf275a2b3 \
--hash=sha256:e80e6c2f55656b4824d72065abb4ddd6a525c74bd78a0aab5d9fc2cf4fb5af50 \
--hash=sha256:ed2a239c0ea213acc1908150a3037257083c7c083128f1a4cec2ec4b97dca491 \
--hash=sha256:ed905975ab14056a2e5eb1c376cb2e1ebc5396baf84163939c518556fccde9f5 \
--hash=sha256:ee21e28f0430bd6dc9086c6e525d5e818a44a5ad19720c8a0ef766792f3eb5e5 \
--hash=sha256:ee43c17b173d46a3212baa6ead3ae258eeabdae48c263a01ccf0218c366dd655 \
--hash=sha256:ef4fcbf3327382cd4c9f540babd61248208af7b93eec4de397b4d5f58a09e288 \
--hash=sha256:eff0ac9dbe711a4aee69bf04a83896aa9b85f19641264053a9f6d48573abb7dd \
--hash=sha256:f0aa869112ef88429ae17820d99c3dd9504c9e9c671d3c246f3d7442cb051084 \
--hash=sha256:f3c96f633825733f735c5a9cf21d21a257d8e1edf0b1cee0a064b9c424ca0f7d \
--hash=sha256:f5833ad231be5eb6553de524a70f48d71b2c8563101750531e0b80184e175cd4 \
--hash=sha256:f5ec61164adcec446f8969a3358ec3f9b26bbda3b9213e5586d219afa8df2915 \
--hash=sha256:f7d486c83842422badd511868fd8a9a20e9407ace71564b6af47ce7e60a336c1 \
--hash=sha256:fb9e68df06293761f9fe66ade60a9bc6d0f5e42b8acf2939a9158af86ab0e5bd \
--hash=sha256:fc14a032f813bf5fe624d991960ea83e9715adc27e4c1830a2361eb1d02ac341 \
--hash=sha256:fcff63213e8e6e47770541a4607175404f47cbb3ebea7b6058cc82d524a0e424 \
--hash=sha256:fd1fbe0f116b6e55da77aca2c6ddcddcfac2186cbf78bdebf40fc156efca389d \
--hash=sha256:fe9753dfee015c570d73df76f899f18444d41388bffcde097deba51c4fadbb9f
# via requests
click==8.4.2 \ click==8.4.2 \
--hash=sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6 \ --hash=sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6 \
--hash=sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76 --hash=sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76
@@ -383,6 +558,7 @@ idna==3.18 \
# anyio # anyio
# httpx # httpx
# httpx2 # httpx2
# requests
iniconfig==2.3.0 \ iniconfig==2.3.0 \
--hash=sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730 \ --hash=sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730 \
--hash=sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 --hash=sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12
@@ -919,9 +1095,9 @@ pygments==2.20.0 \
--hash=sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f \ --hash=sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f \
--hash=sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176 --hash=sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176
# via pytest # via pytest
pyjwt==2.13.0 \ pyjwt==2.14.0 \
--hash=sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423 \ --hash=sha256:77283c83fb56ecf566a886c757a714bc83668e38156de2cce8263302f42e0b86 \
--hash=sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728 --hash=sha256:ad0cef71c756a56e74863c2919cf0985f72decbcfcb550ee2f422e7c62b5eedc
# via # via
# geointel-backend (pyproject.toml) # geointel-backend (pyproject.toml)
# pyjwt # pyjwt
@@ -1154,6 +1330,10 @@ rdflib==7.6.0 \
--hash=sha256:30c0a3ebf4c0e09215f066be7246794b6492e054e782d7ac2a34c9f70a15e0dd \ --hash=sha256:30c0a3ebf4c0e09215f066be7246794b6492e054e782d7ac2a34c9f70a15e0dd \
--hash=sha256:6c831288d5e4a5a7ece85d0ccde9877d512a3d0f02d7c06455d00d6d0ea379df --hash=sha256:6c831288d5e4a5a7ece85d0ccde9877d512a3d0f02d7c06455d00d6d0ea379df
# via geointel-backend (pyproject.toml) # via geointel-backend (pyproject.toml)
requests==2.34.2 \
--hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \
--hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed
# via geointel-backend (pyproject.toml)
ruff==0.15.22 \ ruff==0.15.22 \
--hash=sha256:11c1c715af53a09f714e011106bffc419751ec8232fcb5da42173284ea3fec6f \ --hash=sha256:11c1c715af53a09f714e011106bffc419751ec8232fcb5da42173284ea3fec6f \
--hash=sha256:1877d63b9d24ed278744f1523fd11b85540566d54641f97c566d7d9dc5ca5296 \ --hash=sha256:1877d63b9d24ed278744f1523fd11b85540566d54641f97c566d7d9dc5ca5296 \
@@ -1335,6 +1515,10 @@ typing-inspection==0.4.2 \
# fastapi # fastapi
# pydantic # pydantic
# pydantic-settings # pydantic-settings
urllib3==2.8.0 \
--hash=sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3 \
--hash=sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63
# via requests
uvicorn==0.51.0 \ uvicorn==0.51.0 \
--hash=sha256:5d38af6cd620f2ae3849fb44fd4879e0890aa1febe8d47eb355fb45d93fe6a5b \ --hash=sha256:5d38af6cd620f2ae3849fb44fd4879e0890aa1febe8d47eb355fb45d93fe6a5b \
--hash=sha256:f6f4b69b657c312f516dd2d268ab9ae6f254b11e4bac504f37b2ab58b24dd0b0 --hash=sha256:f6f4b69b657c312f516dd2d268ab9ae6f254b11e4bac504f37b2ab58b24dd0b0
+4 -4
View File
@@ -4,7 +4,7 @@
# #
# pip-compile --extra=gis --generate-hashes --no-index --output-file=requirements-runtime.lock --strip-extras pyproject.toml # pip-compile --extra=gis --generate-hashes --no-index --output-file=requirements-runtime.lock --strip-extras pyproject.toml
# #
# geointel-input-sha256: 30318170074aad9b91f570cccc574eaaad0eded5814a464d1207a94d2e1d3317 # geointel-input-sha256: 2e1bf366b76c576b2d17fba2a7841e4442a7480528fe0329a4c784401a4c5c8e
affine==2.4.0 \ affine==2.4.0 \
--hash=sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92 \ --hash=sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92 \
--hash=sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea --hash=sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea
@@ -880,9 +880,9 @@ pydantic-settings==2.14.2 \
--hash=sha256:a20c97b37910b6550d5ea50fbcc2d4187defe58cd57070b73863d069419c9440 \ --hash=sha256:a20c97b37910b6550d5ea50fbcc2d4187defe58cd57070b73863d069419c9440 \
--hash=sha256:c19dd64b19097f1de80184f0cc7b0272a13ae6e170cbf240a3e27e381ed14a5f --hash=sha256:c19dd64b19097f1de80184f0cc7b0272a13ae6e170cbf240a3e27e381ed14a5f
# via geointel-backend (pyproject.toml) # via geointel-backend (pyproject.toml)
pyjwt==2.13.0 \ pyjwt==2.14.0 \
--hash=sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423 \ --hash=sha256:77283c83fb56ecf566a886c757a714bc83668e38156de2cce8263302f42e0b86 \
--hash=sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728 --hash=sha256:ad0cef71c756a56e74863c2919cf0985f72decbcfcb550ee2f422e7c62b5eedc
# via # via
# geointel-backend (pyproject.toml) # geointel-backend (pyproject.toml)
# pyjwt # pyjwt
@@ -1,6 +1,6 @@
from pathlib import Path from pathlib import Path
from tests.frontend_contract import read_feature
from tests.frontend_contract import read_feature
ROOT = Path(__file__).resolve().parents[2] ROOT = Path(__file__).resolve().parents[2]
@@ -53,8 +53,7 @@ def test_product_docs_record_national_scope_and_mol_regression_focus() -> None:
readme = (ROOT / "README.md").read_text(encoding="utf-8") readme = (ROOT / "README.md").read_text(encoding="utf-8")
vision = (ROOT / "docs" / "PRODUCT_VISION.md").read_text(encoding="utf-8") vision = (ROOT / "docs" / "PRODUCT_VISION.md").read_text(encoding="utf-8")
# The README is Dutch; assert the two claims it must make, not one phrasing. assert "Belgian North Sea" in readme
assert "Belgische Noordzee" in readme assert "Mol and the Kempen" in readme and "golden regression areas" in readme
assert "Mol en de Kempen" in readme and "regressiegebieden" in readme
assert "Belgie en de Belgische Noordzee" in vision assert "Belgie en de Belgische Noordzee" in vision
assert "Mol en de Kempen blijven gouden regressiegebieden" in vision assert "Mol en de Kempen blijven gouden regressiegebieden" in vision
@@ -1,6 +1,5 @@
from pathlib import Path from pathlib import Path
ROOT = Path(__file__).resolve().parents[2] ROOT = Path(__file__).resolve().parents[2]
@@ -14,8 +13,9 @@ def test_export_handoff_cards_use_width_aware_grid() -> None:
def test_public_readme_documents_desktop_and_mobile_workspace() -> None: def test_public_readme_documents_desktop_and_mobile_workspace() -> None:
readme = (ROOT / "README.md").read_text(encoding="utf-8") for path in (ROOT / "README.md", ROOT / "public-source" / "README.md"):
readme = path.read_text(encoding="utf-8")
assert "geointel-workbench-wide.png" in readme assert "geointel-workbench-map.png" in readme
assert "geointel-workbench-quality.png" in readme
assert "geointel-workbench-mobile.png" in readme assert "geointel-workbench-mobile.png" in readme
assert "Mobiele werkruimte" in readme assert "mobile workbench" in readme.lower()
+32
View File
@@ -0,0 +1,32 @@
# Asset provenance and redistribution
The visual files distributed with GeoIntel were created for this project and
are released by the repository owner with the source under Apache-2.0. They do
not include private operator data, proprietary model weights, unpublished
imagery, or a bundled third-party geospatial dataset.
## Project artwork
The original PNG masters in `frontend/design-assets/portfolio/` and their
optimized WebP derivatives in `frontend/public/portfolio/` are project artwork.
The WebP files are mechanical resizes of the corresponding masters; the
reproduction command is documented in `frontend/design-assets/README.md`.
## Product captures and generated documents
Files in `docs/assets/portfolio/` are captures or diagrams of the GeoIntel
public-demo interface using synthetic/public demonstration content. The case
study at `output/pdf/geointel-case-study.pdf` is generated from repository
sources by `scripts/create_portfolio_case_study.py`.
Any provider name, logo, map attribution, or dataset title visible inside a
capture remains the property of its respective owner and is included only to
identify the source or reproduce the application's attribution UI. This
repository does not relicense or redistribute the underlying provider data.
## Integrity
Release review verifies these paths through the repository's normal Git object
hashes and the public-release gate. Regenerated derivatives must come from a
tracked master or reproducible repository source; do not replace them with
unlicensed stock material, private screenshots, or local operator exports.
Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 800 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

+226 -479
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -22,7 +22,7 @@
"@fontsource/manrope": "^5.3.0", "@fontsource/manrope": "^5.3.0",
"@fontsource/public-sans": "^5.3.0", "@fontsource/public-sans": "^5.3.0",
"lucide-react": "^1.25.0", "lucide-react": "^1.25.0",
"maplibre-gl": "^4.7.1", "maplibre-gl": "^6.11.2",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0" "react-dom": "^18.2.0"
}, },
@@ -35,6 +35,6 @@
"playwright": "^1.61.1", "playwright": "^1.61.1",
"typescript": "^5.5.4", "typescript": "^5.5.4",
"vite": "^7.3.6", "vite": "^7.3.6",
"vitest": "^3.2.6" "vitest": "^4.1.11"
} }
} }
+4 -1
View File
@@ -1,5 +1,6 @@
import { useEffect, useRef, useState } from 'react' import { useEffect, useRef, useState } from 'react'
import maplibregl from 'maplibre-gl' import * as maplibregl from 'maplibre-gl'
import maplibreWorkerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url'
import type { ExpressionSpecification } from '@maplibre/maplibre-gl-style-spec' import type { ExpressionSpecification } from '@maplibre/maplibre-gl-style-spec'
import 'maplibre-gl/dist/maplibre-gl.css' import 'maplibre-gl/dist/maplibre-gl.css'
import { NATIONAL_MAP_CENTER, NATIONAL_MAP_ZOOM } from '../config/primaryFocus' import { NATIONAL_MAP_CENTER, NATIONAL_MAP_ZOOM } from '../config/primaryFocus'
@@ -7,6 +8,8 @@ import { featureCollectionBounds } from '../lib/geojsonBounds'
import type { MapImageOverlay, MapViewportState, VectorSelectionBBox } from '../types' import type { MapImageOverlay, MapViewportState, VectorSelectionBBox } from '../types'
import { basemapGround, basemapPaint, huidigeWerkstand, mapSymbology } from './map/mapSymbology' import { basemapGround, basemapPaint, huidigeWerkstand, mapSymbology } from './map/mapSymbology'
maplibregl.setWorkerUrl(maplibreWorkerUrl)
interface GeoMapProps { interface GeoMapProps {
data: GeoJSON.FeatureCollection | null data: GeoJSON.FeatureCollection | null
dataFillColor?: string dataFillColor?: string