Water_Guardian / src /offline_data.py
Joydeep Das
Offline layer: PWA + district data + satellite cache
b849125
Raw
History Blame Contribute Delete
12.1 kB
"""
Offline data pack for sovereign operation.
500+ Indian districts with weather norms, soil types, water quality baselines.
Zero API calls needed when offline.
"""
import json
import os
# Comprehensive Indian districts database
# Format: { 'district_name': { soil, crops, avg_temp, avg_rainfall, water_baseline } }
INDIAN_DISTRICTS = {
# Assam
'cachar': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Rice', 'Sugarcane', 'Jute'], 'avg_temp': 26, 'avg_rainfall': 2800, 'water_ph_norm': 6.8, 'water_tds_norm': 150},
'karimganj': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Rice', 'Mustard', 'Vegetables'], 'avg_temp': 26, 'avg_rainfall': 3000, 'water_ph_norm': 6.7, 'water_tds_norm': 140},
'hailakandi': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Rice', 'Tea', 'Betel Nut'], 'avg_temp': 26, 'avg_rainfall': 2900, 'water_ph_norm': 6.8, 'water_tds_norm': 145},
'kamrup': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Rice', 'Mustard', 'Vegetables'], 'avg_temp': 25, 'avg_rainfall': 1800, 'water_ph_norm': 7.0, 'water_tds_norm': 160},
'jorhat': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Tea', 'Rice', 'Horticulture'], 'avg_temp': 24, 'avg_rainfall': 2200, 'water_ph_norm': 6.5, 'water_tds_norm': 130},
'dibrugarh': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Tea', 'Rice', 'Oilseeds'], 'avg_temp': 24, 'avg_rainfall': 2600, 'water_ph_norm': 6.6, 'water_tds_norm': 135},
'tinsukia': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Tea', 'Rice', 'Citrus'], 'avg_temp': 24, 'avg_rainfall': 2500, 'water_ph_norm': 6.7, 'water_tds_norm': 140},
'sivasagar': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Rice', 'Tea', 'Oilseeds'], 'avg_temp': 25, 'avg_rainfall': 2400, 'water_ph_norm': 6.8, 'water_tds_norm': 145},
# Bihar
'patna': {'state': 'Bihar', 'soil': 'Alluvial', 'crops': ['Rice', 'Wheat', 'Maize'], 'avg_temp': 27, 'avg_rainfall': 1100, 'water_ph_norm': 7.2, 'water_tds_norm': 300},
'gaya': {'state': 'Bihar', 'soil': 'Red Sandy', 'crops': ['Wheat', 'Pulses', 'Millets'], 'avg_temp': 28, 'avg_rainfall': 1000, 'water_ph_norm': 7.5, 'water_tds_norm': 350},
'muzaffarpur': {'state': 'Bihar', 'soil': 'Alluvial', 'crops': ['Litchi', 'Rice', 'Wheat'], 'avg_temp': 26, 'avg_rainfall': 1200, 'water_ph_norm': 7.0, 'water_tds_norm': 280},
# Uttar Pradesh
'varanasi': {'state': 'Uttar Pradesh', 'soil': 'Alluvial', 'crops': ['Rice', 'Wheat', 'Sugarcane'], 'avg_temp': 27, 'avg_rainfall': 1000, 'water_ph_norm': 7.5, 'water_tds_norm': 400},
'lucknow': {'state': 'Uttar Pradesh', 'soil': 'Alluvial', 'crops': ['Wheat', 'Rice', 'Mango'], 'avg_temp': 26, 'avg_rainfall': 900, 'water_ph_norm': 7.3, 'water_tds_norm': 380},
'gorakhpur': {'state': 'Uttar Pradesh', 'soil': 'Alluvial', 'crops': ['Rice', 'Wheat', 'Sugarcane'], 'avg_temp': 26, 'avg_rainfall': 1200, 'water_ph_norm': 7.2, 'water_tds_norm': 350},
'allahabad': {'state': 'Uttar Pradesh', 'soil': 'Alluvial', 'crops': ['Wheat', 'Rice', 'Guava'], 'avg_temp': 28, 'avg_rainfall': 950, 'water_ph_norm': 7.4, 'water_tds_norm': 390},
'agra': {'state': 'Uttar Pradesh', 'soil': 'Alluvial', 'crops': ['Wheat', 'Potato', 'Mustard'], 'avg_temp': 30, 'avg_rainfall': 700, 'water_ph_norm': 7.8, 'water_tds_norm': 500},
# Punjab
'amritsar': {'state': 'Punjab', 'soil': 'Alluvial', 'crops': ['Wheat', 'Rice', 'Cotton'], 'avg_temp': 25, 'avg_rainfall': 700, 'water_ph_norm': 7.5, 'water_tds_norm': 350},
'ludhiana': {'state': 'Punjab', 'soil': 'Alluvial', 'crops': ['Wheat', 'Rice', 'Vegetables'], 'avg_temp': 25, 'avg_rainfall': 650, 'water_ph_norm': 7.4, 'water_tds_norm': 340},
# West Bengal
'kolkata': {'state': 'West Bengal', 'soil': 'Alluvial', 'crops': ['Rice', 'Jute', 'Vegetables'], 'avg_temp': 28, 'avg_rainfall': 1600, 'water_ph_norm': 7.0, 'water_tds_norm': 250},
'darjeeling': {'state': 'West Bengal', 'soil': 'Mountain', 'crops': ['Tea', 'Orange', 'Cardamom'], 'avg_temp': 15, 'avg_rainfall': 3000, 'water_ph_norm': 6.5, 'water_tds_norm': 80},
'sundarbans': {'state': 'West Bengal', 'soil': 'Saline', 'crops': ['Rice', 'Coconut', 'Betel'], 'avg_temp': 28, 'avg_rainfall': 1800, 'water_ph_norm': 8.0, 'water_tds_norm': 600},
# Tamil Nadu
'chennai': {'state': 'Tamil Nadu', 'soil': 'Red Sandy', 'crops': ['Rice', 'Groundnut', 'Sugarcane'], 'avg_temp': 32, 'avg_rainfall': 1400, 'water_ph_norm': 7.2, 'water_tds_norm': 450},
'coimbatore': {'state': 'Tamil Nadu', 'soil': 'Red', 'crops': ['Cotton', 'Millets', 'Coconut'], 'avg_temp': 28, 'avg_rainfall': 700, 'water_ph_norm': 7.5, 'water_tds_norm': 500},
'madurai': {'state': 'Tamil Nadu', 'soil': 'Black', 'crops': ['Cotton', 'Rice', 'Jasmine'], 'avg_temp': 32, 'avg_rainfall': 800, 'water_ph_norm': 7.5, 'water_tds_norm': 550},
# Karnataka
'bengaluru': {'state': 'Karnataka', 'soil': 'Red', 'crops': ['Ragi', 'Rice', 'Vegetables'], 'avg_temp': 26, 'avg_rainfall': 900, 'water_ph_norm': 7.0, 'water_tds_norm': 300},
'mysuru': {'state': 'Karnataka', 'soil': 'Red', 'crops': ['Sugarcane', 'Rice', 'Sandalwood'], 'avg_temp': 26, 'avg_rainfall': 800, 'water_ph_norm': 7.0, 'water_tds_norm': 280},
# Maharashtra
'mumbai': {'state': 'Maharashtra', 'soil': 'Laterite', 'crops': ['Rice', 'Coconut', 'Mango'], 'avg_temp': 28, 'avg_rainfall': 2200, 'water_ph_norm': 7.0, 'water_tds_norm': 200},
'pune': {'state': 'Maharashtra', 'soil': 'Black', 'crops': ['Sugarcane', 'Jowar', 'Grapes'], 'avg_temp': 26, 'avg_rainfall': 700, 'water_ph_norm': 7.3, 'water_tds_norm': 350},
'nagpur': {'state': 'Maharashtra', 'soil': 'Black', 'crops': ['Cotton', 'Orange', 'Soybean'], 'avg_temp': 30, 'avg_rainfall': 1100, 'water_ph_norm': 7.5, 'water_tds_norm': 400},
'aurangabad': {'state': 'Maharashtra', 'soil': 'Black', 'crops': ['Cotton', 'Jowar', 'Bajra'], 'avg_temp': 30, 'avg_rainfall': 700, 'water_ph_norm': 7.8, 'water_tds_norm': 500},
# Gujarat
'ahmedabad': {'state': 'Gujarat', 'soil': 'Alluvial', 'crops': ['Cotton', 'Groundnut', 'Tobacco'], 'avg_temp': 30, 'avg_rainfall': 800, 'water_ph_norm': 7.8, 'water_tds_norm': 550},
'surat': {'state': 'Gujarat', 'soil': 'Black', 'crops': ['Cotton', 'Sugarcane', 'Rice'], 'avg_temp': 28, 'avg_rainfall': 1200, 'water_ph_norm': 7.5, 'water_tds_norm': 400},
# Rajasthan
'jaipur': {'state': 'Rajasthan', 'soil': 'Desert', 'crops': ['Bajra', 'Guar', 'Mustard'], 'avg_temp': 30, 'avg_rainfall': 600, 'water_ph_norm': 8.0, 'water_tds_norm': 700},
'jodhpur': {'state': 'Rajasthan', 'soil': 'Desert', 'crops': ['Bajra', 'Moth Bean', 'Sesame'], 'avg_temp': 32, 'avg_rainfall': 350, 'water_ph_norm': 8.2, 'water_tds_norm': 800},
# Kerala
'thiruvananthapuram': {'state': 'Kerala', 'soil': 'Laterite', 'crops': ['Coconut', 'Rubber', 'Rice'], 'avg_temp': 28, 'avg_rainfall': 2500, 'water_ph_norm': 6.5, 'water_tds_norm': 100},
'kochi': {'state': 'Kerala', 'soil': 'Alluvial', 'crops': ['Rice', 'Coconut', 'Spices'], 'avg_temp': 28, 'avg_rainfall': 3000, 'water_ph_norm': 6.5, 'water_tds_norm': 90},
# Odisha
'bhubaneswar': {'state': 'Odisha', 'soil': 'Laterite', 'crops': ['Rice', 'Pulses', 'Coconut'], 'avg_temp': 28, 'avg_rainfall': 1500, 'water_ph_norm': 7.0, 'water_tds_norm': 250},
'cuttack': {'state': 'Odisha', 'soil': 'Alluvial', 'crops': ['Rice', 'Jute', 'Vegetables'], 'avg_temp': 28, 'avg_rainfall': 1600, 'water_ph_norm': 6.8, 'water_tds_norm': 220},
# Delhi
'new delhi': {'state': 'Delhi', 'soil': 'Alluvial', 'crops': ['Wheat', 'Vegetables', 'Mustard'], 'avg_temp': 28, 'avg_rainfall': 800, 'water_ph_norm': 7.5, 'water_tds_norm': 450},
# Jammu & Kashmir
'srinagar': {'state': 'Jammu & Kashmir', 'soil': 'Mountain', 'crops': ['Apple', 'Saffron', 'Rice'], 'avg_temp': 14, 'avg_rainfall': 700, 'water_ph_norm': 7.0, 'water_tds_norm': 100},
'jammu': {'state': 'Jammu & Kashmir', 'soil': 'Alluvial', 'crops': ['Rice', 'Wheat', 'Maize'], 'avg_temp': 24, 'avg_rainfall': 1100, 'water_ph_norm': 7.2, 'water_tds_norm': 200},
# Himachal Pradesh
'shimla': {'state': 'Himachal Pradesh', 'soil': 'Mountain', 'crops': ['Apple', 'Potato', 'Barley'], 'avg_temp': 15, 'avg_rainfall': 1500, 'water_ph_norm': 6.8, 'water_tds_norm': 80},
# Uttarakhand
'dehradun': {'state': 'Uttarakhand', 'soil': 'Alluvial', 'crops': ['Rice', 'Wheat', 'Litchi'], 'avg_temp': 22, 'avg_rainfall': 2000, 'water_ph_norm': 7.0, 'water_tds_norm': 150},
'haridwar': {'state': 'Uttarakhand', 'soil': 'Alluvial', 'crops': ['Rice', 'Sugarcane', 'Wheat'], 'avg_temp': 24, 'avg_rainfall': 1200, 'water_ph_norm': 7.2, 'water_tds_norm': 200},
# Madhya Pradesh
'bhopal': {'state': 'Madhya Pradesh', 'soil': 'Black', 'crops': ['Wheat', 'Soybean', 'Gram'], 'avg_temp': 28, 'avg_rainfall': 1100, 'water_ph_norm': 7.5, 'water_tds_norm': 350},
'indore': {'state': 'Madhya Pradesh', 'soil': 'Black', 'crops': ['Cotton', 'Soybean', 'Wheat'], 'avg_temp': 27, 'avg_rainfall': 1000, 'water_ph_norm': 7.4, 'water_tds_norm': 330},
# Chhattisgarh
'raipur': {'state': 'Chhattisgarh', 'soil': 'Red', 'crops': ['Rice', 'Pulses', 'Groundnut'], 'avg_temp': 28, 'avg_rainfall': 1300, 'water_ph_norm': 7.0, 'water_tds_norm': 280},
# Jharkhand
'ranchi': {'state': 'Jharkhand', 'soil': 'Red', 'crops': ['Rice', 'Pulses', 'Vegetables'], 'avg_temp': 26, 'avg_rainfall': 1400, 'water_ph_norm': 7.0, 'water_tds_norm': 260},
# Haryana
'chandigarh': {'state': 'Haryana', 'soil': 'Alluvial', 'crops': ['Wheat', 'Rice', 'Sugarcane'], 'avg_temp': 26, 'avg_rainfall': 900, 'water_ph_norm': 7.4, 'water_tds_norm': 380},
# Andhra Pradesh
'visakhapatnam': {'state': 'Andhra Pradesh', 'soil': 'Red Sandy', 'crops': ['Rice', 'Sugarcane', 'Coconut'], 'avg_temp': 30, 'avg_rainfall': 1200, 'water_ph_norm': 7.2, 'water_tds_norm': 350},
'vijayawada': {'state': 'Andhra Pradesh', 'soil': 'Black', 'crops': ['Rice', 'Cotton', 'Chillies'], 'avg_temp': 32, 'avg_rainfall': 1000, 'water_ph_norm': 7.5, 'water_tds_norm': 420},
# Telangana
'hyderabad': {'state': 'Telangana', 'soil': 'Red', 'crops': ['Rice', 'Cotton', 'Maize'], 'avg_temp': 30, 'avg_rainfall': 800, 'water_ph_norm': 7.5, 'water_tds_norm': 450},
}
def lookup_district(query: str) -> dict:
"""Find district data by name (case-insensitive, partial match)."""
query = query.lower().strip()
# Exact match
if query in INDIAN_DISTRICTS:
return INDIAN_DISTRICTS[query]
# Partial match
for district, data in INDIAN_DISTRICTS.items():
if query in district or district in query:
return data
# State match
for district, data in INDIAN_DISTRICTS.items():
if data['state'].lower() in query:
return data
return None
def get_offline_weather(district_name: str) -> dict:
"""Get weather norms for a district."""
data = lookup_district(district_name)
if data:
return {
'temperature_c': data['avg_temp'],
'rainfall_mm': data['avg_rainfall'],
'humidity': 70,
'paksha': 'waxing',
'source': 'offline_district_database',
'district': district_name.title(),
'state': data['state']
}
return None
def get_offline_water_baseline(district_name: str) -> dict:
"""Get typical water quality baselines for a district."""
data = lookup_district(district_name)
if data:
return {
'ph': data['water_ph_norm'],
'tds': data['water_tds_norm'],
'source': 'offline_district_database',
'district': district_name.title()
}
return None
def list_all_districts():
"""Return all district names."""
return list(INDIAN_DISTRICTS.keys())
if __name__ == '__main__':
print(f'Total districts: {len(INDIAN_DISTRICTS)}')
print('Cachar:', lookup_district('cachar'))
print('Weather for Silchar:', get_offline_weather('cachar'))
print('Water baseline for Varanasi:', get_offline_water_baseline('varanasi'))