Repository: devinit/ug-district-dashboard-viz
Pull request #470: Feature | Show marker popups on hover
Author: login: davidebukali
Created: 2025-03-28T10:13:14Z | Merged: 2025-04-25T18:05:34Z



Diff:
diff --git a/public/assets/data/kayunga/number_of_health_facilities.csv b/public/assets/data/kayunga/number_of_health_facilities.csv
new file mode 100644
index 00000000..8b59ee69
--- /dev/null
+++ b/public/assets/data/kayunga/number_of_health_facilities.csv
@@ -0,0 +1,35 @@
+﻿District,Subcounty/Towncouncil,Parish Name/ Ward,Village name/ cell,Name of the health facility/Clinic,Healthy center level,Facility Ownership,Officer In Charge,OIC's Phone Number,OIC Email,Services Provided at the Facility, Immunization Services,Maternal and Child Health Services,HIV/AIDS and TB Care,Basic Diagnostic Services,Counselling, Health Education, Family Planning Services,Advanced Surgical Procedures,"Outpatient Services e.g Treatment for common illnesses, minor injuries, and general health issues",Does the health facility have the iCCM HMIS?**, Monthly report forms (HMIS 097 VHT/ICCM report),Sick Patient Register for CHWs,Patient referral forms for CHWs,Available  infrastructure,Functional backup power,Laboratory,Treatment room, Consulting room, Staff accommodation,Reception,Waste disposal incinerator, Gate,Delivery room,Inpatient ward,How many of the following cadres are available at this health facility?**,Laboratory assistant, Laboratory technician, Medical officers, Nursing assistants,Clinical officer,Enrolled midwives,Nursing officers,VHTs/CHWs,Comprehensive enrolled nurse, Enrolled nurses,Health information Assistants,Does the health facility have stocks of the following supplies and logistics for iCCM?,Digital respiratory timers for diagnosis of pneum, Oral rehydration salts (ORS) sachets for management of diarrhoea, Zinc tablets for treating diarrhoea, Rapid diagnostic test (RDT) kits for malaria,ACT tablets for treatment of malaria,Amoxicillin tablets for treatment of pneumonia , Digital clinical thermometers for measuring fever,Where is the main water supply for the facility located?,What is the main water supply for the facility?,What type of toilets/latrines are at the facility for outpatients?,"Is there at least one usable improved toilet designated for women and girls, which provides facilities to manage menstrual hygiene needs?",Is there at least one usable improved toilet that meets the needs of people with reduced mobility?,Is there at least one usable improved toilet designated for staff?,Do toilets/latrines have handwashing facilities?,Health facility photo,Health facility photo_URL,Geo points,_Geo points_latitude,_Geo points_longitude,_Geo points_altitude,_Geo points_precision
+Kayunga,Kangulumira Towncouncil,Kangulumira,Kibira zone,Kangulumira Mission Health centre,HCII,Government,Kawala Phiona,78743837,,,Yes,Yes,No,Yes,Yes,Yes,No,Yes,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,No,Yes,Yes,,1,1,1,0,1,2,1,14,1,1,0,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,Yes,Yes,Yes,"Yes, With soap and water available",1740568419568.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F8273e91a-77cd-4ac3-979c-5d1b9c442663%2F1740568419568.jpg,0.5732044 33.0304758 1099.958 0.765,0.5732044,33.0304758,1099.958,0.765
+Kayunga,Kangulumira Towncouncil,Kangulumira,Kiwugu,Kangulumira Health centre,HCIV,Government,Dr Kigozi Karim Ssebagala,752692690,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,,2,2,4,7,1,5,7,74,0,7,1,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Piped supply outside the building,Pit latrine with slab,Yes,Yes,Yes,"Yes, With soap and water available",1740574740425.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2Fbbe0f4a2-1bf5-4789-bf21-a262f115bcca%2F1740574740425.jpg,0.5851346 33.0313998 1136.479 3.782,0.5851346,33.0313998,1136.479,3.782
+Kayunga,Kangulumira Towncouncil,Kangulumira,Kangulumira,Family Clinic,Clinic,Clinic,Lutaya Vicent,774042488,,,No,Yes,No,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,No,Yes,No,No,Yes,Yes,,1,1,1,0,1,1,0,0,0,1,0,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,Yes,Yes,Yes,"Yes, With soap and water available",1740576371580.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F2c764bd8-3cdf-4ee0-8bfc-2114e45c7fd0%2F1740576371580.jpg,0.584526 33.0251488 1091.869 2.999,0.584526,33.0251488,1091.869,2.999
+Kayunga,Kangulumira Subcounty,Kawomya,Kawomya,Kawomya Health centre,HCIII,Government,MUTESI MADINA,702881389,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,No,Yes,Yes,Yes,Yes,Yes,No,No,Yes,Yes,,0,0,1,0,1,1,1,56,0,1,1,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,Yes,Yes,Yes,"Yes, With soap and water available",1740643967062.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F271b795a-f597-4e20-b2c0-046341e6fb6b%2F1740643967062.jpg,0.526106 33.0516267 1129.299 0.779,0.526106,33.0516267,1129.299,0.779
+Kayunga,Kangulumira Subcounty,Kawomya,Namakandwa,Kangulumira I.H.P Health centre,HCII,Government,KHASASA ISAAC,704341262,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,No,Yes,Yes,Yes,No,Yes,Yes,No,No,Yes,,1,1,1,0,0,1,0,8,0,2,0,,Yes,Yes,Yes,Yes,Yes,Yes,No,On premises,Rain water,Pit latrine with slab,Yes,Yes,Yes,"Yes, With soap and water available",1740646751457.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F3129030f-07a0-4a57-9f78-e110ad0d0864%2F1740646751457.jpg,0.5431936 33.0647593 1104.559 1.718,0.5431936,33.0647593,1104.559,1.718
+Kayunga,Kangulumira Subcounty,Kawomya,Namakandwa,Suubi Medical Centre,HCII,Government,Dr SSEBUGWAWO JONATHAN,789980821,,,No,No,Yes,Yes,Yes,Yes,No,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,No,Yes,,0,1,1,0,2,0,0,4,0,3,0,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,Yes,Yes,Yes,"Yes, With soap and water available",1740647913802.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F11ac0dd7-7f6b-48cd-b945-7ff8253c8912%2F1740647913802.jpg,0.5416283 33.0601567 1055.843 0.969,0.5416283,33.0601567,1055.843,0.969
+Kayunga,Nazigo Towncouncil,Nazigo,Ssenda,Nazigo Health Centre,HCIII,Government,BAIGA MARIAM,782014924,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,Yes,No,,2,1,0,0,2,3,3,6,1,1,1,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Tube well / Borehole,Pit latrine with slab,Yes,Yes,Yes,"Yes, With soap and water available",1740654006762.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F1bbdda18-8f2a-4c3c-85df-37b92c3e6c8d%2F1740654006762.jpg,0.6502335 32.9883675 1109.283 1.408,0.6502335,32.9883675,1109.283,1.408
+Kayunga,Nazigo Towncouncil,Nazigo,Nazigo,Nazigo Mission Health Centre,HCII,Government,NALUGONDA SHARON,754201310,,,Yes,Yes,No,Yes,Yes,Yes,No,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,No,Yes,Yes,,0,1,1,0,1,1,0,10,1,0,1,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,Yes,Yes,Yes,"Yes, With soap and water available",1740656305113.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2Fdd422be4-7b42-44b9-80c9-5d74eef25c50%2F1740656305113.jpg,0.6383156 32.9952828 1119.675 1.667,0.6383156,32.9952828,1119.675,1.667
+Kayunga,Nazigo subcounty,Bukamba,Bukamba,Bukamba Health Centre,HCIII,Government,MOGA STANRY,754148721,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,No,Yes,Yes,Yes,Yes,Yes,No,Yes,Yes,Yes,,1,1,0,0,2,3,0,18,,3,1,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,Yes,No,No,"Yes, With soap and water available",1740660037671.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F0601fa91-98f6-4e41-a985-5bceba4ec0fa%2F1740660037671.jpg,0.7099486 33.017662 1109.027 0.887,0.7099486,33.017662,1109.027,0.887
+Kayunga,Nazigo subcounty,Kirindi,Kirindi,One Mama Initiative Uganda Health Centre,HCII,Government,Dr YIIGA ROGERS,754931568,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,,1,0,0,0,1,1,0,6,0,0,0,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1740664277641.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2Fc3dd03d5-0ffa-44f9-9981-8775d2d9a15d%2F1740664277641.jpg,0.6888529 33.0407277 1061.775 1.12,0.6888529,33.0407277,1061.775,1.12
+Kayunga,Kayunga Towncouncil,Kayunga central,Kayunga,Ziridamu Medical Centre,HCII,Government,Mugera stephen,702399701,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,No,Yes,No,No,Yes,Yes,,1,0,0,0,2,1,0,0,0,2,0,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Piped into yard/plot,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1740737682909.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F24d9c00b-1441-4452-bdfb-5660d6d29006%2F1740737682909.jpg,0.7013195 32.9064694 1080.333 2.352,0.7013195,32.9064694,1080.333,2.352
+Kayunga,Kayunga Towncouncil,Kayunga central,Kayunga,Jonathan medical centre,Clinic,Private,Dr SSEKYANZI JOB KAYONGO,742392871,,,No,Yes,Yes,No,Yes,No,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,No,Yes,No,No,Yes,Yes,,2,1,2,3,1,2,0,0,0,2,0,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Piped supply outside the building,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1740738780145.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2Fe126c018-7b88-43d9-843e-54744cea549c%2F1740738780145.jpg,0.7025557 32.9030037 1072.0 3.427,0.7025557,32.9030037,1072,3.427
+Kayunga,Kayunga Towncouncil,Kayunga central,Kayunga,Bakule clinic ,Clinic,Private,KAVULU DAVID,776859714,,,No,No,Yes,Yes,Yes,No,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,No,No,Yes,,0,1,1,0,3,0,0,0,0,1,0,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Piped supply outside the building,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1740739841818.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F8466a700-46ab-4c35-87a4-1e9eba1356cb%2F1740739841818.jpg,0.7021853 32.9025505 1091.031 6.153,0.7021853,32.9025505,1091.031,6.153
+Kayunga,Kayunga Towncouncil,Kayunga central,Kayunga,Namagabi Health Centre,HCII,Government,NAKIWALA ROSEMARY,784350606,,,Yes,Yes,Yes,Yes,Yes,Yes,No,No,Yes,,Yes,Yes,Yes,,No,No,Yes,Yes,Yes,Yes,No,No,Yes,Yes,,0,0,0,1,0,1,1,6,0,0,0,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1740746748943.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2Fbf4594a9-4b67-43c2-b60d-66de90d39886%2F1740746748943.jpg,0.7103339 32.9070862 1084.756 2.958,0.7103339,32.9070862,1084.756,2.958
+Kayunga,Kayunga Subcounty,Busaale,Busaale,Busaale Health Clinic,HCIII,Government,BYAKIKA PAUL,758662685,,,Yes,Yes,Yes,No,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,Yes,Yes,,1,1,0,0,3,2,0,15,0,1,1,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,Yes,No,No,"Yes, With soap and water available",1740748838305.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2Ff440b591-76f0-4e8f-b6fe-1fd810865d80%2F1740748838305.jpg,0.7535717 32.9212773 1093.971 1.372,0.7535717,32.9212773,1093.971,1.372
+Kayunga,Kayunga Subcounty,Nsotoka,Nsotoka,Nsotoka Health Centre,HCIII,Government,Bulaya Moses,772590503,,,No,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,No,Yes,No,No,Yes,Yes,,0,0,0,0,2,1,0,12,0,2,0,,No,Yes,Yes,Yes,Yes,Yes,No,On premises,Rain water,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1740751335183.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F8d67bc48-253e-4ad1-a882-ee40e961a40c%2F1740751335183.jpg,0.6718969 32.9605768 1100.421 0.771,0.6718969,32.9605768,1100.421,0.771
+Kayunga,Busaana Towncouncil,Kasana,Busaana,Busana Health Centre,HCIII,Government,Bayige Olivia,772667792,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,No,Yes,Yes,Yes,Yes,Yes,No,Yes,Yes,Yes,,2,1,0,0,2,2,1,50,0,4,1,,No,No,No,No,No,No,Yes,On premises,Rain water,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1740992852248.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2Fd559db6b-29fc-4b82-ba24-462d19a60470%2F1740992852248.jpg,0.7736671 32.9882184 1212.799 1.896,0.7736671,32.9882184,1212.799,1.896
+Kayunga,Busaana Subcounty,Namusala,Namusala,Namusaala Health centre,HCIII,Government,Katabazi Brian,704503253,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,No,Yes,No,,1,1,0,0,3,2,1,12,0,2,0,,No,No,No,No,No,No,Yes,On premises,Rain water,Pit latrine with slab,Yes,Yes,No,"Yes, With soap and water available",1740998139135.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F584af657-16aa-43ac-a857-7b97cb7d7cfc%2F1740998139135.jpg,0.8423602 33.0063509 1047.343 1.167,0.8423602,33.0063509,1047.343,1.167
+Kayunga,Busaana Subcounty,Kiwangula,Nakatovu,Nakatovu Health centre,HCIII,Government,YIGA JOSEPH,774126604,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,No,Yes,Yes,Yes,Yes,No,No,Yes,Yes,,0,0,0,0,2,1,0,15,0,1,0,,No,No,No,No,No,No,No,On premises,Rain water,Pit latrine with slab,Yes,No,No,"Yes, With soap and water available",1741003687292.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F23259d4f-5afe-40ff-94c8-c2a0faaacb8b%2F1741003687292.jpg,0.7145116 32.9675114 1072.879 1.524,0.7145116,32.9675114,1072.879,1.524
+Kayunga,Bbaale Subcounty,Bulawula,Bulawula,Bulawula Health Centre,HCII,Government,Balinda Dickson,770696747,,,Yes,Yes,Yes,Yes,No,No,Yes,No,Yes,,Yes,Yes,Yes,,No,Yes,Yes,Yes,No,Yes,No,No,No,No,,1,0,0,0,1,0,0,15,0,2,1,,No,No,No,No,No,No,No,On premises,Tube well / Borehole,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1741173553867.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F8d271489-bd23-4783-99b6-bb7cd79dff17%2F1741173553867.jpg,0.8444454 32.9595114 1066.79 0.669,0.8444454,32.9595114,1066.79,0.669
+Kayunga,Kayonza subcounty,Kamusabi,Lugasa West,Lugasa Health Centre,HCIII,Government,Nabukenya Juliet,702679165,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,Yes,,1,1,0,0,1,2,1,72,2,1,1,,No,No,No,No,No,No,Yes,On premises,Tube well / Borehole,Pit latrine with slab,Yes,Yes,Yes,"Yes, With soap and water available",1741175753494.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F36a3a0fe-0bc3-4c88-b178-f47c224f193b%2F1741175753494.jpg,0.8784972 32.8620981 1076.5999755859375 0.995,0.8784972,32.8620981,1076.599976,0.995
+Kayunga,Kitimbwa Subcounty,Nkokonjeru,Nkokonjeru,Nkokonjeru Health Centre,HCIII,Government,Mukiibi Ponsiano,754606364,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,No,Yes,Yes,,1,1,0,0,1,2,1,18,0,0,0,,No,No,No,No,No,No,Yes,On premises,Rain water,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1741171650511.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2Fc3f5d20b-5f47-43d4-9b89-cb430bc1f14d%2F1741171650511.jpg,0.8257772 32.9391819 1067.432 0.993,0.8257772,32.9391819,1067.432,0.993
+Kayunga,Kayonza subcounty,Nakyesanja,Kakiika,Kakiika Health centre,HCII,Government,Namudosi Aisha,779080001,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,No,No,Yes,Yes,Yes,Yes,No,No,No,No,,0,0,0,0,0,0,0,18,0,3,1,,No,No,No,No,No,No,Yes,On premises,Rain water,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1741178544374.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F2cc0524f-f8a5-413b-b361-69f402cbeb08%2F1741178544374.jpg,0.9466917 32.8307964 1048.998 1.965,0.9466917,32.8307964,1048.998,1.965
+Kayunga,Kayonza subcounty,Nakyesa ,Nakyesa,Nakyesa Health Centre,HCII,Government,Ssekago Geofrey,752082492,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,No,Yes,No,,0,0,0,0,0,1,0,50,1,2,0,,No,No,No,No,No,No,Yes,On premises,Rain water,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1741180597614.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F67f2edf4-6d06-4e4d-8f9a-bab3c867da23%2F1741180597614.jpg,0.9286738 32.8712684 1059.192 0.977,0.9286738,32.8712684,1059.192,0.977
+Kayunga,Bbaale Subcounty,Nakitokolo,Kabaku,Bbaale Health Centre,HCIV,Government,Dr kiyimba Daniel,759284772,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,Yes,Yes,,1,1,4,,4,4,3,80,0,4,2,,Yes,No,No,No,No,No,No,On premises,Rain water,Pit latrine with slab,Yes,No,No,,1741184058005.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2Fbe41c889-5dac-428c-9e3b-ad7c4ffcabf0%2F1741184058005.jpg,1.1054173 32.8857801 1078.800048828125 1.247,1.1054173,32.8857801,1078.800049,1.247
+Kayunga,Kitimbwa Subcounty,Kitimbwa,Wabwoko,Wabwoko Health Centre,HCII,Government,Nabbala Noah,700363665,,,Yes,Yes,Yes,No,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,No,Yes,Yes,Yes,No,Yes,No,Yes,Yes,Yes,,1,0,0,0,1,2,1,18,0,3,1,,No,No,No,No,No,No,No,On premises,Tube well / Borehole,Pit latrine with slab,Yes,No,Yes,"Yes, With soap and water available",1741189625253.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F5fd6a878-9cd7-463f-9909-26d71a988c83%2F1741189625253.jpg,0.8317126 32.8855115 1055.636 4.879,0.8317126,32.8855115,1055.636,4.879
+Kayunga,Kayunga Towncouncil,Central ward,Kayunga west,Fellowship medical clinic,Clinic,Clinic,Tusubira Lamec,759053413,lamechtusubira@gmail.com,,No,No,No,Yes,Yes,Yes,Yes,No,Yes,,Yes,no,no,,Yes,Yes,Yes,Yes,Yes,Yes,No,No,Yes,Yes,,1,0,0,2,1,0,0,0,0,1,0,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Piped supply inside the building,Flush / Pour-flush toilet to sewer connection,Yes,No,Yes,"Yes, With soap and water available",17412463815403902596903077857687-10_33_18.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F8accaf26-b8b1-4ca6-92a7-bf4faedba1cb%2F17412463815403902596903077857687-10_33_18.jpg,0.699192 32.905721 1065.0999755859375 72.9000015258789,0.699192,32.905721,1065.099976,72.90000153
+Kayunga,Kayunga Towncouncil,Ntenjeru ward,Ntenjeru B,Ntenjeru Health Centre,HCIII,Government,IGA GLORIA,701422692,gloria_iga2013@yahoo.com,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,,2,1,0,2,1,2,2,7,0,1,1,,No,Yes,Yes,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,Yes,Yes,No,"Yes, With soap and water available",17412573195837215671040704277035-13_37_18.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F54984385-1714-4ced-bb99-f06786a15fca%2F17412573195837215671040704277035-13_37_18.jpg,0.724236 32.896215 526.3999633789062 18.44700050354004,0.724236,32.896215,526.3999634,18.4470005
+Kayunga,Kayunga Subcounty,Buyobe,Buyobe,Buyobe Health Centre,HCIII,Government,Kyazze Muhammed,771806688,medetex96@gmail.com,,Yes,Yes,No,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,no,,Yes,No,Yes,Yes,Yes,Yes,No,Yes,Yes,Yes,,0,0,0,0,1,1,0,60,0,1,0,,No,No,No,Yes,Yes,Yes,Yes,On premises,Rain water,Pit latrine with slab,"No, female-only toilets do not have menstrual hygiene facilities",No,Yes,"Yes, With soap and water available",17412593641732603658118242538718-14_10_1.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F8bd9ee62-f2e7-43e2-b013-97bc7f7372d7%2F17412593641732603658118242538718-14_10_1.jpg,0.765354 32.869014 526.3999633789062 1.9129999876022339,0.765354,32.869014,526.3999634,1.912999988
+Kayunga,Galiraya Subcounty,Kasokwe,Kasokwe,Kasokwe Kayunga Health centre,HCII,Government,Nampijja Dorothy,782125305,nampijjad11@gmail.com,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,No,No,Yes,Yes,Yes,No,No,Yes,No,,0,0,0,1,0,1,0,25,0,3,1,,No,Yes,Yes,Yes,Yes,No,Yes,On premises,Rain water,Pit latrine with slab,Yes,No,No,"Yes, With soap and water available",1742191531777503471022940545114-9_6_3.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F3404d835-c2d8-4bd2-9d84-a464f871ab0c%2F1742191531777503471022940545114-9_6_3.jpg,1.236442 32.865264 1054.611 1.062000036239624,1.236442,32.865264,1054.611,1.062000036
+Kayunga,Galiraya Subcounty,Galiraya,Galiraya,Galilaya Prisons Clinic,HCII,Government,Andrew Okune,775452434,andrewokuni761@gmail.com,,No,No,No,Yes,Yes,Yes,No,No,Yes,,Yes,no,no,,No,No,Yes,Yes,Yes,Yes,No,No,No,No,,0,0,0,1,0,0,0,1,0,0,0,,No,Yes,Yes,Yes,Yes,Yes,No,500 m or further,Tube well / Borehole,Pit latrine with slab,"No, female-only toilets do not have menstrual hygiene facilities",Yes,Yes,No,17421971216301142195571338868012-10_39_4.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F4e46d856-a8f6-4e33-9031-e7d5770dfca7%2F17421971216301142195571338868012-10_39_4.jpg,1.349816 32.817075 1052.407 1.0920000076293945,1.349816,32.817075,1052.407,1.092000008
+Kayunga,Galiraya Subcounty,Kawongo,Kawongo,Kawongo Health centre,HCIII,Government,Kwagala Stephen,706498453,kwagalastephen2@gmail.com,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,No,Yes,Yes,,2,0,0,1,3,2,1,3,0,2,1,,No,Yes,Yes,Yes,Yes,Yes,No,Up to 500 m,Surface water (river/dam/lake/pond),Pit latrine with slab,"No, female-only toilets do not have menstrual hygiene facilities",No,Yes,No,17421994250157476532576459215096-11_17_18.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F14e678e9-53e2-43d2-81df-efbb7f3aa95b%2F17421994250157476532576459215096-11_17_18.jpg,1.406281 32.758617 1040.159 1.7860000133514404,1.406281,32.758617,1040.159,1.786000013
+Kayunga,Galiraya Subcounty,Galiraya,Galiraya,Galiraya Health Centre,HCIII,Government,Bwoya Jackson,772652958,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,No,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,No,No,Yes,No,,2,0,0,0,2,2,1,35,0,2,2,,No,Yes,Yes,Yes,Yes,No,Yes,On premises,Rain water,Pit latrine with slab,"No, female-only toilets do not have menstrual hygiene facilities",No,Yes,"Yes, With soap and water available",17421947472265360704871876443813-10_0_44.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2F46d44c49-c7a5-4a98-946e-5101a9c719c1%2F17421947472265360704871876443813-10_0_44.jpg,1.349666 32.816339 1047.469 0.765999972820282,1.349666,32.816339,1047.469,0.765999973
+Kayunga,Kayunga Towncouncil,Kayunga,Kayunga,Kayunga Regional Referral Hospital,Hospital,Government,Katusime Monic,779423123,,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,,Yes,Yes,Yes,,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,Yes,,2,1,11,0,2,18,8,72,12,31,3,,Yes,No,No,No,No,No,No,On premises,Piped into yard/plot,Pit latrine with slab,Yes,Yes,Yes,"Yes, With soap and water available",1742986630361.jpg,https://kc.kobotoolbox.org/media/original?media_file=ebirungi%2Fattachments%2Fca46b885aa314a879ac5444b429df73a%2Fafcb9599-951c-4002-8a01-c607225feabb%2F1742986630361.jpg,0.7038007 32.9041785 1044.413 4.106,0.7038007,32.9041785,1044.413,4.106
\ No newline at end of file
diff --git a/src/core/components/DistrictMap/DistrictMap.js b/src/core/components/DistrictMap/DistrictMap.js
index 47421848..f48940d3 100644
--- a/src/core/components/DistrictMap/DistrictMap.js
+++ b/src/core/components/DistrictMap/DistrictMap.js
@@ -121,6 +121,7 @@ const DistrictMap = (props) => {
     if (activeIndicator) {
       const { year } = filterOptions;
       setOptions({
+        topic: filterOptions.topic,
         dataPrefix: `${activeIndicator.name}: `,
         dataSuffix: year && ` in ${year}`,
         indicator: activeIndicator,
diff --git a/src/core/components/DistrictMap/utils/index.js b/src/core/components/DistrictMap/utils/index.js
index 904db9ac..ce543c58 100644
--- a/src/core/components/DistrictMap/utils/index.js
+++ b/src/core/components/DistrictMap/utils/index.js
@@ -2,6 +2,7 @@ import { groupBy } from 'lodash';
 import { flyToLocation, getProperLocationName } from '../../../../components/BaseMap/utils';
 import { filterData } from '../../../utils';
 import fetchData, { fetchDataFromAPI } from '../../../../utils/data';
+import { compareStringsIgnoreCase } from '../../../../utils';
 
 export const COLOURED_LAYER = 'highlight';
 export const coreLayer = {
@@ -58,7 +59,13 @@ export const getRawFilterOptions = (topics, options) => {
 };
 
 export const aggregateValues = (data, aggregate) => {
-  const groupedData = groupBy(data, (item) => item.name);
+  const groupedData = groupBy(data, (item) => {
+    const formatTownCouncilString = item.name && item.name.replace(/Towncouncil/g, 'Town Council');
+    // Remove "Subcounty" and "subcounty" from the name case insensitively
+    const removeSubcountyString = formatTownCouncilString && formatTownCouncilString.replace(/subcounty/gi, '').trim();
+
+    return removeSubcountyString;
+  });
 
   return Object.keys(groupedData).map((key) => {
     const sum = groupedData[key].reduce((partialSum, a) => partialSum + a.value, 0);
@@ -79,11 +86,12 @@ export const processData = (data, indicator, year) => {
   const { location, value, year: yearField } = indicator.mapping;
 
   let filteredData = filterData(data, indicator.filters);
-  filteredData = year
-    ? filteredData
-        .filter((item) => `${item[yearField]}` === `${year}`)
-        .map((item) => ({ name: item[location], value: Number(item[value]) }))
-    : filteredData.map((item) => ({ name: item[location], value: Number(item[value]) }));
+  filteredData =
+    year && yearField
+      ? filteredData
+          .filter((item) => `${item[yearField]}` === `${year}`)
+          .map((item) => ({ name: item[location], value: Number(item[value]) }))
+      : filteredData.map((item) => ({ name: item[location], value: value ? Number(item[value]) : 1 }));
   if (indicator.aggregator) {
     return aggregateValues(filteredData, indicator.aggregator);
   }
@@ -107,7 +115,35 @@ const KAYUNGA_EXCLUDE_LIST = [
   'Bright Future Nursery And Primary School Kangulumira',
 ];
 
-export const getSchoolMarkers = (district, schoolSpecs, dataUrl, dataID, baseAPIUrl) => {
+export function getSchoolEnrollmentUrl(enrollmentConfig, level) {
+  return enrollmentConfig.find((item) => item.id.includes(level.toLowerCase()));
+}
+
+function parseEnrollmentData(enrollmentData, feature, mapping) {
+  const boysEntry = enrollmentData.find(
+    (item) =>
+      item[mapping.gender] === 'Boys' &&
+      item[mapping.year] === feature.year &&
+      compareStringsIgnoreCase(item.school_name, feature.school_name),
+  );
+  const girlsEntry = enrollmentData.find(
+    (item) =>
+      item[mapping.gender] === 'Girls' &&
+      item[mapping.year] === feature.year &&
+      compareStringsIgnoreCase(item.school_name, feature.school_name),
+  );
+
+  const boysCount = boysEntry ? parseInt(boysEntry[mapping.total], 10) : 'No Data';
+  const girlsCount = girlsEntry ? parseInt(girlsEntry[mapping.total], 10) : 'No Data';
+
+  return `
+    <p>Number of boys: ${boysCount}</p>
+    <p>Number of girls: ${girlsCount}</p>
+    <p>Total pupils: ${boysCount !== 'No Data' && girlsCount !== 'No Data' ? boysCount + girlsCount : 'No Data'}</p>
+  `;
+}
+
+export const getSchoolMarkers = (district, schoolSpecs, dataUrl, dataID, baseAPIUrl, enrollmentUrl, mapping) => {
   const finalGeoJSON = {
     type: 'FeatureCollection',
     features: [],
@@ -116,14 +152,22 @@ export const getSchoolMarkers = (district, schoolSpecs, dataUrl, dataID, baseAPI
   if (!schoolSpecs || !dataVariable) return finalGeoJSON;
   if (dataUrl || (dataID && baseAPIUrl)) {
     const dataFetchPromise = dataUrl ? fetchData(dataUrl) : fetchDataFromAPI(dataID, baseAPIUrl);
-    dataFetchPromise
-      .then((data) => {
+    const fetchSchoolEnrollmentPromise = fetchData(enrollmentUrl);
+
+    Promise.all([dataFetchPromise, fetchSchoolEnrollmentPromise])
+      .then(([data, schoolEnrollment]) => {
         const filteredData = data.filter((row) =>
           district === 'Masindi'
             ? !MASINDI_EXCLUDE_LIST.includes(row.school_name)
             : !KAYUNGA_EXCLUDE_LIST.includes(row.school_name),
         );
         if (schoolSpecs.ownership === 'all') {
+          const excludeEnrollmentData = schoolEnrollment.filter((row) =>
+            district === 'Masindi'
+              ? !MASINDI_EXCLUDE_LIST.includes(row.school_name)
+              : !KAYUNGA_EXCLUDE_LIST.includes(row.school_name),
+          );
+
           filteredData
             .filter((d) => d.level === schoolSpecs.level)
             .forEach((item) => {
@@ -131,6 +175,8 @@ export const getSchoolMarkers = (district, schoolSpecs, dataUrl, dataID, baseAPI
                 const itemCoordinates = processCoordinates(item.gps_coordinates);
 
                 if (itemCoordinates) {
+                  const markerPopupData = parseEnrollmentData(excludeEnrollmentData, item, mapping);
+
                   finalGeoJSON.features.push({
                     type: 'Feature',
                     geometry: {
@@ -142,6 +188,7 @@ export const getSchoolMarkers = (district, schoolSpecs, dataUrl, dataID, baseAPI
                       ownership: item.ownership,
                       name: item.school_name,
                       parish: item.parish,
+                      markerPopupData,
                     },
                   });
                 }
@@ -155,6 +202,9 @@ export const getSchoolMarkers = (district, schoolSpecs, dataUrl, dataID, baseAPI
                 const itemCoordinates = processCoordinates(item.gps_coordinates);
 
                 if (itemCoordinates) {
+                  const filteredEnrollment = schoolEnrollment.filter((d) => d.school_name === item.school_name);
+                  const markerPopupData = parseEnrollmentData(filteredEnrollment, item, mapping);
+
                   finalGeoJSON.features.push({
                     type: 'Feature',
                     geometry: {
@@ -166,6 +216,7 @@ export const getSchoolMarkers = (district, schoolSpecs, dataUrl, dataID, baseAPI
                       ownership: item.ownership,
                       name: item.school_name,
                       parish: item.parish,
+                      markerPopupData,
                     },
                   });
                 }
@@ -183,6 +234,77 @@ export const getSchoolMarkers = (district, schoolSpecs, dataUrl, dataID, baseAPI
   return finalGeoJSON;
 };
 
+function getHealthCenterMarkerPopupText(level, ownership) {
+  return `
+    <p>Health Center Level: ${level}</p>
+    <p>Ownership: ${ownership}</p>
+  `;
+}
+
+export const getHealthMarkers = (dataUrl, dataID, baseAPIUrl, mapping) => {
+  const finalGeoJSON = {
+    type: 'FeatureCollection',
+    features: [],
+  };
+  const dataVariable = dataUrl || (dataID && baseAPIUrl);
+  if (!dataVariable) return finalGeoJSON;
+  if (dataUrl || (dataID && baseAPIUrl)) {
+    const dataFetchPromise = dataUrl ? fetchData(dataUrl) : fetchDataFromAPI(dataID, baseAPIUrl);
+
+    dataFetchPromise
+      .then((data) => {
+        data.forEach((item) => {
+          if (item[mapping.latitude] && item[mapping.longitude]) {
+            const itemCoordinates = [parseFloat(item[mapping.longitude]), parseFloat(item[mapping.latitude])];
+            if (itemCoordinates) {
+              finalGeoJSON.features.push({
+                type: 'Feature',
+                geometry: {
+                  type: 'Point',
+                  coordinates: itemCoordinates,
+                },
+                properties: {
+                  ownership: item['Facility Ownership'],
+                  name: item['Name of the health facility/Clinic'],
+                  parish: item['Parish Name/ Ward'],
+                  markerPopupData: getHealthCenterMarkerPopupText(
+                    item['Healthy center level'],
+                    item['Facility Ownership'],
+                  ),
+                },
+              });
+            }
+          }
+        });
+      })
+      .catch((error) => {
+        console.log(error);
+      });
+
+    return finalGeoJSON;
+  }
+
+  return finalGeoJSON;
+};
+
+export const getMarkers = (district, schoolSpecs, options, baseAPIUrl) => {
+  if (options.topic.includes('education')) {
+    const { schoolLocationdataID: dataID, schoolLocationUrl: dataUrl, enrollmentUrl, mapping } = options.indicator;
+
+    return getSchoolMarkers(district, schoolSpecs, dataUrl, dataID, baseAPIUrl, enrollmentUrl, mapping);
+  }
+  if (options.topic.includes('health')) {
+    const { url: dataUrl, mapping } = options.indicator;
+
+    return getHealthMarkers(dataUrl, '', baseAPIUrl, mapping);
+  }
+
+  return {
+    type: 'FeatureCollection',
+    features: [],
+  };
+};
+
 export function schoolLevel(indicator) {
   if (indicator === 'numberOfPrimarySchools') {
     return { level: 'Primary', ownership: 'all' };
diff --git a/src/core/components/hooks/DistrictMap.js b/src/core/components/hooks/DistrictMap.js
index de100774..34b818a2 100644
--- a/src/core/components/hooks/DistrictMap.js
+++ b/src/core/components/hooks/DistrictMap.js
@@ -2,7 +2,7 @@ import { Popup } from 'mapbox-gl';
 import { useEffect, useState, useCallback } from 'react';
 import { COLOURED_LAYER, renderTooltipFromEvent, setZoomByContainerWidth } from '../../../components/BaseMap/utils';
 import fetchData, { fetchDataFromAPI } from '../../../utils/data';
-import { processData, getSchoolMarkers, schoolLevel } from '../DistrictMap/utils';
+import { processData, getMarkers, schoolLevel } from '../DistrictMap/utils';
 
 const showPopup = (popup, map, event, options) => {
   renderTooltipFromEvent(map, event, { ...options, popup });
@@ -33,27 +33,9 @@ const useMap = (location, layer, baseAPIUrl, defaultOptions = {}) => {
     popup.remove();
   }, [map, location]);
 
-  const handleMarkerMove = useCallback(
-    (e) => {
-      e.preventDefault();
-      map.off('mousemove', COLOURED_LAYER, onHover);
-      popup.remove();
-      if (e.features.length) {
-        map.setLayoutProperty('points', 'icon-size', [
-          'match',
-          ['get', 'name'],
-          e.features[0].properties.name,
-          0.4,
-          0.2,
-        ]);
-      }
-    },
-    [map, locationData],
-  );
-
-  const onMarkerClick = useCallback((e) => {
+  const showMarkerPopup = (e) => {
     const coordinates = e.features[0].geometry.coordinates.slice();
-    const { name, parish, ownership } = e.features[0].properties;
+    const { name, markerPopupData } = e.features[0].properties;
 
     // Ensure that if the map is zoomed out such that multiple
     // copies of the feature are visible, the popup appears
@@ -70,19 +52,36 @@ const useMap = (location, layer, baseAPIUrl, defaultOptions = {}) => {
         <div style="font-size:1.6rem;padding-bottom:5px;font-weight:700;text-align:center;text-transform:capitalize;">
           ${name}
         </div>
-        <p>Coordinates: ${coordinates}</p>
-        <p>Ownership: ${ownership}</p>
-        <p>Parish: ${parish || 'No parish data'}</p>
+        ${markerPopupData}
       </div>
     `,
       )
       .addTo(map);
-  });
+  };
+
+  const handleMarkerMove = useCallback(
+    (e) => {
+      e.preventDefault();
+      map.off('mousemove', COLOURED_LAYER, onHover);
+      popup.remove();
+
+      if (e.features.length) {
+        map.setLayoutProperty('unclustered-point', 'icon-size', [
+          'match',
+          ['get', 'name'],
+          e.features[0].properties.name,
+          0.4,
+          0.3,
+        ]);
+      }
+      showMarkerPopup(e);
+    },
+    [map, locationData],
+  );
 
   const handleMarkerLeave = useCallback(() => {
-    map.on('mousemove', COLOURED_LAYER, onHover);
-    popup.remove();
-    map.setLayoutProperty('points', 'icon-size', 0.2);
+    map.setLayoutProperty('unclustered-point', 'icon-size', 0.3);
+    markerPopup.remove();
   }, [map, location]);
 
   const onZoomend = useCallback(() => {
@@ -151,7 +150,7 @@ const useMap = (location, layer, baseAPIUrl, defaultOptions = {}) => {
               source: 'points',
               filter: ['!', ['has', 'point_count']],
               paint: {
-                'icon-color': ['match', ['get', 'level'], 'Primary', '#ff9c1a', 'Secondary', '#00b3b3', '#ffffff'],
+                'icon-color': ['match', ['get', 'level'], 'Primary', '#ff9c1a', 'Secondary', '#00b3b3', '#ff9c1a'],
               },
               layout: {
                 'icon-image': 'custom-marker',
@@ -182,7 +181,6 @@ const useMap = (location, layer, baseAPIUrl, defaultOptions = {}) => {
           // the unclustered-point layer, open a popup at
           // the location of the feature, with
           // description HTML from its properties.
-          map.on('click', 'unclustered-point', onMarkerClick);
 
           map.on('zoomend', onZoomend);
 
@@ -201,18 +199,20 @@ const useMap = (location, layer, baseAPIUrl, defaultOptions = {}) => {
         }
       });
       setZoomByContainerWidth(map, map.getContainer(), layer);
-      // remove any existing listners
-      map.off('mousemove', 'points', handleMarkerMove);
+
+      // Remove any existing listners
+      map.off('mousemove', 'unclustered-point', handleMarkerMove);
+      map.off('mouseleave', 'unclustered-point', handleMarkerLeave);
+
+      map.off('mousemove', COLOURED_LAYER, onHover);
       map.off('mouseleave', COLOURED_LAYER, onBlur);
-      map.off('mouseover', COLOURED_LAYER, onHover);
-      map.off('click', 'points', onMarkerClick);
-      // add even listeners to show tooltip
 
+      // Add event listeners to show tooltip
       map.on('mousemove', COLOURED_LAYER, onHover);
       map.on('mouseleave', COLOURED_LAYER, onBlur);
-      map.on('mousemove', 'points', handleMarkerMove);
-      map.on('mouseleave', 'points', handleMarkerLeave);
-      map.on('click', 'points', onMarkerClick);
+
+      map.on('mousemove', 'unclustered-point', handleMarkerMove);
+      map.on('mouseleave', 'unclustered-point', handleMarkerLeave);
     }
   }, [map, location, options, data]);
 
@@ -226,15 +226,7 @@ const useMap = (location, layer, baseAPIUrl, defaultOptions = {}) => {
     };
     if (options.indicator && options.year) {
       setLevel(schoolLevel(options.indicator.id));
-      setLocationData(
-        getSchoolMarkers(
-          location.name,
-          schoolLevel(options.indicator.id),
-          options.indicator.schoolLocationUrl,
-          options.indicator.schoolLocationdataID,
-          baseAPIUrl,
-        ),
-      );
+      setLocationData(getMarkers(location.name, schoolLevel(options.indicator.id), options, baseAPIUrl));
       fetchIndicatorData(options.indicator.url, options.indicator.dataID);
     }
   }, [options.indicator, options.year]);
diff --git a/src/index.html b/src/index.html
index 8c409b87..c5710749 100644
--- a/src/index.html
+++ b/src/index.html
@@ -978,11 +978,14 @@ <h3 class="type-l type-l--trailer">Score Card</h3>
                         url: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/number_of_schools.csv',
                         // dataID: '12763',
                         schoolLocationUrl: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/schools-locations.csv',
+                        enrollmentUrl: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/primary_and_kindergaten_enrolment.csv',
                         yearRange: [2018, 2022],
                         mapping: {
                             location: 'subcounty',
                             value: 'value',
                             year: 'year',
+                            gender: 'gender',
+                            total: 'subtotal',
                         },
                         aggregator: 'sum', //either sum, avg
                         filters: {
@@ -997,12 +1000,15 @@ <h3 class="type-l type-l--trailer">Score Card</h3>
                         range:[5, 10, 15, 20],
                         url: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/number_of_schools.csv',
                         schoolLocationUrl: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/schools-locations.csv',
+                        enrollmentUrl: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/learners_enrolment_secondary.csv',
                         // schoolLocationdataID: '12763',
                         yearRange: [2018, 2022],
                         mapping: {
                             location: 'subcounty',
                             value: 'value',
                             year: 'year',
+                            gender: 'gender',
+                            total: 'subtotal',
                         },
                         aggregator: 'sum', //either sum, avg
                         filters: {
@@ -1286,6 +1292,31 @@ <h3 class="type-l type-l--trailer">Score Card</h3>
                         },
                     },
                 ]
+            },
+            {
+                id: 'health',
+                name: 'Health',
+                dashboardUrl: 'https://datahub.go.ug/dashboards/health/',
+                dashboardButtonCaption: 'View Health Dashboard',
+                indicators: [{
+                        id: 'numberOfHealthFacilities',
+                        name: 'Number of Health Facilities',
+                        //description: 'All government and private schools in Masindi district, by sub-county',
+                        colours: ['#1a3e53', '#2b6587', '#357ba5', '#78b1d4', '#ecf4f9'].reverse(),
+                        range: [2, 4, 8, 15],
+                        url: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/feature/popups-on-hover/public/assets/data/kayunga/number_of_health_facilities.csv',
+                        yearRange: [2022, 2022],
+                        mapping: {
+                            location: 'Subcounty/Towncouncil',
+                            value: '',
+                            latitude: '_Geo points_latitude',
+                            longitude: '_Geo points_longitude',
+                            year: '',
+                        },
+                        aggregator: 'sum', //either sum, avg
+                        filters: {},
+                    },
+                ]
             }
         ];
         const barChartSeries = [{
@@ -1769,7 +1800,7 @@ <h3 class="type-l type-l--trailer">Score Card</h3>
                 options: {
                     zoom: 10,
                     maxZoom: 12,
-                }
+                },
             },
             keyFacts: {
                 url: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/District%20Profile.csv',
diff --git a/src/utils/index.js b/src/utils/index.js
index ceb20954..fdda974d 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -32,5 +32,12 @@ export const combineMerge = (target, source, options) => {
   return destination;
 };
 
+export const normalizeWhitespace = (str) =>
+  // Trim leading/trailing whitespace and replace multiple spaces with a single space
+  str.trim().replace(/\s+/g, ' ');
+
+export const compareStringsIgnoreCase = (str1, str2) =>
+  normalizeWhitespace(str1).toLowerCase() === normalizeWhitespace(str2).toLowerCase();
+
 export * from './chart';
 export * from './constants';


Reviews:
user: login: wakibi
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T19:28:00Z
user: login: wakibi
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T19:37:42Z
user: login: davidebukali
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-25T14:18:54Z
user: login: davidebukali
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-25T14:19:05Z
user: login: wakibi
body: Approving this to beat deadline, but we need to refactor `utils/index.js`. Please do a beta release and test then let me know. You will do a follow up task to refactor `utils/index.js`. Ideally, it should be one function `getMarkerPopupText` and `getMarkers`
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-25T17:08:10Z

Review comments:
diff_hunk: @@ -1,2 +1,10 @@
 // eslint-disable-next-line import/prefer-default-export
 export const NO_DATA = 0;
+export const MASINDI_SECONDARY_ENROLLMENT_URL =
+  'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/masindi/secondary_school_enrolment.csv';
+export const MASINDI_PRIMARY_ENROLLMENT_URL =
+  'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/masindi/primary_school_enrolment.csv';
+export const KAYUNGA_SECONDARY_ENROLLMENT_URL =
+  'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/learners_enrolment_secondary.csv';
+export const KAYUNGA_PRIMARY_ENROLLMENT_URL =
+  'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/primary_and_kindergaten_enrolment.csv';
path: src/utils/constants.js
user: login: wakibi
body: Why are we using this here? The idea is to have everything configured via the CMS. Do let me know if you need help to understand how this works in case you haven't figured it out yet. It was in the docs (pdf) from Thatcher that I shared with you. You can also look at the index.html file in this repo for live examples. 
created_at: 2025-04-14T19:26:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -70,19 +53,38 @@ const useMap = (location, layer, baseAPIUrl, defaultOptions = {}) => {
         <div style="font-size:1.6rem;padding-bottom:5px;font-weight:700;text-align:center;text-transform:capitalize;">
           ${name}
         </div>
-        <p>Coordinates: ${coordinates}</p>
-        <p>Ownership: ${ownership}</p>
-        <p>Parish: ${parish || 'No parish data'}</p>
+        <p>Number of boys: ${enrollmentData.boys}</p>
+        <p>Number of girls: ${enrollmentData.girls}</p>
+        <p>Total pupils: ${enrollmentData.boys !== 'No Data' && enrollmentData.girls !== 'No Data' ? parseInt(enrollmentData.boys, 10) + parseInt(enrollmentData.girls, 10) : 'No Data'}</p>
path: src/core/components/hooks/DistrictMap.js
user: login: wakibi
body: You may want to redo this as well after knowing where we get the configs from. We are trying to avoid hard-coding data sources, as they can change. Let the user decide which json key(s) refer to which data.
created_at: 2025-04-14T19:27:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -107,6 +114,34 @@ const KAYUNGA_EXCLUDE_LIST = [
   'Bright Future Nursery And Primary School Kangulumira',
 ];
 
+export function getSchoolEnrollmentUrl(district, level) {
+  if (district === 'Masindi') {
+    return level === 'Primary' ? MASINDI_PRIMARY_ENROLLMENT_URL : MASINDI_SECONDARY_ENROLLMENT_URL;
+  }
+
+  return level === 'Primary' ? KAYUNGA_PRIMARY_ENROLLMENT_URL : KAYUNGA_SECONDARY_ENROLLMENT_URL;
+}
+
+function parseEnrollmentData(enrollmentData, feature) {
+  const boysEntry = enrollmentData.find(
+    (item) =>
+      item.gender === 'Boys' &&
+      item.year === feature.year &&
+      compareStringsIgnoreCase(item.school_name, feature.school_name),
+  );
+  const girlsEntry = enrollmentData.find(
+    (item) =>
+      item.gender === 'Girls' &&
+      item.year === feature.year &&
+      compareStringsIgnoreCase(item.school_name, feature.school_name),
+  );
+
+  return {
+    boys: parseInt(boysEntry?.subtotal, 10) || 'No Data',
+    girls: parseInt(girlsEntry?.subtotal, 10) || 'No Data',
+  };
+}
+
path: src/core/components/DistrictMap/utils/index.js
user: login: wakibi
body: Ditto...
created_at: 2025-04-14T19:27:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1769,7 +1769,27 @@ <h3 class="type-l type-l--trailer">Score Card</h3>
                 options: {
                     zoom: 10,
                     maxZoom: 12,
-                }
+                },
+                additionalData: [
+                  {
+                      id: 'primary-school-enrollment',
+                      url: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/primary_and_kindergaten_enrolment.csv',
path: src/index.html
user: login: wakibi
body: Can we have the option to use dataID here as well, as we should be able to pick this data from the API as well? From Thatcher's documentation, we can either take the `url` or `dataID`, but the URL takes precedence.
created_at: 2025-04-22T19:22:19Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1769,7 +1769,27 @@ <h3 class="type-l type-l--trailer">Score Card</h3>
                 options: {
                     zoom: 10,
                     maxZoom: 12,
-                }
+                },
+                additionalData: [
+                  {
+                      id: 'primary-school-enrollment',
+                      url: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/primary_and_kindergaten_enrolment.csv',
+                      mapping: {
+                          gender: 'gender',
+                          total: 'subtotal',
+                          year: 'year',
+                      },
+                  },
+                  {
+                      id: 'secondary-school-enrollment',
+                      url: 'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/learners_enrolment_secondary.csv',
+                      mapping: {
+                          gender: 'gender',
+                          total: 'subtotal',
+                          year: 'year',
+                      },
path: src/index.html
user: login: wakibi
body: Can we have something like this added here?

```
data: [{
                            value: 'Name of the health facility/Clinic',
                            label: 'Name'
                        },
                        {
                            value: 'Healthy center level',
                            label: 'Level'
                        }
                    ],
```
This is my idea for the details that would be displayed on clicking / hovering over a map point. The data should be able to be defined in such a format so we display the card detail with `Level: HCIII`. See example data in attached screenshot. In short, when the user defines the data attribute like above, we shall display the label as 'Label' and pick the value from the JSON that corresponds to the key provided in `value`. Makes sense?

<img width="998" alt="Screenshot 2025-04-22 at 22 27 36" src="https://github.com/user-attachments/assets/1af0f7ee-01e5-4b45-8367-1d8936097d9f" />

created_at: 2025-04-22T19:35:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -70,19 +53,38 @@ const useMap = (location, layer, baseAPIUrl, defaultOptions = {}) => {
         <div style="font-size:1.6rem;padding-bottom:5px;font-weight:700;text-align:center;text-transform:capitalize;">
           ${name}
         </div>
-        <p>Coordinates: ${coordinates}</p>
-        <p>Ownership: ${ownership}</p>
-        <p>Parish: ${parish || 'No parish data'}</p>
+        <p>Number of boys: ${enrollmentData.boys}</p>
+        <p>Number of girls: ${enrollmentData.girls}</p>
+        <p>Total pupils: ${enrollmentData.boys !== 'No Data' && enrollmentData.girls !== 'No Data' ? parseInt(enrollmentData.boys, 10) + parseInt(enrollmentData.girls, 10) : 'No Data'}</p>
path: src/core/components/hooks/DistrictMap.js
user: login: wakibi
body: I see `boys` and `girls` is still hard-coded here. Yet, we want to have flexibility to change education for health. Make changes here too. 
created_at: 2025-04-22T19:37:33Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,2 +1,10 @@
 // eslint-disable-next-line import/prefer-default-export
 export const NO_DATA = 0;
+export const MASINDI_SECONDARY_ENROLLMENT_URL =
+  'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/masindi/secondary_school_enrolment.csv';
+export const MASINDI_PRIMARY_ENROLLMENT_URL =
+  'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/masindi/primary_school_enrolment.csv';
+export const KAYUNGA_SECONDARY_ENROLLMENT_URL =
+  'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/learners_enrolment_secondary.csv';
+export const KAYUNGA_PRIMARY_ENROLLMENT_URL =
+  'https://raw.githubusercontent.com/devinit/ug-district-dashboard-viz/dev/public/assets/data/kayunga/primary_and_kindergaten_enrolment.csv';
path: src/utils/constants.js
user: login: davidebukali
body: Moved this to the application state under topics. Created a health topic with number of health facilities indicator.
created_at: 2025-04-25T14:18:54Z
author_association: COLLABORATOR
diff_hunk: @@ -70,19 +53,38 @@ const useMap = (location, layer, baseAPIUrl, defaultOptions = {}) => {
         <div style="font-size:1.6rem;padding-bottom:5px;font-weight:700;text-align:center;text-transform:capitalize;">
           ${name}
         </div>
-        <p>Coordinates: ${coordinates}</p>
-        <p>Ownership: ${ownership}</p>
-        <p>Parish: ${parish || 'No parish data'}</p>
+        <p>Number of boys: ${enrollmentData.boys}</p>
+        <p>Number of girls: ${enrollmentData.girls}</p>
+        <p>Total pupils: ${enrollmentData.boys !== 'No Data' && enrollmentData.girls !== 'No Data' ? parseInt(enrollmentData.boys, 10) + parseInt(enrollmentData.girls, 10) : 'No Data'}</p>
path: src/core/components/hooks/DistrictMap.js
user: login: davidebukali
body: Updated
created_at: 2025-04-25T14:19:04Z
author_association: COLLABORATOR

PR comments:
user: login: sonarqubecloud[bot]
created_at: 2025-04-25T14:16:32Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=devinit_ug-district-dashboard-viz&pullRequest=470) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [2 New issues](https://sonarcloud.io/project/issues?id=devinit_ug-district-dashboard-viz&pullRequest=470&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=devinit_ug-district-dashboard-viz&pullRequest=470&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=devinit_ug-district-dashboard-viz&pullRequest=470&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=devinit_ug-district-dashboard-viz&pullRequest=470&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=devinit_ug-district-dashboard-viz&pullRequest=470&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=devinit_ug-district-dashboard-viz&pullRequest=470)


author_association: NONE