Exploring Historical Geology with Wolfram Language

Jeff Bryant, Wolfram|Alpha

(RowDefault[, (Spacer1), , (Spacer1), ])  #WolframTechConf

ABSTRACT

Reconstructions of the geological history of the Earth can be carried out using a number of tools in Wolfram Language. [GeoGraphics], [EntityValue] and the [Wolfram Function Repository] provide a variety of tools that aid in exploring historical geology and will all be investigated in this presentation.

Introduction

Historical geology is a branch of geology that studies of the changes to Earth and its systems over geologic time using preserved evidence.

GraphicsGrid[{{DateListPlot[{(Entity["Phanerozoic Eon", Entity["GeologicalPeriod","PhanerozoicEon"], "Entity[\"GeologicalPeriod\", \"PhanerozoicEon\"]", "geological period"])["Biodiversity"],(Entity["Ordovician Period", Entity["GeologicalPeriod","OrdovicianPeriod"], "Entity[\"GeologicalPeriod\", \"OrdovicianPeriod\"]", "geological period"])["Biodiversity"],(Entity["Mesozoic Era", Entity["GeologicalPeriod","MesozoicEra"], "Entity[\"GeologicalPeriod\", \"MesozoicEra\"]", "geological period"])["Biodiversity"]},FrameTicks->None,AspectRatio->1,PlotRangePadding->0],ResourceFunction["GeologicalPeriodBedrockPlot"][{Entity["GeologicalPeriod","OrdovicianPeriod"],Entity["GeologicalPeriod","SilurianPeriod"],Entity["GeologicalPeriod","DevonianPeriod"],Entity["GeologicalPeriod","PennsylvanianEpoch"],Entity["GeologicalPeriod","MississippianEpoch"]},GeoCenter->Entity["City",{"Cincinnati","Ohio","UnitedStates"}],GeoRange->Quantity[500,"Miles"]],}},ImageSize->600]//Rasterize

GeologicalPeriod Entity Type

Basic Exploration

Entities from Eons down to Ages:

periods=EntityValue["GeologicalPeriod","Entities"]

Numerous properties available:

(Entity["Ordovician Period", Entity["GeologicalPeriod","OrdovicianPeriod"], "Entity[\"GeologicalPeriod\", \"OrdovicianPeriod\"]", "geological period"])["Properties"]

(Entity["Ordovician Period", Entity["GeologicalPeriod","OrdovicianPeriod"], "Entity[\"GeologicalPeriod\", \"OrdovicianPeriod\"]", "geological period"])["BiologicalEvents"]

Some properties return [TimeSeries] that can be plotted:

DateListPlot[{(Entity["Phanerozoic Eon", Entity["GeologicalPeriod","PhanerozoicEon"], "Entity[\"GeologicalPeriod\", \"PhanerozoicEon\"]", "geological period"])["Biodiversity"],(Entity["Ordovician Period", Entity["GeologicalPeriod","OrdovicianPeriod"], "Entity[\"GeologicalPeriod\", \"OrdovicianPeriod\"]", "geological period"])["Biodiversity"],(Entity["Mesozoic Era", Entity["GeologicalPeriod","MesozoicEra"], "Entity[\"GeologicalPeriod\", \"MesozoicEra\"]", "geological period"])["Biodiversity"]}]

DateListPlot[{(Entity["Ediacaran Period", Entity["GeologicalPeriod","EdiacaranPeriod"], "Entity[\"GeologicalPeriod\", \"EdiacaranPeriod\"]", "geological period"])["SeaLevel"],(Entity["Cambrian Period", Entity["GeologicalPeriod","CambrianPeriod"], "Entity[\"GeologicalPeriod\", \"CambrianPeriod\"]", "geological period"])["SeaLevel"]}]

DateListPlot[(Entity["Carboniferous Period", Entity["GeologicalPeriod","CarboniferousPeriod"], "Entity[\"GeologicalPeriod\", \"CarboniferousPeriod\"]", "geological period"])["AtmosphericCO2"]]

Wolfram Function Repository – GeologicalPeriodChronologyChart

Historical geology requires an understanding of the geologic time scale. [GeologicalPeriodChronologyChart] can be used to provide a visual tool for use in such explorations.

ResourceFunction["GeologicalPeriodChronologyChart"][Entity["GeologicalPeriod","PaleozoicEra"],2]

ResourceFunction["GeologicalPeriodChronologyChart"][Entity["GeologicalPeriod","QuaternaryPeriod"]]

ResourceFunction["GeologicalPeriodChronologyChart"][Entity["GeologicalPeriod","CalabrianAge"],2]

GeoGraphics Explorations

By default, GeoGraphics is used for general mapping of Earth.

GeoGraphics[GeoRange->All]

Polygons that use geo coordinates can be overlaid on top of the map and styled as desired.

GeoGraphics[{GeoStyling[Red],Polygon[(Entity["United States", Entity["Country","UnitedStates"], "Entity[\"Country\", \"UnitedStates\"]", "country"])]},GeoRange->All]

But if your polygons represent the position of continental plates in the distant past, the mix of the polygons and the modern map don’t play nice together.

plates=(Entity["Ordovician Period", Entity["GeologicalPeriod","OrdovicianPeriod"], "Entity[\"GeologicalPeriod\", \"OrdovicianPeriod\"]", "geological period"])["ContinentalPlates"]

GeoGraphics[{plates[(DateObject["Year: ""-445000000", DateObject[{-445000000},"Year"]])]},GeoRange->All]

This problem can be avoided by turning off the default GeoBackground

GeoGraphics[{plates[(DateObject["Year: ""-445000000", DateObject[{-445000000},"Year"]])]},GeoRange->All,GeoBackground->None]

Once this has been done, we can apply whatever styling and options we desire.

GeoGraphics[{GeoStyling[Brown],plates[(DateObject["Year: ""-445000000", DateObject[{-445000000},"Year"]])]},GeoRange->All,GeoBackground->LightBlue,GeoProjection->"Mollweide",GeoGridLines->Automatic]

Wolfram Function Repository – ContinentalPlateMaps

[ContinentalPlateMaps] was designed to make it a little easier to create these ancient world maps so you don’t have to construct the GeoGraphics scene yourself. For a given geological time period, polygons are available at various snapshots within that period.

({{"[◼]", "ContinentalPlateMaps" }})[(Entity["Ordovician Period", Entity["GeologicalPeriod","OrdovicianPeriod"], "Entity[\"GeologicalPeriod\", \"OrdovicianPeriod\"]", "geological period"])]

If you are interested in a specific snapshot of time, you can feed the date/quantity in.

({{"[◼]", "ContinentalPlateMaps" }})[(DateObject["Year: ""-445000000", DateObject[{-445000000},"Year"]])]

We can extract all of the unique time snapshots available using the following and then animate them to show how the continental plates have moved around over the last billion years.

plots=Flatten[Values[KeySort[Union/@Merge[DeleteMissing[ResourceFunction["ContinentalPlateMaps"]/@periods],Identity]]]];

ListAnimate[plots]

GeologicalFormation EntityType

As rock units are laid down over geologic time, they can be grouped based on appearance that is distinct enough from surrounding units to define a geological formation. Many geological formations can be found around the world of different age and composition.

EntityValue["GeologicalFormation","Properties"]

Entity["GeologicalFormation","MorrisonUnitedStates"]["Lithology"]

Entity["GeologicalFormation","MorrisonUnitedStates"]["GeologicalPeriod"]

GeologicalFormation - Uses

We can use GeologicalPeriodChronologyChart to visualize the ages of the rocks in a formation.

ResourceFunction["GeologicalPeriodChronologyChart"][#]&/@SortBy[Entity["GeologicalFormation","MorrisonUnitedStates"]["GeologicalPeriod"],#["TimeRange"]&]

Since the available data includes position and/or polygon information, we can use GeoGraphics to visualize where these formations can be found.

GeoListPlot[{Entity["GeologicalFormation","LibertyUnitedStates"],Entity["GeologicalFormation","WhitewaterUnitedStates"],Entity["GeologicalFormation","FairviewUnitedStates"]},GeoRange->Quantity[1000,"Miles"]]

The available data for dinosaurs includes the geological formations their fossils are found in.

trex=(Entity["Tyrannosaurus rex", Entity["Dinosaur","Species:TyrannosaurusRex"], "Entity[\"Dinosaur\", \"Species:TyrannosaurusRex\"]", "dinosaur"])["GeologicalFormations"]

We can use this data to visualize where Tyrannosaurus rex fossils are found.

GeoListPlot[trex,GeoRange->Quantity[1000,"Miles"]]

Expanding this analysis further, we can find dinosaur fossil localities globally.

dinos=Flatten[EntityValue["Dinosaur","GeologicalFormations"]];

GeoListPlot[Union[dinos],PlotLegends->None,PlotMarkers->Point,PlotStyle->Directive[Orange,AbsolutePointSize[3]]]

We can even include information that shows where most dinosaur fossils are found.

GeoRegionValuePlot[SortBy[dinos//Tally,Last]]

Wolfram Function Repository – GeologicalPeriodBedrockPlot

If you strip away the soil at a given location, you will eventually encounter the bedrock. The age (and composition) of the bedrock varies depending on your location. The exact details of the age depends not only on when rocks were formed or deposited (igneous and metamorphic vs sedimentary), but also depends on environmental factors such as erosion and chemical weathering over time. GeologicalPeriodBedrockPlot can be used to plot the location of bedrock of a specified age (currently covers mostly North and Central America including offshore areas).

Here’s an example showing where Permian bedrock can be found in the central U.S.

ResourceFunction["GeologicalPeriodBedrockPlot"][Entity["GeologicalPeriod","PermianPeriod"],GeoCenter->Entity["AdministrativeDivision",{"Oklahoma","UnitedStates"}],GeoRange->Quantity[500,"Miles"]]

You can also plot bedrock of multiple ages. Here’s an example showing the bedrock in the mid-west U.S.

ResourceFunction["GeologicalPeriodBedrockPlot"][{Entity["GeologicalPeriod","OrdovicianPeriod"],Entity["GeologicalPeriod","SilurianPeriod"],Entity["GeologicalPeriod","DevonianPeriod"],Entity["GeologicalPeriod","PennsylvanianEpoch"],Entity["GeologicalPeriod","MississippianEpoch"]},GeoCenter->Entity["City",{"Cincinnati","Ohio","UnitedStates"}],GeoRange->Quantity[500,"Miles"],PlotLegends->True]

GeologicalPeriodBedrockPlot - Applied Use

Typically, adjacent rock layers are continuous in age. Older rocks are typically found below younger rocks with no gaps in between. But, as mentioned earlier, erosion and chemical weathering (or lack of deposition) can result in rocks of different ages being stacked on top of each other. This is similar to the GeologicalPeriodChronologyChart described earlier. For example, here are the geological periods and sub-periods from the Mesoproterozoic Era through the Cambrian Period. Notice the older periods are below the younger ones. The same is typical of the rock record.

ResourceFunction["GeologicalPeriodChronologyChart"][Entity["GeologicalPeriod","PrecambrianSupereon"],2]

When a discontinuity of the rock record is found, this is known as an unconformity. In a given location, rocks may have not been deposited for a length of time, or they may have been eroded away. The length of missing time in the rock record may vary from one unconformity to another. For example, in southeastern Missouri its possible to find rocks that are Mesoproterozic in age right under and adjacent to rock that is Cambrian Period in age. This is nearly 1 billion years of time missing in the rock record. This particular unconformity is known as the Great Unconformity and can be found in various locations around the world. Here’s a GeologicalPeriodBedrockPlot showing the adjacent Mesoproterozoic and Cambrian rocks in southeast Missouri.

[{(Entity["Cambrian Period", Entity["GeologicalPeriod","CambrianPeriod"], "Entity[\"GeologicalPeriod\", \"CambrianPeriod\"]", "geological period"]),(Entity["Mesoproterozoic Era", Entity["GeologicalPeriod","MesoproterozoicEra"], "Entity[\"GeologicalPeriod\", \"MesoproterozoicEra\"]", "geological period"])},GeoCenter->(Entity["Fredericktown", Entity["City",{"Fredericktown","Missouri","UnitedStates"}], "Entity[\"City\", {\"Fredericktown\", \"Missouri\", \"UnitedStates\"}]", "city"]),GeoRange->Quantity[350,"Miles"],"BedrockOpacity"->1]

Zooming in and changing the GeoBackground allows us to see possible road cuts that may expose the Great Unconformity at the surface. Here, we zoom into Frederickstown, MO and can see that along highway 72, west of Frederickstown, we can see a transition of these bedrock layers (where the orange meets the green).

[{(Entity["Cambrian Period", Entity["GeologicalPeriod","CambrianPeriod"], "Entity[\"GeologicalPeriod\", \"CambrianPeriod\"]", "geological period"]),(Entity["Mesoproterozoic Era", Entity["GeologicalPeriod","MesoproterozoicEra"], "Entity[\"GeologicalPeriod\", \"MesoproterozoicEra\"]", "geological period"])},GeoCenter->(Entity["Fredericktown", Entity["City",{"Fredericktown","Missouri","UnitedStates"}], "Entity[\"City\", {\"Fredericktown\", \"Missouri\", \"UnitedStates\"}]", "city"]),GeoRange->Quantity[10,"Miles"],GeoBackground->"StreetMap","BedrockOpacity"->.4]

I was fortunate to be able to drive there in 2023 and find a prime example of one of these road cuts a couple of miles west of Frederickstown. In the following picture, my hand is on ~1.5 billion year old Mesoproterozoic igneous bedrock while over my head is a distinct cobbled sedimentary layer that is a about a billion years younger (Cambrian).

Though the true cause of the Great Unconformity is still being debated in the literature, the rock in between the Mesoproterozoic and Cambrian was likely eroded away about 700 million years ago during the Cryogenian Period when massive global ice sheets covered the Earth in a “Snowball Earth” event. As the world recovered from this global ice age, sea levels began to rise leading up to the Cambrian Period leading to sandstone deposits.

Using Third Party Data

Third party data can provide many examples of niche datasets that may be of interest for those users within a field of expertise. Data sets may be limited in scope or large in size, or both, but almost always requires some work to clean it up and make it computable.

Third Party Data - Geologic Assembly of the United States

https://community.wolfram.com/groups/-/m/t/2952971

This party data exists that explores the age and properties of the continental basement, at the base of the bedrock. Exploring such data provides an understanding of how and when the continents were assembled.

Code

data=Import["https://pubs.usgs.gov/ds/0898/downloads/datafiles/Bsmt_CONUS_AK_shapefiles.zip","Data"][[1]];

labeledData=Lookup[data,"LabeledData"];

domains=Lookup[labeledData,"Domain_Nam"];

geometry=Lookup[data,"Geometry"];

geometryRules=Normal@Merge[Thread[domains->geometry],Join];

altNames=Lookup[labeledData,"Alternate_"]/."<Null>"->Missing["NotAvailable"];

altNameRules=DeleteDuplicates[Thread[domains->altNames]];

formationAge=Lookup[labeledData,"Crust_Form"];

formationAgeRules=DeleteDuplicates[Thread[domains->formationAge]];

stringToNumericList[s_]:=Which[!StringFreeQ[s," Ga"],ToExpression["1000000000 "<>StringReplace[#," Ga"->""]],!StringFreeQ[s," Ma"],ToExpression["1000000 "<>StringReplace[#," Ma"->""]],!StringFreeQ[s,DigitCharacter],ToExpression["1000000000 "<>#],True,#]&/@StringSplit[s,"-"]

formationAgeNumericRules=SortBy[Rule[#[[1]],Replace[Replace[#[[2]],s_String:>stringToNumericList[s]],{{a_,b_}:>Interval[{-a,-b}],{a_}:>Interval[{-a,-a}]}]]&/@formationAgeRules,#[[2]]&];

accretionAge=Lookup[labeledData,"Accretion1"]/."<Null>"->Missing["NotAvailable"];

accretionAgeRules=DeleteDuplicates[Thread[domains->accretionAge]]/."1.45-1.35"->"1.45-1.35 Ga";

crustType=Lookup[labeledData,"Crust_Type"]/."<Null>"->Missing["NotAvailable"];

crustTypeRules=DeleteDuplicates[Thread[domains->crustType]];

periodRangeRules=Normal[QuantityMagnitude[#,"Years"]&/@EntityValue[Join[EntityList[EntityClass["GeologicalPeriod","Periods"]],{(Entity["Neoarchean Era", Entity["GeologicalPeriod","NeoarcheanEra"], "Entity[\"GeologicalPeriod\", \"NeoarcheanEra\"]", "geological period"]),(Entity["Eoarchean Era", Entity["GeologicalPeriod","EoarcheanEra"], "Entity[\"GeologicalPeriod\", \"EoarcheanEra\"]", "geological period"]),(Entity["Paleoarchean Era", Entity["GeologicalPeriod","PaleoarcheanEra"], "Entity[\"GeologicalPeriod\", \"PaleoarcheanEra\"]", "geological period"])}],"TimeRange","EntityAssociation"]];

intervalToEntity[num_]:=Select[periodRangeRules,IntervalMemberQ[#[[2]],num[[1,1]]]&][[1,1]]

uniquedomains=DeleteDuplicates[domains];

formationAgeColorRules1=Rule[#[[1]],Replace[#[[2]],{num_Interval:>intervalToEntity[num]}]["CGMWColor"]]&/@formationAgeNumericRules;

formationAgeColorRules2=Rule[#,ColorData[1][Position[uniquedomains,#][[1,1]]]]&/@uniquedomains;

politicalBoundaries={GrayLevel[.5,.5],Line@@@((EntityClass["all US states with District of Columbia", EntityClass["AdministrativeDivision","AllUSStatesPlusDC"], "EntityClass[\"AdministrativeDivision\", \"AllUSStatesPlusDC\"]", "administrative divisions"])["Polygon"])};

domainTooltip[domain_]:=Column[{domain,With[{anam=Lookup[altNameRules,domain]},If[MatchQ[anam,_String],"alternate name: "<>anam,Sequence@@{}]],"type: "<>Lookup[crustTypeRules,domain],"formation: "<>Lookup[formationAgeRules,domain],With[{acc=Lookup[accretionAgeRules,domain]},If[MatchQ[acc,_String],"accretion: "<>acc,Sequence@@{}]]}]

domainPrimitives[rules_]:={GeoStyling[Directive[Lookup[rules,#],Opacity[.8],EdgeForm[GrayLevel[.15]]]],Annotation[Lookup[geometryRules,#],domainTooltip[#],"Callout"]}&/@domains;

ggUS[colorrules_]:=GeoGraphics[{domainPrimitives[colorrules],politicalBoundaries},GeoRange->(Entity["United States", Entity["Country","UnitedStates"], "Entity[\"Country\", \"UnitedStates\"]", "country"]),GeoBackground->"ReliefMap",GeoProjection->{"Orthographic","Centering"->GeoPosition[{38,-97}]}];

annotsUS[colorrules_]:=Cases[ggUS[colorrules][[1,1]],Annotation[_,_,"Callout"],Infinity];

toCentroid[{Style[{},___]..}]:={}

toCentroid[{Style[{},___],Style[p_Polygon,___]}]:=RegionCentroid[RegionUnion[p/.y_Style:>y[[1]]]]

toCentroid[{Style[{},___],Style[p1_Polygon,___],Style[{},___],Style[p2_Polygon,___]}]:={RegionCentroid[RegionUnion[p1/.y_Style:>y[[1]]]],RegionCentroid[RegionUnion[p2/.y_Style:>y[[1]]]]}

toCentroid[x_]:=RegionCentroid[RegionUnion[x/.y_Style:>y[[1]]]]

centroidCalloutsUSDomains[colorrules_]:=DeleteCases[annotsUS[colorrules],Annotation[{Style[{},___]..},__]|{}]/.Annotation[poly_,label_,"Callout"]:>Callout[toCentroid[poly],label[[1,1]]];

centroidCalloutsUSFullData[colorrules_]:=DeleteCases[annotsUS[colorrules],Annotation[{Style[{},___]..},__]|{}]/.Annotation[poly_,label_,"Callout"]:>Callout[toCentroid[poly],StringJoin[Riffle[label[[1]],"\n"]]];

ggAK[colorrules_]:=GeoGraphics[{domainPrimitives[colorrules],politicalBoundaries},GeoRange->(Entity["Alaska, United States", Entity["AdministrativeDivision",{"Alaska","UnitedStates"}], "Entity[\"AdministrativeDivision\", {\"Alaska\", \"UnitedStates\"}]", "administrative division"]),GeoBackground->"ReliefMap",GeoProjection->{"Orthographic","Centering"->GeoPosition[{64.53325502228302`,-152.7497197704388`}]}];

annotsAK[colorrules_]:=Cases[ggAK[colorrules][[1,1]],Annotation[_,_,"Callout"],Infinity];

centroidCalloutsAKDomains[colorrules_]:=(DeleteCases[annotsAK[colorrules],Annotation[{Style[{},___]..},__]|{}]/.Annotation[poly_,label_,"Callout"]:>Callout[toCentroid[poly],label[[1,1]]])/.Callout[{l1_List,l2_List},label_]:>Callout[Mean[{l1,l2}],label];

centroidCalloutsAKFullData[colorrules_]:=(DeleteCases[annotsAK[colorrules],Annotation[{Style[{},___]..},__]|{}]/.Annotation[poly_,label_,"Callout"]:>Callout[toCentroid[poly],StringJoin[Riffle[label[[1]],"\n"]]])/.Callout[{l1_List,l2_List},label_]:>Callout[Mean[{l1,l2}],label];

Examples

Color the formations based on standard Commission for the Global Map of the World (CGMW) colorsL

ggUS[formationAgeColorRules1]/.Annotation[poly_,label_,"Callout"]:>Tooltip[poly,label]

Arbitrary colors for greater contrast using ColorData:

ggUS[formationAgeColorRules2]/.Annotation[poly_,label_,"Callout"]:>Tooltip[poly,label]

Annotate the formations using callouts instead of tooltips:

Show[ggUS[formationAgeColorRules2][[1]],ListPlot[centroidCalloutsUSDomains[formationAgeColorRules2]]]

Show[ggAK[formationAgeColorRules2][[1]],ListPlot[centroidCalloutsAKDomains[formationAgeColorRules2]]]

Present the underlying non-geographic data as a dataset:

Dataset[<|"domain"->#,"alternate name"->Lookup[altNameRules,#],"type"->Lookup[crustTypeRules,#],"formation age"->Lookup[formationAgeRules,#],"accretion age"->Lookup[accretionAgeRules,#]|>&/@uniquedomains,ItemSize->12,ItemStyle->{10,GrayLevel[.9]},Background->{{#/.formationAgeColorRules2&/@uniquedomains},None}]

Third Party Data - Exploring Relief Maps on Ancient Earth

https://community.wolfram.com/groups/-/m/t/2828058

Previously shown polygon-based data provides position and rotation of continents only. Third party data is available that  includes global relief data which allows sea level changes and mountains to be seen as well.

Code

cdf=Import["\\\\wrisync02.wri.wolfram.com\\backup$\\jeffb\\My Documents\\DesktopStuff\\PaleoDEMs\\Scotese_Wright_2018_Maps_1-88_6minX6min_PaleoDEMS_nc\\Map57_PALEOMAP_6min_Late_Pennsylvanian_300Ma.nc","Data"]

data=Normal[cdf["/z"]];

ri=ReliefImage[data,PlotRange->{0,4500},ClippingStyle->{Automatic,White},ColorFunction->ColorDataFunction["HypsometricTints","Physical",{-11000,9000},Blend["HypsometricTints",#1]&],ColorFunctionScaling->False];

Examples

GeoGraphics[GeoBackground->GeoStyling[{"GeoImage",ri}],GeoProjection->"Mollweide",GeoGridLines->Automatic]

Compare this with the previous polygon-based approach:

ResourceFunction["ContinentalPlateMaps"][Quantity[300,"Megayears"],GeoGridLines->Automatic]

Third Party Data - Coal Beds by Age

https://community.wolfram.com/groups/-/m/t/1821130

Third party data is also available for more applied uses, such as the location and properties of coal beds.

Code

Import["https://pubs.usgs.gov/of/2008/1257/Americas_coal.zip","CoordinateSystemInformation"]

coaldata=Import["https://pubs.usgs.gov/of/2008/1257/Americas_coal.zip","Data"];

labeleddata="LabeledData"/.coaldata[[2]];

coalgeom="Geometry"/.coaldata[[2]];

agelabels="age"/.labeleddata;

agerules={"Carboniferous"->3.291*^8,"Cretaceous"->1.055*^8,"Cretaceous-Tertiary"->7.488*^7,"Devonian"->3.876*^8,"Eocene"->4.485*^7,"Jurassic"->1.7255*^8,"Jurassic and Cretaceous"->1.39*^8,"Jurassic to Upper Cretaceous"->1.2755*^8,"Lower Cretaceous"->1.23*^8,"Mesozoic"->1.58*^8,"Middle Jurassic"->1.684*^8,"Middle-Upper Jurassic"->1.61*^8,"Miocene"->1.418*^7,"Miocene-Oligocene"->2.13*^7,"Mississippian"->3.3865*^8,"Mississippian-Pennsylvanian"->3.236*^8,"Oligocene"->2.85*^7,"Oligocene-Paleocene"->4.46*^7,"Paleozoic - no differentiation"->3.96*^8,"Pennsylvanian"->3.0855*^8,"Pennsylvanian and Permian"->2.92*^8,"Permian"->2.75*^8,"Pliocene"->3.96*^6,"Pliocene-Oligocene"->1.62*^7,"Quaternary-Tertiary"->2.278*^7,"Tertiary"->4.43*^7,"Triassic"->2.253*^8,"Triassic-Jurassic"->1.98925*^8,"Unknown"->4*^8,"Upper Cretaceous"->8.255*^7,"Upper Cretaceous and Lower Tertiary"->6.34075*^7,"Upper Cretaceous-Tertiary"->6.34076*^7,"Upper Jurassic"->1.5335*^8,"Upper Jurassic-Lower Cretaceous"->1.38*^8,"Upper Triassic-Lower Jurassic"->2.007*^8,"Very Young"->3.9*^6};

sortedagelabels=SortBy[Transpose[{DeleteDuplicates[agelabels],DeleteDuplicates[agelabels]/.agerules}],#[[2]]&][[All,1]];

MapIndexed[(coalagecolor[#1]=Blend[{Red,RGBColor[.1,0,0]},.02*First[#2]])&,sortedagelabels];

agegeompairs=Transpose[{coalgeom,agelabels}];

agecoloredtooltip[poly_,label_]:={coalagecolor[label],Tooltip[poly,label]}

Examples

GeoGraphics[{EdgeForm[],GeoStyling[Opacity[1]],agecoloredtooltip@@@agegeompairs},GeoBackground->"ReliefMap",GeoRange->(EntityClass["Continental US states", EntityClass["AdministrativeDivision","ContinentalUSStates"], "EntityClass[\"AdministrativeDivision\", \"ContinentalUSStates\"]", "administrative divisions"])]

Third Party Data - Coal Beds by Type

Code

ranklabels="rank"/.labeleddata;

DeleteDuplicates[ranklabels]

MapIndexed[(coaltypecolor[#1]=ColorData[106][First[#2]])&,DeleteDuplicates[ranklabels]];

rankgeompairs=Transpose[{coalgeom,ranklabels}];

typecoloredtooltip[poly_,label_]:={coaltypecolor[label],Tooltip[poly,label]}

Examples

GeoGraphics[{EdgeForm[],GeoStyling[Opacity[1]],typecoloredtooltip@@@rankgeompairs},GeoBackground->"ReliefMap",GeoRange->(EntityClass["Continental US states", EntityClass["AdministrativeDivision","ContinentalUSStates"], "EntityClass[\"AdministrativeDivision\", \"ContinentalUSStates\"]", "administrative divisions"])]

GeoGraphics[{EdgeForm[],GeoStyling[Opacity[1]],typecoloredtooltip@@@rankgeompairs},GeoBackground->"ReliefMap",GeoRange->Quantity[500,"Miles"],GeoCenter->(Entity["Pittsburgh", Entity["City",{"Pittsburgh","Pennsylvania","UnitedStates"}], "Entity[\"City\", {\"Pittsburgh\", \"Pennsylvania\", \"UnitedStates\"}]", "city"])]

Additional Resources

Reference Pages

[EntityValue]

[Dinosaur]

[GeologicalPeriod]

[GeoGraphics]

Wolfram Function Repository

[GeologicalPeriodBedrockPlot]

[GeologicalPeriodChronologyChart]

[ContinentalPlateMaps]

Community Posts

[Bedrock geology of North and Central America]

[The geologic time scale - structure and quantification with trees]

[When continents rip themselves apart]

[Mountain Building and Orogenies using GeoGraphics]

[Geologic Assembly of the United States]

[Exploring Relief Maps on Ancient Earth]

[Age and Rank of North American Coal Deposits]

[Exploring the Yellowstone Calderas with GeoGraphics and USGS Data]

[Visualizing the Unified Geologic Map of the Moon from the USGS]

[Pleistocene-Holocene Sea Level 500K Years Change UK/European Coastlines]