

{"id":13232,"date":"2021-11-02T13:55:42","date_gmt":"2021-11-02T18:55:42","guid":{"rendered":"https:\/\/rud.is\/b\/?p=13232"},"modified":"2021-11-02T13:55:42","modified_gmt":"2021-11-02T18:55:42","slug":"30daymapchallenge-2021-day-2-lines","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/","title":{"rendered":"#30DayMapChallenge 2021 Day 2: Lines"},"content":{"rendered":"<p>The 30-Day Map Challenge is on again, and I&#8217;m hoping to be able to scrounge some time to get an entry for each day. Day 2 is lines (Day 1 was posted on Twitter only) and \u2014 while I&#8217;m hoping to focus on saving U.S. democracy for the majority of the entries, today&#8217;s is a short one that shows all the walks\/hikes\/boats we took during our Iceland vacation.<\/p>\n<p>I use <a href=\"https:\/\/apps.apple.com\/us\/app\/healthfit\/id1202650514\">HealthFit<\/a> to export data (automagically) from all my Apple Watch, Garmin, and Peloton activities, and have it auto-sync to iCloud, which means I have instant access to all the Garmin FIT files it creates in <code>~\/Library\/Mobile Documents\/iCloud~com~altifondo~HealthFit\/<\/code>.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"13233\" data-permalink=\"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/healthfit-directory\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?fit=748%2C784&amp;ssl=1\" data-orig-size=\"748,784\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"healthfit-directory\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?fit=510%2C535&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?resize=510%2C535&#038;ssl=1\" alt=\"\" width=\"510\" height=\"535\" class=\"aligncenter size-large wp-image-13233\" srcset=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?resize=530%2C556&amp;ssl=1 530w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?resize=286%2C300&amp;ssl=1 286w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?resize=143%2C150&amp;ssl=1 143w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?resize=500%2C524&amp;ssl=1 500w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?resize=150%2C157&amp;ssl=1 150w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?resize=400%2C419&amp;ssl=1 400w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?resize=200%2C210&amp;ssl=1 200w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?w=748&amp;ssl=1 748w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/a><\/p>\n<p>We can use {FITFileR} to read in those files, turn the points into lines, and plot them all on a {leaflet} map, so I can get an interactive view into the paths.<\/p>\n<p>If I had more time, I&#8217;d add activity names and other clickable statistics in popups, which is pretty straightforward in {leaflet}.<\/p>\n<p>Comments in code hopefully explain the workflow:<\/p>\n<pre><code class=\"language-r\">library(sf)\nlibrary(FITfileR) # remotes::install_github(\"grimbough\/FITfileR\")\nlibrary(leaflet)\nlibrary(tidyverse)\n\n# get a listing of all the files for when we were in Iceland\nlist.files(\n  path = \"~\/Library\/Mobile Documents\/iCloud~com~altifondo~HealthFit\/Documents\", \n  pattern = \"(2021-07-3[01]|2021-08-0[1-9])\",\n  full.names = TRUE\n) %&gt;% \n  map(\n    ~readFitFile(.x) %&gt;%          # read the file in\n      records() %&gt;%               # turn into something we can then bind into a data frame\n      bind_rows() %&gt;%             # bind ^^ into a data frame!\n      mutate(file = basename(.x)) # add the file info in case we want to eventually make a popup of information\n  ) -&gt; iceland_fit_files\n\n\n# look at the data\n\niceland_fit_files[[1]]\n## # A tibble: 2,210 \u00d7 12\n##    timestamp           position_lat position_long gps_accuracy altitude distance speed temperature heart_rate cadence\n##    &lt;dttm&gt;                     &lt;dbl&gt;         &lt;dbl&gt;        &lt;dbl&gt;    &lt;dbl&gt;    &lt;dbl&gt; &lt;dbl&gt;       &lt;dbl&gt;      &lt;dbl&gt;   &lt;dbl&gt;\n##  1 2021-07-30 06:28:26         64.2         -21.9            2     21       318. 0.221          13        116      NA\n##  2 2021-07-30 06:28:27         64.2         -21.9            2     21       318. 0.521          13        116      NA\n##  3 2021-07-30 06:28:28         64.2         -21.9            2     21       319. 0.792          13        116      NA\n##  4 2021-07-30 06:28:47         64.2         -21.9            2     19.4     338. 0.217          13        118      NA\n##  5 2021-07-30 06:28:48         64.2         -21.9            2     19.2     338. 0.147          13        118      NA\n##  6 2021-07-30 06:28:49         64.2         -21.9            2     19       338. 0.109          13        117      NA\n##  7 2021-07-30 06:28:50         64.2         -21.9            2     19       338. 0.076          13        117      NA\n##  8 2021-07-30 06:28:51         64.2         -21.9            2     18.8     338. 0.036          13        116      NA\n##  9 2021-07-30 06:28:52         64.2         -21.9            2     18.6     338. 0.153          13        115      NA\n## 10 2021-07-30 06:28:53         64.2         -21.9            2     18.4     339. 0.393          13        115      NA\n## # \u2026 with 2,200 more rows, and 2 more variables: fractional_cadence &lt;dbl&gt;, file &lt;chr&gt;\n\niceland_fit_files[map_lgl(iceland_fit_files, has_name, \"position_long\")] %&gt;% # only want activities with geo data\n  map(\n    ~.x %&gt;% \n      filter(!is.na(position_long), !is.na(position_lat)) %&gt;% # {sf} hates NAs\n      st_as_sf(\n        coords = c(\"position_long\", \"position_lat\"), # turn the data frame into an {sf} object\n        crs = 4326\n      )\n  ) %&gt;% \n  bind_rows() %&gt;% # this makes one big data frame\n  group_by(file) %&gt;%  # which we can turn into individual geometries\n  summarise(          # with the epic summarise() function\n    m = max(distance)\n  ) %&gt;% \n  st_cast(\"LINESTRING\") -&gt; paths # and then turn the points into linestrings\n\n# let's take a look\n\npaths\n## Simple feature collection with 33 features and 2 fields\n## Geometry type: LINESTRING\n## Dimension:     XY\n## Bounding box:  xmin: -23.92788 ymin: 63.40121 xmax: -16.18086 ymax: 65.08101\n## Geodetic CRS:  WGS 84\n## # A tibble: 33 \u00d7 3\n##    file                                        m                                                                    geometry\n##    &lt;chr&gt;                                   &lt;dbl&gt;                                                            &lt;LINESTRING [\u00b0]&gt;\n##  1 2021-07-30-062401-Walking-Chetzmoka.fit 2807. (-21.94386 64.15495, -21.94382 64.15497, -21.94384 64.15496, -21.94388 64.\u2026\n##  2 2021-07-30-101146-Walking-Chetzmoka.fit 1191. (-21.93504 64.14761, -21.93502 64.1476, -21.93503 64.14761, -21.93501 64.1\u2026\n##  3 2021-07-30-105706-Walking-Chetzmoka.fit 1554. (-21.91706 64.12906, -21.91704 64.12905, -21.91702 64.12905, -21.917 64.12\u2026\n##  4 2021-07-30-143247-Walking-Chetzmoka.fit 1620. (-21.94977 64.15683, -21.94978 64.15685, -21.94979 64.15686, -21.94995 64.\u2026\n##  5 2021-07-31-122122-Walking-Chetzmoka.fit  702. (-22.26431 64.7628, -22.26463 64.76297, -22.26527 64.76332, -22.26496 64.7\u2026\n##  6 2021-07-31-131832-Walking-Chetzmoka.fit 2084. (-22.84353 64.90553, -22.84351 64.90553, -22.84349 64.90553, -22.84347 64.\u2026\n##  7 2021-07-31-182725-Walking-Chetzmoka.fit  578. (-22.72256 65.0809, -22.72255 65.0809, -22.72254 65.08089, -22.72252 65.08\u2026\n##  8 2021-08-01-105420-Walking-Chetzmoka.fit 1210. (-23.63732 64.79827, -23.6373 64.79829, -23.6373 64.79829, -23.6373 64.798\u2026\n##  9 2021-08-01-142847-Walking-Chetzmoka.fit 2385. (-23.80382 64.73048, -23.8038 64.73047, -23.8038 64.73047, -23.8038 64.730\u2026\n## 10 2021-08-01-165642-Walking-Chetzmoka.fit  423. (-23.92745 64.85198, -23.92749 64.85197, -23.92747 64.85197, -23.92746 64.\u2026\n## # \u2026 with 23 more rows\n\n# make room locally\n\ndir.create(\"~\/projects\/2021-iceland\", showWarnings = FALSE)\n\n# save the widget out\n\npaths %&gt;% \n  filter(!grepl(\"2021-08-10\", file)) %&gt;% \n  leaflet() %&gt;% \n  addProviderTiles(\"CartoDB.Positron\") %&gt;% \n  addPolygons(color = \"green\") %&gt;% \n  htmlwidgets::saveWidget(\n    file = \"~\/projects\/2021-iceland\/index.html\",\n    selfcontained = FALSE\n  )\n\n# rsync it out to my website\n#\n<\/code><\/pre>\n<p>This is the (static) overview:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"13234\" data-permalink=\"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/iceland-overview\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?fit=2366%2C1720&amp;ssl=1\" data-orig-size=\"2366,1720\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"iceland-overview\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?fit=510%2C370&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=510%2C370&#038;ssl=1\" alt=\"\" width=\"510\" height=\"370\" class=\"aligncenter size-large wp-image-13234\" srcset=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=530%2C385&amp;ssl=1 530w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=300%2C218&amp;ssl=1 300w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=150%2C109&amp;ssl=1 150w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=768%2C558&amp;ssl=1 768w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=1536%2C1117&amp;ssl=1 1536w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=2048%2C1489&amp;ssl=1 2048w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=500%2C363&amp;ssl=1 500w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=1200%2C872&amp;ssl=1 1200w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=400%2C291&amp;ssl=1 400w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=800%2C582&amp;ssl=1 800w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?resize=200%2C145&amp;ssl=1 200w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/iceland-overview.png?w=1020&amp;ssl=1 1020w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/a><\/p>\n<p>And, this is a zoom into our boating tour of a glacier lagoon:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"13235\" data-permalink=\"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/glacier-lagoon-zoom\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?fit=1070%2C1036&amp;ssl=1\" data-orig-size=\"1070,1036\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"glacier-lagoon-zoom\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?fit=510%2C494&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?resize=510%2C494&#038;ssl=1\" alt=\"\" width=\"510\" height=\"494\" class=\"aligncenter size-large wp-image-13235\" srcset=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?resize=530%2C513&amp;ssl=1 530w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?resize=300%2C290&amp;ssl=1 300w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?resize=150%2C145&amp;ssl=1 150w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?resize=768%2C744&amp;ssl=1 768w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?resize=500%2C484&amp;ssl=1 500w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?resize=400%2C387&amp;ssl=1 400w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?resize=800%2C775&amp;ssl=1 800w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?resize=200%2C194&amp;ssl=1 200w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?w=1070&amp;ssl=1 1070w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/glacier-lagoon-zoom.png?w=1020&amp;ssl=1 1020w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/a><\/p>\n<p>Hit up <a href=\"https:\/\/rud.is\/vis\/2021-iceland\/\">the widget<\/a> to see where we did our Iceland activities this summer!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The 30-Day Map Challenge is on again, and I&#8217;m hoping to be able to scrounge some time to get an entry for each day. Day 2 is lines (Day 1 was posted on Twitter only) and \u2014 while I&#8217;m hoping to focus on saving U.S. democracy for the majority of the entries, today&#8217;s is a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[720,91],"tags":[846],"class_list":["post-13232","post","type-post","status-publish","format-standard","hentry","category-gis","category-r","tag-30daymapchallenge"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>#30DayMapChallenge 2021 Day 2: Lines - rud.is<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"#30DayMapChallenge 2021 Day 2: Lines - rud.is\" \/>\n<meta property=\"og:description\" content=\"The 30-Day Map Challenge is on again, and I&#8217;m hoping to be able to scrounge some time to get an entry for each day. Day 2 is lines (Day 1 was posted on Twitter only) and \u2014 while I&#8217;m hoping to focus on saving U.S. democracy for the majority of the entries, today&#8217;s is a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2021-11-02T18:55:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory-530x556.png\" \/>\n<meta name=\"author\" content=\"hrbrmstr\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"hrbrmstr\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"#30DayMapChallenge 2021 Day 2: Lines\",\"datePublished\":\"2021-11-02T18:55:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/\"},\"wordCount\":204,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/healthfit-directory-530x556.png\",\"keywords\":[\"30DayMapChallenge\"],\"articleSection\":[\"gis\",\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/\",\"name\":\"#30DayMapChallenge 2021 Day 2: Lines - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/healthfit-directory-530x556.png\",\"datePublished\":\"2021-11-02T18:55:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/healthfit-directory.png?fit=748%2C784&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2021\\\/11\\\/healthfit-directory.png?fit=748%2C784&ssl=1\",\"width\":748,\"height\":784},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/11\\\/02\\\/30daymapchallenge-2021-day-2-lines\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"#30DayMapChallenge 2021 Day 2: Lines\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/\",\"name\":\"rud.is\",\"description\":\"&quot;In God we trust. All others must bring data&quot;\",\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rud.is\\\/b\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\",\"name\":\"hrbrmstr\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"width\":460,\"height\":460,\"caption\":\"hrbrmstr\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\"},\"description\":\"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7\",\"sameAs\":[\"http:\\\/\\\/rud.is\"],\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/author\\\/hrbrmstr\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"#30DayMapChallenge 2021 Day 2: Lines - rud.is","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/","og_locale":"en_US","og_type":"article","og_title":"#30DayMapChallenge 2021 Day 2: Lines - rud.is","og_description":"The 30-Day Map Challenge is on again, and I&#8217;m hoping to be able to scrounge some time to get an entry for each day. Day 2 is lines (Day 1 was posted on Twitter only) and \u2014 while I&#8217;m hoping to focus on saving U.S. democracy for the majority of the entries, today&#8217;s is a [&hellip;]","og_url":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/","og_site_name":"rud.is","article_published_time":"2021-11-02T18:55:42+00:00","og_image":[{"url":"https:\/\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory-530x556.png","type":"","width":"","height":""}],"author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"#30DayMapChallenge 2021 Day 2: Lines","datePublished":"2021-11-02T18:55:42+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/"},"wordCount":204,"commentCount":2,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"image":{"@id":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/#primaryimage"},"thumbnailUrl":"https:\/\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory-530x556.png","keywords":["30DayMapChallenge"],"articleSection":["gis","R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/","url":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/","name":"#30DayMapChallenge 2021 Day 2: Lines - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/#primaryimage"},"image":{"@id":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/#primaryimage"},"thumbnailUrl":"https:\/\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory-530x556.png","datePublished":"2021-11-02T18:55:42+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/#primaryimage","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?fit=748%2C784&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2021\/11\/healthfit-directory.png?fit=748%2C784&ssl=1","width":748,"height":784},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2021\/11\/02\/30daymapchallenge-2021-day-2-lines\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"#30DayMapChallenge 2021 Day 2: Lines"}]},{"@type":"WebSite","@id":"https:\/\/rud.is\/b\/#website","url":"https:\/\/rud.is\/b\/","name":"rud.is","description":"&quot;In God we trust. All others must bring data&quot;","publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rud.is\/b\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886","name":"hrbrmstr","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","width":460,"height":460,"caption":"hrbrmstr"},"logo":{"@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1"},"description":"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7","sameAs":["http:\/\/rud.is"],"url":"https:\/\/rud.is\/b\/author\/hrbrmstr\/"}]}},"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p23idr-3rq","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":12195,"url":"https:\/\/rud.is\/b\/2019\/05\/18\/mapping-tornado-alley-with-r\/","url_meta":{"origin":13232,"position":0},"title":"Mapping Tornado Alley with R","author":"hrbrmstr","date":"2019-05-18","format":false,"excerpt":"I caught a re-tweet of this tweet by @harry_stevens: THREAD: I wrote a post on @observablehq about a map I made today. It shows a typical day in the life of a graphics journalist: You never know what problems you'll have to solve on deadline! https:\/\/t.co\/yRhW1wbLxN #d3js #dataviz 1\/7 pic.twitter.com\/7N6mmK0nz3\u2014\u2026","rel":"","context":"In &quot;cartography&quot;","block_context":{"text":"cartography","link":"https:\/\/rud.is\/b\/category\/cartography\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/05\/map-final-header.png?fit=1001%2C970&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/05\/map-final-header.png?fit=1001%2C970&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/05\/map-final-header.png?fit=1001%2C970&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/05\/map-final-header.png?fit=1001%2C970&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":2962,"url":"https:\/\/rud.is\/b\/2014\/04\/21\/getting-fit2tcx-working-on-mac-os-x-10-9-x\/","url_meta":{"origin":13232,"position":1},"title":"Getting Fit2Tcx Working on Mac OS X (10.9.x)","author":"hrbrmstr","date":"2014-04-21","format":false,"excerpt":"Andreas Diesner's `#spiffy` [Fit2Tcx](https:\/\/github.com\/adiesner\/Fit2Tcx) command-line utility is a lightweight way to convert Garmin\/ANT [FIT](http:\/\/www.thisisant.com\/resources\/fit) files to [TCX](http:\/\/en.wikipedia.org\/wiki\/Training_Center_XML) for further processing. On a linux system, installing it is as simple as: sudo add-apt-repository ppa:andreas-diesner\/garminplugin sudo apt-get update sudo apt-get install fit2tcx On a Mac OS X system, you'll need to first\u2026","rel":"","context":"In &quot;hacks&quot;","block_context":{"text":"hacks","link":"https:\/\/rud.is\/b\/category\/hacks\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3028,"url":"https:\/\/rud.is\/b\/2014\/09\/20\/chartingmapping-the-scottish-vote-with-r-rvestdplyrtidyrtopojsonggplot\/","url_meta":{"origin":13232,"position":2},"title":"Charting\/Mapping the Scottish Vote with R (an rvest\/dplyr\/tidyr\/TopoJSON\/ggplot tutorial)","author":"hrbrmstr","date":"2014-09-20","format":false,"excerpt":"The BBC did a pretty good job [live tracking the Scotland secession vote](http:\/\/www.bbc.com\/news\/events\/scotland-decides\/results), but I really didn't like the color scheme they chose and decided to use the final tally site as the basis for another tutorial using the tools from the Hadleyverse and taking advantage of the fact that\u2026","rel":"","context":"In &quot;Charts &amp; Graphs&quot;","block_context":{"text":"Charts &amp; Graphs","link":"https:\/\/rud.is\/b\/category\/charts-graphs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1591,"url":"https:\/\/rud.is\/b\/2012\/10\/05\/diy-zeroaccess-geoip-plots\/","url_meta":{"origin":13232,"position":3},"title":"DIY ZeroAccess GeoIP Plots","author":"hrbrmstr","date":"2012-10-05","format":false,"excerpt":"Since F-Secure was #spiffy enough to provide us with GeoIP data for mapping the scope of the ZeroAccess botnet, I thought that some aspiring infosec data scientists might want to see how to use something besides Google Maps & Google Earth to view the data. If you look at the\u2026","rel":"","context":"In &quot;Charts &amp; Graphs&quot;","block_context":{"text":"Charts &amp; Graphs","link":"https:\/\/rud.is\/b\/category\/charts-graphs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3054,"url":"https:\/\/rud.is\/b\/2014\/09\/26\/overcoming-d3-cartographic-envy-with-r-ggplot\/","url_meta":{"origin":13232,"position":4},"title":"Overcoming D3 Cartographic Envy With R + ggplot","author":"hrbrmstr","date":"2014-09-26","format":false,"excerpt":"When I used one of the Scotland TopoJSON files for a recent post, it really hit me just how much D3 cartography envy I had\/have as an R user. Don't get me wrong, I can conjure up D3 maps pretty well [1] [2] and the utility of an interactive map\u2026","rel":"","context":"In &quot;Charts &amp; Graphs&quot;","block_context":{"text":"Charts &amp; Graphs","link":"https:\/\/rud.is\/b\/category\/charts-graphs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1040,"url":"https:\/\/rud.is\/b\/2012\/05\/15\/mountain-lion-airplay-screen-captures-drm\/","url_meta":{"origin":13232,"position":5},"title":"Mountain Lion, AirPlay, Screen Captures &#038; DRM","author":"hrbrmstr","date":"2012-05-15","format":false,"excerpt":"I've been wanting to post this entry for a while, but I didn't have the opportunity to compel an extra pair of hands to assist with some necessary, salient portions of it until tonight. For those who were hoping Mountain Lion's AirPlay would be a revolutionary step in the \"your\u2026","rel":"","context":"In &quot;DRM&quot;","block_context":{"text":"DRM","link":"https:\/\/rud.is\/b\/category\/drm\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/13232","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/comments?post=13232"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/13232\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=13232"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=13232"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=13232"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}