<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel rdf:about="https://community.wolfram.com">
    <title>Community RSS Feed</title>
    <link>https://community.wolfram.com</link>
    <description>RSS Feed for Wolfram Community showing ideas tagged with Earth Science with no replies sorted by most viewed.</description>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1135996" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/167650" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2144114" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/582196" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1384972" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1729785" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1167599" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/492955" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/977942" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1076892" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1136354" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/1728396" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/908527" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2299566" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3094952" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/2960096" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3188040" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3503212" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3473144" />
        <rdf:li rdf:resource="https://community.wolfram.com/groups/-/m/t/3152737" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1135996">
    <title>[WSS17]  Identification &amp;amp; Graph Structure of Rivers</title>
    <link>https://community.wolfram.com/groups/-/m/t/1135996</link>
    <description>A Road Map for Rivers&#xD;
=================&#xD;
&#xD;
The goal of this project was to identify rivers on maps and satellite images, and to calculate each river&amp;#039;s graph structure.&#xD;
&#xD;
We produced two functions: one will return a highlighting of all the water in a satellite image given a location entity, and the other will return  the graph structure of the water in the related street map image of a given location entity. Both functions start by taking the related street map of a location entity and stripping the image of every color other than one light shade of blue. Let&amp;#039;s use Seoul, South Korea as an example:&#xD;
&#xD;
![enter image description here][1]&#xD;
![enter image description here][2]&#xD;
&#xD;
    waterhighlight[entity_] := &#xD;
      Module[{streetmap, color, r, bluemap, mask, satmap},&#xD;
       streetmap = &#xD;
        RemoveAlphaChannel@&#xD;
         FirstCase[&#xD;
          GeoGraphics[entity, &#xD;
           GeoBackground -&amp;gt; &amp;#034;StreetMap&amp;#034;], _Image, $Failed, Infinity];&#xD;
       satmap = &#xD;
        ImageResize[&#xD;
         RemoveAlphaChannel@&#xD;
          FirstCase[&#xD;
           GeoGraphics[entity, &#xD;
            GeoBackground -&amp;gt; &amp;#034;Satellite&amp;#034;], _Image, $Failed, Infinity], &#xD;
         ImageDimensions[streetmap]];&#xD;
       color = &#xD;
        Apply[List, &#xD;
         ColorConvert[Interpreter[&amp;#034;Color&amp;#034;][&amp;#034;RGB 158 197 226&amp;#034;], &amp;#034;RGB&amp;#034;]];&#xD;
       r = If[ImageColorSpace[streetmap] != &amp;#034;RGB&amp;#034;,&#xD;
         ColorConvert[streetmap, &amp;#034;RGB&amp;#034;], streetmap];&#xD;
       bluemap = &#xD;
        SetAlphaChannel[r, Binarize[r, (Norm[# - color] &amp;lt; .15) &amp;amp;]];&#xD;
       mask = Closing[#, 7] &amp;amp;@FillingTransform@Binarize@bluemap;&#xD;
       HighlightImage[&#xD;
        satmap, {EdgeForm[{Red, AbsoluteThickness[1.5]}], &#xD;
         FaceForm[{Red, Opacity[.2]}], mask}]&#xD;
       ];&#xD;
&#xD;
The first function takes the blue image and uses it as a mask to highlight the related satellite image.&#xD;
&#xD;
![enter image description here][3]&#xD;
![enter image description here][4]&#xD;
&#xD;
    watergraph[entity_] := Module[{streetmap, color, r, bluemap, mask},&#xD;
       streetmap = &#xD;
        RemoveAlphaChannel@&#xD;
         FirstCase[&#xD;
          GeoGraphics[entity, &#xD;
           GeoBackground -&amp;gt; &amp;#034;StreetMap&amp;#034;], _Image, $Failed, Infinity];&#xD;
       color = &#xD;
        Apply[List, &#xD;
         ColorConvert[Interpreter[&amp;#034;Color&amp;#034;][&amp;#034;RGB 158 197 226&amp;#034;], &amp;#034;RGB&amp;#034;]];&#xD;
       r = If[ImageColorSpace[streetmap] != &amp;#034;RGB&amp;#034;,&#xD;
         ColorConvert[streetmap, &amp;#034;RGB&amp;#034;], streetmap];&#xD;
       bluemap = &#xD;
        SetAlphaChannel[r, Binarize[r, (Norm[# - color] &amp;lt; .15) &amp;amp;]];&#xD;
       mask = Closing[#, 7] &amp;amp;@FillingTransform@Binarize@bluemap;&#xD;
       MorphologicalGraph@SkeletonTransform[mask]&#xD;
       ];&#xD;
&#xD;
The second function smooths out the blue image, takes it&amp;#039;s skeleton, and uses that to calculate the graph structure. The end product really is a graph object, so one could play with it using Wolfram&amp;#039;s graph functionality to get some interesting results.&#xD;
&#xD;
![enter image description here][5]&#xD;
![enter image description here][6]&#xD;
&#xD;
&#xD;
Since one of the original goals of the project was to identify whether or not an image contained a river, we did make an attempt. We tried to first cut up the satellite images, binarize them, and then sort the tiny images based on the percentage of black and white pixels. We did this because in a large number of the initial images we saw, the water was usually much darker than the surrounding area. However as we looked at more test cases, this method of classifying images became useless. Many pictures require different binarize thresholds, some rivers are actually lighter than their surroundings, they may even be indistinguishable from the background, cloud coverage either blocks the water or can even create dark spots on its own via shadows, rivers may appear too thin to be recognized as such, and so on. As the list of issues grew, we decided to use the street maps due to their reliability. The street maps may have gaps in the water due to bridges, but this can be largely solved with basic image processing.&#xD;
&#xD;
In the future, we would like to implement a random river generation function and find a way to accurately automate the classification of satellite images as: &amp;#034;river&amp;#034; or &amp;#034;not river&amp;#034; to make a training set. From there, you could probably train a neural network to identify rivers from satellite images. &#xD;
&#xD;
[Github][7]&#xD;
&#xD;
&#xD;
  [1]: http://community.wolfram.com//c/portal/getImageAttachment?filename=10658streetmap.png&amp;amp;userId=1081910&#xD;
  [2]: http://community.wolfram.com//c/portal/getImageAttachment?filename=bluemap.png&amp;amp;userId=1081910&#xD;
  [3]: http://community.wolfram.com//c/portal/getImageAttachment?filename=satellite.png&amp;amp;userId=1081910&#xD;
  [4]: http://community.wolfram.com//c/portal/getImageAttachment?filename=Highlighted.png&amp;amp;userId=1081910&#xD;
  [5]: http://community.wolfram.com//c/portal/getImageAttachment?filename=Skeleton.png&amp;amp;userId=1081910&#xD;
  [6]: http://community.wolfram.com//c/portal/getImageAttachment?filename=9925Graphstructure.png&amp;amp;userId=1081910&#xD;
  [7]: https://github.com/Mathfig</description>
    <dc:creator>Z D</dc:creator>
    <dc:date>2017-07-05T19:22:36Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/167650">
    <title>Better globes with RevolutionPlot3D</title>
    <link>https://community.wolfram.com/groups/-/m/t/167650</link>
    <description>I decided that my project for tomorrow would be to start the Earth package for [url=https://en.wikipedia.org/wiki/User:Wakebrdkid/Wikicode]Wikicode[/url] with some simple 3D models. I was doing some preliminary investigations tonight, and I noticed an example in the help page for [url=http://reference.wolfram.com/mathematica/ref/Texture.html?q=Texture&amp;amp;lang=en]Texture[/url] that creates a globe with SphericalPlot3D. This function does not close the polygonal mesh, so it creates a very noticeable seam with the specularity setting used in the example.
[img=width: 360px; height: 360px;]/c/portal/getImageAttachment?filename=7664temp.png&amp;amp;userId=64737[/img]
RevolutionPlot3D does create a seamless mesh with respect to the axis of revolution, so it is preferred for making globes.
[img=width: 533px; height: 586px;]/c/portal/getImageAttachment?filename=temp2.png&amp;amp;userId=64737[/img]
I thought this was a tip worth sharing! I&amp;#039;ve found four images that I&amp;#039;m planning to use to start the Wikicode entry. You&amp;#039;ll be able to access them after tomorrow with something like:[mcode]Load[&amp;#034;Earth&amp;#034;]
Graphics3D[{Earth`Model[&amp;#034;Night&amp;#034;]}][/mcode]
[url=http://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73938/world.200401.3x5400x2700.jpg]January[/url]
[url=http://eoimages.gsfc.nasa.gov/images/imagerecords/74000/74092/world.200407.3x5400x2700.jpg]July[/url]
[url=http://eoimages.gsfc.nasa.gov/images/imagerecords/57000/57735/land_ocean_ice_cloud_2048.jpg]Clouds[/url]
[url=http://eoimages2.gsfc.nasa.gov/images/imagerecords/79000/79765/dnb_land_ocean_ice.2012.3600x1800.jpg]Night[/url]

Let me know if you have any requests for Wikicode!</description>
    <dc:creator>Michael Hale</dc:creator>
    <dc:date>2013-12-09T07:29:26Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2144114">
    <title>[WELP20] Using Hexagonal Cellular Automata to Model Flooding</title>
    <link>https://community.wolfram.com/groups/-/m/t/2144114</link>
    <description>&amp;amp;[Wolfram Notebook][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/386c7594-731f-4d37-9c3a-5b06d7d7036f</description>
    <dc:creator>Wolfram Education Programs</dc:creator>
    <dc:date>2020-12-21T16:30:04Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/582196">
    <title>SemanticImport of data from a Netatmo personal weather station in Barcelona</title>
    <link>https://community.wolfram.com/groups/-/m/t/582196</link>
    <description>About a year ago, [Marco Thiel][1] showed us how to [read high resolution weather data][2] from [Netatmo][3]. In another wonderful post, [aftermath of the solar eclipse][4], he imported data from his own Netatmo weather station. This fact, along with the possibility of [connecting Netatmo to Data Drop][5], is what convinced me to get my own Netatmo weather station. &#xD;
&#xD;
In this post I want to share with you some tips to interpret physical quantities using the function [SemanticImport][6]. Netatmo is saving the station&amp;#039;s data to the Cloud but there is an advanced option to download the station data as a CSV/XLS file:&#xD;
&#xD;
![Barcelona indoors data][7]&#xD;
&#xD;
My indoor station data for September is being attached in this post as cvs file. Once it has been downloaded, save it with the (attached) notebook and follow these simple steps:&#xD;
&#xD;
    SetDirectory[NotebookDirectory[]];&#xD;
&#xD;
Before using [SemanticImport][8], I usually take a look at the first few rows of the cvs document to see how it is structured:&#xD;
&#xD;
    Grid[Take[Import[&amp;#034;Indoor_9-2015.csv&amp;#034;], 5], Frame -&amp;gt; All]&#xD;
![cvs5rows][9]&#xD;
&#xD;
I&amp;#039;m based in Barcelona so the time zone is 2:&#xD;
&#xD;
    $TimeZone = 2&#xD;
&#xD;
In [SemanticImport][10] there is an option called [ExcludedLines][11], I use it to remove the first three rows. Then I use an association to take the columns {&amp;#034;Timestamp&amp;#034;, &amp;#034;Temperature&amp;#034;, &amp;#034;Humidity&amp;#034;, &amp;#034;CO2&amp;#034;, &amp;#034;Noise&amp;#034;, &amp;#034;Pressure&amp;#034;} and to specify the type of interpreter to be applied at each column. Finally, once the **SemanticImport** returns a [Dataset][12], I apply the function [FromUnixTime][13] to timestamps to convert them into [DateObjects][14]:&#xD;
&#xD;
    indoor = SemanticImport[&amp;#034;Indoor_9-2015.csv&amp;#034;,&#xD;
       &amp;lt;|&amp;#034;Timestamp&amp;#034; -&amp;gt; Automatic,&#xD;
        &amp;#034;Temperature&amp;#034; -&amp;gt; &#xD;
         Restricted[&amp;#034;StructuredQuantity&amp;#034;, &amp;#034;DegreesCelsius&amp;#034;], &#xD;
        &amp;#034;Humidity&amp;#034; -&amp;gt; Restricted[&amp;#034;StructuredQuantity&amp;#034;, &amp;#034;Percent&amp;#034;], &#xD;
        &amp;#034;CO2&amp;#034; -&amp;gt; Restricted[&amp;#034;StructuredQuantity&amp;#034;, &amp;#034;PartsPerMillion&amp;#034;], &#xD;
        &amp;#034;Noise&amp;#034; -&amp;gt; Restricted[&amp;#034;StructuredQuantity&amp;#034;, &amp;#034;dB&amp;#034;], &#xD;
        &amp;#034;Pressure&amp;#034; -&amp;gt; Restricted[&amp;#034;StructuredQuantity&amp;#034;, &amp;#034;Millibars&amp;#034;] |&amp;gt;,&#xD;
       ExcludedLines -&amp;gt; Range[3]][All, {&amp;#034;Timestamp&amp;#034; -&amp;gt; FromUnixTime}]&#xD;
&#xD;
![SemanticImportCVS][15]&#xD;
&#xD;
Having this as structured dataset it makes it easy to compute all sort of things:&#xD;
&#xD;
    indoor[MinMax, &amp;#034;Temperature&amp;#034;]&#xD;
![MaxMin][16]&#xD;
&#xD;
    indoor[DateListPlot, {&amp;#034;Timestamp&amp;#034;, &amp;#034;CO2&amp;#034;}]&#xD;
![CO2][17]&#xD;
&#xD;
The symbolic character of the Wolfram Language allows me to add any degree of sophistication. For example here I grouped the measurements by hour:&#xD;
&#xD;
    byHour = GroupBy[indoor, DateValue[#Timestamp, &amp;#034;Hour&amp;#034;] &amp;amp;]&#xD;
![byHour][18]&#xD;
&#xD;
I find this specially convenient if one wants to know what an average day looks like. Here is the [ListLinePlot][19] of CO2 concentration in my apartment air:&#xD;
&#xD;
    ListLinePlot[byHour[All, All, &amp;#034;CO2&amp;#034;][All, Mean],&#xD;
     ColorFunction -&amp;gt; &amp;#034;CMYKColors&amp;#034;,&#xD;
     Filling -&amp;gt; 700,&#xD;
     AxesLabel -&amp;gt; Automatic,&#xD;
     Mesh -&amp;gt; All,&#xD;
     Ticks -&amp;gt; {Range[0, 24, 1], Automatic},&#xD;
     GridLines -&amp;gt; {Range[0, 24, 1]}]&#xD;
![24h CO2 concentration][20]&#xD;
&#xD;
CO2 concentration rises up over night due to inexistent air exchange, and it goes down in the morning when windows are opened. Around 2pm there is a smaller peak and I suspect that it is caused by the midday rush hour when the noise level rises up:&#xD;
&#xD;
    ListLinePlot[byHour[All, All, &amp;#034;Noise&amp;#034;][All, Mean],&#xD;
     ColorFunction -&amp;gt; &amp;#034;CMYKColors&amp;#034;,&#xD;
     Filling -&amp;gt; 80,&#xD;
     AxesLabel -&amp;gt; Automatic,&#xD;
     Mesh -&amp;gt; All,&#xD;
     Ticks -&amp;gt; {Range[0, 24, 1], Automatic},&#xD;
     GridLines -&amp;gt; {Range[0, 24, 1]}]&#xD;
![noiseLevels][21]&#xD;
&#xD;
The driest hour of the day is found at 12pm:&#xD;
&#xD;
    ListLinePlot[byHour[All, All, &amp;#034;Humidity&amp;#034;][All, Mean], &#xD;
     ColorFunction -&amp;gt; &amp;#034;RedBlueTones&amp;#034;, Filling -&amp;gt; 2000, &#xD;
     AxesLabel -&amp;gt; Automatic, Mesh -&amp;gt; All, &#xD;
     Ticks -&amp;gt; {Range[0, 24, 1], Automatic}, &#xD;
     GridLines -&amp;gt; {Range[0, 24, 1]}]&#xD;
![humidity%][22]&#xD;
&#xD;
And the coldest at 9am:&#xD;
&#xD;
    ListLinePlot[byHour[All, All, &amp;#034;Temperature&amp;#034;][All, Mean], &#xD;
     ColorFunction -&amp;gt; &amp;#034;TemperatureMap&amp;#034;, Filling -&amp;gt; 2000, &#xD;
     AxesLabel -&amp;gt; Automatic, Mesh -&amp;gt; All, &#xD;
     Ticks -&amp;gt; {Range[0, 24, 1], Automatic}, &#xD;
     GridLines -&amp;gt; {Range[0, 24, 1]}]&#xD;
![Temperatures][23]&#xD;
&#xD;
What surprised me the most was that the pressure measurements clearly showed the existence of a rhythmic semidiurnal pressure variation, a not fully&#xD;
understood phenomenon known as [the atmospheric tide][24].&#xD;
&#xD;
    p = Mean[indoor[All, &amp;#034;Pressure&amp;#034;]];&#xD;
    ListLinePlot[byHour[All, All, &amp;#034;Pressure&amp;#034;][All, Mean[#] - p &amp;amp;],&#xD;
     ColorFunction -&amp;gt; &amp;#034;Pastel&amp;#034;,&#xD;
     AxesLabel -&amp;gt; Automatic, AxesOrigin -&amp;gt; {0, -.7}, &#xD;
     PlotStyle -&amp;gt; AbsoluteThickness[4], Mesh -&amp;gt; All,&#xD;
     Ticks -&amp;gt; {Range[0, 24, 1], Automatic},&#xD;
     GridLines -&amp;gt; {Range[0, 24, 1], Range[-.6, .6, .6]}, &#xD;
     PlotLegends -&amp;gt; Placed[Style[&amp;#034;The atmospheric tide at Barcelona, 24h&amp;#034;, &amp;#034;Text&amp;#034;], Top]]&#xD;
&#xD;
![the atmospheric tide at Barcelona][25]&#xD;
&#xD;
This post has looked at how to import and analyze a dataset, but there are many other things that can be done. For instance, one could upload this data to the Wolfram Data Drop platform, and then analyze the corresponding Databin:&#xD;
&#xD;
    bin = CreateDatabin[&amp;lt;|&amp;#034;Name&amp;#034; -&amp;gt; &amp;#034;September 2015&amp;#034;|&amp;gt;];&#xD;
    (* Notice that the data must be uploaded in smaller chunks to avoid overloading Data Drop&amp;#039;s API *)&#xD;
    DatabinUpload[bin, #] &amp;amp; /@Partition[Normal[indoor], 3000, 3000, 1, Nothing]&#xD;
&#xD;
DateListPlot, Mean, etc., can be directly applied to a Databin:&#xD;
&#xD;
    DateListPlot[Databin[&amp;#034;7vjapOnA&amp;#034;]]&#xD;
![DateListPlots][26]&#xD;
&#xD;
    Dataset@N@Mean@Databin[&amp;#034;7vjapOnA&amp;#034;]&#xD;
![Mean Values][27]&#xD;
&#xD;
All the best from Barcelona,&#xD;
&#xD;
Bernat&#xD;
&#xD;
  [1]: http://community.wolfram.com/web/mthiel&#xD;
  [2]: http://community.wolfram.com/groups/-/m/t/344241&#xD;
  [3]: https://www.netatmo.com/en-US/product/weather-station&#xD;
  [4]: http://community.wolfram.com/groups/-/m/t/463721&#xD;
  [5]: http://www.wolfram.com/broadcast/video.php?c=393&amp;amp;v=1418&#xD;
  [6]: https://reference.wolfram.com/language/ref/SemanticImport.html&#xD;
  [7]: /c/portal/getImageAttachment?filename=cvsIndoors.png&amp;amp;userId=56204&#xD;
  [8]: https://reference.wolfram.com/language/ref/SemanticImport.html&#xD;
  [9]: /c/portal/getImageAttachment?filename=cvsNetatmo.png&amp;amp;userId=56204&#xD;
  [10]: https://reference.wolfram.com/language/ref/SemanticImport.html&#xD;
  [11]: https://reference.wolfram.com/language/ref/ExcludedLines.html&#xD;
  [12]: https://reference.wolfram.com/language/ref/Dataset.html&#xD;
  [13]: https://reference.wolfram.com/language/ref/FromUnixTime.html&#xD;
  [14]: https://reference.wolfram.com/language/ref/DateObject.html&#xD;
  [15]: /c/portal/getImageAttachment?filename=SemanticImportNetatmo.png&amp;amp;userId=56204&#xD;
  [16]: /c/portal/getImageAttachment?filename=temp.png&amp;amp;userId=56204&#xD;
  [17]: /c/portal/getImageAttachment?filename=Co2.png&amp;amp;userId=56204&#xD;
  [18]: /c/portal/getImageAttachment?filename=byHour.png&amp;amp;userId=56204&#xD;
  [19]: https://reference.wolfram.com/language/ref/ListLinePlot.html&#xD;
  [20]: /c/portal/getImageAttachment?filename=CO2concentration.png&amp;amp;userId=56204&#xD;
  [21]: /c/portal/getImageAttachment?filename=noise.png&amp;amp;userId=56204&#xD;
  [22]: /c/portal/getImageAttachment?filename=humidity.png&amp;amp;userId=56204&#xD;
  [23]: /c/portal/getImageAttachment?filename=TempLevels.png&amp;amp;userId=56204&#xD;
  [24]: http://onlinelibrary.wiley.com/doi/10.1002/wea.857/pdf&#xD;
  [25]: /c/portal/getImageAttachment?filename=tide.png&amp;amp;userId=56204&#xD;
  [26]: /c/portal/getImageAttachment?filename=dateListPlots.png&amp;amp;userId=56204&#xD;
  [27]: /c/portal/getImageAttachment?filename=3412meanValues.png&amp;amp;userId=56204</description>
    <dc:creator>Bernat Espigulé</dc:creator>
    <dc:date>2015-10-15T18:00:25Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1384972">
    <title>[WSC18] Shortest Path Between Two Points on a Rough Terrain</title>
    <link>https://community.wolfram.com/groups/-/m/t/1384972</link>
    <description>This project seeks to find the shortest distance between two coordinate locations on the surface of the Earth given a maximum possible slope, or threshold. I created a function called shortestDistance that takes four parameters: the first coordinate location (or city), the second coordinate location (or city), the slope threshold, and the image resolution. Using a module, I declared all of my local variables:&#xD;
&#xD;
        shortestDistance[c1_, c2_, quality_, threshold_] := &#xD;
        Module[{pos1, pos2, dist, bounds, br, center, geoRange, realPixelSize,&#xD;
            data, terrainImage, gradient, d, m, rel, xn, yn, edges, graph, v, &#xD;
            bin, del, pg, path, pix1, pix2, fullTerrain, mag, mesh, newPath, &#xD;
            dropOne, testPath, scaledLength, actualLength, $size},&#xD;
  &#xD;
After that, I stored the coordinate points in {x, y} format of the two user-entered locations into the variables &amp;#034;pos1&amp;#034; and &amp;#034;pos2&amp;#034;:&#xD;
&#xD;
        pos1 = GeoPosition[c1];&#xD;
        pos2 = GeoPosition[c2];&#xD;
&#xD;
The bounds of the image were adjusted to fit the entire area of interest. In this example, c1 represents Denver, CO and c2 represents Aspen, CO, and the adjusted terrain graph is shown below with the locations of the two cities and the midpoint between the cities.&#xD;
&#xD;
       bounds = CoordinateBounds[{pos1[[1]], pos2[[1]]}];&#xD;
        br = Max[#2 - #1 &amp;amp; @@@ bounds];&#xD;
        center = Mean[{pos1[[1]], pos2[[1]]}];&#xD;
        geoRange = Transpose[{center - br, center + br}]; &#xD;
![In this example, c1 represents Denver, CO and c2 represents Aspen, CO][1] &#xD;
&#xD;
&#xD;
and the elevation data was stored as a matrix in the variable &amp;#034;data.&amp;#034;&#xD;
&#xD;
        data = GeoElevationData[Transpose@geoRange];&#xD;
&#xD;
I created four possible pixel dimensions for the size of the newly scaled image and assigned the value to the variable &amp;#034;$size&amp;#034; (eg. choice 2-&amp;gt; {200,200} would correspond to a 200 by 200 pixel resolution). The different resolutions were added to the menu because higher resolutions mean slower runtime: the user has the option to choose between speed and the quality of the image. &#xD;
&#xD;
        $size = Replace[&#xD;
        quality, {1 -&amp;gt; {50, 50}, 2 -&amp;gt; {200, 200}, 3 -&amp;gt; {300, 300}, &#xD;
        4 -&amp;gt; {400, 400}}];&#xD;
&#xD;
Next, I created a function &amp;#034;pixelSize&amp;#034; in order to determine the real distance of the path, in miles, given the distance of the path in pixels, and the definition of the function is shown below. Here, the function takes in two arguments: the range of the pixel values for the x and y coordinates as a single list &amp;#034;geoRange&amp;#034; and a &amp;#034;resolution&amp;#034; argument representing the pixel dimensions specified by the user, which was stored in $size in the previous step. &#xD;
&#xD;
        pixelSize[geoRange_, {resolution_, _}] :=&#xD;
        Module[{x1, x2, y1, y2},&#xD;
        {{x1, x2}, {y1, y2}} = geoRange;&#xD;
        GeoDistance[&#xD;
        GeoPosition[{x1, y1}],&#xD;
        GeoPosition[{x2, y1}]&#xD;
        ]/resolution&#xD;
        ];&#xD;
&#xD;
In the function call below, realPixelSize represents the ratio of $\frac{actual}{scaled}$ pixel lengths, and the original terrain image is rescaled to an image of the user-entered pixel dimensions&#xD;
&#xD;
        realPixelSize = pixelSize[geoRange, $size];&#xD;
        terrainImage = ImageResize[Image[QuantityMagnitude[data]], $size];&#xD;
&#xD;
The image below represents the resized terrain image, with lighter areas representing higher elevations while darker areas representing lower elevations:&#xD;
&#xD;
![enter image description here][2]&#xD;
&#xD;
In one of the most important steps, the gradient filter is applied to the scaled terrain image:&#xD;
&#xD;
        gradient = GradientFilter[terrainImage, 1];&#xD;
&#xD;
Now for the gradient image...the image is lighter in areas with greater **slope** (unlike elevation of the terrain image) and darker in relatively flat terrain with little to no steepness.  &#xD;
&#xD;
![enter image description here][3]&#xD;
&#xD;
In the next block of code, each pixel on the gradient image is connected to the four adjacent pixels, and the duplicates are deleted using the DeleteDuplicates function since every two adjacent pixels (eg. pixel A and pixel B) will be connected twice (A-&amp;gt;B and B-&amp;gt;A) before the duplicates are deleted.&#xD;
&#xD;
        d = #2 - #1 &amp;amp; @@@ geoRange;&#xD;
        m = #1 &amp;amp; @@@ geoRange;&#xD;
        rel = Round[Reverse[$size*(#[[1]] - m)/d] &amp;amp; /@ {pos1, pos2}];&#xD;
        {xn, yn} = ImageDimensions[gradient];&#xD;
        edges = DeleteDuplicatesBy[Flatten@Table[{&#xD;
              Pixel[i, j] \[UndirectedEdge] Pixel[i - 1, j],&#xD;
              Pixel[i, j] \[UndirectedEdge] Pixel[i + 1, j],&#xD;
              Pixel[i, j] \[UndirectedEdge] Pixel[i, j - 1],&#xD;
              Pixel[i, j] \[UndirectedEdge] Pixel[i, j + 1]&#xD;
              }, {i, 2, xn - 1}, {j, 2, yn - 1}], Sort];&#xD;
        graph = Graph[edges];&#xD;
        v = VertexList[graph];&#xD;
&#xD;
Here is a visualization of the connected pixels after duplicates are deleted.&#xD;
&#xD;
![enter image description here][4]&#xD;
&#xD;
The Binarize function is now applied to the gradient image, and all the pixel values greater than the user-inputted threshold will be replaced with a white pixel while all the pixel values less than the threshold will be replaced with a black pixel. The resulting binarized image is stored in the variable &amp;#034;bin.&amp;#034;&#xD;
&#xD;
        bin = Binarize[gradient, threshold];&#xD;
        &#xD;
![enter image description here][5]&#xD;
&#xD;
All the white pixels (pixels with gradient above threshold) will be deleted using a separate function called FastVertexDelete, for which the definition and function call are down below: &#xD;
&#xD;
----------&#xD;
&#xD;
**Side Note:**&#xD;
&#xD;
*Why wasn&amp;#039;t **VertexDelete**, a predefined function in Mathematica, used?* &#xD;
&#xD;
*VertexDelete took a long time to run, due to a possible bug in the function...to cut down runtime, a new function &amp;#034;FastVertexDelete&amp;#034; was created.*&#xD;
&#xD;
----------&#xD;
&#xD;
&#xD;
**Definition of FastVertexDelete:**&#xD;
&#xD;
    FastVertexDelete[ graph_Graph, delete_List ] :=&#xD;
      With[ { dropQ = AssociationMap[ True &amp;amp;, delete ] },&#xD;
          Graph[ Complement[ VertexList @ graph, delete ],&#xD;
                 DeleteCases[ EdgeList @ graph, _[ _?dropQ, _ ] | _[ _, _?dropQ ] ]&#xD;
          ]&#xD;
      ];&#xD;
&#xD;
    FastVertexDelete[ graph_Graph, delete_ ] :=&#xD;
      FastVertexDelete[ graph, { delete } ];&#xD;
&#xD;
**Function Call:**&#xD;
&#xD;
&#xD;
        del = Pixel @@@ PixelValuePositions[bin, White];&#xD;
        {pix1, pix2} = Pixel @@@ rel;        &#xD;
        pg = FastVertexDelete[graph, Complement[Intersection[v, del], {pix1, pix2}]];&#xD;
&#xD;
The Mathematica function FindShortestPath is now implemented to find the minimum distance path between the two user-entered coordinates::&#xD;
&#xD;
        path = Replace[FindShortestPath[pg, pix1, pix2], Except[_List] -&amp;gt; {}];&#xD;
&#xD;
![enter image description here][6]&#xD;
&#xD;
Now for a more in-depth analysis of the path finding mechanism...&#xD;
## Visualization of FindShortestPath ##&#xD;
&#xD;
&#xD;
----------&#xD;
&#xD;
The connected &amp;#034;pixel plane&amp;#034; looks like this:&#xD;
&#xD;
![enter image description here][7]&#xD;
&#xD;
If a pixel is deleted using VertexDelete, &#xD;
&#xD;
    g = VertexDelete[graph, {Pixel[5, 5]}]&#xD;
&#xD;
the resulting pixel plane looks like this:&#xD;
&#xD;
![enter image description here][8]&#xD;
&#xD;
When FindShortestPath is applied to two randomly chosen pixels on the plane,&#xD;
&#xD;
    FindShortestPath[g, Pixel[5, 3], Pixel[5, 8]]&#xD;
&#xD;
the red dots show the shortest path. &#xD;
&#xD;
![enter image description here][9]&#xD;
&#xD;
&#xD;
----------&#xD;
&#xD;
&#xD;
----------&#xD;
&#xD;
&#xD;
However, if there is no path, an error message is produced:&#xD;
&#xD;
        If[path === {},&#xD;
        bin = bin;&#xD;
        &amp;#034;Error: There is no path.&amp;#034;,&#xD;
&#xD;
Otherwise, a function &amp;#034;dropOne&amp;#034; is implemented in order to minimize the length of the path even further: dropOne drops points on the path (excluding starting and ending points) that will still give a path disjoint from the white pixels that have been deleted.&#xD;
&#xD;
&#xD;
        bin = ImageMultiply[bin, &#xD;
        Erosion[ReplacePixelValue[ConstantImage[White, $size],&#xD;
        List @@@ path -&amp;gt; Black], 1]];&#xD;
        fullTerrain = ImageAdjust@Image[QuantityMagnitude[data]];&#xD;
        mag = ImageDimensions[fullTerrain]/$size;&#xD;
        mesh = ImageMesh[bin, Method -&amp;gt; &amp;#034;Exact&amp;#034;, &#xD;
        DataRange -&amp;gt; Transpose[{{1, 1}, ImageDimensions[bin]}]];&#xD;
        newPath = List @@@ path[[2 ;; -2]];&#xD;
&#xD;
**Definition:**&#xD;
&#xD;
        dropOne = &#xD;
        Function[path, &#xD;
        Replace[&#xD;
        SelectFirst[Range[2, Length[path] - 1], &#xD;
        RegionDisjoint[mesh, Line[Delete[path, #]]] &amp;amp;],&#xD;
        {d_Integer :&amp;gt; Delete[path, d], _ :&amp;gt; path}&#xD;
        ]];&#xD;
&#xD;
The new, improved path, achieved using the dropOne function, is named &amp;#034;testPath&amp;#034;:&#xD;
&#xD;
        testPath = FixedPoint[dropOne, newPath];&#xD;
&#xD;
Notice how testPath improves the distance by &amp;#034;smoothening out&amp;#034; the path.&#xD;
&#xD;
![enter image description here][10]&#xD;
&#xD;
The scaled length of the path (aka the path length in pixels) is now determined by using the EuclideanDistance. The scaled distance is converted to actual distance in miles by using the &amp;#034;realPixelSize&amp;#034; value computed at the beginning using the pixelSize function:&#xD;
&#xD;
        scaledLength = &#xD;
        N@Total[EuclideanDistance @@@ &#xD;
        Partition[testPath, 2, 1]] (*with dropOne function*);&#xD;
        actualLength = scaledLength*realPixelSize (*in miles*);&#xD;
&#xD;
**In this example with Denver and Aspen, the length of the path before dropOne was implemented was 128 miles while the length of the path after dropOne was implemented was 117.2 miles.**&#xD;
&#xD;
A grid is created to output a list of lists, specifically, a list of images: the raw graph representing the original path, the smoothened graph representing the improved graph after the dropOne function is implemented, the gradient graph showing the shortest path, and the full terrain image with relative elevations.&#xD;
&#xD;
        Grid[{&#xD;
        {&amp;#034;Raw Graph: &amp;#034;, &#xD;
        ImageResize[HighlightImage[bin, Line[List @@@ path]], 500]},&#xD;
        {&amp;#034;Smoothened Graph: &amp;#034;, &#xD;
        ImageResize[HighlightImage[bin, Line[testPath]], 500]},&#xD;
        {&amp;#034;Gradient: &amp;#034;, &#xD;
        ImageResize[&#xD;
        HighlightImage[&#xD;
        ImageAdjust@&#xD;
        GradientFilter[terrainImage, &#xD;
        1], {Line[{##} - 0.5 &amp;amp; @@@ testPath]}], 500]},&#xD;
        {&amp;#034;Terrain with path marked in red: &amp;#034;, &#xD;
        HighlightImage[fullTerrain, {Line[mag*{##} &amp;amp; @@@ testPath]}]},&#xD;
        {&amp;#034;Distance: &amp;#034;, actualLength}}], Alignment -&amp;gt; Left&#xD;
        ]]&#xD;
&#xD;
Further Work&#xD;
-------&#xD;
&#xD;
A possible improvement that may be made is a quicker runtime: in fact, the image quality may be adjusted in my microsite in order to account for slow runtime. On the microsite, another problem is the need for the user to adjust the threshold in order to obtain the best possible graph: there should be a set numerical correlation between the actual gradient values and threshold since threshold is just a relative measurement of slope. &#xD;
&#xD;
     &#xD;
&#xD;
&#xD;
  [1]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2018-07-15at11.27.45PM.png&amp;amp;userId=1372113&#xD;
  [2]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2018-07-15at11.32.54PM.png&amp;amp;userId=1372113&#xD;
  [3]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2018-07-15at11.37.32PM.png&amp;amp;userId=1372113&#xD;
  [4]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2018-07-15at11.40.08PM.png&amp;amp;userId=1372113&#xD;
  [5]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2018-07-16at8.49.25AM.png&amp;amp;userId=1372113&#xD;
  [6]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2018-07-16at8.57.29AM.png&amp;amp;userId=1372113&#xD;
  [7]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2018-07-15at11.40.08PM.png&amp;amp;userId=1372113&#xD;
  [8]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2018-07-16at12.23.21PM.png&amp;amp;userId=1372113&#xD;
  [9]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2018-07-16at12.28.15PM.png&amp;amp;userId=1372113&#xD;
  [10]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2018-07-16at8.59.46AM.png&amp;amp;userId=1372113</description>
    <dc:creator>Hee Jae Hong</dc:creator>
    <dc:date>2018-07-16T14:05:19Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1729785">
    <title>[WSS19] Automating Weather Data Storage on the Wolfram Blockchain</title>
    <link>https://community.wolfram.com/groups/-/m/t/1729785</link>
    <description>## Introduction ##&#xD;
![enter image description here][1]&#xD;
&#xD;
The World Meteorological Organization has over 11,000 weather stations around the world. The data from these devices are continuously recorded into public databases and made available for anyone to download and analyze. Meteorologists regularly inform their viewers with reports produced by Weather, Research &amp;amp; Forecast (WRF) models which analyze these aggregated datasets. In addition to the WMO&amp;#039;s stations, there are also civilian owned weather stations that inform platforms like Weather Underground, AcuRite, and Weather Bug. Unfortunately, those companies do not share the profits they generate off the data they collect from the community. Also, AcuRite no longer offers a public API for their users to easily access their own data. Even worse, WeatherBug has [been caught selling][2] private location data about its users to third parties.&#xD;
&#xD;
Concerns for privacy and data ownership are on the rise. Though Facebook experienced moderate backlash for its role in the Cambridge Analytica scandal, many opine the reaction was insufficient. Switching costs remain high while data produced by users remains hosted on the platform&amp;#039;s servers.  One way to deal with this is to back up your own data in a secondary location such that it&amp;#039;s available for personal use any time.&#xD;
&#xD;
Insert your own myAcuRite login credentials into the code below and then evaluate the cell to obtain a table of the latest reading from your personal weather station. After the code retrieves the current data feed, it will be inserted into the Wolfram Blockchain and a public databin which can be accessed [here][3]. If the data is successfully inserted into the blockchain and recalled without changing the data, &amp;#034;True&amp;#034; will appear above the weather table. Note this also creates a Scheduled Task and Cloud Deploy to automatically retrieve your weather data once per hour. Also, feel free to create your own databin and replace the name with your own in the DatabinAdd[ ] line of code. Typical Output from a weather station is shown in the table above.&#xD;
&#xD;
    isoStringWithTZToDateObject[string_String]:=&#xD;
    (* by Jesse *)Module[{stringParts=StringSplit[string,RegularExpression[&amp;#034;(?=((\\+|-)\\d{2}:\\d{2})|Z$)&amp;#034;]],tzpart,tzoffset,signedtzoffset},Which[Length[stringParts]===1,signedtzoffset=Automatic,ToUpperCase[stringParts[[2]]]===&amp;#034;Z&amp;#034;,signedtzoffset=0,True,tzpart=StringSplit[stringParts[[2]],{RegularExpression[&amp;#034;(?&amp;lt;=\\+|-)&amp;#034;],&amp;#034;:&amp;#034;}];&#xD;
    tzoffset=NumberCompose[FromDigits/@Rest[tzpart],{1,1/60}];&#xD;
    signedtzoffset=N@If[tzpart[[1]]===&amp;#034;-&amp;#034;,-tzoffset,tzoffset];];&#xD;
    DateObject[stringParts[[1]],TimeZone-&amp;gt;signedtzoffset]];&#xD;
    (*frequency=15min;*)&#xD;
    frequency=Quantity[60,&amp;#034;Minutes&amp;#034;];&#xD;
    stask=ScheduledTask[Module[{&#xD;
    loginData,&#xD;
    mytoken,&#xD;
    myaccountid,&#xD;
    hubsData,&#xD;
    myhubid,&#xD;
    weatherfeed,&#xD;
    deviceRawData,&#xD;
    sensorRawData,&#xD;
    sensorUnits,&#xD;
    sensorData,&#xD;
    weatherEntry,&#xD;
    weatherHash,&#xD;
    list,&#xD;
    trxID&#xD;
    },&#xD;
    (*Send a login request with username and password to get a session token and account ID*)&#xD;
    loginData=URLExecute[HTTPRequest[&amp;lt;|&#xD;
    Method-&amp;gt;&amp;#034;POST&amp;#034;,&#xD;
    &amp;#034;Scheme&amp;#034;-&amp;gt;&amp;#034;https&amp;#034;,&#xD;
    &amp;#034;Domain&amp;#034;-&amp;gt;&amp;#034;marapi.myacurite.com&amp;#034;,&#xD;
    &amp;#034;Path&amp;#034;-&amp;gt;&amp;#034;/users/login&amp;#034;,&#xD;
    &amp;#034;ContentType&amp;#034;-&amp;gt;&amp;#034;application/json&amp;#034;,&#xD;
    &amp;#034;Body&amp;#034;-&amp;gt;ExportString[&#xD;
    &amp;lt;|&#xD;
    &amp;#034;email&amp;#034;-&amp;gt;&amp;#034;YourEmailHere&amp;#034;,&#xD;
    &amp;#034;password&amp;#034;-&amp;gt;&amp;#034;YourPasswordHere&amp;#034;,&#xD;
    &amp;#034;remember&amp;#034;-&amp;gt;&amp;#034;True&amp;#034;&#xD;
    |&amp;gt;,&#xD;
    &amp;#034;RawJSON&amp;#034;]&#xD;
    |&amp;gt;],&amp;#034;RawJSON&amp;#034;];&#xD;
    &#xD;
    mytoken=loginData[&amp;#034;token_id&amp;#034;];&#xD;
    myaccountid=loginData[[&amp;#034;user&amp;#034;,&amp;#034;account_users&amp;#034;,1,&amp;#034;account_id&amp;#034;]];&#xD;
    &#xD;
    (*Find the ID of the particular weather station in question*)&#xD;
    hubsData=URLExecute[HTTPRequest[&amp;lt;|&#xD;
     Method -&amp;gt; &amp;#034;GET&amp;#034;,&#xD;
    &amp;#034;Scheme&amp;#034; -&amp;gt; &amp;#034;https&amp;#034;,&#xD;
    &amp;#034;Domain&amp;#034; -&amp;gt; &amp;#034;marapi.myacurite.com/accounts/&amp;#034;&amp;lt;&amp;gt;ToString[myaccountid]&amp;lt;&amp;gt;&amp;#034;/dashboard/hubs&amp;#034;,&amp;#034;ContentType&amp;#034;-&amp;gt;&amp;#034;application/json&amp;#034;,&#xD;
    &amp;#034;Headers&amp;#034; -&amp;gt; {&amp;#034;x-one-vue-token&amp;#034; -&amp;gt; mytoken}&#xD;
    |&amp;gt;],&amp;#034;RawJSON&amp;#034;];&#xD;
     myhubid=hubsData[[&amp;#034;account_hubs&amp;#034;,1,&amp;#034;id&amp;#034;]];&#xD;
    &#xD;
    (*Obtain the current data feed from the particular weather station*)&#xD;
    weatherfeed=URLExecute[HTTPRequest[&amp;lt;|&#xD;
    Method -&amp;gt; &amp;#034;GET&amp;#034;,&#xD;
    &amp;#034;Scheme&amp;#034; -&amp;gt; &amp;#034;https&amp;#034;,&#xD;
    &amp;#034;Domain&amp;#034; -&amp;gt; &amp;#034;marapi.myacurite.com/accounts/&amp;#034;&amp;lt;&amp;gt;ToString[myaccountid]&amp;lt;&amp;gt;&amp;#034;/dashboard/hubs/&amp;#034;&amp;lt;&amp;gt;ToString[myhubid],&#xD;
    &amp;#034;ContentType&amp;#034;-&amp;gt;&amp;#034;application/json&amp;#034;,&#xD;
    &amp;#034;Headers&amp;#034; -&amp;gt; {&amp;#034;x-one-vue-token&amp;#034; -&amp;gt; mytoken}&#xD;
    |&amp;gt;],&amp;#034;RawJSON&amp;#034;];&#xD;
    &#xD;
    (*Organize data. Consider cases with different units*)&#xD;
    deviceRawData=weatherfeed[[&amp;#034;devices&amp;#034;,1]];&#xD;
    sensorRawData=AssociationThread[deviceRawData[[&amp;#034;sensors&amp;#034;,All,&amp;#034;sensor_name&amp;#034;]]-&amp;gt;deviceRawData[[&amp;#034;sensors&amp;#034;]]];&#xD;
    sensorUnits=&amp;lt;|&#xD;
    &amp;#034;Temperature&amp;#034;-&amp;gt;Switch[sensorRawData[&amp;#034;Temperature&amp;#034;,&amp;#034;chart_unit&amp;#034;],&amp;#034;F&amp;#034;,&amp;#034;DegreesFahrenheit&amp;#034;,&amp;#034;C&amp;#034;,&amp;#034;DegreesCelsius&amp;#034;],&#xD;
    &amp;#034;Pressure&amp;#034;-&amp;gt;Switch[sensorRawData[&amp;#034;Pressure&amp;#034;,&amp;#034;chart_unit&amp;#034;],&amp;#034;inHg&amp;#034;,&amp;#034;InchesOfMercury&amp;#034;,&amp;#034;hPa&amp;#034;,&amp;#034;Hectopascals&amp;#034;],&#xD;
    &amp;#034;Humidity&amp;#034;-&amp;gt;&amp;#034;Percent&amp;#034;,&#xD;
    &amp;#034;Wind Speed&amp;#034;-&amp;gt;Switch[sensorRawData[&amp;#034;Wind Speed&amp;#034;,&amp;#034;chart_unit&amp;#034;],&amp;#034;mph&amp;#034;,&amp;#034;Miles&amp;#034;/&amp;#034;Hours&amp;#034;,&amp;#034;km/h&amp;#034;,&amp;#034;Kilometers&amp;#034;/&amp;#034;Hours&amp;#034;,&amp;#034;kn&amp;#034;,&amp;#034;Knots&amp;#034;],&amp;#034;Wind Direction&amp;#034;-&amp;gt;&amp;#034;Degrees&amp;#034;,&#xD;
    &amp;#034;Rainfall&amp;#034;-&amp;gt;Switch[sensorRawData[&amp;#034;Rainfall&amp;#034;,&amp;#034;chart_unit&amp;#034;],&amp;#034;in&amp;#034;,&amp;#034;Inches&amp;#034;,&amp;#034;mm&amp;#034;,&amp;#034;Millimeters&amp;#034;],&#xD;
    &amp;#034;Dew Point&amp;#034;-&amp;gt;Switch[sensorRawData[&amp;#034;Dew Point&amp;#034;,&amp;#034;chart_unit&amp;#034;],&amp;#034;F&amp;#034;,&amp;#034;DegreesFahrenheit&amp;#034;,&amp;#034;C&amp;#034;,&amp;#034;DegreesCelsius&amp;#034;],&#xD;
    &amp;#034;Feels Like&amp;#034;-&amp;gt;Switch[sensorRawData[&amp;#034;Feels Like&amp;#034;,&amp;#034;chart_unit&amp;#034;],&amp;#034;F&amp;#034;,&amp;#034;DegreesFahrenheit&amp;#034;,&amp;#034;C&amp;#034;,&amp;#034;DegreesCelsius&amp;#034;],&#xD;
    &amp;#034;Wind Speed Average&amp;#034;-&amp;gt;Switch[sensorRawData[&amp;#034;Wind Speed&amp;#034;,&amp;#034;chart_unit&amp;#034;],&amp;#034;mph&amp;#034;,&amp;#034;Miles&amp;#034;/&amp;#034;Hours&amp;#034;,&amp;#034;km/h&amp;#034;,&amp;#034;Kilometers&amp;#034;/&amp;#034;Hours&amp;#034;,&amp;#034;kn&amp;#034;,&amp;#034;Knots&amp;#034;]&#xD;
    |&amp;gt;;&#xD;
    sensorData=&amp;lt;|&amp;#034;Sensor&amp;#034;-&amp;gt;#[&amp;#034;sensor_name&amp;#034;],&amp;#034;Value&amp;#034;-&amp;gt;Quantity[#[&amp;#034;last_reading_value&amp;#034;],sensorUnits[#[&amp;#034;sensor_name&amp;#034;]]]|&amp;gt;&amp;amp;/@Values@sensorRawData;&#xD;
    &#xD;
    &#xD;
    (*Include timestamp, latitude, longitude, and elevation into the table*)&#xD;
    &#xD;
    weatherEntry=dataTable=&amp;lt;|&#xD;
    &amp;#034;Sensors&amp;#034;-&amp;gt;sensorData,&#xD;
    &amp;#034;ReadingTimestamp&amp;#034;-&amp;gt;TimeZoneConvert[isoStringWithTZToDateObject[deviceRawData[&amp;#034;last_check_in_at&amp;#034;]]],&#xD;
    &amp;#034;SubmisisonTimestamp&amp;#034;-&amp;gt;Now,&#xD;
    &amp;#034;Position&amp;#034;-&amp;gt;GeoPosition[Append[&#xD;
    Interpreter[&amp;#034;Real&amp;#034;][{weatherfeed[&amp;#034;latitude&amp;#034;],weatherfeed[&amp;#034;longitude&amp;#034;]}],&#xD;
    Quantity[weatherfeed[&amp;#034;elevation&amp;#034;],Switch[weatherfeed[&amp;#034;elevation_unit&amp;#034;],&amp;#034;ft&amp;#034;,&amp;#034;Feet&amp;#034;,&amp;#034;m&amp;#034;,&amp;#034;Meters&amp;#034;]]]]&#xD;
    |&amp;gt;;&#xD;
    &#xD;
    (*Insert the weatherEntry and its hash into the Wolfram Blockchain and a Databin*)&#xD;
    previousHash=Hash[Normal[Databin[&amp;#034;EM6FHeXi&amp;#034;,-1]][[1,2]],&amp;#034;SHA256&amp;#034;];&#xD;
    list={previousHash, weatherEntry};&#xD;
    trxID=BlockchainPut[list];&#xD;
    listDB={previousHash, Hash[weatherEntry,&amp;#034;SHA256&amp;#034;],trxID};&#xD;
    DatabinAdd[&amp;#034;EM6FHeXi&amp;#034;,listDB];&#xD;
    ],frequency];&#xD;
    task=SessionSubmit[Evaluate@stask];&#xD;
    &#xD;
    obj=CloudDeploy[stask,&amp;#034;BlockchainWeatherUpdate&amp;#034;]&#xD;
&#xD;
As seen in the code above and the image below, three entries are inserted into a databin. The first is a hash of the previous databin entry, the second is a hash of the current weather entry, and finally a receipt from inserting the weather entry into the Wolfram Blockchain. Use BlockchainGet[ ] with that receipt to retrieve the weather data for that entry.&#xD;
![enter image description here][4]&#xD;
&#xD;
## Where are additional weather stations needed? ##&#xD;
Data deserts in the field of meteorology exist in places like northern Canada, inland China, and North Africa. One of the largest factors contributing to weather forecasting inaccuracy is a lack of data from these areas.  A typical World Meteorological Organization weather station costs several thousand dollars for a government to install. Deciding where to install new weather stations depends on several factors such as weather patterns, population centers, budgets, and accessibility. Though local governments may not have the budget to install an official WMO station, it is still important to collect data generated from local denizens.&#xD;
&#xD;
Use the cell below to import the dataset of WMO stations and plot random points in a variety of countries, then determine the average distance to the nearest WMO Station. As can be seen, the United States has a higher density of weather stations than Canada, while France has even more and Algeria has barely any.&#xD;
&#xD;
    WMOStations=ResourceObject[&amp;#034;WMO Meteorological Stations&amp;#034;];&#xD;
    WMOLocations=Values@ResourceData[&amp;#034;WMO Meteorological Stations&amp;#034;][Select[#Country===&amp;#034;United States&amp;#034;&amp;amp;], &amp;#034;Position&amp;#034;];&#xD;
    pts=RandomGeoPosition[Entity[&amp;#034;Country&amp;#034;,&amp;#034;UnitedStates&amp;#034;],200];&#xD;
    GeoGraphics[{{Red,Point/@WMOLocations},{Black,Point[pts]}},GeoRange-&amp;gt;Entity[&amp;#034;Country&amp;#034;,&amp;#034;UnitedStates&amp;#034;]]&#xD;
    nearestDistances = GeoNearest[WMOLocations//Normal,pts[[1]]];&#xD;
    Print[&amp;#034;Average Distance to nearest WMO Station&amp;#034;]&#xD;
    Mean[GeoDistance@@@Transpose[{nearestDistances[[All,1,1]],pts[[1]]}]]&#xD;
    Print[&amp;#034;WMO Stations per Square Mile&amp;#034;]&#xD;
    ScientificForm[Length[WMOLocations]/EntityValue[Entity[&amp;#034;Country&amp;#034;,&amp;#034;UnitedStates&amp;#034;],&amp;#034;Area&amp;#034;]]&#xD;
    &#xD;
    WMOLocationsCA=Values@ResourceData[&amp;#034;WMO Meteorological Stations&amp;#034;][Select[#Country===&amp;#034;Canada&amp;#034;&amp;amp;], &amp;#034;Position&amp;#034;];&#xD;
    ptsCA=RandomGeoPosition[\!\(\*&#xD;
    NamespaceBox[&amp;#034;LinguisticAssistant&amp;#034;,&#xD;
    DynamicModuleBox[{Typeset`query$$ = &amp;#034;Canada&amp;#034;, Typeset`boxes$$ = TemplateBox[{&amp;#034;\&amp;#034;Canada\&amp;#034;&amp;#034;, RowBox[{&amp;#034;Entity&amp;#034;, &amp;#034;[&amp;#034;, RowBox[{&amp;#034;\&amp;#034;Country\&amp;#034;&amp;#034;, &amp;#034;,&amp;#034;, &amp;#034;\&amp;#034;Canada\&amp;#034;&amp;#034;}], &amp;#034;]&amp;#034;}], &amp;#034;\&amp;#034;Entity[\\\&amp;#034;Country\\\&amp;#034;, \\\&amp;#034;Canada\\\&amp;#034;]\&amp;#034;&amp;#034;, &amp;#034;\&amp;#034;country\&amp;#034;&amp;#034;}, &amp;#034;Entity&amp;#034;], Typeset`allassumptions$$ = {}, Typeset`assumptions$$ = {}, Typeset`open$$ = {1, 2}, Typeset`querystate$$ = {&amp;#034;Online&amp;#034; -&amp;gt; True, &amp;#034;Allowed&amp;#034; -&amp;gt; True, &amp;#034;mparse.jsp&amp;#034; -&amp;gt; 0.549673`6.19164939839149, &amp;#034;Messages&amp;#034; -&amp;gt; {}}}, &#xD;
    DynamicBox[ToBoxes[AlphaIntegration`LinguisticAssistantBoxes[&amp;#034;&amp;#034;, 4, Automatic, Dynamic[Typeset`query$$], Dynamic[Typeset`boxes$$], Dynamic[Typeset`allassumptions$$], Dynamic[Typeset`assumptions$$], Dynamic[Typeset`open$$], Dynamic[Typeset`querystate$$]], StandardForm],&#xD;
    ImageSizeCache-&amp;gt;{125., {7., 15.}},&#xD;
    TrackedSymbols:&amp;gt;{Typeset`query$$, Typeset`boxes$$, Typeset`allassumptions$$, Typeset`assumptions$$, Typeset`open$$, Typeset`querystate$$}],&#xD;
    DynamicModuleValues:&amp;gt;{},&#xD;
    UndoTrackedVariables:&amp;gt;{Typeset`open$$}],&#xD;
    BaseStyle-&amp;gt;{&amp;#034;Deploy&amp;#034;},&#xD;
    DeleteWithContents-&amp;gt;True,&#xD;
    Editable-&amp;gt;False,&#xD;
    SelectWithContents-&amp;gt;True]\),200];&#xD;
    GeoGraphics[{{Red,Point/@WMOLocationsCA},{Black,Point[ptsCA]}},GeoRange-&amp;gt;\!\(\*&#xD;
    NamespaceBox[&amp;#034;LinguisticAssistant&amp;#034;,&#xD;
    DynamicModuleBox[{Typeset`query$$ = &amp;#034;Canada&amp;#034;, Typeset`boxes$$ = TemplateBox[{&amp;#034;\&amp;#034;Canada\&amp;#034;&amp;#034;, RowBox[{&amp;#034;Entity&amp;#034;, &amp;#034;[&amp;#034;, RowBox[{&amp;#034;\&amp;#034;Country\&amp;#034;&amp;#034;, &amp;#034;,&amp;#034;, &amp;#034;\&amp;#034;Canada\&amp;#034;&amp;#034;}], &amp;#034;]&amp;#034;}], &amp;#034;\&amp;#034;Entity[\\\&amp;#034;Country\\\&amp;#034;, \\\&amp;#034;Canada\\\&amp;#034;]\&amp;#034;&amp;#034;, &amp;#034;\&amp;#034;country\&amp;#034;&amp;#034;}, &amp;#034;Entity&amp;#034;], Typeset`allassumptions$$ = {}, Typeset`assumptions$$ = {}, Typeset`open$$ = {1, 2}, Typeset`querystate$$ = {&amp;#034;Online&amp;#034; -&amp;gt; True, &amp;#034;Allowed&amp;#034; -&amp;gt; True, &amp;#034;mparse.jsp&amp;#034; -&amp;gt; 0.549673`6.19164939839149, &amp;#034;Messages&amp;#034; -&amp;gt; {}}}, &#xD;
    DynamicBox[ToBoxes[AlphaIntegration`LinguisticAssistantBoxes[&amp;#034;&amp;#034;, 4, Automatic, Dynamic[Typeset`query$$], Dynamic[Typeset`boxes$$], Dynamic[Typeset`allassumptions$$], Dynamic[Typeset`assumptions$$], Dynamic[Typeset`open$$], Dynamic[Typeset`querystate$$]], StandardForm],&#xD;
    ImageSizeCache-&amp;gt;{125., {7., 15.}},&#xD;
    TrackedSymbols:&amp;gt;{Typeset`query$$, Typeset`boxes$$, Typeset`allassumptions$$, Typeset`assumptions$$, Typeset`open$$, Typeset`querystate$$}],&#xD;
    DynamicModuleValues:&amp;gt;{},&#xD;
    UndoTrackedVariables:&amp;gt;{Typeset`open$$}],&#xD;
    BaseStyle-&amp;gt;{&amp;#034;Deploy&amp;#034;},&#xD;
    DeleteWithContents-&amp;gt;True,&#xD;
    Editable-&amp;gt;False,&#xD;
    SelectWithContents-&amp;gt;True]\)]&#xD;
    nearestDistancesCA = GeoNearest[WMOLocationsCA//Normal,ptsCA[[1]]];&#xD;
    Print[&amp;#034;Average Distance to nearest WMO Station&amp;#034;]&#xD;
    Mean[GeoDistance@@@Transpose[{nearestDistancesCA[[All,1,1]],ptsCA[[1]]}]]&#xD;
    Print[&amp;#034;WMO Stations per Square Mile&amp;#034;]&#xD;
    ScientificForm[Length[WMOLocationsCA]/EntityValue[Entity[&amp;#034;Country&amp;#034;,&amp;#034;Canada&amp;#034;],&amp;#034;Area&amp;#034;]]&#xD;
    &#xD;
    WMOLocationsAL=Values@ResourceData[&amp;#034;WMO Meteorological Stations&amp;#034;][Select[#Country===&amp;#034;Algeria&amp;#034;&amp;amp;], &amp;#034;Position&amp;#034;];&#xD;
    ptsAL=RandomGeoPosition[Entity[&amp;#034;Country&amp;#034;,&amp;#034;Algeria&amp;#034;],100];&#xD;
    GeoGraphics[{{Red,Point/@WMOLocationsAL},{Black,Point[ptsAL]}},GeoRange-&amp;gt;Entity[&amp;#034;Country&amp;#034;,&amp;#034;Algeria&amp;#034;]]&#xD;
    nearestDistancesAL = GeoNearest[WMOLocationsAL//Normal,ptsAL[[1]]];&#xD;
    Print[&amp;#034;Average Distance to nearest WMO Station&amp;#034;]&#xD;
    Mean[GeoDistance@@@Transpose[{nearestDistancesAL[[All,1,1]],ptsAL[[1]]}]]&#xD;
    Print[&amp;#034;WMO Stations per Square Mile&amp;#034;]&#xD;
    ScientificForm[Length[WMOLocationsAL]/EntityValue[Entity[&amp;#034;Country&amp;#034;,&amp;#034;Algeria&amp;#034;],&amp;#034;Area&amp;#034;]]&#xD;
    &#xD;
    WMOLocationsFR=Values@ResourceData[&amp;#034;WMO Meteorological Stations&amp;#034;][Select[#Country===&amp;#034;France&amp;#034;&amp;amp;], &amp;#034;Position&amp;#034;];&#xD;
    ptsFR=RandomGeoPosition[Entity[&amp;#034;Country&amp;#034;,&amp;#034;France&amp;#034;],100];&#xD;
    GeoGraphics[{{Red,Point/@WMOLocationsFR},{Black,Point[ptsFR]}},GeoRange-&amp;gt;Entity[&amp;#034;Country&amp;#034;,&amp;#034;France&amp;#034;]]&#xD;
    nearestDistancesFR = GeoNearest[WMOLocationsFR//Normal,ptsFR[[1]]];&#xD;
    Print[&amp;#034;Average Distance to nearest WMO Station&amp;#034;]&#xD;
    Mean[GeoDistance@@@Transpose[{nearestDistancesFR[[All,1,1]],ptsFR[[1]]}]]&#xD;
    Print[&amp;#034;WMO Stations per Square Mile&amp;#034;]&#xD;
    ScientificForm[Length[WMOLocationsFR]/EntityValue[Entity[&amp;#034;Country&amp;#034;,&amp;#034;France&amp;#034;],&amp;#034;Area&amp;#034;]]&#xD;
&#xD;
![enter image description here][5]&#xD;
![enter image description here][6]&#xD;
![enter image description here][7]&#xD;
![enter image description here][8]&#xD;
&#xD;
## Retrieving and Charting Data from the Blockchain ##&#xD;
This cell retrieves entries from the blockchain and charts them against a local weather station. In this example, data is retrieved from KBED which is located at the Laurence G Hanscom Field Airport about ten miles away from the personal weather station. The difference in temperature readings could be attributed to a micro-climates created my paved runways, buildings, HVAC, or other interferences. Though, in general, the temperature reading from KBED takes longer to cool down and longer to heat up. Curiously, KBED&amp;#039;s pressure sensor either seems to be broken or has far less granularity than an AcuRite PRO+ 5-in-1 Weather Sensor.&#xD;
&#xD;
    (*Collect all the Blockchain sumbissions from the weather station and chart the temperature over time*)  &#xD;
    Databin[&amp;#034;EM6FHeXi&amp;#034;, All];&#xD;
    recentHashes=Normal[Dataset[Databin[&amp;#034;EM6FHeXi&amp;#034;, -24]]][[All,1,-1]];&#xD;
    data=Dataset[BlockchainGet[recentHashes]];&#xD;
    times=data[[1;;All,2,2]]//Normal;&#xD;
    temps=data[[1;;All,2,1,1,2]]//Normal;&#xD;
    myTempsTimeSeries=TimeSeries[Transpose[{times, MapAt[ToExpression,#,1]&amp;amp;/@temps}]];&#xD;
    wmoTempsTimeSeries=TimeSeries[Transpose[{times, AirTemperatureData[&amp;#034;KBED&amp;#034;, times]}]];&#xD;
    DateListPlot[{myTempsTimeSeries,wmoTempsTimeSeries}, &#xD;
    	PlotLegends-&amp;gt;{&amp;#034;Personal Weather Station&amp;#034;,&amp;#034;Nearest ICAO Station&amp;#034;}]&#xD;
&#xD;
    (*Chart the weather station&amp;#039;s Pressure*)&#xD;
    pressure=data[[1;;All,2,1,7,2]]//Normal;&#xD;
    &#xD;
    myPressureTimeSeries=TimeSeries[Transpose[{times, MapAt[ToExpression,#,1]&amp;amp;/@pressure}]];&#xD;
    wmoPressureTimeSeries=TimeSeries[Transpose[{times, AirPressureData[&amp;#034;KBED&amp;#034;, times]}]];&#xD;
    DateListPlot[{myPressureTimeSeries,wmoPressureTimeSeries}, PlotLegends-&amp;gt;{&amp;#034;Personal Weather Station&amp;#034;,&amp;#034;Nearest WMO Station&amp;#034;}]&#xD;
&#xD;
    (*Chart the weather station&amp;#039;s Wind Speed*)&#xD;
    windSpeed=data[[1;;All,2,1,3,2]]//Normal;&#xD;
    myWindTimeSeries=TimeSeries[Transpose[{times, MapAt[ToExpression,#,1]&amp;amp;/@windSpeed}]];&#xD;
    wmoWindTimeSeries=TimeSeries[Transpose[{times, WindSpeedData[&amp;#034;KBED&amp;#034;, times]}]];&#xD;
    DateListPlot[{myWindTimeSeries, wmoWindTimeSeries},&#xD;
    	PlotLegends-&amp;gt;{&amp;#034;Personal Weather Station&amp;#034;,&amp;#034;Nearest ICAO Station&amp;#034;}]&#xD;
**Air Temperature**&#xD;
![enter image description here][9]&#xD;
**Pressure**&#xD;
![enter image description here][10]&#xD;
**Wind Speed**&#xD;
![enter image description here][11]&#xD;
&#xD;
## Future Ambitions ##&#xD;
Future work includes plotting additional weather stations hosted by ICAO and CWOP. Plotting these datasets along with WMO stations will help determine the geographic areas with the least density of weather stations - where it would make the most sense to install the next weather station.&#xD;
Next steps also include:&#xD;
&#xD;
- recording multiple personal weather stations into a blockchain and databin such that each contributor gets credit for their contributions&#xD;
&#xD;
- computing weather forecasts augmented with the collected data&#xD;
&#xD;
- inserting data entries into other blockchains such as Ark and Ethereum&#xD;
&#xD;
[Notebook URL][12]&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=weathertable2.png&amp;amp;userId=1709975&#xD;
  [2]: https://www.vice.com/en_us/article/gy77wy/stop-using-third-party-weather-apps&#xD;
  [3]: http://wolfr.am/EM6FHeXi&#xD;
  [4]: https://community.wolfram.com//c/portal/getImageAttachment?filename=databinEntry.png&amp;amp;userId=1709975&#xD;
  [5]: https://community.wolfram.com//c/portal/getImageAttachment?filename=usaMap.png&amp;amp;userId=1709975&#xD;
  [6]: https://community.wolfram.com//c/portal/getImageAttachment?filename=canadaMap.png&amp;amp;userId=1709975&#xD;
  [7]: https://community.wolfram.com//c/portal/getImageAttachment?filename=franceMap.png&amp;amp;userId=1709975&#xD;
  [8]: https://community.wolfram.com//c/portal/getImageAttachment?filename=algeriaMap.png&amp;amp;userId=1709975&#xD;
  [9]: https://community.wolfram.com//c/portal/getImageAttachment?filename=recentTemp.png&amp;amp;userId=1709975&#xD;
  [10]: https://community.wolfram.com//c/portal/getImageAttachment?filename=recentPressure.png&amp;amp;userId=1709975&#xD;
  [11]: https://community.wolfram.com//c/portal/getImageAttachment?filename=recentWind.png&amp;amp;userId=1709975&#xD;
  [12]: https://github.com/tonykoop/WSS-2019/tree/master/Final%20Project/Final%20Submission</description>
    <dc:creator>Tony Koop</dc:creator>
    <dc:date>2019-07-10T19:29:09Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1167599">
    <title>Precision computation for today&amp;#039;s eclipse</title>
    <link>https://community.wolfram.com/groups/-/m/t/1167599</link>
    <description>If you are anywhere near the path of totality for today&amp;#039;s eclipse, check out http://www.precisioneclipse.com to find the precise time of onset, totality and more!&#xD;
&#xD;
Backstory: [When Exactly Will the Eclipse Happen? A Multimillenium Tale of Computation][1]&#xD;
&#xD;
Happy Viewing (protect those eyes!)&#xD;
&#xD;
Best,&#xD;
Danielle&#xD;
&#xD;
[![enter image description here][2]][1]&#xD;
&#xD;
&#xD;
  [1]: http://blog.stephenwolfram.com/2017/08/when-exactly-will-the-eclipse-happen-a-multimillenium-tale-of-computation&#xD;
  [2]: http://community.wolfram.com//c/portal/getImageAttachment?filename=PrecisionEclipseDetails-6201.png&amp;amp;userId=11733</description>
    <dc:creator>Danielle Rommel</dc:creator>
    <dc:date>2017-08-21T14:17:33Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/492955">
    <title>Model selection methods for machine learning routines</title>
    <link>https://community.wolfram.com/groups/-/m/t/492955</link>
    <description>Machine learning theme discussed previously  is further updated with model / variable selection  methods when linear regression is the tool to be used. This is due to the importance of regression routines in exploratory data analysis in econometrics and finance. Although the selection algorithms are presented in the linear model  setting, they are equally applicable to other regression methods, not necessarily linear. &#xD;
&#xD;
![Selection image][1]&#xD;
&#xD;
&#xD;
  [1]: /c/portal/getImageAttachment?filename=Modelselimage.png&amp;amp;userId=387433</description>
    <dc:creator>Igor Hlivka</dc:creator>
    <dc:date>2015-05-07T00:44:11Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/977942">
    <title>Somehow state-level oil production is not in the Wolfram Alpha database</title>
    <link>https://community.wolfram.com/groups/-/m/t/977942</link>
    <description>https://gyazo.com/7455e672ff048efb9f572d9023119aa3&#xD;
&#xD;
The same sort of result happens with any other US state, and presumably with Canadian or Russian provinces as well. Wolfram Alpha has data on every country&amp;#039;s oil production - searching &amp;#034;nauru oil production&amp;#034; will helpfully tell me that the island nation of nauru produces 0 barrels per day - but state-level data has somehow not been programmed in.&#xD;
&#xD;
This is such a trivially easy to acquire piece of information - and one that might be used quite often - so it should absolutely be in the database. I&amp;#039;m not sure where I&amp;#039;m supposed to post this sort of recommendation for data, so I apologize if this is categorized incorrectly.</description>
    <dc:creator>a b</dc:creator>
    <dc:date>2016-12-11T08:37:26Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1076892">
    <title>[NASA Space Apps Challenge] The Earth and us - Pilot Plus and Volcanoes</title>
    <link>https://community.wolfram.com/groups/-/m/t/1076892</link>
    <description>*Note: You can try out the &amp;#034;Volcano Explorer App&amp;#034; [here][1].*&#xD;
&#xD;
#Introduction#&#xD;
The **NASA Space Apps** is an international hackathon that occurs over 48 hours in cities around the world.  If you aren&amp;#039;t close to any of these cities you can also [participate virtually][2]. &#xD;
&#xD;
This year there is a special focus on Earth. Here you can check the different challenges: https://2017.spaceappschallenge.org/challenges/. Many of them can be tackled directly using the Wolfram Language and its Wolfram Knowledgebase.&#xD;
&#xD;
To begin with, I thought it would be fun to work a bit on the [&amp;#034;Pilot Plus Challenge&amp;#034;][3].&#xD;
The description of this challenge is the following:&#xD;
&#xD;
&amp;gt;  Provide private aircraft pilots and passengers with an easy-to-use&#xD;
&amp;gt; tool that gives information about the land underneath their flight&#xD;
&amp;gt; plans.&#xD;
&#xD;
&#xD;
#Part I - Getting the GeoVisibleRegion of an aircraft#&#xD;
&#xD;
For this challenge we have a very useful built-in Wolfram Language Symbol called [GeoVisibleRegion][4] which is is a two-dimensional *GeoGraphics* primitive that represents the region on the surface of the Earth visible from the point of coordinates *lat*, *lon* and height *h*.&#xD;
&#xD;
For example the visible region from an altitude of 10 km is:&#xD;
&#xD;
&#xD;
    GeoGraphics[GeoVisibleRegion[{43, -90, 10000}]]&#xD;
![enter image description here][5]&#xD;
&#xD;
We can even get the region currently viewable from the *International Space Station* using [SatelliteData][6]:&#xD;
&#xD;
    GeoGraphics[GeoVisibleRegion[SatelliteData[Entity[&amp;#034;Satellite&amp;#034;, &amp;#034;25544&amp;#034;], &amp;#034;Position&amp;#034;]], GeoRange -&amp;gt; &amp;#034;World&amp;#034;]&#xD;
![enter image description here][7]&#xD;
&#xD;
Sometimes we might not know the coordinates of the place that we want to explore and we only know the name of the place. In such cases one can get the the Latitude and Longitude coordinates using [LatitudeLongitude][8] and [Interpreter][9][&amp;#034;Location&amp;#034;] :&#xD;
&#xD;
    geoVR[place_String, altitude_] := GeoVisibleRegion[Append[LatitudeLongitude[Interpreter[&amp;#034;Location&amp;#034;][place]], altitude]]&#xD;
    GeoGraphics[geoVR[&amp;#034;Paris&amp;#034;, 100]]&#xD;
![enter image description here][10]&#xD;
&#xD;
We can also get the NASA satellite image as a GeoBackground:&#xD;
&#xD;
    GeoGraphics[geoVR[&amp;#034;Paris&amp;#034;, 100], GeoBackground -&amp;gt; GeoStyling[&amp;#034;Satellite&amp;#034;], GeoScaleBar -&amp;gt; &amp;#034;Kilometers&amp;#034;]![enter image description here][11]&#xD;
#Getting information of Volcanoes within a region using GeoEntities #&#xD;
So far so good, now we need to identify **geographic, natural, and cultural locations of interest** from these visible regions. And [GeoEntities][12] is exactly what we need! It gives a list of the geographic entities of type *enttype* contained in the extended region *reg*.&#xD;
&#xD;
In particular we will focus on volcanoes, but you can try your other **entity types** like, *&amp;#034;Lake&amp;#034;, &amp;#034;Mountain&amp;#034;, &amp;#034;City&amp;#034;*, ... For example these are the volcanoes that you can see from an aircraft at 1000 m above Portland:&#xD;
&#xD;
    volcanoes = GeoEntities[geoVR[&amp;#034;Portland&amp;#034;, 1000], &amp;#034;Volcano&amp;#034;]&#xD;
![enter image description here][13]&#xD;
&#xD;
We can check all the properties available for a volcano entity:&#xD;
![enter image description here][14]&#xD;
&#xD;
Furthermore we can get extra info of these Volcanoes using [WikipediaData][15]:![enter image description here][16]&#xD;
&#xD;
#Creating and Deploying the *Volcano Explorer App*#&#xD;
Now we have the tools to retrieve the data, and we can put them together to create a Wolfram Cloud based App. &#xD;
For this I decided to use [FormPage][17] but alternatively we could also use [FormFunction][18] or the [APIFuntion][19].&#xD;
&#xD;
I&amp;#039;m sure that the following code can be optimized. Furthermore the user interface and the design of the App need to be improved, but as a first quick prototype I think it is decent enough. &#xD;
&#xD;
    fp = FormPage[{{&amp;#034;location&amp;#034;, &amp;#034;Location&amp;#034;} -&amp;gt; &#xD;
        &amp;#034;Location&amp;#034;, {&amp;#034;altitude&amp;#034;, &amp;#034;Altitude (m)&amp;#034;} -&amp;gt; &#xD;
        Restricted[&amp;#034;Number&amp;#034;, {0, 10000}] -&amp;gt; 1000}, &#xD;
      With[{geoVR = &#xD;
          GeoVisibleRegion[&#xD;
           Append[LatitudeLongitude[&#xD;
             Interpreter[&amp;#034;Location&amp;#034;][#location]], #altitude]]}, &#xD;
        Column[{GeoGraphics[{GeoStyling[&amp;#034;Satellite&amp;#034;, &#xD;
             GeoStylingImageFunction -&amp;gt; (Lighter[#, 0.4] &amp;amp;)], &#xD;
            EdgeForm[{Red, Thick}], geoVR,&#xD;
            With[{volcanoes = GeoEntities[geoVR, &amp;#034;Volcano&amp;#034;]}, &#xD;
             If[Length[v = volcanoes] == 0, Nothing, &#xD;
              GeoMarker[GeoEntities[geoVR, &amp;#034;Volcano&amp;#034;], &#xD;
               Entity[&amp;#034;Icon&amp;#034;, &amp;#034;Volcano&amp;#034;]]]]}, &#xD;
           GeoBackground -&amp;gt; GeoStyling[&amp;#034;Satellite&amp;#034;], &#xD;
           GeoScaleBar -&amp;gt; &amp;#034;Kilometers&amp;#034;],&#xD;
          If[Length[v] == 0, Nothing, Column@Map[Column@Flatten@{&amp;#034;&amp;#034;, &amp;#034;&amp;#034;,&#xD;
                 Style[#[&amp;#034;Name&amp;#034;], Bold, 20],&#xD;
                 DeleteMissing[#[{EntityProperty[&amp;#034;Volcano&amp;#034;, &amp;#034;Image&amp;#034;]}]],&#xD;
                 Style[&amp;#034;Elevation (m):&amp;#034;, Bold],&#xD;
                 &#xD;
                 DeleteMissing[&#xD;
                  QuantityMagnitude[#[{EntityProperty[&amp;#034;Volcano&amp;#034;, &#xD;
                      &amp;#034;Elevation&amp;#034;]}], &amp;#034;Meters&amp;#034;]],&#xD;
                 Style[&amp;#034;Last Eruption (year):&amp;#034;, Bold],&#xD;
                 &#xD;
                 DeleteMissing[#[{EntityProperty[&amp;#034;Volcano&amp;#034;, &#xD;
                     &amp;#034;LastKnownEruptionDate&amp;#034;]}]],&#xD;
                 &#xD;
                 GeoGraphics[#, GeoBackground -&amp;gt; GeoStyling[&amp;#034;Satellite&amp;#034;], &#xD;
                  GeoScaleBar -&amp;gt; &amp;#034;Kilometers&amp;#034;],&#xD;
                 WikipediaData[#, &amp;#034;SummaryPlaintext&amp;#034;]} &amp;amp;, v]]}]]&#xD;
       &#xD;
       &amp;amp;, FormTheme -&amp;gt; &amp;#034;Red&amp;#034;, &#xD;
      AppearanceRules -&amp;gt; &amp;lt;|&amp;#034;Title&amp;#034; -&amp;gt; &amp;#034;Volcano Explorer&amp;#034;, &#xD;
        &amp;#034;Description&amp;#034; -&amp;gt; &#xD;
         &amp;#034;Discover the volcanoes that are visible from your aircraft!&amp;#034;|&amp;gt;]&#xD;
&#xD;
We can then CloudDeploy the FormPage: &#xD;
&#xD;
    CloudDeploy[fp, &amp;#034;VolcanoExplorer&amp;#034;, Permissions-&amp;gt;&amp;#034;Public&amp;#034;]&#xD;
&#xD;
And this is the resulting **&amp;#034;Volcano Explorer App&amp;#034;** , feel free to [try it][20], tweak it and suggest improvements:&#xD;
![enter image description here][21]&#xD;
![enter image description here][22]&#xD;
&#xD;
As a next step, it could be great to include commercial flight routes into the App. This might be achieved with the code and resources that [@Marco Thiel][at0] used on his post about [flight data and trajectories of planes][23]. Another source of inspiration that we could use to enhance this App is the post from [@Arnoud Buzing][at1] about [earthquakes around a volcano][24].&#xD;
&#xD;
&#xD;
 [at0]: http://community.wolfram.com/web/mthiel&#xD;
&#xD;
&#xD;
 [at1]: http://community.wolfram.com/web/arnoudb&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/objects/user-55ede016-e048-4097-9b58-db218e02e037/VolcanoExplorer&#xD;
  [2]: https://2017.spaceappschallenge.org/auth/signup&#xD;
  [3]: https://2017.spaceappschallenge.org/challenges/earth-and-us/pilots-plus/details&#xD;
  [4]: https://reference.wolfram.com/language/ref/GeoVisibleRegion.html&#xD;
  [5]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-04-28at13.26.19.png&amp;amp;userId=95400&#xD;
  [6]: https://reference.wolfram.com/language/ref/SatelliteData.html&#xD;
  [7]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-04-28at13.30.20.png&amp;amp;userId=95400&#xD;
  [8]: https://reference.wolfram.com/language/ref/LatitudeLongitude.html&#xD;
  [9]: http://reference.wolfram.com/language/ref/Interpreter.html&#xD;
  [10]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-04-28at13.37.02.png&amp;amp;userId=95400&#xD;
  [11]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-04-28at13.39.19.png&amp;amp;userId=95400&#xD;
  [12]: http://reference.wolfram.com/language/ref/GeoEntities.html&#xD;
  [13]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-04-28at13.48.46.png&amp;amp;userId=95400&#xD;
  [14]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-04-28at13.51.02.png&amp;amp;userId=95400&#xD;
  [15]: http://reference.wolfram.com/language/ref/WikipediaData.html&#xD;
  [16]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-04-28at13.53.17.png&amp;amp;userId=95400&#xD;
  [17]: http://reference.wolfram.com/language/ref/FormPage.html&#xD;
  [18]: http://reference.wolfram.com/language/ref/FormFunction.html&#xD;
  [19]: http://reference.wolfram.com/language/ref/APIFunction.html&#xD;
  [20]: https://www.wolframcloud.com/objects/user-55ede016-e048-4097-9b58-db218e02e037/VolcanoExplorer&#xD;
  [21]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-04-28at14.10.02.png&amp;amp;userId=95400&#xD;
  [22]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-04-28at14.14.35.png&amp;amp;userId=95400&#xD;
  [23]: http://community.wolfram.com/groups/-/m/t/1072478&#xD;
  [24]: http://community.wolfram.com/groups/-/m/t/325930</description>
    <dc:creator>Jofre Espigule-Pons</dc:creator>
    <dc:date>2017-04-28T19:25:55Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1136354">
    <title>[WSS17] 3D modeling of topographical maps</title>
    <link>https://community.wolfram.com/groups/-/m/t/1136354</link>
    <description>My goal was to create a function that could generate a 3D representation of a landscape from a topographical map.  I decided to do this by building a convolution neural network that could have a grayscale topographical map as an input, and a grayscale heat map as an output.  A 3D image could then be constructed from the data encoded in the heat map.&#xD;
&#xD;
## Making random maps ##&#xD;
&#xD;
In order to generate enough training data for the neural network, I needed to be able to generate random artificial landscapes:&#xD;
&#xD;
    makeMountains[x_List, n_Integer] :=&#xD;
     Flatten[&#xD;
      Table[&#xD;
       RandomVariate[&#xD;
        BinormalDistribution[i, {RandomReal[], RandomReal[]}, &#xD;
         RandomReal[{-1, 1}]],&#xD;
        RandomInteger[{1, 100}]&#xD;
        ],&#xD;
       {i, x}&#xD;
       ],&#xD;
      1&#xD;
      ]&#xD;
The function makeMountains generates a random list of n points.  To turn this into a landscape, I wrote another function:&#xD;
&#xD;
    randTopo :=&#xD;
     Rasterize[&#xD;
      randMountain =&#xD;
       SmoothHistogram3D[&#xD;
        makeMountains[RandomReal[{-15, 15}, {200, 2}], 100],&#xD;
        Lighting -&amp;gt; {White, &amp;#034;Ambient&amp;#034;},&#xD;
        Mesh -&amp;gt; {Table[i, {i, -15 + RandomInteger[{0, 5}], 15, 6}], &#xD;
          Table[i, {i, -15 + RandomInteger[{0, 5}], 15, 6}], 30},&#xD;
        PlotStyle -&amp;gt; White,&#xD;
        MeshFunctions -&amp;gt; { #1 &amp;amp; , #2 &amp;amp; , #3 &amp;amp;},&#xD;
        Boxed -&amp;gt; False,&#xD;
        Axes -&amp;gt; False,&#xD;
        PlotRangePadding -&amp;gt; None,&#xD;
        ImagePadding -&amp;gt; None,&#xD;
        ViewPoint -&amp;gt; {0, 0, \[Infinity]},&#xD;
        PlotRange -&amp;gt; {{-15, 15}, {-15/1.6, 15/1.6}},&#xD;
        AspectRatio -&amp;gt; 1/1.6&#xD;
        ],&#xD;
      ImageSize -&amp;gt; {600 1.6, 600}&#xD;
      ]&#xD;
The function randMountain makes a smooth 3D histogram plot of makeMountains.  The function randTopo creates an image that is a top-down view of this plot.  The three types of mesh create gridlines and contour lines, which make the image look like a real topographical map.  The Mesh parameter is used to make sure that the gridlines are placed slightly differently each time randTopo is used to make a map.  This is done so that the neural network learns to ignore the gridlines that are present on most real maps.  &#xD;
&#xD;
I then needed to make a function that could generate a grayscale heat map that would correspond to the map generated by randTopo:&#xD;
&#xD;
    heatMap :=&#xD;
     Rasterize[&#xD;
      ListDensityPlot[&#xD;
       pointsNew = &#xD;
        Transpose[{randMountain[[1, 1]][[All, 1]], &#xD;
          randMountain[[1, 1]][[All, 2]], &#xD;
          Rescale[randMountain[[1, 1]][[All, 3]]]}],&#xD;
       Frame -&amp;gt; False,&#xD;
       ImagePadding -&amp;gt; None,&#xD;
       PlotRangePadding -&amp;gt; None,&#xD;
       ColorFunction -&amp;gt; GrayLevel,&#xD;
       AspectRatio -&amp;gt; 1/1.6&#xD;
       ],&#xD;
      ImageSize -&amp;gt; {600 1.6, 600}&#xD;
      ]&#xD;
The function heatMap accomplishes this by rasterizing a ListDensityPlot of the points from randMountain.  However, the points are altered by pointsNew so that the height values are all between 0 and 1.  The normalized height values are then encoded as intensity values in the grayscale ListDensityPlot.  We can overlay the heat map and the random topographical map and see that the areas of higher elevation are brighter than the areas of lower elevation:&#xD;
&#xD;
![enter image description here][1]&#xD;
&#xD;
&#xD;
Using these randomly generated topo maps and heat maps, I created a small data set on which to train the neural network:&#xD;
&#xD;
    trainingData = Table[randTopo -&amp;gt; heatMap, 50];&#xD;
## The neural network ##&#xD;
&#xD;
The next step was to build the convolution neural network.  I started by defining some layers that would be used repeatedly:&#xD;
&#xD;
    Layers&#xD;
    &#xD;
    convLayer1[channels_, kernelSize_, options___] :=&#xD;
     NetChain[{&#xD;
       ConvolutionLayer[channels, kernelSize, options],&#xD;
       ElementwiseLayer[Ramp],&#xD;
       BatchNormalizationLayer[]}]&#xD;
    &#xD;
    convLayer2[channels_, kernelSize_, options___] :=&#xD;
     NetChain[{&#xD;
       ConvolutionLayer[channels, kernelSize, options],&#xD;
       ElementwiseLayer[Ramp],&#xD;
       BatchNormalizationLayer[],&#xD;
       PoolingLayer[2, &amp;#034;Stride&amp;#034; -&amp;gt; 2]}]&#xD;
    &#xD;
    deconvLayer1[channels_, kernelSize_, options___] :=&#xD;
     NetChain[{&#xD;
       DeconvolutionLayer[channels, kernelSize, options],&#xD;
       ElementwiseLayer[Ramp],&#xD;
       BatchNormalizationLayer[]}]&#xD;
I then put these layers into a network:&#xD;
&#xD;
    mapNN = NetChain[{&#xD;
       NetChain[{&#xD;
         ConvolutionLayer[32, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2, &#xD;
          &amp;#034;Weights&amp;#034; -&amp;gt; Automatic],&#xD;
         ElementwiseLayer[Ramp],&#xD;
         BatchNormalizationLayer[]},&#xD;
        &amp;#034;Input&amp;#034; -&amp;gt; {1, 600, 960}],&#xD;
       convLayer1[64, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       convLayer1[128, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       convLayer2[256, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       convLayer2[512, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       deconvLayer1[256, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       deconvLayer1[128, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       deconvLayer1[64, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       deconvLayer1[32, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       deconvLayer1[16, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       deconvLayer1[8, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       deconvLayer1[1, {3, 3}, &amp;#034;Stride&amp;#034; -&amp;gt; 2],&#xD;
       ResizeLayer[{600, 960}],&#xD;
       ElementwiseLayer[LogisticSigmoid]},&#xD;
      &amp;#034;Input&amp;#034; -&amp;gt; &#xD;
       NetEncoder[{&amp;#034;Image&amp;#034;, ImageDimensions[randTopo], &amp;#034;Grayscale&amp;#034;}], &#xD;
      &amp;#034;Output&amp;#034; -&amp;gt; NetDecoder[{&amp;#034;Image&amp;#034;, ColorSpace -&amp;gt; &amp;#034;Grayscale&amp;#034;}]]&#xD;
The ResizeLayer is present at the end due to the loss of pixels from repeated convolution layers.  It simply makes sure that the heat map output is the same size as the input image.  The LogisticSigmoid keeps all of the intensity values of the heat map between 0 and 1.&#xD;
&#xD;
## Generating the 3D landscape ##&#xD;
&#xD;
The whole point of the heat map is that it has height values encoded as intensity.  These values are also normalized, so in the final 3D model all of the mountains and valleys will be at the right elevation relative to each other.  This way, there is no need to worry about the elevation numbers written on a real topographical map.&#xD;
&#xD;
To make the 3D landscape, I extracted the data encoded in the heat map:&#xD;
&#xD;
    imageData = ImageData[heatMap];&#xD;
    &#xD;
    mapPoints = Flatten[&#xD;
       Table[{i, j, imageData[[i, j, 1]]}, {i, Length[imageData]}, {j, &#xD;
         Length[imageData]}],&#xD;
       1];&#xD;
I then used ListPlot3D to get the final result:&#xD;
&#xD;
![enter image description here][2]&#xD;
&#xD;
&#xD;
## Testing ##&#xD;
&#xD;
I was unable to test the neural network on a large enough data set.  After being trained on 50 input/output pairs, I tried to input the following map:&#xD;
&#xD;
![enter image description here][3]&#xD;
&#xD;
I got the following output:&#xD;
&#xD;
![enter image description here][4]&#xD;
&#xD;
Although this heat map is far from clear or accurate, it does seem to show some of the bright spots where it is supposed to.  This can be seen by comparing it to the heat map generated from the heatMap function:&#xD;
&#xD;
![enter image description here][5]&#xD;
&#xD;
Particularly on the left side of the image, the result seems pretty good for a neural network trained on such a small data set.  On the right, you can see that the neural net mistook a mountain for a cone-shaped valley (there is a bright &amp;#039;ring&amp;#039; with a dark center).  With a larger set of training data, the neural network would learn that valleys are rarely steep or cone-shaped, and that contour lines that are very dense typically indicate mountains.&#xD;
&#xD;
## Notes ##&#xD;
&#xD;
The results here could certainly be improved.  As previously mentioned, a larger set of training data would likely produce better results.  Also, there are no elevation numbers, legends, or place names on my randomly generated topographical maps.  Adding these features to some of the training images might help the neural network learn to ignore them.&#xD;
&#xD;
My full code can be found [here][6].&#xD;
&#xD;
&#xD;
  [1]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-07-05at3.40.34PM.png&amp;amp;userId=1106152&#xD;
  [2]: http://community.wolfram.com//c/portal/getImageAttachment?filename=6174topo5.png&amp;amp;userId=1106152&#xD;
  [3]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-07-02at6.13.19PM.png&amp;amp;userId=1106152&#xD;
  [4]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-07-02at6.13.41PM.png&amp;amp;userId=1106152&#xD;
  [5]: http://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2017-07-02at6.13.31PM.png&amp;amp;userId=1106152&#xD;
  [6]: https://github.com/kalekel/WSS2017/blob/master/topo%205.nb</description>
    <dc:creator>Kaleb Alekel</dc:creator>
    <dc:date>2017-07-05T20:13:18Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/1728396">
    <title>[WSS19] Rocks, Patterns, Dynamics, Prediction</title>
    <link>https://community.wolfram.com/groups/-/m/t/1728396</link>
    <description>The summer school project is a first step towards developing the application of the tools of nonlinear dynamics to measuring rocks, to measuring the structural architectures which result from processes interacting and developing in a coupled environment.&#xD;
&#xD;
I am concerned with the processes that operate during the deformation and metamorphism of rocks in the crust and upper lithosphere of the Earth. The deformation and metamorphism of rocks involves structural rearrangements of elements of the rock at the microscale by processes such as mass diffusion, dislocation slip and climb, grain-boundary migration and fracturing at the same time as chemical reactions proceed. In some instances infiltrating fluids introduce or remove chemical components and may influence mechanical properties through changes in mineralogical composition, fluid pressure or temperature. At the same time, heat is added to or removed from the system depending on the surrounding tectonic environment. Such mechanisms do not operate independently of each other but are coupled so that each process has feedback influences on the others leading to structures and mineral assemblages that do not develop in the uncoupled environment.&#xD;
&#xD;
Some aspects of this research are represented by this Word Cloud:&#xD;
&#xD;
![Word Cloud][1]&#xD;
&#xD;
The characterisation of nonlinear systems in terms of multifractal geometry and recurrence in the dynamics constitutes an important tool box for geological systems.&#xD;
&#xD;
An important concept in nonlinear analysis is the recurrence plot; this contains all the information that defines the underlying dynamics of a system. A recurrence plot determines the times (or locations for a spatially patterned signal) at which a trajectory in phase space visits roughly the same area in that phase space. Distances are measured in the embedding space of the attractor for the system. The complete dynamics of a system can be derived from a time (or spatial) series for a single state variable from that system ([Takens][2]) so that the dynamics of the system are encompassed by the attractor for that system. The input data are not constrained to any type of statistical distribution and the data are not required to be stationary. There is no need to know the mathematical rules (if any) governing the system under study. &#xD;
&#xD;
Quantification of a recurrence plot such as that shown here has been developed by [Webber and Marwan (2015).][3] &#xD;
&#xD;
![Main recurrence plot][4]&#xD;
&#xD;
Further details of the multiscaling of the system may be explored through windows moving along the main diagonal. The structures in the five windows shown here may be matched with their position in the main window.&#xD;
&#xD;
![5 multiscaled recurrence plots][5]&#xD;
&#xD;
Prediction based on nonlinear dynamics, in this case through recurrence quantification analysis, takes into account the full mechanics of the formation of the geological system.&#xD;
&#xD;
The Wolfram Language Notebook containing the details of the analysis performed at the Wolfram Summer School 2019 is available [here][6].&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=hobbsord2015WordCloud.jpg&amp;amp;userId=1728341&#xD;
  [2]: https://en.wikipedia.org/wiki/Takens%27s_theorem &amp;#034;Taken&amp;#039;s Theorem&amp;#034;&#xD;
  [3]: https://link.springer.com/book/10.1007/978-3-319-07155-8 &amp;#034;Recurrence Quantification Analysis&amp;#034;&#xD;
  [4]: https://community.wolfram.com//c/portal/getImageAttachment?filename=rm1.jpg&amp;amp;userId=1728341&#xD;
  [5]: https://community.wolfram.com//c/portal/getImageAttachment?filename=rm2.jpg&amp;amp;userId=1728341&#xD;
  [6]: https://www.wolframcloud.com/obj/abbott/Published/deformation%20and%20metamorphism.nb &amp;#034;Deformation and Metamorphism&amp;#034;</description>
    <dc:creator>Alison Ord</dc:creator>
    <dc:date>2019-07-10T13:05:31Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/908527">
    <title>[WSSA16] Detection of TGE Events in weather data, aka Thunderstorm Analyzer</title>
    <link>https://community.wolfram.com/groups/-/m/t/908527</link>
    <description>Thunderstorm Analyzer&#xD;
=====================&#xD;
&#xD;
![Crazy Tampa Lightning][1]&#xD;
&#xD;
ABSTRACT:&#xD;
&#xD;
Every moment our bodies are penetrated by cosmic rays. Those are tiny little particles which are coming from the rest of the universe and they can affect air and ground communication as well as airplane navigation.&#xD;
It was observed that during thunderstorms number of this particles increases.&#xD;
We know that those excess number of particles are not coming from space, because they occur only during atmospheric events so they should be generated inside the thundercloud.&#xD;
&#xD;
Scientists at [Alikhanyan National Science Laboratory][2] (Yerevan Physics Institute) came up with a theory which explains why this is happening and the goal of this project is to test it and create a system which will analyze atmospheric properties like electric field, number of electrons, neutrons, muons and gamma rays taken from [public weather server][3] of Yerevan Physics Institute and study their temporal correlation to detect the cases of additional particle creation in a process called [Thunderstorm Ground Enhancement][4] (TGE).&#xD;
&#xD;
![7200 FPS Lightning][5]&#xD;
&#xD;
Theory&#xD;
======&#xD;
&#xD;
It was long known that there are big charge concentrations in thunderclouds because of static electricity generated when super-cooled water droplets are colliding with ice crystals because of which charge constantly builds up until lightning will not happen between any areas of thundercloud or between cloud and ground or the thundercloud will not disperse. This can be observed by measuring overall electric field near earth surface. Usually the electric field near ground is at the levels of 0.2 - 0.5 kV/m during bright weather, but during thunderstorms that number can rise with absolute magnitude to the levels of 60 - 70 kV/m.&#xD;
When lightning happens charge distribution within the cloud changes and simultaneously the magnitude of overall electric field near ground falls down immediately. &#xD;
The idea is that there is a big potential difference between earth surface and thundercloud thus charged particles from cosmic rays can accelerate during propagation through the air and clouds with strong atmospheric electric fields. We know that when charged particles moves with acceleration they emits radiation (gamma rays) thus loosing energy and eventually stopping, but if external electric field will be higher of some certain value the energy gain from external field will be higher than energy looses from gamma ray emissions, those electrons will continue to propagate with positive acceleration and kicking off electrons from air atoms. Those kicked off atoms on their turn will continue to do the exact same thing, like in chain reaction. Eventually in the end it will end up with particle shower when only couple of electrons will generate great amount of electrons and gamma rays.&#xD;
This process is called a Thunderstorm Ground Enhancement (TGE).&#xD;
The TGE events are characterized by following 7 criteria:&#xD;
&#xD;
 - Large fluxes of electrons and gamma rays with duration  around 10 minutes;&#xD;
 - Increase in neutron number;&#xD;
 - Microsecond electron bursts with around 50ms duration;&#xD;
 - Increase of high energy muon level;&#xD;
 - Large, usually negative, near-surface electric field, rising sometimes from deep negative to near zero positive values. Usually field is at the level of -10 - -30 kV/m;&#xD;
 - Decrease of the cloud-ground lightnings and increase of intra-cloud lightnings.&#xD;
 - Increase of relative humidity above 80% and decrease of air temperature below 5 - 6* Celsius.&#xD;
&#xD;
The system should analyze all the data and look for this kind of events and notify us upon their occurring.&#xD;
&#xD;
Import Weather Data from csv file.&#xD;
----------------------------------&#xD;
First thing we should do is to import weather data downloaded from weather server. After importing, we should format all the data and transform them to standard form so it will be easier to work with them.&#xD;
This function takes the name of a file as an argument and imports it&amp;#039;s content.&#xD;
    dataImporter[filePath_String, nOfColumns_Integer]:=Select[&#xD;
        DeleteCases[&#xD;
            Delete[&#xD;
                Import[&#xD;
                    StringJoin[&#xD;
                        NotebookDirectory[], filePath&#xD;
                    ]&#xD;
                ],&#xD;
                1&#xD;
            ],&#xD;
            &amp;#034;&amp;#034;, {2}&#xD;
        ],&#xD;
        (Length[#] == nOfColumns)&amp;amp;&#xD;
    ];&#xD;
&#xD;
By default, date column in csv file has a format  of &amp;#034;Day[type: Numeric] - Month [type: string] - Year[Type: Two digit Numeric] H:M:S&amp;#034;. Because later we should create a time series we need to change date format to &amp;#034;y, m, d, h, m, s&amp;#034;. Pay attention that all parts of date are Numeric and the date is a 4 digit numeric.&#xD;
&#xD;
    dateFormater[inputList_] := Replace[&#xD;
        Part[&#xD;
            MapAt[&#xD;
                ToExpression,&#xD;
                ReplaceAll[&#xD;
                    StringSplit[&#xD;
                        inputList,&#xD;
                        &amp;#034;:&amp;#034; | &amp;#034; &amp;#034; | &amp;#034;-&amp;#034;&#xD;
                    ],&#xD;
                    monthRule],&#xD;
                {All,{1,2,3,4,5,6}}&#xD;
            ],All, {3, 2, 1, 4, 5, 6}&#xD;
        ],&#xD;
        {year_, rest__} :&amp;gt; {year+2000, rest},&#xD;
        {1}&#xD;
    ];&#xD;
monthRule is a Rule that transforms string names of months to their numeric representations. For example January -&amp;gt; 1, February -&amp;gt; 2, etc..&#xD;
&#xD;
Now we should import data of different detectors and perform some transformations on them.&#xD;
Import data of Electric Field Meter.&#xD;
    electricFieldFull = dataImporter[&amp;#034;Weather Data (05.Jul - 07.Jul.16)\\Electric_Field_MAKET.csv&amp;#034;, 2];&#xD;
    &#xD;
    electricFieldFullConverted = Transpose[{dateFormater[electricFieldFull[[All,1]]], electricFieldFull[[All,2]]}];&#xD;
&#xD;
    electricField = Part[&#xD;
        electricFieldFullConverted,&#xD;
        Position[&#xD;
            electricFieldFullConverted,&#xD;
            {2016, 7, 6, 8, 32, 45.`}][[1, 1]] ;; Position[electricFieldFullConverted, {2016, 7, 6, 8, 34, 15.`}][[1, 1]]&#xD;
    ];&#xD;
&#xD;
Import STAND Electron and Gamma ray Detector Data:&#xD;
&#xD;
    stand1Raw = dataImporter[&amp;#034;Weather Data (05.Jul - 07.Jul.16)\\Stand_1cm.csv&amp;#034;, 13];&#xD;
    &#xD;
    stand1 = Transpose[{dateFormater[stand1Raw[[All,1]]],stand1Raw[[All,2]]}];&#xD;
    stand1Normalized = Transpose[{dateFormater[stand1Raw[[All,1]]],N[Rescale[stand1Raw[[All,2]],{Min[stand1],Max[stand1]},{0, 20}]]}];&#xD;
&#xD;
Import NaI Electron and Gamma ray Detector Data&#xD;
&#xD;
    naIFull = dataImporter[&amp;#034;Weather Data (05.Jul - 07.Jul.16)\\NaI.csv&amp;#034;,19];&#xD;
    naIFull = naIFull[[4;;]];&#xD;
    &#xD;
    naI3 = Transpose[&#xD;
    	{dateFormater[naIFull[[All, 1]]], naIFull[[All, 3]]}&#xD;
    ];&#xD;
&#xD;
Import temperature and humidity data:&#xD;
&#xD;
    weatherData = Select[&#xD;
        Delete[&#xD;
            Import[&#xD;
                StringJoin[NotebookDirectory[],&amp;#034;Weather Data (05.Jul - 07.Jul.16)\\Weather_Station.csv&amp;#034;]&#xD;
            ],&#xD;
            1&#xD;
        ],&#xD;
        (Length[#] == 37)&amp;amp;&#xD;
    ];&#xD;
    temperature = Transpose[{dateFormater[weatherData[[All, 1]]], weatherData[[All, 2]]}];&#xD;
    humidity = Transpose[{dateFormater[weatherData[[All, 1]]], weatherData[[All, 5]]}];&#xD;
&#xD;
Generate the plot of unprocessed electric field:&#xD;
&#xD;
    plotOriginal[data_, rangeMin_, rangeMax_, rangeStep_] := DateListPlot[&#xD;
    	data,&#xD;
    	Filling-&amp;gt;Axis,&#xD;
    	PlotRange-&amp;gt;plottingRange,&#xD;
    	Joined-&amp;gt;False,&#xD;
    	PlotTheme-&amp;gt;&amp;#034;Detailed&amp;#034;,&#xD;
    	FrameTicks-&amp;gt;{{Range[rangeMin, rangeMax, rangeStep],None},All}&#xD;
    ]&#xD;
&#xD;
    plotEField = plotOriginal[electricField, -50, 50, 1]&#xD;
&#xD;
![enter image description here][6]&#xD;
&#xD;
    plotNaI3 = plotOriginal[naI3, 30000, 70000, 1000]&#xD;
&#xD;
![enter image description here][7]&#xD;
&#xD;
    Show[DateListPlot[electricField, PlotRange -&amp;gt; {-20, 30}, &#xD;
      Joined -&amp;gt; False, PlotTheme -&amp;gt; &amp;#034;Detailed&amp;#034;,&#xD;
      	FrameTicks -&amp;gt; {{Range[-50, 50, 1], None}, All}], &#xD;
     DateListPlot[stand1Normalized, PlotRange -&amp;gt; Full, PlotStyle -&amp;gt; Red, &#xD;
      Joined -&amp;gt; False]]&#xD;
![enter image description here][8]&#xD;
&#xD;
-------------------------------&#xD;
Get local minima and maxima in time series&#xD;
&#xD;
    getMaxs[detectorData_, sigma_, sharpness_, triggerShreshold_] := DeleteCases[&#xD;
    	Pick[&#xD;
    		detectorData,&#xD;
    		PeakDetect[&#xD;
    			detectorData[[All, 2]],&#xD;
    			sigma,&#xD;
    			sharpness&#xD;
    		],&#xD;
    		1&#xD;
    	],&#xD;
    	{date_,data_}/;data &amp;gt;= triggerShreshold&#xD;
    ];&#xD;
    getMaxs[detectorData_, sigma_, sharpness_] := Pick[&#xD;
    	detectorData,&#xD;
    	PeakDetect[&#xD;
    		detectorData[[All, 2]],&#xD;
    		sigma,&#xD;
    		sharpness&#xD;
    	],&#xD;
    	1&#xD;
    ];&#xD;
    &#xD;
    getMins[detectorData_, sigma_, sharpness_, triggerShreshold_] := DeleteCases[&#xD;
    	Pick[&#xD;
    		detectorData,&#xD;
    		PeakDetect[&#xD;
    			-detectorData[[All, 2]],&#xD;
    			sigma,&#xD;
    			sharpness&#xD;
    		],&#xD;
    		1&#xD;
    	],&#xD;
    	{date_,data_}/;data &amp;gt;= triggerShreshold&#xD;
    ];&#xD;
    getMins[detectorData_, sigma_, sharpness_] := Pick[&#xD;
    	detectorData,&#xD;
    	PeakDetect[&#xD;
    		-detectorData[[All, 2]],&#xD;
    		sigma,&#xD;
    		sharpness&#xD;
    	],&#xD;
    	1&#xD;
    ];&#xD;
&#xD;
    eFieldMins = getMins[electricField, 30, 0, -7]&#xD;
    eFieldMaxs = getMaxs[electricField, 50, 0, -0.5]&#xD;
&#xD;
    naI3Mins = getMins[naI3, 50, 0.3]&#xD;
    naI3Maxs = getMaxs[naI3, 15, 1.3]&#xD;
&#xD;
Construct a graph of a data with minimas and maximas.&#xD;
&#xD;
    Show[&#xD;
     	plotNaI3,&#xD;
     	DateListPlot[&#xD;
      		naI3Maxs,&#xD;
      		PlotStyle -&amp;gt; Red,&#xD;
      		PlotRange -&amp;gt; naI3PlottingRange,&#xD;
      		Joined -&amp;gt; False&#xD;
      	],&#xD;
     	DateListPlot[&#xD;
      		naI3Mins,&#xD;
      		PlotStyle -&amp;gt; Green,&#xD;
      		PlotRange -&amp;gt; naI3PlottingRange,&#xD;
      		Joined -&amp;gt; False&#xD;
      	]&#xD;
     ]&#xD;
![enter image description here][9]&#xD;
&#xD;
    Show[&#xD;
    	plotEField,&#xD;
    	DateListPlot[&#xD;
    		eFieldMaxs,&#xD;
    		PlotStyle-&amp;gt;Red,&#xD;
    		PlotRange-&amp;gt;eFieldPlottingRange,&#xD;
    		Joined-&amp;gt;False&#xD;
    	],&#xD;
    	DateListPlot[&#xD;
    		eFieldMins,&#xD;
    		PlotStyle-&amp;gt;Green,&#xD;
    		PlotRange-&amp;gt;eFieldPlottingRange,&#xD;
    		Joined-&amp;gt;False&#xD;
    	]&#xD;
    ]&#xD;
&#xD;
![enter image description here][10]&#xD;
&#xD;
Find the start and end of the peaks&#xD;
-----------------------------------&#xD;
&#xD;
    eFieldRightEdges = (rightEdge[electricField, eFieldPeakPositions, #, &#xD;
          1200, 30, 0]) &amp;amp; /@ Range[1, Length[eFieldPeakPositions]];&#xD;
    eFieldLeftEdges = (leftEdge[electricField, eFieldPeakPositions, #, &#xD;
          1200, 30, 0]) &amp;amp; /@ Range[1, Length[eFieldPeakPositions]];&#xD;
&#xD;
    naI3RightEdges = (rightEdge[naI3, naI3PeakPositions, #, 21, 1]) &amp;amp; /@ &#xD;
       Range[1, Length[naI3PeakPositions]];&#xD;
    naI3LeftEdges = (leftEdge[naI3, naI3PeakPositions, #, 21, 1]) &amp;amp; /@ &#xD;
       Range[1, Length[naI3PeakPositions]];&#xD;
&#xD;
![enter image description here][11]&#xD;
&#xD;
![enter image description here][12]&#xD;
&#xD;
![enter image description here][13]&#xD;
&#xD;
![enter image description here][14]&#xD;
&#xD;
&#xD;
  [1]: http://community.wolfram.com//c/portal/getImageAttachment?filename=GEXyley-Imgur.gif&amp;amp;userId=900279&#xD;
  [2]: http://crd.yerphi.am/&#xD;
  [3]: http://www.crd.yerphi.am/adei/&#xD;
  [4]: http://www.crd.yerphi.am/Projects_Research&#xD;
  [5]: http://community.wolfram.com//c/portal/getImageAttachment?filename=EIJwf3P-Imgur.gif&amp;amp;userId=900279&#xD;
  [6]: http://community.wolfram.com//c/portal/getImageAttachment?filename=Plot.png&amp;amp;userId=900279&#xD;
  [7]: http://community.wolfram.com//c/portal/getImageAttachment?filename=PlotNai.png&amp;amp;userId=900279&#xD;
  [8]: http://community.wolfram.com//c/portal/getImageAttachment?filename=manualcorelation.png&amp;amp;userId=900279&#xD;
  [9]: http://community.wolfram.com//c/portal/getImageAttachment?filename=naIpicks.png&amp;amp;userId=900279&#xD;
  [10]: http://community.wolfram.com//c/portal/getImageAttachment?filename=efieldpicks.png&amp;amp;userId=900279&#xD;
  [11]: http://community.wolfram.com//c/portal/getImageAttachment?filename=Naistartandend.png&amp;amp;userId=900279&#xD;
  [12]: http://community.wolfram.com//c/portal/getImageAttachment?filename=Naizoomedstartend.png&amp;amp;userId=900279&#xD;
  [13]: http://community.wolfram.com//c/portal/getImageAttachment?filename=efieldstartend.png&amp;amp;userId=900279&#xD;
  [14]: http://community.wolfram.com//c/portal/getImageAttachment?filename=efieldNaimanualcorrelaton.png&amp;amp;userId=900279</description>
    <dc:creator>Haik Voskanyan</dc:creator>
    <dc:date>2016-08-19T10:41:15Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2299566">
    <title>Create local total precipitable water maps from global data</title>
    <link>https://community.wolfram.com/groups/-/m/t/2299566</link>
    <description>&amp;amp;[monsoonTPW][1]&#xD;
&#xD;
&#xD;
  [1]: https://www.wolframcloud.com/obj/53d70cbf-185f-4082-a305-ac561524f4fe</description>
    <dc:creator>Robert Rimmer</dc:creator>
    <dc:date>2021-06-26T20:19:05Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3094952">
    <title>[WELP23] Analyzing Topographical and Elevation Data to Find an Optimized Settlement Location on Mars</title>
    <link>https://community.wolfram.com/groups/-/m/t/3094952</link>
    <description>![Analyzing Topographical and Elevation Data to Find an Optimized Settlement Location on Mars][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=9521image.jpeg&amp;amp;userId=911151&#xD;
  [2]: https://www.wolframcloud.com/obj/00b1ee9a-deef-493b-b8ba-e29aeb087708</description>
    <dc:creator>Wolfram Education Programs</dc:creator>
    <dc:date>2024-01-02T19:00:40Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/2960096">
    <title>[WSS23] Atmospheric data retrieval from Calipso satellite</title>
    <link>https://community.wolfram.com/groups/-/m/t/2960096</link>
    <description>![enter image description here][1]&#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=lidar_hero_image.png&amp;amp;userId=2955757&#xD;
  [2]: https://www.wolframcloud.com/obj/6a3e49a9-281b-4732-9598-0bbf87e7419b</description>
    <dc:creator>Richard Medina</dc:creator>
    <dc:date>2023-07-13T01:56:13Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3188040">
    <title>Wolfram Data Science Boot Camp 2024</title>
    <link>https://community.wolfram.com/groups/-/m/t/3188040</link>
    <description>![enter image description here][1]&#xD;
Join the [two-week online boot camp][2], to connect remotely with Wolfram instructors for a guided online introduction to applied multiparadigm data science. You will have the option to use either your own dataset at camp or one of the curated datasets from the Wolfram Data Repository or the built-in knowledgebase in the Wolfram Language, to discover insights and develop results in an area that is of importance to you.&#xD;
&#xD;
Earn certification for:&#xD;
&#xD;
 - Program completion (by attending and actively participating in the&#xD;
   sessions)&#xD;
 - Level 1 proficiency in multiparadigm data science (by completing quizzes and graded exercises)&#xD;
 - Level 2 applied expertise in multiparadigm data science (by completing a multiparadigm data science project)&#xD;
&#xD;
Register now. Pick from two options for registration:&#xD;
&#xD;
&amp;gt;  - **[Full Registration][3]**&#xD;
&amp;gt;  - **[Guest Pass][4]**&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot2024-06-05at1.54.28PM.png&amp;amp;userId=130003&#xD;
  [2]: https://www.wolfram.com/wolfram-u/boot-camp-data-science/&#xD;
  [3]: http://www.wolfram.com/wolfram-u/registration/?id=143321&amp;amp;lang=&#xD;
  [4]: http://www.wolfram.com/wolfram-u/registration/?id=143322&amp;amp;lang=</description>
    <dc:creator>Abrita Chakravarty</dc:creator>
    <dc:date>2024-06-05T18:58:44Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3503212">
    <title>[WSRP25] Simulating surfactant-water interactions for applications in cloud seeding</title>
    <link>https://community.wolfram.com/groups/-/m/t/3503212</link>
    <description>![A visual representation of cloud seeding, where the blue molecules represent Cloud Condensation Nuclei attracting water molecules][1]   &#xD;
&#xD;
&amp;amp;[Wolfram Notebook][2]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=Screenshot2025-07-10at5.16.37%E2%80%AFPM.png&amp;amp;userId=3493403&#xD;
  [2]: https://www.wolframcloud.com/obj/000cbc2e-d168-471c-8489-81b07271772b</description>
    <dc:creator>Yuti Purohit</dc:creator>
    <dc:date>2025-07-10T22:12:48Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3473144">
    <title>Wolfram Data Science Boot Camp 2025</title>
    <link>https://community.wolfram.com/groups/-/m/t/3473144</link>
    <description>![enter image description here][1]&#xD;
&#xD;
Early this August, Wolfram U will be hosting a [two-week online boot camp][2] that will teach you how to apply multiparadigm data science to a bevy of different fields. You&amp;#039;ll learn about everything from data visualization to relational database connectivity and working with geographical data and maps from our very best instructors.&#xD;
&#xD;
If you don&amp;#039;t know any Wolfram Language yet, not to worry: we will rapidly introduce you to that as well!&#xD;
&#xD;
By the end of this boot camp, you can earn [certification][3] for:&#xD;
&#xD;
 - Program completion (by attending and actively participating in the sessions)&#xD;
  - Level 1 proficiency in multiparadigm data science (by completing quizzes and graded exercises)&#xD;
  - Level 2 applied expertise in multiparadigm data science (by completing a project which can include your own data)&#xD;
&#xD;
In addition to the daily lectures, this boot camp also includes daily office hours and frequent opportunities to complete hands-on explorations.&#xD;
&#xD;
You can log into your free Wolfram account and register for this boot camp at two different levels below:&#xD;
&#xD;
&amp;gt; -  [**Full Registration**][4]&#xD;
&amp;gt; - [**Guest Pass**][5]&#xD;
&#xD;
We hope that we&amp;#039;ll see you there.&#xD;
&#xD;
![enter image description here][6]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot_2025-06-0217.33.11.png&amp;amp;userId=1711324&#xD;
  [2]: https://www.wolfram.com/wolfram-u/boot-camp-data-science/&#xD;
  [3]: https://www.wolfram.com/wolfram-u/certifications/&#xD;
  [4]: https://www.wolfram.com/wolfram-u/registration/?id=143461&amp;amp;lang=&#xD;
  [5]: https://www.wolfram.com/wolfram-u/registration/?id=143463&amp;amp;lang=&#xD;
  [6]: https://community.wolfram.com//c/portal/getImageAttachment?filename=ScreenShot_2025-06-0217.52.41.png&amp;amp;userId=1711324</description>
    <dc:creator>Arben Kalziqi</dc:creator>
    <dc:date>2025-06-02T23:22:52Z</dc:date>
  </item>
  <item rdf:about="https://community.wolfram.com/groups/-/m/t/3152737">
    <title>[Colloquium] Ecological Research with Wolfram Language</title>
    <link>https://community.wolfram.com/groups/-/m/t/3152737</link>
    <description>![enter image description here][1]&#xD;
&#xD;
Contemporary ecological research requires robust analytical tools and techniques to model ecosystems reliably or study ecological data. Wolfram Language offers a broad and powerful toolkit for researchers exploring complex ecological questions.&#xD;
&#xD;
In this special online colloquium, we have invited research experts from around the world to share short presentations focused on their recent exciting work in ecology, highlighting how they have used Wolfram Language tools in their work.&#xD;
&#xD;
Learn about the wide-ranging applications of Wolfram Language for ecology, whether for data-driven discovery of spatial scales of habitat choice by elephants; assessing the effects of interplay between trophic structure, diversity and competition in a generalised consumer resource model; or modeling the effects of patch geometry on ecological release.&#xD;
&#xD;
Attendees will gain insights into the application of computational approaches to ecological studies, ranging from structural and spatial ecology to food web dynamical modeling, demonstrating the versatility and capability of Wolfram Language in addressing critical ecological challenges.&#xD;
&#xD;
To register for the event please follow the link below to the BigMarker platform.&#xD;
&#xD;
&amp;gt; [**Register here**][2]&#xD;
&#xD;
Please feel free to use this thread to collaborate and share ideas. Also, let us know what colloquium topics interest you for future events in this series!&#xD;
&#xD;
![enter image description here][3]&#xD;
&#xD;
&#xD;
  [1]: https://community.wolfram.com//c/portal/getImageAttachment?filename=EcologyColloqImage.png&amp;amp;userId=2591433&#xD;
  [2]: https://www.wolfram.com/wolfram-u/courses/computational-thinking/ecological-research-with-wolfram-language/&#xD;
  [3]: https://community.wolfram.com//c/portal/getImageAttachment?filename=WolframUbanner.png&amp;amp;userId=2591433</description>
    <dc:creator>Phileas Dazeley-Gaist</dc:creator>
    <dc:date>2024-04-04T15:48:58Z</dc:date>
  </item>
</rdf:RDF>

