几个星期前,我花了一个晚上阅读人类引爆的最大的核弹。 像往常一样,这让我想知道我是否可以用Wolfram语言做任何与此主题相关的事情。 在阅读了最大核弹的影响和半径这些影响的测量或观察后,我发现GeoGraphics非常方便实现这些。
1961年10月30日,世界上最大的核弹被苏联引爆,高于北极圈。 这就是沙皇邦巴(Tsar Bomba - 世界上最大的氢弹),约为58兆吨。
In[4]:= Entity["NuclearExplosion",
"UnionSovietSocialistRepublics10301961Test2"]["Yield"]
Out[4]= Quantity[5.8*10^4, "KilotonsOfTNT"]
该装置是一种“氢弹”,它是一种利用裂变爆炸来压缩氢气样品以产生更强大的热核聚变爆炸的装置。 它们还有一个更大的100兆吨装置,但由于担心人口稠密地区的放射性沉降以及飞行员无法及时逃离现场,因此从未引爆过。 就目前而言,由于冲击波导致飞机坠落1公里,沙皇邦巴爆炸几乎不允许飞行员逃跑,但飞行员能够安全地恢复和降落。 下面显示了一组同心圆盘,显示了这种爆炸的各种影响程度。
In[5]:= tsar = GeoPosition[{73.8072, 54.98167`}];
In[6]:= legend = Labeled[
SwatchLegend[{Directive[Red, Opacity[.3]], Directive[Orange, Opacity[.3]],
Directive[Blue, Opacity[.2]], Directive[Yellow, Opacity[.2]],
Directive[Black, Opacity[.3]]}, {"3rd degree burns", "heat felt",
"shock wave visible", "glass windows broke",
"top of mushroom cloud visible"}, LegendFunction -> "Frame"],
Text[Style["Tsar Bomba Effects", Bold, 18]], Top];
In[8]:= text = {Text[Style["Moscow", 12],
Entity["City", {"Moscow", "Moscow", "Russia"}], {0, 1}],
Text[Style["St. Petersburg", 12],
Entity["City", {"SaintPetersburg", "SaintPetersburg", "Russia"}], {0, 1}],
Text[Style["Greenland", 18], Entity["Country", "Greenland"]],
Text[Style["Sweden", 18], Entity["Country", "Sweden"]],
Text[Style["Svalbard", 18], Entity["Country", "Svalbard"]], White,
Text[Style["+", 36], GeoPosition[{90, 0}]]};
In[9]:= map[km_] := Grid[{
{
GeoGraphics[{
GeoStyling[Opacity[.3]], Red, PointSize[.007],
Point[Entity["City", {"Moscow", "Moscow", "Russia"}]],
Point[Entity["City", {"SaintPetersburg", "SaintPetersburg", "Russia"}]],
Point[tsar], GeoDisk[tsar, Quantity[100, "Kilometers"]],
Black, text,
GeoVisibleRegion[
GeoPosition[{73.80722222222222`, 54.98166666666667`, 67000}]],
Orange, GeoDisk[tsar, Quantity[270, "Kilometers"]],
GeoStyling[Opacity[.2]], Blue,
GeoDisk[tsar, Quantity[700, "Kilometers"]],
Yellow, GeoDisk[tsar, Quantity[900, "Kilometers"]]},
GeoGridRange -> {{-1.3, 1.3}, {-1, 1}} km/4000,
GeoBackground -> "ReliefMap", ImageSize -> {800, 600},
GeoProjection -> "Orthographic", GeoCenter -> tsar,
GeoScaleBar -> "Miles", GeoZoomLevel -> 5], legend}
}
]
In[11]:= map[500]
我们可以缩小一点,以便更好地根据各个地标了解这有多大。
map[1500]
我继续探索世界各地其他核爆炸的位置、日期和产量,并创建了一个动画,每帧显示爆炸1次。 首先,我使用EntityValue获取所有可用爆炸的数据。
nuc = EntityValue["NuclearExplosion", {"Entity", "Date", "Yield"}];
然后我只选择那些有所有必要数据并按日期排序的数据。
In[15]:= clean = Select[nuc, FreeQ[#, _Missing] &];
In[16]:= sorted = SortBy[clean, JulianDate[#[[2]]] &];
In[17]:= sorted // Length
Out[17]= 1913
出于规模限制,我需要定义最大的一个。
In[18]:= max = {#[[2]], Rule[#[[1]], #[[3]]]} &@SortBy[sorted, #[[3]] &][[-1]]
Out[18]= {DateObject[{1961, 10, 30, 8, 33, 27.}, "Instant", "Gregorian", 0.],
Entity["NuclearExplosion", "UnionSovietSocialistRepublics10301961Test2"] ->
Quantity[5.8*10^4, "KilotonsOfTNT"]}
In[19]:= rules = {#[[2]], Rule[#[[1]], #[[3]]]} & /@ sorted;
我使用GeoBubbleChart绘制所有爆炸,其气泡大小与其产量成正比。 许多爆炸发生在各个测试区域附近,所以有很多重叠的气泡。
In[24]:= GeoBubbleChart[{rules[[1 ;; length]][[All, 2]], {max[[2]]}}, ImageSize -> 800,
GeoZoomLevel -> 2, GeoBackground -> "ReliefMap", GeoRange -> All,
ChartElements -> {Automatic, None}, ChartStyle -> {Red}]
可以使用以下程序生成从1945年一直持续到2017年的动画。
Do[
Export["Frame" <>
ToString[
PaddedForm[i - 1, 4, NumberPadding -> "0",
NumberSigns -> {"", ""}]] <> ".png",
GeoBubbleChart[{rules[[1 ;; i]][[All, 2]], {max[[2]]}},
ImageSize -> {1920, 1080}, GeoZoomLevel -> 2,
GeoBackground -> "ReliefMap", GeoRange -> All,
ChartElements -> {Automatic, None}, ChartStyle -> {Red},
PlotLabel ->
Style[DateString[
rules[[i, 1]], {"DayNameShort", " ", "Day", " ",
"MonthNameShort", " ", "Year"}], {FontFamily -> "Consolas",
FontSize -> 42}]]],
{i, 1, length, 1}]