Discuss the factors that led to the creation of the separate Odisha Province in 1936. Highlight the contribution of Maharaja Krushna Chandra Gajapati in this movement. (20 Marks, 300 Words)
formation of separate Orissa Province 1936 factors Krushna Chandra Gajapati contribution
Utkal Sammilani Odia language movement Orissa separation 1936 history
https://magazines.odisha.gov.in/orissareview/2015/Apr/engpdf…
"The distribution of mineral resources in Odisha is a direct outcome of its geological history and rock formations." Discuss with suitable examples. (20 Marks, 300 Words)"The distribution of mineral resources in Odisha is a direct outcome of its geological history and rock formations." Discuss with suitable examples. (20 Marks, 300 Words)
Odisha mineral resources geological history rock formations iron ore chromite bauxite coal distribution
Odisha geology Precambrian Eastern Ghats Gondwana mineral wealth districts
https://odishageography.com/mineral-resources-of-odisha
| Geological Formation | Age | Key Minerals | Districts |
|---|---|---|---|
| Iron Ore Group (IOG) | Proterozoic | Iron Ore, Chromite | Keonjhar, Jajpur, Mayurbhanj, Sundargarh |
| Gangpur Group | Proterozoic | Manganese, Limestone | Keonjhar, Sundargarh |
| Eastern Ghats Granulite Belt | Proterozoic | Bauxite, Graphite, Nickel, Gemstones | Koraput, Kalahandi, Rayagada |
| Gondwana Supergroup | Mesozoic | Coal | Angul, Jharsuguda, Sambalpur |
| Coastal Quaternary Deposits | Cenozoic | Beach Sand Minerals | Coastal districts |
Generate a comparison PDF of Odisha's mineral belts and rock formations
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"
mkdir -p /home/daytona/workspace/odisha-minerals && echo "created"
~/odisha-minerals/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak
OUTPUT = "/home/daytona/workspace/odisha-minerals/Odisha_Mineral_Belts_Rock_Formations.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_GREEN = colors.HexColor("#1B4332")
MID_GREEN = colors.HexColor("#2D6A4F")
LIGHT_GREEN = colors.HexColor("#52B788")
PALE_GREEN = colors.HexColor("#D8F3DC")
ORANGE = colors.HexColor("#E76F51")
AMBER = colors.HexColor("#F4A261")
PALE_AMBER = colors.HexColor("#FFF3E0")
STEEL = colors.HexColor("#264653")
LIGHT_STEEL = colors.HexColor("#E0F2F1")
WHITE = colors.white
BLACK = colors.HexColor("#1A1A1A")
LIGHT_GREY = colors.HexColor("#F5F5F5")
MID_GREY = colors.HexColor("#BDBDBD")
# ── Styles ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
title_style = S("DocTitle",
fontName="Helvetica-Bold", fontSize=22,
textColor=WHITE, alignment=TA_CENTER, spaceAfter=4,
leading=28)
subtitle_style = S("DocSub",
fontName="Helvetica", fontSize=12,
textColor=colors.HexColor("#B7E4C7"), alignment=TA_CENTER, spaceAfter=2)
section_head = S("SecHead",
fontName="Helvetica-Bold", fontSize=13,
textColor=WHITE, alignment=TA_LEFT,
backColor=MID_GREEN, borderPadding=(6, 8, 6, 8),
spaceAfter=6, spaceBefore=12, leading=18)
sub_head = S("SubHead",
fontName="Helvetica-Bold", fontSize=10,
textColor=DARK_GREEN, spaceAfter=4, spaceBefore=6)
body = S("Body",
fontName="Helvetica", fontSize=9,
textColor=BLACK, leading=14, spaceAfter=4,
alignment=TA_JUSTIFY)
cell_head = S("CellHead",
fontName="Helvetica-Bold", fontSize=8.5,
textColor=WHITE, alignment=TA_CENTER, leading=12)
cell_body = S("CellBody",
fontName="Helvetica", fontSize=8,
textColor=BLACK, alignment=TA_LEFT, leading=11)
cell_body_c = S("CellBodyC",
fontName="Helvetica", fontSize=8,
textColor=BLACK, alignment=TA_CENTER, leading=11)
bold_body = S("BoldBody",
fontName="Helvetica-Bold", fontSize=8,
textColor=DARK_GREEN, alignment=TA_LEFT, leading=11)
caption = S("Caption",
fontName="Helvetica-Oblique", fontSize=7.5,
textColor=colors.HexColor("#555555"), alignment=TA_CENTER, spaceAfter=6)
footer_style = S("Footer",
fontName="Helvetica", fontSize=7,
textColor=colors.HexColor("#777777"), alignment=TA_CENTER)
# ── Helper: coloured section banner ─────────────────────────────────────────
def banner(text, bg=MID_GREEN, fg=WHITE, fs=13):
st = S(f"Banner_{text[:10]}",
fontName="Helvetica-Bold", fontSize=fs,
textColor=fg, backColor=bg,
borderPadding=(7, 10, 7, 10),
alignment=TA_LEFT, leading=fs+6, spaceAfter=8, spaceBefore=10)
return Paragraph(text, st)
def sub_banner(text, bg=PALE_GREEN, fg=DARK_GREEN, fs=9):
st = S(f"SubBan_{text[:10]}",
fontName="Helvetica-Bold", fontSize=fs,
textColor=fg, backColor=bg,
borderPadding=(4, 6, 4, 6),
alignment=TA_LEFT, leading=fs+5, spaceAfter=5)
return Paragraph(text, st)
# ── Document setup ───────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm,
title="Odisha Mineral Belts & Rock Formations — Comparison",
author="Orris AI"
)
W = A4[0] - 3.6*cm # usable page width
story = []
# ════════════════════════════════════════════════════════════════════════════
# COVER BLOCK
# ════════════════════════════════════════════════════════════════════════════
cover_data = [[
Paragraph("ODISHA", S("CT1", fontName="Helvetica-Bold", fontSize=28,
textColor=WHITE, alignment=TA_CENTER, leading=34)),
],[
Paragraph("Mineral Belts & Rock Formations", S("CT2", fontName="Helvetica",
fontSize=16, textColor=colors.HexColor("#B7E4C7"),
alignment=TA_CENTER, leading=22)),
],[
Paragraph("A Comparative Reference Guide", S("CT3", fontName="Helvetica-Oblique",
fontSize=11, textColor=colors.HexColor("#95D5B2"),
alignment=TA_CENTER, leading=16)),
],[
Spacer(1, 0.3*cm)
],[
Paragraph("Geological History | Rock Systems | Mineral Distribution | District Mapping",
S("CT4", fontName="Helvetica", fontSize=8.5,
textColor=colors.HexColor("#74C69D"),
alignment=TA_CENTER, leading=13)),
]]
cover_table = Table(cover_data, colWidths=[W])
cover_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_GREEN),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,0), 18),
("BOTTOMPADDING", (0,-1), (-1,-1), 18),
("LEFTPADDING", (0,0), (-1,-1), 14),
("RIGHTPADDING", (0,0), (-1,-1), 14),
("LINEABOVE", (0,0), (-1,0), 3, LIGHT_GREEN),
("LINEBELOW", (0,-1), (-1,-1), 3, LIGHT_GREEN),
]))
story.append(cover_table)
story.append(Spacer(1, 0.5*cm))
# Key statistics strip
stat_data = [
[Paragraph("96%\nChromite", cell_head),
Paragraph("92%\nNickel", cell_head),
Paragraph("51%\nBauxite", cell_head),
Paragraph("43%\nManganese", cell_head),
Paragraph("33%\nIron Ore", cell_head),
Paragraph("24%\nCoal", cell_head)],
]
stat_table = Table(stat_data, colWidths=[W/6]*6, rowHeights=[1.1*cm])
stat_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), STEEL),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TEXTCOLOR", (0,0), (-1,-1), WHITE),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#3A7CA5")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
]))
story.append(stat_table)
story.append(Paragraph("Odisha's share of India's total mineral reserves (Indian Bureau of Mines)", caption))
story.append(Spacer(1, 0.4*cm))
# ════════════════════════════════════════════════════════════════════════════
# SECTION 1 — GEOLOGICAL TIME & ROCK SYSTEMS
# ════════════════════════════════════════════════════════════════════════════
story.append(banner("1. Geological Time Scale & Rock Systems of Odisha"))
story.append(Paragraph(
"About 72.5% of Odisha's area is underlain by Precambrian metamorphic and igneous rocks "
"of Archaean and Proterozoic age. These ancient formations, spanning billions of years, "
"are the primary hosts for the state's mineral wealth. Younger Gondwana and Quaternary "
"formations occupy the remainder and host coal and beach-sand minerals respectively.",
body))
story.append(Spacer(1, 0.3*cm))
geo_headers = [
Paragraph("Rock System", cell_head),
Paragraph("Geological Age", cell_head),
Paragraph("Age (Billion Yrs)", cell_head),
Paragraph("Rock Types", cell_head),
Paragraph("Area Coverage", cell_head),
Paragraph("Primary Minerals", cell_head),
]
geo_rows = [
["Archean Crystalline\nBasement Complex",
"Archean Eon",
"4.0 – 2.5 Ga",
"Granites, gneisses,\nschists, amphibolites",
"Basement (foundation\nfor all other systems)",
"Structural host;\nlocalised gold traces"],
["Iron Ore Group\n(IOG)",
"Early–Mid Proterozoic",
"~2.5 – 1.6 Ga",
"Banded Iron Formations\n(BIF), phyllites, shales,\nultramafics",
"Northern & central\nOdisha belt",
"Iron ore (hematite),\nChromite, Manganese"],
["Gangpur Group",
"Mid Proterozoic",
"~1.8 – 1.2 Ga",
"Phyllites, quartzites,\nlimestones, schists\n(low-med metamorphics)",
"Northwestern Odisha",
"Manganese, Limestone,\nLead-Zinc, Dolomite"],
["Eastern Ghats\nGranulite Belt",
"Mid–Late Proterozoic",
"~1.6 – 0.9 Ga",
"Khondalites, charnockites,\nmigmatites, anorthosites,\nalkaline rocks",
"~52,000 sq km;\ncentral–southern Odisha",
"Bauxite, Graphite,\nNickel, Gemstones,\nCopper, PGMs"],
["Gondwana\nSupergroup",
"Permian–Triassic\n(Mesozoic)",
"~0.3 – 0.2 Ga",
"Sandstone, shale,\nconglomerate, coal\nseams (sedimentary)",
"~8% of state;\nriver valley basins",
"Coal, Fireclay,\nBauxite (minor)"],
["Tertiary &\nQuaternary Deposits",
"Cenozoic",
"<0.065 Ga",
"Alluvium, laterite,\nbeach sand, deltaic\nsediments",
"Eastern coastal plains\nand deltas",
"Beach sand minerals:\nIlmenite, Rutile,\nZircon, Monazite"],
]
geo_data = [geo_headers]
for r in geo_rows:
geo_data.append([Paragraph(c, cell_body) for c in r])
col_w = [W*x for x in [0.17, 0.15, 0.13, 0.20, 0.17, 0.18]]
geo_table = Table(geo_data, colWidths=col_w, repeatRows=1)
row_count = len(geo_data)
geo_style = [
("BACKGROUND", (0,0), (-1,0), DARK_GREEN),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GREY]),
]
geo_table.setStyle(TableStyle(geo_style))
story.append(geo_table)
story.append(Spacer(1, 0.5*cm))
# ════════════════════════════════════════════════════════════════════════════
# SECTION 2 — MINERAL BELT COMPARISON
# ════════════════════════════════════════════════════════════════════════════
story.append(banner("2. Mineral Belt Comparison — Characteristics at a Glance"))
belt_col_w = [W*x for x in [0.16, 0.14, 0.13, 0.16, 0.18, 0.13, 0.10]]
belt_headers = [
Paragraph("Mineral Belt /\nComplex", cell_head),
Paragraph("Rock Formation\n(Host Rock)", cell_head),
Paragraph("Geological\nAge", cell_head),
Paragraph("Key Minerals", cell_head),
Paragraph("Major Districts", cell_head),
Paragraph("Structure /\nOccurrence", cell_head),
Paragraph("India's\nShare %", cell_head),
]
belt_rows = [
["Sukinda Ultramafic\nBelt",
"IOG — Dunite,\nPeridotite, Pyroxenite\n(ultramafics)",
"Early Proterozoic\n(~2.5 Ga)",
"Chromite\n(High-grade)",
"Jajpur\n(95.6% of state\nchromite output)",
"Synclinally folded;\n3 zones — N, C, S",
"~96%"],
["Boula-Nuasahi\nIgneous Complex",
"IOG — Ultramafics\n(dunite, peridotite)",
"Early Proterozoic",
"Chromite,\nNickel, Cobalt,\nPGMs",
"Keonjhar",
"Layered igneous\ncomplex; high grade",
"Nickel: 92%"],
["Joda–Barbil–\nBarajamda Belt",
"IOG — Banded Iron\nFormations (BIF),\nJaspilites",
"Early Proterozoic\n(~2.3 Ga)",
"Iron ore (hematite,\nmagnetite); high Fe\n(60–65%)",
"Keonjhar,\nMayurbhanj,\nSundargarh",
"Tabular / lensoid\nbands; open-cast\nminable",
"~33%"],
["Daitari–Tomka\nIron Belt",
"IOG — BIF, shales,\nphyllites",
"Proterozoic",
"Iron ore, Manganese",
"Jajpur,\nKeonjhar",
"Folded BIF;\nassociated Mn",
"Part of\n33% share"],
["Gangpur\nMetasedimentary\nBelt",
"Gangpur Group —\nPhyllites, quartzites,\nlimestone",
"Mid Proterozoic\n(~1.8 Ga)",
"Manganese, Limestone,\nLead-Zinc, Dolomite",
"Sundargarh,\nKeonjhar,\nBolangir",
"Stratiform / syn-\nsedimentary deposits",
"Mn: ~43%"],
["East Coast\nBauxite Deposits",
"Eastern Ghats —\nKhondalite &\nCharnockite laterite",
"Proterozoic\n(~1.0 Ga);\nlateritized later",
"Bauxite (Al₂O₃\n40–56%)",
"Koraput,\nKalahandi,\nRayagada,\nKandhamal",
"Plateau-top cappings;\n900–1400 m elevation",
"~51%"],
["Eastern Ghats\nGraphite Belt",
"Eastern Ghats —\nKhondalite, migmatite",
"Proterozoic",
"Graphite,\nGemstones (Ruby),\nGarnet",
"Bargarh, Kalahandi,\nKoraput, Rayagada",
"Disseminated /\nvein type in\nmetapelites",
"Ruby: sole\nsource"],
["Talcher\nCoalfield",
"Gondwana Super-\ngroup — Sandstone,\nshale, coal seams",
"Permian\n(~280 Ma)",
"Coal (sub-bituminous\nto bituminous)",
"Angul\n(~60% of state\ncoal)",
"Fluvio-lacustrine\nbasin; multiple\nseams",
"~24%"],
["Ib River\nCoalfield",
"Gondwana —\nGondwana sediments",
"Permian",
"Coal",
"Jharsuguda,\nSundargarh,\nSambalpur",
"River-valley\nbasin deposits",
"Part of\n24% share"],
["Coastal Beach\nSand Belt",
"Quaternary —\nAlluvium, beach\nsand, laterite",
"Cenozoic\n(<2 Ma)",
"Ilmenite, Rutile,\nZircon, Monazite,\nGarnet",
"Kendrapara,\nJagatsinghpur,\nGanjam coast",
"Placer deposits;\nmarine & fluvial\nconcentrations",
"Zircon: ~24%"],
]
belt_data = [belt_headers]
for r in belt_rows:
belt_data.append([Paragraph(c, cell_body) for c in r])
belt_table = Table(belt_data, colWidths=belt_col_w, repeatRows=1)
# Alternating row colour + highlight some belts
belt_style_cmds = [
("BACKGROUND", (0,0), (-1,0), DARK_GREEN),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GREY]),
# Highlight chromite rows
("BACKGROUND", (0,1), (-1,2), colors.HexColor("#E8F5E9")),
# Highlight coal rows
("BACKGROUND", (0,8), (-1,9), colors.HexColor("#FFF8E1")),
]
belt_table.setStyle(TableStyle(belt_style_cmds))
story.append(belt_table)
story.append(Spacer(1, 0.3*cm))
# Legend
legend_data = [[
Paragraph(" Legend:", bold_body),
Paragraph("Green rows = Chromite/IOG belts", cell_body),
Paragraph("Yellow rows = Gondwana Coal belts", cell_body),
Paragraph("White/Grey = Other mineral belts", cell_body),
]]
legend_table = Table(legend_data, colWidths=[W*x for x in [0.15, 0.28, 0.28, 0.29]])
legend_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), PALE_GREEN),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("BOX", (0,0), (-1,-1), 0.5, MID_GREEN),
]))
story.append(legend_table)
story.append(Spacer(1, 0.5*cm))
# ════════════════════════════════════════════════════════════════════════════
# SECTION 3 — GEOLOGICAL FORMATION vs MINERAL LINKAGE
# ════════════════════════════════════════════════════════════════════════════
story.append(banner("3. Rock Formation → Mineral Linkage (Cause & Effect)"))
story.append(Paragraph(
"The table below shows the direct cause-and-effect relationship between the type of rock "
"formation and the minerals it produces, demonstrating why Odisha's mineral map is a "
"direct print of its geological map.", body))
story.append(Spacer(1, 0.3*cm))
link_headers = [
Paragraph("Rock Formation", cell_head),
Paragraph("Geological Process\n(How minerals formed)", cell_head),
Paragraph("Resulting Mineral(s)", cell_head),
Paragraph("Why this formation\nproduces this mineral", cell_head),
]
link_rows = [
["Banded Iron Formation\n(IOG)",
"Chemical precipitation\nfrom Proterozoic seas;\nhydrothermal enrichment",
"Iron Ore (Hematite,\nMagnetite)",
"Fe-rich seawater precipitated\nsilica-iron bands; later\nweathering removed silica,\nconcentrating iron to 60–65%"],
["Ultramafic intrusions\n(Dunite, Peridotite)\nwithin IOG",
"Magmatic crystallisation;\nchromite segregated\nearly from mafic magma",
"Chromite, Nickel,\nCobalt, PGMs",
"Chromite crystallises at\nhigh temperature as an\nearly cumulate mineral in\nultramafic magma chambers"],
["Khondalite\n(Eastern Ghats)",
"High-grade metamorphism\nof Al-rich sediments +\nintense tropical lateritisation",
"Bauxite (Al₂O₃ 40–56%)",
"Khondalite is rich in\naluminium silicates; prolonged\nweathering leaches silica,\nleaving Al-hydroxides (bauxite)"],
["Khondalite & Migmatite\n(Eastern Ghats)",
"Metamorphism of\ncarbonaceous sediments\nunder granulite facies",
"Graphite, Ruby, Garnet",
"Organic carbon in pelites\nrecrystallises to graphite;\nruby forms in Al-rich\ncalcite marble layers"],
["Phyllites & Shales\n(Gangpur Group)",
"Marine chemical\nsedimentation + low-grade\nmetamorphism",
"Manganese Ore,\nLimestone, Dolomite",
"Mn precipitated from marine\nwaters in oxygen-deficient\nconditions; limestone from\ncarbonate accumulation"],
["Gondwana sedimentary\nbasins (Sandstone,\nshale, coal seams)",
"Burial of Permian\nswamp flora + thermal\nmaturation",
"Coal (sub-bituminous\nto bituminous)",
"River-valley basins trapped\norganic matter; burial under\nsediment led to coalification\nover ~250 million years"],
["Quaternary beach\nand alluvial sands",
"Fluvial transport +\nmarine wave sorting;\nplacer concentration",
"Ilmenite, Rutile,\nZircon, Monazite",
"Dense heavy minerals\nresist transport; waves and\ncurrents concentrate them\nin beach/coastal deposits"],
]
link_col_w = [W*0.18, W*0.24, W*0.20, W*0.38]
link_data = [link_headers] + [[Paragraph(c, cell_body) for c in r] for r in link_rows]
link_table = Table(link_data, colWidths=link_col_w, repeatRows=1)
link_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), STEEL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_STEEL]),
]))
story.append(link_table)
story.append(Spacer(1, 0.5*cm))
# ════════════════════════════════════════════════════════════════════════════
# SECTION 4 — DISTRICT-WISE MINERAL MAP (text-based)
# ════════════════════════════════════════════════════════════════════════════
story.append(banner("4. District-wise Mineral Distribution"))
story.append(Paragraph(
"The spatial distribution of minerals in Odisha mirrors its underlying geological zones. "
"Northern and central districts (Keonjhar, Jajpur, Sundargarh, Mayurbhanj) sit on "
"Proterozoic IOG rocks and are rich in iron and chromite. Southern and central plateau "
"districts (Koraput, Kalahandi, Rayagada) rest on Eastern Ghats formations and yield "
"bauxite and graphite. Western districts (Angul, Jharsuguda) overlie Gondwana basins "
"and are Odisha's coal heartland.",
body))
story.append(Spacer(1, 0.25*cm))
dist_headers = [
Paragraph("District", cell_head),
Paragraph("Dominant Geology", cell_head),
Paragraph("Key Minerals", cell_head),
Paragraph("Notable Mines / Sites", cell_head),
]
dist_rows = [
["Keonjhar", "IOG + Gangpur Group", "Iron ore, Chromite, Manganese, Nickel", "Joda-Barbil belt; Boula-Nuasahi complex"],
["Jajpur", "IOG — Sukinda Ultramafics", "Chromite (dominant), Iron ore", "Sukinda Valley (largest chromite belt)"],
["Mayurbhanj", "IOG — BIF + Archaean gneisses", "Iron ore, Manganese, Copper", "Barajamda, Gorumahisani, Badampahar"],
["Sundargarh", "IOG + Gangpur + Gondwana", "Iron ore, Coal, Manganese, Limestone", "Rourkela-area coal & iron mines"],
["Angul", "Gondwana Supergroup", "Coal (dominant), Bauxite (minor)", "Talcher coalfield (~60% of state coal)"],
["Jharsuguda", "Gondwana Supergroup", "Coal, Fireclay", "Ib River coalfield"],
["Sambalpur", "Gondwana + Gangpur", "Coal, Dolomite, Limestone", "Ib River basin extensions"],
["Koraput", "Eastern Ghats Granulite Belt", "Bauxite, Graphite, Limestone, Nickel", "Damanjodi (NALCO), Pottangi bauxite"],
["Kalahandi", "Eastern Ghats — Khondalite", "Bauxite (high-grade), Graphite", "Lanjigarh plateau (Vedanta bauxite)"],
["Rayagada", "Eastern Ghats — Khondalite", "Bauxite, Graphite, Limestone", "Baphliamali & Sijimali plateaus"],
["Kandhamal", "Eastern Ghats — Charnockite", "Bauxite, Steatite (soapstone)", "Phulbani-area deposits"],
["Bolangir", "Gangpur + Eastern Ghats", "Manganese, Dolomite, Limestone", "Patnagarh region manganese"],
["Kendrapara /\nJagatsinghpur", "Quaternary coastal", "Ilmenite, Rutile, Zircon, Monazite", "Erasama & Astaranga beach sands"],
["Dhenkanal", "IOG — Ultramafics", "Chromite (minor), Iron ore", "Kansa-Sukinda periphery"],
["Ganjam", "Eastern Ghats + Coastal Q.", "Beach sand minerals, Graphite", "Gopalpur coastal belt"],
]
dist_col_w = [W*x for x in [0.16, 0.22, 0.28, 0.34]]
dist_data = [dist_headers] + [[Paragraph(c, cell_body) for c in r] for r in dist_rows]
dist_table = Table(dist_data, colWidths=dist_col_w, repeatRows=1)
dist_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_GREEN),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ALIGN", (0,0), (1,-1), "LEFT"),
("ALIGN", (0,0), (0,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GREY]),
# Colour-code by geology zone
("BACKGROUND", (0,1), (-1,6), colors.HexColor("#E8F5E9")), # IOG/N Odisha — green
("BACKGROUND", (0,7), (-1,11), colors.HexColor("#FFF9C4")), # E Ghats — yellow
("BACKGROUND", (0,12), (-1,14), colors.HexColor("#E3F2FD")), # Coastal/S — blue
# Re-apply Gondwana rows
("BACKGROUND", (0,5), (-1,7), colors.HexColor("#FFF3E0")), # Gondwana — amber
]))
dist_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_GREEN),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GREY]),
]))
story.append(dist_table)
# Zone legend
story.append(Spacer(1, 0.25*cm))
zone_leg = [
[Paragraph("Zone Key:", bold_body),
Paragraph("Rows 1–6: Northern IOG Belt (Iron, Chromite, Mn)", cell_body),
Paragraph("Rows 7–8: Gondwana Belt (Coal)", cell_body),
Paragraph("Rows 9–12: Eastern Ghats Belt (Bauxite, Graphite)", cell_body),
Paragraph("Rows 13–15: Coastal Zone (Beach Minerals, Graphite)", cell_body),
]
]
zone_table = Table(zone_leg, colWidths=[W*x for x in [0.12, 0.26, 0.15, 0.25, 0.22]])
zone_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), PALE_AMBER),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("BOX", (0,0), (-1,-1), 0.5, ORANGE),
]))
story.append(zone_table)
story.append(Spacer(1, 0.5*cm))
# ════════════════════════════════════════════════════════════════════════════
# SECTION 5 — QUICK COMPARISON: MINERAL BELT vs BELT
# ════════════════════════════════════════════════════════════════════════════
story.append(banner("5. Head-to-Head: Sukinda vs Boula-Nuasahi Chromite Belts"))
comp_headers = [
Paragraph("Parameter", cell_head),
Paragraph("Sukinda Ultramafic Belt\n(Jajpur)", cell_head),
Paragraph("Boula-Nuasahi Complex\n(Keonjhar)", cell_head),
]
comp_rows = [
["Location", "Sukinda Valley, Jajpur District", "Keonjhar District"],
["Host Rock", "Dunite, peridotite, pyroxenite (IOG)", "Dunite, peridotite (IOG layered complex)"],
["Geological Age", "Early Proterozoic (~2.5 Ga)", "Early Proterozoic"],
["Structure", "Synclinally folded; 3 zones (N, C, S)","Layered igneous complex"],
["Chromite Grade", "40–45% Cr₂O₃", "High-grade; ferro-chrome quality"],
["Reserves", "Largest in India; ~176 MT (all cat.)", "Second largest in Odisha"],
["Associated Minerals","Iron ore, Nickel, Vanadium", "Nickel, Cobalt, PGMs (unique)"],
["Economic Importance","Supplies ~96% of India's chromite", "Key for nickel & PGM extraction"],
["Special Feature", "Largest contiguous chromite body\nin the world",
"India's only significant PGM\n(platinum group metals) source"],
]
comp_col_w = [W*0.22, W*0.39, W*0.39]
comp_data = [comp_headers] + [[Paragraph(c, cell_body) for c in r] for r in comp_rows]
comp_table = Table(comp_data, colWidths=comp_col_w, repeatRows=1)
comp_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), STEEL),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, colors.HexColor("#E8F5E9")]),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("TEXTCOLOR", (0,1), (0,-1), STEEL),
("BACKGROUND", (0,-1), (-1,-1), colors.HexColor("#C8E6C9")),
]))
story.append(comp_table)
story.append(Spacer(1, 0.5*cm))
# ════════════════════════════════════════════════════════════════════════════
# SECTION 6 — KEY TAKEAWAYS
# ════════════════════════════════════════════════════════════════════════════
story.append(banner("6. Key Takeaways — Geology Drives Mineral Geography", bg=ORANGE, fg=WHITE))
takeaways = [
("Precambrian Dominance",
"72.5% of Odisha's area is Precambrian rock — the single biggest reason the state dominates India's metallic mineral reserves."),
("Iron Ore Group (IOG) = Metal Wealth",
"The ancient IOG formations of northern Odisha are the source of virtually all iron ore and chromite, making Keonjhar, Jajpur, and Mayurbhanj the backbone of India's steel industry."),
("Eastern Ghats = Bauxite & Graphite",
"Intense Proterozoic metamorphism + prolonged tropical lateritisation of khondalite rocks has produced the East Coast Bauxite Belt — India's largest, with 51% of national reserves."),
("Gondwana Basins = Energy Reserve",
"The Permian Gondwana basins of western Odisha trapped organic carbon that became coal. The Talcher coalfield alone holds enormous reserves crucial for India's power sector."),
("Coastal Geology = Rare Minerals",
"Quaternary coastal processes have concentrated titanium, zirconium, and rare-earth-bearing minerals along the coast — an often overlooked but strategically important resource."),
("First Linguistic Province, First Mineral State",
"Odisha contributes ~46% of India's total mineral production value (FY2024), a direct dividend of its extraordinary geological heritage spanning 4 billion years."),
]
take_col_w = [W*0.24, W*0.76]
take_data = []
for title, detail in takeaways:
take_data.append([
Paragraph(title, bold_body),
Paragraph(detail, cell_body)
])
take_table = Table(take_data, colWidths=take_col_w)
take_table.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("ROWBACKGROUNDS", (0,0), (-1,-1), [PALE_AMBER, WHITE]),
("TEXTCOLOR", (0,0), (0,-1), ORANGE),
("LINEAFTER", (0,0), (0,-1), 1, ORANGE),
]))
story.append(take_table)
story.append(Spacer(1, 0.4*cm))
# ── Footer note ──────────────────────────────────────────────────────────────
story.append(HRFlowable(width=W, thickness=0.5, color=MID_GREY))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph(
"Sources: Indian Bureau of Mines (IBM) | Society of Geoscientists & Allied Technologists, Odisha | "
"Odisha Directorate of Geology | ASSOCHAM Odisha Mining Report 2022 | odishageography.com | "
"Generated by Orris AI — For academic reference only.",
footer_style))
# ── Build ────────────────────────────────────────────────────────────────────
doc.build(story)
print("PDF generated:", OUTPUT)
cd /home/daytona/workspace/odisha-minerals && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/odisha-minerals/Odisha_Mineral_Belts_Rock_Formations.pdf
Odisha Mineral Belts Rock Formations
PDF Document · PDF
| Section | What it covers |
|---|---|
| 1. Geological Time Scale & Rock Systems | All 6 major rock systems (Archean to Quaternary) with age, rock types, area coverage, and primary minerals in a comparison table |
| 2. Mineral Belt Comparison | 10 mineral belts side-by-side - host rock, geological age, key minerals, districts, structure, and India's share % |
| 3. Rock Formation → Mineral Linkage | Cause-and-effect table explaining why each rock type produces its specific mineral (the geochemical reasoning) |
| 4. District-wise Mineral Distribution | 15 districts mapped to their dominant geology and key minerals, colour-coded by zone |
| 5. Sukinda vs Boula-Nuasahi Head-to-Head | Detailed comparison of Odisha's two major chromite belts |
| 6. Key Takeaways | 6 synthesised conclusions tying geology directly to mineral geography |
Generate a comparison table of Odisha's mineral belts and rock formations
| Rock System | Geological Age | Age (Ga) | Rock Types | Area Coverage | Primary Minerals Hosted |
|---|---|---|---|---|---|
| Archean Crystalline Basement Complex | Archean Eon | 4.0 – 2.5 Ga | Granites, gneisses, schists, amphibolites | Basement foundation of entire state | Structural host; localised gold traces |
| Iron Ore Group (IOG) | Early–Mid Proterozoic | ~2.5 – 1.6 Ga | Banded Iron Formations (BIF), phyllites, shales, ultramafics | Northern & central Odisha belt | Iron ore (hematite), Chromite, Manganese |
| Gangpur Group | Mid Proterozoic | ~1.8 – 1.2 Ga | Phyllites, quartzites, limestones, schists (low-med metamorphics) | Northwestern Odisha | Manganese, Limestone, Lead-Zinc, Dolomite |
| Eastern Ghats Granulite Belt | Mid–Late Proterozoic | ~1.6 – 0.9 Ga | Khondalites, charnockites, migmatites, anorthosites, alkaline rocks | ~52,000 sq km; central–southern Odisha | Bauxite, Graphite, Nickel, Gemstones (Ruby), Copper, PGMs |
| Gondwana Supergroup | Permian–Triassic (Mesozoic) | ~0.3 – 0.2 Ga | Sandstone, shale, conglomerate, coal seams | ~8% of state; river valley basins | Coal, Fireclay |
| Tertiary & Quaternary Coastal Deposits | Cenozoic | < 0.065 Ga | Alluvium, laterite, beach sand, deltaic sediments | Eastern coastal plains | Ilmenite, Rutile, Zircon, Monazite, Garnet |
| Mineral Belt / Complex | Host Rock Formation | Geological Age | Key Minerals | Major Districts | Structure / Occurrence | India's Share |
|---|---|---|---|---|---|---|
| Sukinda Ultramafic Belt | IOG — Dunite, Peridotite, Pyroxenite | Early Proterozoic (~2.5 Ga) | Chromite (high-grade, 40–45% Cr₂O₃) | Jajpur (95.6% of state chromite output) | Synclinally folded body; 3 zones — North, Central, South | ~96% |
| Boula-Nuasahi Igneous Complex | IOG — Ultramafics (dunite, peridotite) | Early Proterozoic | Chromite, Nickel, Cobalt, PGMs | Keonjhar | Layered igneous complex; high-grade ore | Nickel: ~92% |
| Joda–Barbil–Barajamda Belt | IOG — Banded Iron Formations (BIF), jaspilites | Early Proterozoic (~2.3 Ga) | Iron ore (hematite/magnetite, 60–65% Fe) | Keonjhar, Mayurbhanj, Sundargarh | Tabular/lensoid BIF bands; open-cast mineable | ~33% |
| Daitari–Tomka Iron Belt | IOG — BIF, shales, phyllites | Proterozoic | Iron ore, Manganese | Jajpur, Keonjhar | Folded BIF with associated Mn layers | Part of 33% |
| Gangpur Metasedimentary Belt | Gangpur Group — Phyllites, quartzites, limestone | Mid Proterozoic (~1.8 Ga) | Manganese, Limestone, Lead-Zinc, Dolomite | Sundargarh, Keonjhar, Bolangir | Stratiform / syn-sedimentary deposits | Mn: ~43% |
| East Coast Bauxite Deposits | Eastern Ghats — Khondalite & Charnockite laterite caps | Proterozoic (~1.0 Ga); lateritised in Cenozoic | Bauxite (Al₂O₃ 40–56%) | Koraput, Kalahandi, Rayagada, Kandhamal | Plateau-top cappings at 900–1,400 m elevation | ~51% |
| Eastern Ghats Graphite Belt | Eastern Ghats — Khondalite, migmatite (metapelites) | Proterozoic | Graphite, Ruby (gemstone), Garnet | Bargarh, Kalahandi, Koraput, Rayagada | Disseminated / vein-type in metamorphic pelites | Ruby: sole source in India |
| Talcher Coalfield | Gondwana Supergroup — Sandstone, shale, coal seams | Permian (~280 Ma) | Coal (sub-bituminous to bituminous) | Angul (~60% of state coal output) | Fluvio-lacustrine basin; multiple seams | ~24% |
| Ib River Coalfield | Gondwana Supergroup | Permian | Coal, Fireclay | Jharsuguda, Sundargarh, Sambalpur | River-valley basin deposits | Part of 24% |
| Coastal Beach Sand Belt | Quaternary — Alluvium, beach sand, laterite | Cenozoic (< 2 Ma) | Ilmenite, Rutile, Zircon, Monazite, Garnet | Kendrapara, Jagatsinghpur, Ganjam coast | Placer deposits; marine & fluvial concentrations | Zircon: ~24% |
| Rock Formation | Geological Process | Resulting Mineral | Why This Formation Produces This Mineral |
|---|---|---|---|
| Banded Iron Formation (IOG) | Chemical precipitation from Proterozoic seas + hydrothermal enrichment | Iron Ore (Hematite, Magnetite) | Fe-rich seawater precipitated silica-iron bands; weathering removed silica, concentrating iron to 60–65% |
| Ultramafic intrusions within IOG (Dunite, Peridotite) | Magmatic crystallisation; chromite segregated early from mafic magma | Chromite, Nickel, Cobalt, PGMs | Chromite crystallises at high temperature as an early cumulate mineral in ultramafic magma chambers |
| Khondalite — Eastern Ghats | High-grade metamorphism of Al-rich sediments + intense tropical lateritisation | Bauxite (Al₂O₃ 40–56%) | Khondalite is rich in aluminium silicates; prolonged weathering leaches silica, leaving Al-hydroxides |
| Khondalite & Migmatite — Eastern Ghats | Granulite-facies metamorphism of carbonaceous sediments | Graphite, Ruby, Garnet | Organic carbon in pelites recrystallises to graphite; ruby forms in Al-rich marble layers |
| Phyllites & Shales — Gangpur Group | Marine chemical sedimentation + low-grade metamorphism | Manganese, Limestone, Dolomite | Mn precipitated from oxygen-deficient marine waters; limestone from carbonate accumulation |
| Gondwana sedimentary basins | Burial of Permian swamp flora + thermal maturation over ~250 Ma | Coal (sub-bituminous to bituminous) | River-valley basins trapped organic matter; burial under sediment led to coalification |
| Quaternary beach and alluvial sands | Fluvial transport + marine wave sorting; placer concentration | Ilmenite, Rutile, Zircon, Monazite | Dense heavy minerals resist transport; waves concentrate them in coastal deposits |
| District | Dominant Geology | Key Minerals | Notable Mines / Areas |
|---|---|---|---|
| Keonjhar | IOG + Gangpur Group | Iron ore, Chromite, Manganese, Nickel | Joda-Barbil belt; Boula-Nuasahi complex |
| Jajpur | IOG — Sukinda Ultramafics | Chromite (dominant), Iron ore | Sukinda Valley — largest chromite belt in India |
| Mayurbhanj | IOG — BIF + Archaean gneisses | Iron ore, Manganese, Copper | Barajamda, Gorumahisani, Badampahar |
| Sundargarh | IOG + Gangpur + Gondwana | Iron ore, Coal, Manganese, Limestone | Rourkela-area mines |
| Angul | Gondwana Supergroup | Coal (dominant) | Talcher coalfield (~60% of state coal) |
| Jharsuguda | Gondwana Supergroup | Coal, Fireclay | Ib River coalfield |
| Koraput | Eastern Ghats Granulite Belt | Bauxite, Graphite, Limestone, Nickel | Damanjodi (NALCO), Pottangi |
| Kalahandi | Eastern Ghats — Khondalite | Bauxite (high-grade), Graphite | Lanjigarh plateau |
| Rayagada | Eastern Ghats — Khondalite | Bauxite, Graphite, Limestone | Baphliamali & Sijimali plateaus |
| Bolangir | Gangpur + Eastern Ghats | Manganese, Dolomite, Limestone | Patnagarh region |
| Kendrapara / Jagatsinghpur | Quaternary coastal | Ilmenite, Rutile, Zircon, Monazite | Erasama & Astaranga beach sands |
| Ganjam | Eastern Ghats + Coastal Quaternary | Beach sand minerals, Graphite | Gopalpur coastal belt |
| Geological Zone | Location in Odisha | Rock Type | Dominant Minerals |
|---|---|---|---|
| Northern IOG Belt | Keonjhar, Jajpur, Mayurbhanj, Sundargarh | Banded Iron Formations + Ultramafics | Iron ore, Chromite, Nickel, Manganese |
| Western Gondwana Belt | Angul, Jharsuguda, Sambalpur | Gondwana sedimentary sequences | Coal, Fireclay |
| Southern/Central Eastern Ghats Belt | Koraput, Kalahandi, Rayagada, Kandhamal | Khondalite, Charnockite (granulites) | Bauxite, Graphite, Gemstones |
| Eastern Coastal Belt | Kendrapara, Jagatsinghpur, Ganjam | Quaternary alluvium & beach sand | Ilmenite, Rutile, Zircon, Monazite |
Bottom line: Odisha's mineral map is effectively a mirror of its geological map. Every major mineral belt spatially overlaps its parent rock formation - iron and chromite over IOG, bauxite over Eastern Ghats khondalites, coal over Gondwana basins, and heavy minerals over Quaternary coastal sands. This is why Odisha contributes ~46% of India's total mineral production value (FY2024).