<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Spatial Times's Blog]]></title><description><![CDATA[Unofficial thoughts on technology for the spatial world]]></description><link>https://www.spatialtimes.com</link><generator>GatsbyJS</generator><lastBuildDate>Thu, 09 Apr 2026 19:04:22 GMT</lastBuildDate><item><title><![CDATA[Velocity Grid Transformations in ArcGIS]]></title><description><![CDATA[Coordinate reference systems and datum transformations are one of those GIS fundamentals that usually ‘just work’, right up until they don’t…]]></description><link>https://www.spatialtimes.com/2026/04/velocity-grid-transformations-arcgis/</link><guid isPermaLink="false">https://www.spatialtimes.com/2026/04/velocity-grid-transformations-arcgis/</guid><pubDate>Wed, 08 Apr 2026 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Coordinate reference systems and datum transformations are one of those GIS fundamentals that usually ‘just work’, right up until they don’t. Well, we all assumed it just worked, but not always in the way we thought. &lt;em&gt;“Just use the first transformation on the list”&lt;/em&gt; isn’t a scientific approach, but thankfully, the software did attempt to guide us. However, the software could only do so much, especially when the best transformations weren’t even an option.&lt;/p&gt;
&lt;p&gt;While the implications are broad, the real impact is felt most strongly in Canada, where modern datum management relies heavily on velocity-based transformations. We will focus on NAD83(CSRS) NTv2 velocity grid transformations since these are the first ones to be implemented in ArcGIS Pro 3.6, but more are coming in future releases.&lt;/p&gt;
&lt;h2&gt;A Quick Recap: Why CSRS Transformations Were a Problem&lt;/h2&gt;
&lt;p&gt;For anyone working with Canadian data, transformations between NAD83 CSRS realizations have always been a bit &lt;em&gt;uncomfortable&lt;/em&gt; in ArcGIS (or any desktop GIS). For years, we’ve known the issue: NRCan moved to NTv2 velocity grid transformations for later CSRS re-adjustments, but ArcGIS didn’t support velocity grids. That left GIS users in an awkward position. We either accept partial transformation support or resort to external tools like NRCan’s TRX when accuracy of transformations really mattered.&lt;/p&gt;
&lt;p&gt;That finally changed.&lt;/p&gt;
&lt;p&gt;With ArcGIS Pro 3.6, Esri has added support for velocity grid transformations, aligning ArcGIS Pro with modern geodetic practice. In this initial release, Esri leveraged NRCan’s publication of velocity grids to make them the first ones to use this new approach in GIS software.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 449px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3a86f7afa26502030df0f7e5ed66c443/46d70/arcgisVelocity-transform1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 53.67483296213808%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABqUlEQVR42o3QwZKaQBDGcd//HZJKpRKzVs4muLiLAyxMT88wDIKBGSCbuFEB9aSWxxS6B/eUPMCv/l/3YOSKDxP/ox3eudHQgSHhI098cthwxj47OPLEFyLu85e7GXv3jTzWnZ0v34+dr0HyPfs1CCglLgl8jwLLsgw5J4QAgO/5UsZ/1qv9frdarzfrleu6uTaF1oILpWIKMGCcAwBnwLnQWsdx/PTky1gCpcl83nXb0+nUtG3XNkEQmrI0RidKLbKMUjpgiJSGCBRRFFrLWPq+H0URACwWi7ZtD4fDpmnaZsMYlmWljVZKZWl6wRwpUM4oXstK9mUZAaXzedp12+PxcC0jw6r++YqzNxguuLjFSZK2PT5ecV+uavMG97NpP/v15n62jC7lNG277hZXVa3/E2eLrNveYMCyrLUx/8IyomGgVHJ7MwC7POwGiyhCZJKjkHFZVck8CcNQKcWR53m+2+/P5/N2t9vvtkJEz8+/q7pK0zTPfyDiwJ5OJxPr4X5i2w+UUmfmjMdjx3mcWJbnecaYl+WyKApd5LY95UIgIiHE9z3Lsv4CoxUb8s5tpaoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Table displaying geographic datum transformation names, WKIDs, and methods for NAD83 CSRS velocity grid transformations&quot;
        title=&quot;&quot;
        src=&quot;/static/3a86f7afa26502030df0f7e5ed66c443/46d70/arcgisVelocity-transform1.png&quot;
        srcset=&quot;/static/3a86f7afa26502030df0f7e5ed66c443/46d70/arcgisVelocity-transform1.png 449w&quot;
        sizes=&quot;(max-width: 449px) 100vw, 449px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; This table lists all the transformations based on the new NTv2 velocity grid approach in Pro 3.6&lt;/p&gt;
&lt;h3&gt;Blame Canada?! Nah, we are just fashionably &lt;del&gt;late&lt;/del&gt; early:&lt;/h3&gt;
&lt;p&gt;NRCan defines transformations between NAD83(CSRS) realizations using NTv2 velocity grids, not traditional static NTv2 grids. These velocity grids account for crustal motion over time and are essential for more accurate transformations between CSRS versions.&lt;/p&gt;
&lt;p&gt;Until recently, desktop GIS software had some related limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No support for published NTv2 velocity grids;&lt;/li&gt;
&lt;li&gt;Many CSRS realization transformations were not available;&lt;/li&gt;
&lt;li&gt;Results between GIS transformations and NRCan’s TRX tool didn’t align for NAD83(CSRS) realizations;&lt;/li&gt;
&lt;li&gt;EPSG didn’t even register these transformations until March 2024;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, the math existed, but ArcGIS Pro couldn’t leverage the file format. Side note as of writing: this still isn’t available in QGIS yet.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 2000px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAADLAAAAywAEoZFrbAAADpUlEQVR42kWTW2/jVBSF88/4E7wi8Qd4RLwhISQkBBqY0QgGhotGdGCYtsNMJm2gbW5N0yRNEzvOzXFuduJL4jgX+9iJk/icheLO5TychyXtb++1l3YklcluX0Rj9L9UNohdXNHnJxn65PCCPv41Rh/dO6Y/fH5A73/yiH798bf00w8/o//Gz6hQE2i5XKZTa0YDyuhmu93tdjvMF7YaKXN8ILbbUPUxuFoLmXwFF5clRKNpnL3O4fTPBGK/xJE+SCH68wtkLnMo1hUMBiokqYVerwcAbP95q7UemUytYLVew7Jme5ERx2ZTc8Km0wlb2Atmr+xQX6w91lSGTNZNFi+p7Lffi0yTNVa8ybN6vUE910Wt3tAjm8028DwPbUlik7GBkWZgu93h7XNtF3WujUy2hPuPn+H6toq2ouOfRBuHxwK6Uh+yPKCGYaDRbOmRzXYbuK4LdSSzYqmKDKdANefvgIlkBfFYBvkSh4OjMxhjK9S1sYFXKR4nqQ4GA5m+s7xe+4FpjsELHZa8VTF2NmiNLIgDFbJq4DTD4zhWRKFcx7PoJb77KYrLXBXBdoMyx+HvZA2CNAyBjuvpkYlpBs26iMOXOcaJfdjrLfrjJfKijmi2icQ1h8cHScQvcji/KiOd5/Hk6AqvE3kQx0b2po7EdYW6hGDlb+4se94Ky8WCOY4NzZxhNHNR7k7w/JxDVpDxNFbB01MOR8kK6mIPJaGDV+dX8Nfr0L7v++GExFvpkbW/Cd6sK4y+dHsLrq0gfiPjKC3ivCgiyY+Qa2rgRBnt7hA1SUGh2kFL6sFxyL7szjLx3gODIAiBHM/jrFBHVVlAGEzwMlNDrj7EpSDDIW7YWRnPEc33kOY6SBYEFDiRMkrvLL8FUspCoKZpqIh9KJYHy/UxtAhqfR39iYOblgrFmGFp22iM5uB7Bq54CelSi5Y5Aaqmvwcydgd0HAeFMg994WFGVliud1DGFop8A7w8R6K6b6igpRi4aWvoyEP0BwOq6QYWSycE7t7wwougYIyXuswiLrMcly09n1k2YUJLYspkxkTFYLLpMJP4TDXnbDDSWLF0uy+Dt/a1/aXcJULDASEV+3j4xRniVz1I+gJNdY6WOoexXGG6dNDtD9AQ2xiMNMj6GPJIA6VhJvuUJxHirexdELi+v9nHRXJH1+TLD74hX330B/nxQYo8vJcmD75Pkb9OBDK0lmRomETs9kiz0yVCZ0gU1SCMMWcXBP7Cdrr/A5XfMDBOaxveAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;NAD83v80VG East Uncertainty Map&quot;
        title=&quot;&quot;
        src=&quot;/static/2aa5ea9e38c1d82e1349cbebc323b1d4/f97d7/arcgisVelocity-nrcan.png&quot;
        srcset=&quot;/static/2aa5ea9e38c1d82e1349cbebc323b1d4/0eb09/arcgisVelocity-nrcan.png 500w,
/static/2aa5ea9e38c1d82e1349cbebc323b1d4/1263b/arcgisVelocity-nrcan.png 1000w,
/static/2aa5ea9e38c1d82e1349cbebc323b1d4/f97d7/arcgisVelocity-nrcan.png 2000w,
/static/2aa5ea9e38c1d82e1349cbebc323b1d4/36812/arcgisVelocity-nrcan.png 2071w&quot;
        sizes=&quot;(max-width: 2000px) 100vw, 2000px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt; NAD83v80VG East Uncertainty Map ~&lt;a href=&quot;https://webapp.csrs-scrs.nrcan-rncan.gc.ca/geod/tools-outils/nad83-docs.php&quot;&gt;NRCan&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What Changed in ArcGIS Pro 3.6&lt;/h2&gt;
&lt;p&gt;As of ArcGIS Pro 3.6, Esri has implemented support for velocity grid transformations using the published NRCan NTv2 velocity grids. Specifically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArcGIS Pro now supports transformations between NAD83(CSRS) v2 through v8;&lt;/li&gt;
&lt;li&gt;These transformations use the latest velocity grid, NAD83v80VG.gsb;&lt;/li&gt;
&lt;li&gt;The required grid files are included via the ArcGIS Coordinate System Data installer;&lt;/li&gt;
&lt;li&gt;Transformations are available directly through standard ArcGIS Pro projection workflows;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a big deal. It means ArcGIS can now perform the same class of transformations NRCan has been promoting for years.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 967px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e7b45261b383aa8cda255b36c099ae28/3ccd1/arcgisVelocity-pro.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 13.999999999999998%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAqUlEQVR42j2OwW7CMBBE8/9f1UMPQE+VekJIWGoU0iaxvbtE2E7KqxwEh7c7cxjNNF3XoaqYGWZXfoPxE4yL3Ij5jpU7Wh7/SfVz+WNZFnLOlFJY13WjaduWYRiIMeJD5OPU8fbleD9e2J1HDs5v7M8TezdxcBM7F/j89tRs3/d477dBIkJTT22qLSllVART4WqKxvDQKpjEl67lkw+M48g8z1u2Lk0p8Q8VP+Ou6dPyMwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Pro using a 2-step transformation including a NTv2 Velocity Grid&quot;
        title=&quot;&quot;
        src=&quot;/static/e7b45261b383aa8cda255b36c099ae28/3ccd1/arcgisVelocity-pro.png&quot;
        srcset=&quot;/static/e7b45261b383aa8cda255b36c099ae28/0eb09/arcgisVelocity-pro.png 500w,
/static/e7b45261b383aa8cda255b36c099ae28/3ccd1/arcgisVelocity-pro.png 967w&quot;
        sizes=&quot;(max-width: 967px) 100vw, 967px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; ArcGIS Pro using a 2-step transformation including a NTv2 Velocity Grid&lt;/p&gt;
&lt;h2&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;This update closes a long-standing gap for datum transformations in the software:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArcGIS Pro can now perform modern, authoritative velocity grid transformations;&lt;/li&gt;
&lt;li&gt;Aligns with EPSG registered definitions;&lt;/li&gt;
&lt;li&gt;Is the first phase to supporting NATRF2022 migrations in North America;&lt;/li&gt;
&lt;li&gt;Differences between ArcGIS and NRCan transformations are effectively eliminated (at the anchor epoch);&lt;/li&gt;
&lt;li&gt;No more awkward disclaimers in project documentation (because we were all doing that… RIGHT?!);&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is also a first, and critical step for ArcGIS Pro as we get closer to the release of the North American Terrestrial Reference Frame of 2022 (NATRF2022). Moving from older NAD83 projections into more modern systems of NAD83(CSRS) or NATRF2022 will be possible with this enhancement and expansion over time.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 449px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/883dfa3ffe283c2fb4ab593e0f482c2a/46d70/arcgisVelocity-transform2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 22.048997772828507%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA30lEQVR42gXBTU+DMBgAYP7/r/CyOIwmOg4kTqx8lLaMt6Ut7fiYZR4EtmQc5oGrz+O94fIh2G9CtI3yF0SeEPUj7H/gx/fEj/KAVgGp4ua83SfPiGE3hmA2IdoR+UqEB2URJzHFKSXkeLRSVvEXKgqaZ5ms5GWe/+73afyFQ9l2/c/gAKDW2lqDs9TjHAhjAg6MFU3TSCWzLFVKMspqY5ZlWdd1mkYpqv7kBvddAjfGCCEQ+vSUlpwDAHRtp2utlAQOHEqtVNs2w+Ccc9frxdamP7nldpvnWSk1TpO15h/5HcIg3aDXrAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Transformations that could be leveraged from NAD83, to NAD83(CSRS)v3, to NAD83(CSRS) v6/7/8&quot;
        title=&quot;&quot;
        src=&quot;/static/883dfa3ffe283c2fb4ab593e0f482c2a/46d70/arcgisVelocity-transform2.png&quot;
        srcset=&quot;/static/883dfa3ffe283c2fb4ab593e0f482c2a/46d70/arcgisVelocity-transform2.png 449w&quot;
        sizes=&quot;(max-width: 449px) 100vw, 449px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; Transformations that could be leveraged from NAD83 &gt; NAD83(CSRS)v3 &gt; NAD83(CSRS) v6/7/8. Leveraging NTv2 and a second NTv2 Velocity Grid.&lt;/p&gt;
&lt;h2&gt;Epochs: One Important Limitation in ArcGIS&lt;/h2&gt;
&lt;p&gt;There is one important caveat to the ArcGIS Pro implementation of the velocity grid transformations. Although NTv2 velocity grids support transformations at different epochs, ArcGIS Pro currently supports transformations only at the anchor epochs of the CSRS realization.  In practice, this is fine for the majority of GIS workflows. If you’re doing time-aware tectonic modelling, you’re probably not using GIS software anyway. Still, it’s something to be aware of if you are comparing results against the full desktop NRCan TRX tool.&lt;/p&gt;
&lt;h2&gt;Why Everything Uses the v80 Velocity Grid&lt;/h2&gt;
&lt;p&gt;If you’ve poked around the Esri Coordinate System Data installation folder, you might have noticed something interesting: ArcGIS installs three velocity grids:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NAD83v6VG.gsb&lt;/li&gt;
&lt;li&gt;NAD83v70VG.gsb&lt;/li&gt;
&lt;li&gt;NAD83v80VG.gsb&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although all 3 are installed, only v80 is actually used. Why? This comes straight from the EPSG Geodetic Registry (and confirmation from Esri’s Bojan Savric): Transformations for CSRS v6 and v7 that used their matching velocity grids were &lt;strong&gt;superseded&lt;/strong&gt; by newer transformation variants that always reference the latest velocity grid (v80). According to EPSG and NRCan: Users should use the most recent velocity grid, with older velocity grids retained only for backward compatibility. To note: CSRS v6, v7, and v8 all share the same anchor epoch (2010.0).&lt;/p&gt;
&lt;p&gt;The result? Transformations from CSRS v3 to v6, v7, or v8 produce identical coordinates in ArcGIS Pro, and that is the expected behavior. So why include the older versions?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“users who wish to work with superseded transformations can create their own custom geographic transformations and ensure possible backward compatibility with older product releases, should we later add support for those superseded transformations”&lt;/em&gt;. ~ Esri’s Bojan Savric on Esri Forums&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;This is one of those changes that looks small on a release but is going to be critical as organizations update their datums over time. Even if you don’t plan to move from NAD83 (&lt;a href=&quot;https://epsg.org/crs_4269/NAD83.html&quot;&gt;EPSG: 4269&lt;/a&gt;) to the NAD83(CSRS)v8 (&lt;a href=&quot;https://epsg.org/crs_10414/NAD83-CSRS-v8.html&quot;&gt;EPSG: 10414&lt;/a&gt;) datum just yet, NATRF2022 is coming, and it is likely we are all headed in this direction.&lt;/p&gt;
&lt;p&gt;FYI: GNSS correction services in Canada are already using epoch 2010 in most cases, so if you want to align other/older data with it, say NAD83, these transformations produce better (and different) results than the options in ArcGIS Pro 3.5 and earlier.&lt;/p&gt;
&lt;p&gt;Final, final thought: No matter how you transform between datums, please don’t forget to document the transformation used. The software default transformation changes over different releases (first in the list), and no, we will not remember it in our GIS brains.&lt;/p&gt;
&lt;p&gt;Updated final, final thought: This enhancement is also available in ArcGIS Enterprise v12.0! But no, you can’t use the new Coordinate System installer with older software versions as they can’t handle the velocity grids.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pro.arcgis.com/en/pro-app/latest/help/mapping/properties/pdf/geographic_transformations.pdf&quot;&gt;Esri Geographic Transformations List&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://natural-resources.canada.ca/sites/nrcan/files/mapstoolspublications/NATRF2022_reference_pamphlet.pdf&quot;&gt;NRCan NATRF2022 pamphlet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pro.arcgis.com/en/pro-app/latest/get-started/whats-new-in-arcgis-pro.htm&quot;&gt;ArcGIS Pro: What’s New&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: Photo by &lt;a href=&quot;https://unsplash.com/@simonppt&quot;&gt;Simon Lee&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/photos/a-close-up-of-a-ball-with-a-yellow-background-sWI76WS6OMc&quot;&gt;Unsplash&lt;/a&gt;. April 08, 2026.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Say Goodbye to Concurrent Use Licenses]]></title><description><![CDATA[The GIS landscape is changing once again, and this time it’s the familiar Concurrent Use (CU) license model that’s being phased out. Esri…]]></description><link>https://www.spatialtimes.com/2025/08/goodbye-concurrent-use/</link><guid isPermaLink="false">https://www.spatialtimes.com/2025/08/goodbye-concurrent-use/</guid><pubDate>Wed, 13 Aug 2025 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The GIS landscape is changing once again, and this time it’s the familiar Concurrent Use (CU) license model that’s being phased out. Esri has announced the deprecation of both Concurrent Use licenses and the ArcGIS License Manager. This will directly affect users of ArcGIS Pro and ArcGIS CityEngine currently using CU. While this shift aligns with broader trends in software licensing, it does mean that organizations relying on these legacy models will need to start planning for a transition.&lt;/p&gt;
&lt;h2&gt;Why the Change?&lt;/h2&gt;
&lt;p&gt;Esri is transitioning to a licensing framework that emphasizes secure, permission-based access and centralized management of GIS content. The recommended path forward is through ArcGIS user types, which offer “a more modern and scalable approach to managing access across teams and platforms” (Esri). Unlike Concurrent Use, which leverages a shared pool of licenses, named users are assigned to an individual person.&lt;/p&gt;
&lt;h2&gt;Don’t Want to Change?&lt;/h2&gt;
&lt;p&gt;Sadly, you will need to decide if you want software upgrades or Concurrent Use. ArcGIS Pro can still use CU licenses with the existing software (3.5.x and possibly 3.6.x) if you have perpetual CU licenses. However, CU licenses are tied to a maximum version, and moving forward, there will be no way to request newer licenses as you upgrade ArcGIS Pro. There will definitely be an impact on companies that use CU for large numbers of casual users to manage costs, global CU pools, and some emergency management mobilization scenarios.&lt;/p&gt;
&lt;h2&gt;Key Dates to Keep in Mind&lt;/h2&gt;
&lt;p&gt;Here’s a breakdown of the timeline and what it means for your organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;December 1, 2025: Maintenance renewals will transition to equivalent ArcGIS user types. MyEsri will also remove the ability to convert ArcGIS Pro add-ons to Single Use or Concurrent Use licenses—or revert them back.&lt;/li&gt;
&lt;li&gt;March 1, 2026: Last date for software releases that support Concurrent Use licenses.&lt;/li&gt;
&lt;li&gt;Q2 2026: ArcGIS Pro and CityEngine versions released after this point will no longer support Concurrent Use.&lt;/li&gt;
&lt;li&gt;Through 2028: ArcGIS License Manager will continue to support older versions of ArcGIS Desktop, Pro, and CityEngine until those products reach the Mature phase of their lifecycle.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Time to Evaluate Options&lt;/h2&gt;
&lt;p&gt;If your organization is still using Concurrent Use licenses, now is the time to evaluate your options and discuss them with your Esri reps. Before updating to newer versions of ArcGIS Pro or CityEngine in 2026 and beyond, you’ll need to transition to a supported license type. This means using ArcGIS user types or Single Use licenses (for ArcGIS Pro only) and/or evaluating future GIS software needs. Failing to do so will result in updated software that simply won’t be setup to work properly. There are options beyond ArcGIS Pro, but for many GIS departments, the integrations run too deep.&lt;/p&gt;
&lt;p&gt;While this change may require some adjustment, it’s part of a broader effort to modernize how GIS software is accessed and managed. For many organizations, the move to user types will offer greater flexibility and control. Regardless of why it’s happening, it’s important to plan ahead to avoid disruption.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en-us/knowledge-base/deprecation-concurrent-use-license-type-and-arcgis-lice-000036856&quot;&gt;Esri Support - Deprecation of Concurrent Use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en-us/products/arcgis-pro/life-cycle&quot;&gt;ArcGIS Pro Lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: Photo Generated with support from &lt;a href=&quot;https://copilot.microsoft.com/&quot;&gt;Copilot&lt;/a&gt;. August 2025.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Enterprise 11.3 Released]]></title><description><![CDATA[ArcGIS Enterprise 11.3 is here! There are many significant updates and new capabilities in ArcGIS Enterprise 11.3, emphasizing its…]]></description><link>https://www.spatialtimes.com/2024/05/arcgis-enterprise-113-released/</link><guid isPermaLink="false">https://www.spatialtimes.com/2024/05/arcgis-enterprise-113-released/</guid><pubDate>Sun, 26 May 2024 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ArcGIS Enterprise 11.3 is here! There are many significant updates and new capabilities in ArcGIS Enterprise 11.3, emphasizing its continuous evolution to meet technology and industry needs. This also adds many of the new ArcGIS Online features to in-house Enterprise deployments with new Apps and features.&lt;/p&gt;
&lt;h2&gt;What’s New&lt;/h2&gt;
&lt;p&gt;ArcGIS Enterprise 11.3 introduces enhancements for data management, administration, and applications, with a focus on new features for numeric and temporal data types, and updates to ArcGIS Living Atlas content.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;11.3 is the new Long-Term Release (LTS) version of Enterprise: Yes, this is the one to install/upgrade to (or wait for the first patch).&lt;/li&gt;
&lt;li&gt;Installation tweaks: The Portal for ArcGIS and ArcGIS Server packages now come in two install files (.exe and .exe.001), and there’s a new .NET 8-based ArcGIS Web Adaptor (IIS) requirement.&lt;/li&gt;
&lt;li&gt;Data Types: Four new field data types for numeric and temporal data are available based on the same field types released in ArcGIS Pro 3.2:
&lt;ul&gt;
&lt;li&gt;Big Integer: Numeric 64-bit field type storing values up to 53-bit safe integers and has a storage size of 8 bytes. FYI: Some client applications may not fully support this field type.&lt;/li&gt;
&lt;li&gt;Date only: Store date values of day, month, and year. No time values are stored for date-only fields.&lt;/li&gt;
&lt;li&gt;Time only: Store time values in local time with millisecond precision. No date values are stored.&lt;/li&gt;
&lt;li&gt;Timestamp offset: Store date and time values. The time values include information about the time offset from coordinated universal time (UTC).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Retirement Notices: ArcGIS GeoPlanner is retired in version 11.3, with additional details and transitioning recommendations available in the deprecation announcement.&lt;/li&gt;
&lt;li&gt;ArcGIS Urban: New App to design, manage, and measure urban developments in your city and collaborate with stakeholders. ArcGIS Rural isn’t a thing, but Esri does have an Ideas Page if you feel left out &lt;em&gt;&lt;strong&gt;in the field&lt;/strong&gt;&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;New in ArcGIS Portal&lt;/h3&gt;
&lt;p&gt;Lots of additions to Portal in this release to hopefully catch up to ArcGIS Online:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Organization Administration: Many new administration options. Thankfully you can bulk delete members and transfer content now. Living Atlas also gets some love with the ability to update Atlas items when new content is available.&lt;/li&gt;
&lt;li&gt;Data Management:
&lt;ul&gt;
&lt;li&gt;You can schedule the cache to be rebuilt for hosted vector tile layers that have an associated hosted feature layer or map image layer.&lt;/li&gt;
&lt;li&gt;A new editor for metadata (and the old editor renamed to… you guessed it “classic”).&lt;/li&gt;
&lt;li&gt;Additional authentication methods (Entra ID and SAS token).&lt;/li&gt;
&lt;li&gt;Can now set a schedule to synchronize bulk published layers with their source datasets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mapping and visualization: Many new visualizations and colour ramps, chart type (Box plot); a Box plot chart; and Many enhancements to sketch layers.&lt;/li&gt;
&lt;li&gt;A very cool addition for custom tools within the MapViewer: Custom web tools are geoprocessing workflows, such as models, scripts, or notebooks, that are published and hosted in ArcGIS Enterprise as Tool or Geoprocessing Service items and are accessed from the Map Viewer Analysis pane.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;New in ArcGIS Server&lt;/h3&gt;
&lt;p&gt;This is more of a hardening release for LTS, but it does provide some new features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administer custom data providers in Server Manager.&lt;/li&gt;
&lt;li&gt;New cloud data store authentication methods added (Microsoft Entra ID and SAS).&lt;/li&gt;
&lt;li&gt;ArcGIS Enterprise 11.3 is the last release to support Microsoft SQL Server 2017 (no more SQL Server 2016 or PostgreSQL 12x).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Installation Requirement Details&lt;/h2&gt;
&lt;p&gt;There are some requirement changes before you do a fresh install or migrate an existing Enterprise deployment. ArcGIS is only supported on 64-bit CPUs with x86-64 architecture at this point, so don’t run out and buy a fancy new Microsoft Surface laptop with a Snapdragon X Elite (Arm 64 architecture) just yet. Some more important changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArcGIS Enterprise components require the Microsoft Visual C++ 2015–2022 Redistributable (x86 and x64) minimum version 11.3.50790. If installing using the setup.&lt;strong&gt;exe&lt;/strong&gt; files, this will be automatically installed if missing. However, if using the setup.&lt;strong&gt;msi&lt;/strong&gt; the file will not install automatically. If you are savvy enough to use the MSI, you are savvy enough to install this yourself.&lt;/li&gt;
&lt;li&gt;ArcGIS Web Adaptor: New to this release, the Web Adaptor will require the ASP.NET Core Runtime - Windows Hosting Bundle 8.x. The Web Adaptor also requires Microsoft Web Deploy 3.6, although this is the same requirement as 11.2.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://enterprise.arcgis.com/en/get-started/11.3/windows/what-s-new-in-arcgis-enterprise.htm&quot;&gt;What’s new in ArcGIS Enterprise 11.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://downloads.esri.com/support/downloads/other_/113-IssuesAddressedList_05212024.pdf&quot;&gt;ArcGIS Enterprise 11.3 Issues Addressed List&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: Photo by &lt;a href=&quot;%22https://flickr.com/photos/kickabrick/&quot;&gt;KickABrick&lt;/a&gt; on &lt;a href=&quot;https://flickr.com/photos/kickabrick/49923458676/&quot;&gt;FLICKR&lt;/a&gt;. Modified May 26, 2024.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Pro 3.3 Released]]></title><description><![CDATA[ArcGIS Pro 3.3 was just released by Esri. Although this is a minor release, it has some bigger implications and features. Overall, this is…]]></description><link>https://www.spatialtimes.com/2024/05/arcgis-pro-33-released/</link><guid isPermaLink="false">https://www.spatialtimes.com/2024/05/arcgis-pro-33-released/</guid><pubDate>Thu, 09 May 2024 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ArcGIS Pro 3.3 was just released by Esri. Although this is a minor release, it has some bigger implications and features. Overall, this is related to one of the new Long-Term Support (LTS) releases for ArcGIS Enterprise (11.3) that will be coming in the next few weeks. This release also changes a few of the pre-install/upgrade requirements so you might not be able to just click the upgrade button. This is also a designated “Network Management Release”, important for those in the Utilities and Telecom sector.&lt;/p&gt;
&lt;h2&gt;New ArcGIS Pro 3.3 Requirement: Microsoft .NET Desktop Runtime 8x&lt;/h2&gt;
&lt;p&gt;Before installing ArcGIS Pro 3.3, you will need to install Microsoft .NET Desktop Runtime 8.0.x (x64). Don’t worry, it won’t install/upgrade otherwise. The version linked in &lt;em&gt;&lt;strong&gt;MyEsri&lt;/strong&gt;&lt;/em&gt; is preset to download 8.0.0 as of writing, but Microsoft updates this very frequently so you can already grab 8.0.4 from Microsoft if you want the latest and greatest.&lt;/p&gt;
&lt;h2&gt;New ArcGIS Pro 3.3 Requirement: WebView2 Runtime 117+&lt;/h2&gt;
&lt;p&gt;You will also need the Microsoft WebView2 runtime version 117 or later. This is likely already installed on your computer unless you did some fancy Windows SlipStream install. This runtime is used to display HTML and JavaScript content in Pro (popups, etc).&lt;/p&gt;
&lt;h2&gt;What’s New in ArcGIS Pro 3.3&lt;/h2&gt;
&lt;p&gt;Too much to cover here, but some of the highlights are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Enhanced Water Flow modelling with Flood Simulation: ArcGIS Pro 3.3 introduces improved capabilities for modeling water flow. Whether you’re analyzing drainage patterns or managing water resources, these enhancements allow you to create new mapping products.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Storytelling: The new Presentations feature enables you to create compelling narratives directly within ArcGIS Pro. Combine maps, charts, images, and text to communicate your spatial analysis results effectively. Don’t want to use PowerPoint? Create a “ProPoint” presentation (patent pending). It’s like giving your maps a bedtime story—complete with dragons, unicorns, and maybe a sprinkle of GIS magic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Simplified PDF Integration: In previous versions, adding PDF files to your project required converting them to other formats, such as TIFF. ArcGIS Pro 3.3 eliminates this step, allowing you to directly import PDFs into your map layouts. This enhancement simplifies document integration and preserves the original quality of your PDF files. Way cooler AND less pixelated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hyperlinks in Text Elements: Now you can add hyperlinks to text elements in your layouts. Link to external websites, documents, or other resources directly from your map annotations. This feature enhances interactivity and provides additional context for your audience. I did some preliminary tests on this and the results are great within the Layout itself, but don’t always work when exporting to PDF as tested below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a textbox with LINK tag only: Exports text only, &lt;strong&gt;no hyperlink created&lt;/strong&gt;. &lt;code class=&quot;language-text&quot;&gt;&amp;lt;LINK url=&quot;https://www.spatialtimes.com&quot;&gt;SpatialTimes&amp;lt;/LINK&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Create a textbox with LINK AND some text preceeding the link: Exports a hyperlink. &lt;code class=&quot;language-text&quot;&gt;Hi &amp;lt;LINK url=&quot;https://www.spatialtimes.com&quot;&gt;SpatialTimes&amp;lt;/LINK&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Create a textbox with LINK where the link text is the URL, PDF reads as a hyperlink. &lt;code class=&quot;language-text&quot;&gt;&amp;lt;LINK url=&quot;https://www.spatialtimes.com&quot;&gt;https://www.spatialtimes.com&amp;lt;/LINK&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Sadly, none of the exports to PDF meet WCAG 2.0 AA for hyperlinks. Further, &lt;strong&gt;no PDF Layout exports from ArcGIS Pro meet S.508/AODA&lt;/strong&gt; as tag order and proper tag types are still lacking since being introduced.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Export Attachments: When exporting data from feature layers, ArcGIS Pro 3.3 allows you to include attachments associated with features. This is especially valuable for field data collection workflows where photos, documents, or other files are linked to specific features.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Geodatabase Schema Replication: The Schema Report tool generates a detailed report of your geodatabase schema, including feature classes, domains, relationships, and more. In ArcGIS Pro 3.3, you can now use this report to create a new geodatabase with the same schema. This feature simplifies database replication and ensures consistency across projects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Combined Visualization Techniques: ArcGIS Pro 3.3 enhances your cartographic options by allowing you to combine multiple visualization techniques within a single layer. For example, you can display point features as both graduated symbols and heat maps. Let’s all start making those Graduated Heat Symbols.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more details, you can refer to the official ArcGIS Pro 3.3 release notes and explore the full list of enhancements and bug fixes. Also wanted to mention that existing 3.x custom SDK modules/extensions should continue to work with ArcGIS Pro 3.3. Recompiling isn’t required unless you need to crack the code open again.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pro.arcgis.com/en/pro-app/3.3/get-started/release-notes.htm&quot;&gt;ArcGIS Pro Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en-us/products/arcgis-pro/life-cycle&quot;&gt;ArcGIS Pro Lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: Photo by &lt;a href=&quot;%22https://unsplash.com/@mockaroon&quot;&gt;Mockaroon&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/photos/yellow-wall-bricks-9f3tCfHoGDE&quot;&gt;Unsplash&lt;/a&gt;. Modified May 9, 2024.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Pro Layouts and Accessibility]]></title><description><![CDATA[Creating beautiful cartographic map layouts can be a difficult journey. Titles, fonts, and picking a north arrow that matches your design…]]></description><link>https://www.spatialtimes.com/2023/02/arcgis-pro-layouts-and-accessibility/</link><guid isPermaLink="false">https://www.spatialtimes.com/2023/02/arcgis-pro-layouts-and-accessibility/</guid><pubDate>Mon, 20 Feb 2023 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Creating beautiful cartographic map layouts can be a difficult journey. Titles, fonts, and picking a north arrow that matches your design (much like your socks matching your belt). Yeah, those difficult decisions. Let’s not forget the accessibility of our design as well. Forgetting accessibility during the design process is like forgetting the map title - it shouldn’t happen. Accessibility should be part of the design process, not an afterthought. This will drastically reduce the time needed to remediate at the end and allows more people to enjoy your map. And yes, it’s also a legal requirement in many jurisdictions - this is where it gets interesting.&lt;/p&gt;
&lt;p&gt;This started as a simple article on making a great, and accessible PDF layout with ArcGIS Pro. However, I went too far down the rabbit hole, and we end up with this article. In short: ArcGIS Pro (at version 3.0.4) &lt;strong&gt;doesn’t generate&lt;/strong&gt; accessible layouts that meet Section 508 or AODA requirements. Note: An explaination to this statement is in the &lt;a href=&quot;#is-wcag-not-possible-in-arcgis-pro?&quot;&gt;ArcGIS Pro section below&lt;/a&gt;. That said, ArcGIS Pro &lt;strong&gt;does&lt;/strong&gt; have some accessible features and exports some PDF elements - which is a great start.&lt;/p&gt;
&lt;p&gt;It helps when we have tools that support building and testing accessible layouts. As mentioned, ArcGIS Pro does have some layout “accessibility” tools, and they should expand over time. Adobe Pro has an “accessibility” checker to report on some accessibility issues. The problem is: “Accessibility” is a broad term. Neither ArcGIS Pro nor Adobe Pro is creating/checking WCAG 2.0 AA accessibility. What?!&lt;/p&gt;
&lt;p&gt;Let’s step back for a second.&lt;/p&gt;
&lt;h2&gt;Accessibility and Section 508, AODA, and WCAG&lt;/h2&gt;
&lt;p&gt;Accessibility is something we strive for and there are many different levels of accessibility. There are also differences between Section 508 and Web Content Accessibility Guidelines (WCAG) although all 3 terms are used interchangeably by some. Section 508 and WCAG are, in fact, quite different. Since I live in Ontario Canada, I’m adding AODA in there too - it will make sense later.&lt;/p&gt;
&lt;h3&gt;Section 508&lt;/h3&gt;
&lt;p&gt;Section 508 is a federal law in the United States. This law requires federal agencies and those receiving federal funds to acquire, develop, use, and maintain information and communications so people with disabilities can access it. In 2018, Section 508 was enhanced with updated requirements for information and communication technology (ICT). This update adopted &lt;strong&gt;WCAG 2.0 AA&lt;/strong&gt; as the criteria for a website, electronic document, and software accessibility.&lt;/p&gt;
&lt;h3&gt;AODA&lt;/h3&gt;
&lt;p&gt;Accessibility for Ontarians with Disabilities Act (AODA). This is Ontario provincial law that sets out a process for developing and enforcing accessibility standards much like Section 508. Public content must meet the &lt;strong&gt;WCAG 2.0 AA&lt;/strong&gt; success criteria. There are 2 exceptions, but they don’t apply to our PDF map layouts.&lt;/p&gt;
&lt;h3&gt;WCAG&lt;/h3&gt;
&lt;p&gt;Web Content Accessibility Guidelines (WCAG) were “developed to provide a single shared standard for web content accessibility that meets the needs of individuals, organizations, and governments internationally” &lt;a href=&quot;https://www.w3.org/WAI/standards-guidelines/wcag/#intro&quot;&gt;W3.org&lt;/a&gt;. These guidelines have been adopted for digital documents (Word, PDF, etc) over the years as well. There are many versions of WCAG, with version 2.0 categorized into three levels of conformance: A (minimum), AA (mid-range), and AAA (highest). Both Section 508 and AODA must meet WCAG 2.0 AA as their compliance requirement.&lt;/p&gt;
&lt;h2&gt;Accessibility in Adobe Pro&lt;/h2&gt;
&lt;p&gt;Adobe accessibility checker isn’t specifically checking for WCAG 2.0 AA compliance. It does validate many WCAG criteria, but passing the Adobe checker doesn’t mean the document passes WCAG 2.0 AA. Some items can’t be checked, and other items can be complex and might not apply to all accessibility standards. So if you don’t pass the Adobe Pro accessibility checker: You have a lot of remediation to do. If you do pass the Adobe Pro accessibility checker: You probably still have some remediation to do.&lt;/p&gt;
&lt;p&gt;Don’t be mad at Adobe/ArcGIS Pro (that &lt;em&gt;Pro&lt;/em&gt;-ism didn’t escape me), there are more than 2 accessibility laws in this world and many accessibility guidelines. Providing tools to help us along our accessible journey is what we are looking for.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 200px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f7944dccc5375ae41859bb4577a7c87e/56d15/AdobePro_AccessibilityChecker.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 111.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAIAAABPIytRAAAACXBIWXMAAA7CAAAOwgEVKEqAAAACEUlEQVR42o2US47dIBBFvbtnfgZjCqgCg93vJ2WWYSaRsoYsIFuNsJN0S7Gf+g6YWIe6datw9+PLr5imUur1en08Ht57peTwR+q1um/3n57suqyl1Fqrc65nPRecMSaEkCfaP3WjnhjrGeMA4JxDxBAjIqZE1tpDXggRQtBad8uy3O93KSVizCnlnDcW5zlP0ySl/N+tlBIAGmytHe04jmOpRUq5u+Wc9/0r25zzZptSIiJjzO12M8ZwzndGfUKdd9a71psQYtDa+xBDPOv2oxqs8CbxYQZpmvcRYyQi55x8H9jpxDpVv8rHd6OENsYYO5cSQiil2HH824I4hSejYRqF3OpY7qMnSiGEGKNzsJ3TWQTdsqzr2xtj/aC0gotHV2uNMRCRB09EACDFcfHuPQA5DHAJ5Je6EtLclL33tdSUkjoq3l2v1+fz2fet8uAuPkJOOTRFQtRav8isM6bFvKUyKNdDdEQUQvDeJ0r6ddqllGVZGGODGrTvIUxzyohIKc1zJmr+EfHYtnMOANqGqEFNF49Q5oKIOWWiBN6nlFpmh/DuULQ8hwF6j7Aua6K0axtZsNYew4hYa+Wc77adt0Q71jIr87y/weOe963eLm6VIbqUMwDMc7bWMtZez2na/57oBl8CQslzCD5vV+w63+2PsNtsI7W0t91q/wXCT8By0KHHHNdlraW0CcVYSqVz+DdRI6N7n6GK7AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Adobe Pro Accessibility checker showing all items passing, but the document doesn&amp;#39;t meet WCAG 2.0 AA&quot;
        title=&quot;&quot;
        src=&quot;/static/f7944dccc5375ae41859bb4577a7c87e/56d15/AdobePro_AccessibilityChecker.png&quot;
        srcset=&quot;/static/f7944dccc5375ae41859bb4577a7c87e/56d15/AdobePro_AccessibilityChecker.png 200w&quot;
        sizes=&quot;(max-width: 200px) 100vw, 200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;ArcGIS Pro and PDF Layout Accessibility&lt;/h2&gt;
&lt;p&gt;Oh yeah, the original article title. Based on the information above, what I’m &lt;em&gt;really&lt;/em&gt; talking about is using ArcGIS Pro to create WCAG 2.0 AA PDF layouts. And now we know, ArcGIS Pro and Adobe Pro can help get us started, but can’t get us there like an Uber. Although great tools such as the color vision deficiency simulator do highlight the efforts Esri is making in this area.&lt;/p&gt;
&lt;p&gt;Esri does have a few good blog articles, help documents, and demonstrations on using ArcGIS Pro to generate accessible PDFs. I’m honestly grateful they are bringing attention to the subject and adding related functionality. They also do a good job of NOT saying “WCAG 2.0 AA accessibility”. It may look synonymous, but there is purposeful separation.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 200px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/df15512bd69cfb6eb95db8affd7be793/56d15/arcgisPro_accessibility.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 101.49999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAA7CAAAOwgEVKEqAAAAC0klEQVR42nWU627bOBCF/f5PU6BYoH8CtEC3aVo7dqLEcRTdZUu8UxLvlBzvSnLcdNE9OCBGIr4hOUNp8SMmHwP8V4B/pGyd89s3r3K2ytgUX4LpfcauQ/D5oVhF1aIR8sAVbPRx8Kfjxf3pdTidhnN8Dma7wZuj11aLhVTKe+ecVcYoY6W2QqkkTaM4CePk+SXaPodRnEg9zs7W1hrnhFKLTkhjnbHOWquNmQInhNRKGa2s0cYorZQ21th3dk4qtYAQpnmWl3lW5IigLM+KfUk5e86Lu110s3n4e7mOy6rv+yn173DTdARxhltO2pYJihpUU1jTXQK3KUpRE4OmZp1z7g8rb749fb/aLL/e33xef/l0ffs1eN5ku3WSBPntVdDx7vQ6eP87eYHvvj/lWVHBQ7Ev0zyBBPrX3np7Or2G9zmoiRv8fw98gZdfgmC5y5Mi3EZJmEe7NNhsg9vHcBddfbjGkPnem/+Do21+d70LfoYPy/Bx9fK4enlax0/rZLeO72/CrpP27bTWuV/2foS11gCBrMiSLHmJo+32EVFyPB394PtjfyaNtc5OTdOztTFSyoWQ8rA/UMrmOUopgqiuagAgxhgAgDGmlAAIhJTDMPSTrLVCyvGGcc7bTvTDMN4bITjnBGOEEOccI0QI4ZwhiNp2bJidpJQ6wwCALMuTJBFK1VWdxMmhqsqiTNOs3O/zLK+q6lBVh0N1KVjbdZ0Q47YZZxDjpm21tZxzhDHnvGkaRinnnFJGKRVKKqUusFRKzHBd10VRtkJY55qmqd60L0sI4X6/r6paa9P3vX+TMUbMBcOEAAjllJgxxjm3Y4XH7th5nB7f69fKjFGIsB6/KEcpZYz3/dD3fi6s934e7TupMywkoZQ3DcZEaS3HXIxg3LYt44wS0rYtxrjtuj9vG0BYjZ2F2pi2aepJY8MRAjWglIIaMMb99NOYpbX+F/4HDlVb1tYtNgsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Pro accessibility export options to include tags and metadata&quot;
        title=&quot;&quot;
        src=&quot;/static/df15512bd69cfb6eb95db8affd7be793/56d15/arcgisPro_accessibility.png&quot;
        srcset=&quot;/static/df15512bd69cfb6eb95db8affd7be793/56d15/arcgisPro_accessibility.png 200w&quot;
        sizes=&quot;(max-width: 200px) 100vw, 200px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Is WCAG not possible in ArcGIS Pro?&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;*It &lt;em&gt;is&lt;/em&gt; possible, but not by using regular ArcGIS Pro layout elements (scale bar, north arrow, legend). And other elements that do have tag structure aren’t complete (tables, headings). Tag types, tag order, and changing the order isn’t available at this time either. So it might be possible - but keep a copy of Adobe Pro for the time being.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Now What&lt;/h2&gt;
&lt;p&gt;If Section 508 or AODA apply to you - let’s celebrate Esri and Adobe for their accessibility efforts so far. They are making improvements and this does make our job easier when remediating PDFs. Once we export our maps to PDF, we run the Adobe Accessibility checker to fix obvious issues. Then we dive deeper into the remediation and continue on our journey.&lt;/p&gt;
&lt;p&gt;I’m hoping to post a second article on this topic where I get into the map layout remediation process in the near future.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/WCAG20/&quot;&gt;Web Content Accessibility Guidelines 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-pro/mapping/creating-accessible-pdfs-in-arcgis-pro/&quot;&gt;Creating accessible PDFs in ArcGIS Pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pro.arcgis.com/en/pro-app/latest/help/sharing/overview/pdf-export.htm&quot;&gt;ArcGIS Pro PDF Exports&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: Photo by &lt;a href=&quot;%22https://www.pexels.com/@fauxels/&quot;&gt;Fauxels&lt;/a&gt; on &lt;a href=&quot;https://www.pexels.com/photo/photo-of-people-holding-sign-board-3228837/&quot;&gt;Pexels&lt;/a&gt;. Modified Feb. 20, 2023.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Pro 3.0 Released]]></title><description><![CDATA[Initially scheduled for release in June, Esri was able to release ArcGIS Pro 3.0 with a few days to spare. With the Esri User Conference…]]></description><link>https://www.spatialtimes.com/2022/06/arcgis-pro-3-released/</link><guid isPermaLink="false">https://www.spatialtimes.com/2022/06/arcgis-pro-3-released/</guid><pubDate>Mon, 27 Jun 2022 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Initially scheduled for release in June, Esri was able to release ArcGIS Pro 3.0 with a few days to spare. With the Esri User Conference just around the corner, I’m sure it will get lots of attention on the UC’s big stage. There isn’t an official announcement of the release yet, but with the ArcGIS Pro update service going offline for a few hours, it seemed like something big was happening - now we know.&lt;/p&gt;
&lt;h2&gt;Ready to Upgrade to ArcGIS Pro 3.0&lt;/h2&gt;
&lt;p&gt;To upgrade to ArcGIS Pro 3.0, just open the currently installed version and you will be prompted that an upgrade is available. It doesn’t specify the significance of the update - but don’t be fooled, this is significant.&lt;/p&gt;
&lt;p&gt;In short, the biggest things to know when upgrading to ArcGIS Pro 3.0 are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You will require &lt;a href=&quot;https://dotnet.microsoft.com/en-us/download/dotnet/6.0&quot;&gt;&lt;strong&gt;.NET 6 Desktop Runtime x64&lt;/strong&gt;&lt;/a&gt;: This needs to be installed before ArcGIS Pro 3.0. If you just run the upgrade from pro 2.x it will fail to install. However, install the runtime, and head back to the upgrade and the install should be successful (without another download needed).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7cd72fa72593d8fd0740e4eec65fee3a/dface/ProDotNet64.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.4%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAA7CAAAOwgEVKEqAAAABg0lEQVR42i2OyY6cMBRF+f9PyTqRokj5hN50mAqXDUUztJoGD+AJyr4RqJ50dAe9xU3SNANjdcyLElVFLm63CndKUZE7KGXQ2sBaC2tOzKXGvDpr4ZyLzllMswjJR9vEruvweDRomhp916FtWwxdh3HoMY4DpOAXQnAoKS6/Kol5/gbnCz7HMRq9QaotJGVZgNxJzLLsWlUWJe6EgBCCumaXVtUNZVkizzIUeYE0TfHv/R3jOEJvK5Zljs4aSLmGZJqmuK4qCs6jkjJyzmPXtbHrP6Lkc5RiiUKIKIW4FgrBTx/7vo/DMMRVqWiNidZozIsIyaNtA+c8SKWClCoIIQMhbbi9peH7YwpqR/DOBffCWhu89+Hrawqsbq7/szuZF/FMPsfxnAyjNbTeoLcNcvZQ3EH8+In111+YGOCNwe49nseB49gRnk+cF56vHA4IuSI59p1656i1hlprqbOGeqepCwfd6zvb//ymt6JgeZ6zpq6Zd44Zo+mFfqnR1FlL50Wy/0feCwpha6gUAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Dot Net Desktop Runtime Download&quot;
        title=&quot;&quot;
        src=&quot;/static/7cd72fa72593d8fd0740e4eec65fee3a/dface/ProDotNet64.png&quot;
        srcset=&quot;/static/7cd72fa72593d8fd0740e4eec65fee3a/0eb09/ProDotNet64.png 500w,
/static/7cd72fa72593d8fd0740e4eec65fee3a/dface/ProDotNet64.png 600w&quot;
        sizes=&quot;(max-width: 600px) 100vw, 600px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If using concurrent licenses, update to ArcGIS License Manager 2022.0 first.&lt;/li&gt;
&lt;li&gt;ArcGIS Pro 3.0 is a breaking change release: Esri uses the semantic versioning specification - which means when the first number changes, it’s a major release. Major releases tend to break some areas of backward compatibility. There are some breaking changes with this release (including the update to .NET 6).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 390px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/785b7e9cb1a414d39aabf2fbb80566e7/506f3/Pro3SaveWarning.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.35897435897436%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABcklEQVR42nWQSY7cMAxFfZYsgm50VZmiJkq2LHnQXJ2ssgh625fIFXKdXDBwBbUM8UB8jiA4ADmmLdPTk5lpx+YEroCr4Mqp5/jIz8+GUwAtA5MkkQnOkQEiMBgRObgO/vs4JZjLuP4Afz+rAKd/wqQZUJnbCAx58MH7sB/Rex+8884d++aXOQTv3RzWLYTgnFvX1YfgnUNthwvqj28+rZMPW+vvrfd932prMaZaW86plFJbraW933uMsfZWUjZETJnhyuSf3z9/fXY9+VLrvq0xpuPYt3XbYyq1bvvW2/2IKeecS9njvriZIzvP5to4IyyJnEvtNR5H6z3GI6UUU4oxlpxzSqWkXmtKWXB+PujfMJMGGAPkRKSJtNaaSCklpdKPWNL5YU6zsosmqx9mSAuaB5QkORPiXPYAERk/QUTgQryO8uvrBaX+8nIVNF2vb5bodn1TdhlAO5AGpP0fN+Uuyo9mvagFyUuz6ClIu6ANfwE0dn0akqiwhAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Pro 3.0 save warning on old projects&quot;
        title=&quot;&quot;
        src=&quot;/static/785b7e9cb1a414d39aabf2fbb80566e7/506f3/Pro3SaveWarning.png&quot;
        srcset=&quot;/static/785b7e9cb1a414d39aabf2fbb80566e7/506f3/Pro3SaveWarning.png 390w&quot;
        sizes=&quot;(max-width: 390px) 100vw, 390px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Breaking Changes&lt;/h2&gt;
&lt;p&gt;Projects &lt;strong&gt;created&lt;/strong&gt; or &lt;strong&gt;saved&lt;/strong&gt; using ArcGIS Pro 3.0 can’t be opened directly in ArcGIS Pro 2.x. After updating to ArcGIS Pro 3.0, when you first save a project created in an earlier version, you will receive a notification of this breaking change. You can still create a project package if you need to open it in a previous version as that functionality is still a workaround. Pro 1.x and 2.x projects can be opened in 3.0, but if saved they will become 3.0 projects.&lt;/p&gt;
&lt;p&gt;Some geodatabase functionality is also not backwards compatible. Attribute Rules, Annotation, Dimensions, and Utility networks created in 3.0 will not work with 2.x releases. Other limitations exist and it’s recommended to read the &lt;a href=&quot;https://pro.arcgis.com/en/pro-app/latest/get-started/migrate-2x-to-3.htm&quot;&gt;migration page&lt;/a&gt; before upgrading geodatabase functionality.&lt;/p&gt;
&lt;h2&gt;What’s New&lt;/h2&gt;
&lt;p&gt;Beyond the new splash screen, Pro has many new features available - so I’m not going to attempt to list them all here. Here are some notable items:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New Package Manager: Allowing us to manage multiple Conda environments for use in ArcGIS Pro. Yes, Conda was always there but there is now an interface to manage versions, repair environments, and rename environments.&lt;/li&gt;
&lt;li&gt;Add maps to reports: Sure you can add reports to maps, but what about maps to reports? This is now available for those that want to add some spatial goodness.&lt;/li&gt;
&lt;li&gt;Export Map Presets: These presets allow us to save all the settings for a particular export type and shortcut to these settings in the future. When you export a map or layout, you can select a default preset or a custom preset created. This isn’t handled the same as other user favourites, but hopefully, this gets streamlined over time.&lt;/li&gt;
&lt;li&gt;New MGWR Spatial Statistics: Multi-scaled Geographically Weighted Regression (MGWR) tools are here. Huh?! That’s right, some pretty advanced predictive and explanatory spatial analysis tools are now available - it is the &lt;em&gt;Science of Where&lt;/em&gt; after all.&lt;/li&gt;
&lt;li&gt;New Hydrology Tools: Hydro conditioning is not required with these new tools which aim to make it easier to create hydro surfaces with less effort.&lt;/li&gt;
&lt;li&gt;Credit Consumption Estimation for Batch Geocoding: Worried you will use too many credits when Geocoding? A simple estimation tool is now available so you no longer need to keep an Excel Spreadsheet calculator off to the side.&lt;/li&gt;
&lt;li&gt;And lots more: Improved 3D, more CAD/BIM support, Synthetic Aperture Radar Toolset, Mobile database publishing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-pro/announcements/whats-new-in-arcgis-pro-3-0/&quot;&gt;What’s New in ArcGIS Pro 3.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pro.arcgis.com/en/pro-app/latest/get-started/migrate-2x-to-3.htm&quot;&gt;ArcGIS Pro migrate 2x to 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-pro/announcements/get-ready-for-arcgis-pro-3-0/&quot;&gt;Getting Ready for Pro 3.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dotnet.microsoft.com/en-us/download/dotnet/6.0&quot;&gt;Microsoft .NET 6.0 Downloads&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: Photo by &lt;a href=&quot;%22https://unsplash.com/@danielkcheung?utm_source=unsplash&amp;#x26;utm_medium=referral&amp;#x26;utm_content=creditCopyText&quot;&gt;Daniel K Cheung&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/s/photos/lego-sign?utm_source=unsplash&amp;#x26;utm_medium=referral&amp;#x26;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;. Modified June 27, 2022.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Using JavaScript's Geolocation API]]></title><description><![CDATA[The location of people and devices is handy if you want to display local weather, show a map, get directions, or even tweak advertisements…]]></description><link>https://www.spatialtimes.com/2022/01/using-javascripts-geolocation-api/</link><guid isPermaLink="false">https://www.spatialtimes.com/2022/01/using-javascripts-geolocation-api/</guid><pubDate>Sun, 23 Jan 2022 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The location of people and devices is handy if you want to display local weather, show a map, get directions, or even tweak advertisements by region. These examples of GeoLocation are just the tip of the iceberg, but you get the idea - location, location, location. Web browsers and javascript started supporting geolocation back in 2009 (Firefox v3.5). This happened with very little fanfare since very few people owned smartphones, and tracking user location wasn’t big business (yet).&lt;/p&gt;
&lt;p&gt;Today, we assume our phone knows where we are, where we are going, where the device is, and if we are near them. Sounds complicated, but we are just tapping into an API that can ask the device for location details. With GNSS chips (AKA “GPS”) in all our phones, how easy is it to tap into this location? With JavaScript’s GeoLocation API, it’s easier than you might think.&lt;/p&gt;
&lt;h2&gt;JavaScript GeoLocation API&lt;/h2&gt;
&lt;p&gt;The JavaScript Geolocation API ’&lt;em&gt;provides access to geographical location information (lat/long) associated with the hosting device&lt;/em&gt;’ &lt;a href=&quot;https://w3c.github.io/geolocation-api&quot;&gt;W3C&lt;/a&gt;. This enables web apps to request location data - whether it be your phone, laptop, or another smart device. Even without a GNSS/GPS chip, device location is still possible via cellular triangulation, network IP, etc. The accuracy will vary and is impacted by this and a few other factors. Thankfully, we don’t need to worry about those details, we just ask the GeoLocation API for the location and the device will take care of the rest - if permission is granted.&lt;/p&gt;
&lt;p&gt;The GeoLocation API provides a few different ways to access this information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;getCurrentPosition: Get the device’s current location&lt;/li&gt;
&lt;li&gt;watchPosition: A handler function that is called automatically when the location of the device changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are three arguments with both approaches:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A success callback (required)&lt;/li&gt;
&lt;li&gt;An error callback (optional)&lt;/li&gt;
&lt;li&gt;An Options object (optional)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;A Simple Request for Location&lt;/h2&gt;
&lt;p&gt;Call the getCurrentPosition once, we can use: &lt;code class=&quot;language-text&quot;&gt;navigator.geolocation.getCurrentPosition(successCallback, errorCallback);&lt;/code&gt;.
If the browser supports ES6, you can always use the arrow approach too:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;geolocation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getCurrentPosition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;pos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;myFunction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;longitude&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;By default, the API answers as quickly as possible with a low accuracy result. Great if you just want to know the general area or city. If you want a more accurate result you also need to supply the Options object and enable high accuracy.&lt;/p&gt;
&lt;h3&gt;Extra options object&lt;/h3&gt;
&lt;p&gt;The options object is optional but has some important settings worth reviewing. From &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition#parameters&quot;&gt;MDN&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;maximumAge: A positive long value indicating the maximum age in milliseconds of a possible cached position that is acceptable to return. If set to 0, it means that the device cannot use a cached position and must attempt to retrieve the real current position. If set to Infinity the device must return a cached position regardless of its age. Default: 0.&lt;/li&gt;
&lt;li&gt;timeout: A positive long value representing the maximum length of time (in milliseconds) the device is allowed to take to return a position. The default value is Infinity, meaning that getCurrentPosition() won’t return until the position is available.&lt;/li&gt;
&lt;li&gt;enableHighAccuracy: A boolean value that indicates the application would like to receive the best possible results. If true and if the device can provide a more accurate position, it will do so. Note that this can result in slower response times or increased power consumption (with a GPS chip on a mobile device for example). On the other hand, if false, the device can take the liberty to save resources by responding more quickly and/or using less power. Default: false.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We can add the options by sending them with our request:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; geoOps &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;enableHighAccuracy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10000&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//10 seconds&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;geolocation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getCurrentPosition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;successCallback&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; errorCallback&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; geoOps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Geolocation callback&lt;/h3&gt;
&lt;p&gt;With our call complete, we now wait for our results in the success callback where we can use the location to enhance the user experience.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;successCallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;pos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lat &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lng &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;longitude&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Latitude : &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; lat &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; Longitude: &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; lng&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That is pretty much it. This extremely useful API can be used with your app, such as: showing location on a map, tracking, directions, or grabbing some weather data.&lt;/p&gt;
&lt;h2&gt;GeoLocation Limitations&lt;/h2&gt;
&lt;p&gt;Geolocation functionality is available in all major browsers (desktop and mobile), including IE - yeah, crazy I know. But just because it’s supported, doesn’t mean our code will always bring back a valid location. Here are a few main reasons why we might not get what we are looking for:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The Geolocation API will only work on secure contexts such as HTTPS. If your site is hosted on a non-secure origin (such as HTTP) the requests to get the users’ location will no longer function in most modern browser versions.
&lt;ul&gt;
&lt;li&gt;An exception to the HTTPS rule is local file:// testing which still works.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Geolocation API might be blocked by the user/settings. In most desktop/mobile operating systems users can block location services from being exposed to the browser. In addition, the user will be prompted to provide permission for an individual website as per W3C specifications.&lt;/li&gt;
&lt;li&gt;A request timeout can occur if the data takes too long to return. An optional PositionOptions object has a timeout setting representing the maximum length of time (in milliseconds) the device is allowed to wait for a return a position. The default timeout value is Infinity, which is a long time to wait. It’s a good idea to set a reasonable timeout. Even slower response times should be expected if using this in combination with &lt;code class=&quot;language-text&quot;&gt;enableHighAccuracy&lt;/code&gt; set to true.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Mapping the Location&lt;/h2&gt;
&lt;p&gt;Popular mapping APIs have their own techniques to get the user location. In most cases, this is just a wrapper around the Geolocation API with some additional properties that focus on use ease of use within the map environment. For example, Leaflet’s location function uses Geolocation and also provides some shortcuts to working with their map object, providing a copy of the lat/long pre-formatted to the leaflet standard. Overall this means we can use the GeoLocation API directly, or using Leaflet’s &lt;code class=&quot;language-text&quot;&gt;map.locate&lt;/code&gt; wrapper if we want to set additional options such as the map’s &lt;code class=&quot;language-text&quot;&gt;setView&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;maxZoom&lt;/code&gt;. The returned object just has a few minor differences.&lt;/p&gt;
&lt;h3&gt;Leaflet with vanilla Geolocation API&lt;/h3&gt;
&lt;p&gt;A brief example of getting the user location with the Geolocation API and adding to a map.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1rem&quot; &gt; &lt;iframe src=&quot;/html/2021-12-geolocation-api.html&quot; allowfullscreen=&quot;allowfullscreen&quot; frameborder=&quot;0&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;And below is the javascript code using the Geolocation API. With the results, it grabs the date, latitude, longitude, and accuracy from the return object and uses them with the map, popup, and prints some details to the page.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Setup Geolocation API options&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; gpsOptions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;enableHighAccuracy&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;maximumAge&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; gnssDiv &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;gnssData&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Geolocation: Success&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;gpsSuccess&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;pos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Get the date from Geolocation return (pos)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; dateObject &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timestamp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Get the lat, long, accuracy from Geolocation return (pos.coords)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; longitude&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; accuracy&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Add details to page&lt;/span&gt;
    gnssDiv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Date: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;dateObject&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; 
        &amp;lt;br&gt;Lat/Long: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;longitude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; 
        &amp;lt;br&gt;Accuracy: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;accuracy&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; (m)&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; radius &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; accuracy &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    layerGpsGroup&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;clearLayers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Zoom to the location&lt;/span&gt;
    map&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setView&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;longitude&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Add a marker and radius based on accuracy to map &lt;/span&gt;
    &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;marker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;longitude&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;layerGpsGroup&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;bindPopup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Lat/Long : &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;longitude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;openPopup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;circle&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;longitude&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; radius&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;layerGpsGroup&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Geolocation: Error&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;gpsError&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;warn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;Error: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;code&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Button onClick, get the the location&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getLocation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;geolocation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getCurrentPosition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gpsSuccess&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gpsError&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gpsOptions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Setup the leaflet map&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; map &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;map&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setView&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;44&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;79&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Toronto area set as default&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; osmTileLayer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;tileLayer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;maxZoom&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;attribution&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;amp;copy; &amp;lt;a href=&quot;https://www.openstreetmap.org/copyright&quot;&gt;OpenStreetMap&amp;lt;/a&gt; contributors&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; layerGpsGroup &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;layerGroup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[ArcGIS and Log4j Vulnerabilities]]></title><description><![CDATA[The investigation continues into the Log4j vulnerability (AKA Log4Shell) as CVE-2021-44228 was disclosed on December 9, 2021, and related…]]></description><link>https://www.spatialtimes.com/2021/12/arcgis-and-log4j-vulnerabilities/</link><guid isPermaLink="false">https://www.spatialtimes.com/2021/12/arcgis-and-log4j-vulnerabilities/</guid><pubDate>Wed, 15 Dec 2021 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The investigation continues into the Log4j vulnerability (AKA Log4Shell) as CVE-2021-44228 was disclosed on December 9, 2021, and related CVE’s (2021-45046, 2021-4104) were disclosed on December 14, 2021.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Article updated January 23, 2022: Added links to more software instructions (Workflow and GeoEnrichment Servers) and a Related Technologies section.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Is ArcGIS Software at Risk?&lt;/h2&gt;
&lt;p&gt;Like many enterprise software packages, ArcGIS server software uses the OpenSource Log4j module - so regardless if exploitable, take all mitigation measures available.&lt;/p&gt;
&lt;p&gt;As of writing, no exploits have been identified with ArcGIS products. However, closing the potential vulnerability is still best practice and highly recommended. Errr, this is more than a recommendation - &lt;strong&gt;mitigate by patching regardless&lt;/strong&gt;. Even if you are using the Windows version of ArcGIS Server/Enterprise/Portal, the ArcGIS software uses Java behind the scenes - the Web Adaptor is then used to proxy traffic from Windows IIS to the real GIS server itself. So Linux or Windows, whatever version, fix it.&lt;/p&gt;
&lt;p&gt;Props to Esri as they’ve been researching and posting on the situation since the start on their &lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-enterprise/administration/arcgis-software-and-cve-2021-44228-aka-log4shell-aka-logjam/&quot;&gt;blog&lt;/a&gt;. Keep checking their pages as they update daily. At this point, Esri has already posted scripts to help mitigate the threat across many of their server products. This ST article was delayed until now for this reason.&lt;/p&gt;
&lt;h2&gt;Which Esri Software is Vulnerable?&lt;/h2&gt;
&lt;p&gt;There are only &lt;em&gt;&lt;strong&gt;potential&lt;/strong&gt;&lt;/em&gt; vulnerabilities at this point. Esri currently stated there are no known exploits with ArcGIS products. However, be diligent and take the recommended mitigation measures now.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“No known exploit available for any version of a base ArcGIS Enterprise deployment (including the ArcGIS Server, Portal for ArcGIS, and ArcGIS Data Store components) or stand-alone ArcGIS Server at this time” ~&lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-enterprise/administration/arcgis-software-and-cve-2021-44228-aka-log4shell-aka-logjam/&quot;&gt;esri blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So if you are using ArcGIS server technologies (all 10.x releases), use the links below to start patching.&lt;/p&gt;
&lt;p&gt;Software to patch with links to the script downloads and instructions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/Technical-Article/000026951&quot;&gt;ArcGIS Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/Technical-Article/000026950&quot;&gt;Portal for ArcGIS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/Technical-Article/000026949&quot;&gt;ArcGIS Data Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/Technical-Article/000026956&quot;&gt;ArcGIS GeoEvent Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en/technical-article/000026970&quot;&gt;ArcGIS Workflow Manager Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/Technical-Article/000026982&quot;&gt;ArcGIS GeoEnrichment Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Script Success&lt;/h2&gt;
&lt;p&gt;After going through the workflow, it is pretty straightforward. I successfully ran the &lt;code class=&quot;language-text&quot;&gt;--list&lt;/code&gt; command with no issues. The only hiccup I had was running the actual &lt;code class=&quot;language-text&quot;&gt;--delete&lt;/code&gt; command. I was logged in as an Administrator, but I still had to open the Command Prompt with “Run as administrator” for the second execution to work properly. Otherwise, everything went smoothly. Note: It automatically makes backups of the files for you too which is a nice touch. Update: instruction pages do explain the admin access in more detail now.&lt;/p&gt;
&lt;p&gt;Now, stop reading, start patching.&lt;/p&gt;
&lt;h2&gt;Related Technologies&lt;/h2&gt;
&lt;p&gt;Related technology/software notes (added Jan 06, 2022 from Esri blog updates):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArcGIS Notebook Server: The underlying framework does not contain or for 10.7x does NOT include the vulnerable JMSAppender class. The Docker container image contains Log4j, however for a person to be able to execute the component they would need to be granted permissions to the notebook container, so Log4j does not present additional RCE risk in this configuration. A patch will be made available in the future regardless.&lt;/li&gt;
&lt;li&gt;ArcGIS Online: Esri continues to perform patching of ArcGIS Online systems including some updates with the latest log4j version of 2.17 and is continuing to evaluate the CVE as well as all relevant third-party fixes as they become available.&lt;/li&gt;
&lt;li&gt;Esri Managed Cloud Services: EMCS Advanced and Advanced+ have implemented web filter mitigations for Log4j vulnerabilities and have applied the scripts that remove the JNDILookup class to all affected systems.&lt;/li&gt;
&lt;li&gt;ArcGIS Monitor: Does not contain Log4j&lt;/li&gt;
&lt;li&gt;ArcGIS Pro: All ArcGIS Pro versions under General Availability support contain Log4j, but are not known to be exploitable as the software does not listen for remote traffic.&lt;/li&gt;
&lt;li&gt;Esri Geoportal Server: This open source product was updated to version 2.65 on Dec 17th to resolve Log4j issues, please upgrade to this latest release.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-enterprise/administration/arcgis-software-and-cve-2021-44228-aka-log4shell-aka-logjam/&quot;&gt;Esri Blog post on Log4j&lt;/a&gt;, updated frequently&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trust.arcgis.com/en/documents/&quot;&gt;Esri Trust Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cisa.gov/uscert/apache-log4j-vulnerability-guidance&quot;&gt;CISA Log4j Vulnerability Guidance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Pro Favorites and Folders]]></title><description><![CDATA[ArcGIS Pro has been able to store favorites since the 2.x releases. How this is managed in Pro has changed slightly over the years. Well, I…]]></description><link>https://www.spatialtimes.com/2021/09/arcgis-pro-favorites-and-folders/</link><guid isPermaLink="false">https://www.spatialtimes.com/2021/09/arcgis-pro-favorites-and-folders/</guid><pubDate>Tue, 21 Sep 2021 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ArcGIS Pro has been able to store favorites since the 2.x releases. How this is managed in Pro has changed slightly over the years. Well, I guess it started with no favorites, but we don’t like to talk about Pro 1.x so let’s just pretend it never happened. If you have corporate database connections or projection files, setting this up for users makes day-to-day GIS’ing a little easier.&lt;/p&gt;
&lt;h2&gt;A Short History of Favorites&lt;/h2&gt;
&lt;p&gt;Setting favorites in ArcGIS Desktop (ArcMap/Catalog) was a mixed bag of files and locations: database connections could be copied into your roaming profile folder; Custom/favorite projections files stored in a different folder; Folders shortcuts stored in the &lt;code class=&quot;language-text&quot;&gt;ArcCatalog.gx&lt;/code&gt; binary file. From that point forward they would be available in every MXD or ArcCatalog instance. Overall, this worked great with the files stored locally (per user), not great if you wanted shared favorites throughout the organization.&lt;/p&gt;
&lt;p&gt;Some of this ArcGIS Desktop ’&lt;em&gt;favorite location chaos&lt;/em&gt;’ has been fixed in ArcGIS Pro. The binary GX folder favorites have been replaced with a JSON file and extracted from the binary. As well, you can store some favorites on a shared network which makes corporate updates easier to deploy. However, there are still a few locations where favorites might exist and a new JSON schema that is worth reviewing.&lt;/p&gt;
&lt;h2&gt;Favorites &lt;em&gt;Pro&lt;/em&gt; Every Occasion&lt;/h2&gt;
&lt;p&gt;There are many types of ArcGIS Pro favorites you might want to set up for yourself or your organization, this includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Database Connections&lt;/li&gt;
&lt;li&gt;Server Connections (ags, wms, wcs, etc)&lt;/li&gt;
&lt;li&gt;Folder Connections (shortcuts)&lt;/li&gt;
&lt;li&gt;Projections (prj files)&lt;/li&gt;
&lt;li&gt;Custom Transformations&lt;/li&gt;
&lt;li&gt;Custom Style File&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 558px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/fc2f5caed528a20ba8b5e15af12ac04e/65207/proFavFolder_favorites.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 92.60000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAIAAAAf7rriAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACFklEQVR42pWT2W4UMRBF+/8/iBdeWKUIiQAJk0CYoGFsd7u87y5Pkm7UPUMStkBK15Zfjur6utw9WekXa7Pqw0cWVn04If6EuL/pA3HvtvZ4Y44u+MvP0IFUxpjorVRq4LxhGa93N1ftnvDufN2m8Waaplb8asO7EEJKycdIpN1wHXKpDQveKeOuYKuLdEhH51+fn26eHq9fnbMupOx8CCGmnHJOaVa+VUwpRQjBGetqrT6Vt18un72/fH1G3qyhI8LTAQglW0ppP6ScsbWKuFcuxTuqpGCMaa3HcZymcdmnMyI7KdaMfWNssNbGnBd7eB+OwRpjhBAAwnvfGu7hc6o7qSilBIRwzjkfsO3abtYt7JzRWkspAYBzLqXc7XYHGMD0hPQD3877IKWSSimt9/5zqabfaAkghFIKEWOMFXGaxrOt7JTkPaM95yHGEKPz3vngvM+lYMNca9heGMFBSGvNtNTe9ieqO28uARgHWRGxtVsdbNdi1CAABs5jjOM4Xi116FyxVKzzwj+o1Nobq7S1xlhrU0rjIeyl8y/x/g5zZaTUWmshRErpJ9sPkItttHIwQsD8VJBzfgRcKio1SAFKzZ1jjI+De93zOS++f+Qlrek/bVejwBmttJ4/X4xL2NfTeEj7QXiebWWMBhD7wbpn2/wHbLhzVknVGl79qHk8yb/vXJ3qOR8oY5Qx1s9FKC05nW7gO9yVM9rqNczvAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Pro Favorites&quot;
        title=&quot;&quot;
        src=&quot;/static/fc2f5caed528a20ba8b5e15af12ac04e/65207/proFavFolder_favorites.png&quot;
        srcset=&quot;/static/fc2f5caed528a20ba8b5e15af12ac04e/0eb09/proFavFolder_favorites.png 500w,
/static/fc2f5caed528a20ba8b5e15af12ac04e/65207/proFavFolder_favorites.png 558w&quot;
        sizes=&quot;(max-width: 558px) 100vw, 558px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The abnormally wide table below compares the new ArcGIS Pro favorites locations with ArcGIS Desktop.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Favorite&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;ArcGIS Pro&lt;/th&gt;
&lt;th&gt;ArcGIS Desktop&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Database Connection&lt;/td&gt;
&lt;td&gt;.sde, .odc&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\ArcGISPro\Favorites\&lt;strong&gt;Favorites.json&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\Desktop10.x\ArcCatalog\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server Connection&lt;/td&gt;
&lt;td&gt;.ags, .wms, .wcs, .wfs, .wmts&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\ArcGISPro\Favorites\&lt;strong&gt;Favorites.json&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\Desktop10.x\ArcCatalog\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Folder Connection&lt;/td&gt;
&lt;td&gt;UNC path&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\ArcGISPro\Favorites\&lt;strong&gt;Favorites.json&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\Desktop10.x\ArcCatalog\&lt;strong&gt;ArcCatalog.gx&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Projection&lt;/td&gt;
&lt;td&gt;.prj&lt;/td&gt;
&lt;td&gt;%AppData%\&lt;strong&gt;Local&lt;/strong&gt;\Esri\ArcGISPro\Favorites\&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\Desktop10.x\ArcMap\Coordinate Systems\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom Transformation&lt;/td&gt;
&lt;td&gt;.gtf&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\ArcGISPro\ArcToolbox\&lt;strong&gt;CustomTransformations&lt;/strong&gt;\&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\Desktop10.x\ArcToolbox\CustomTransformations\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toolbox&lt;/td&gt;
&lt;td&gt;.tbx&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\ArcGISPro\Favorites\&lt;strong&gt;Favorites.json&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\Desktop10.x\ArcToolbox\My Toolboxes\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Style&lt;/td&gt;
&lt;td&gt;.style, .stylx&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\ArcGISPro\Favorites\&lt;strong&gt;Favorites.json&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;%AppData%\Roaming\Esri\Desktop10.x\ArcMap\&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In the table, &lt;em&gt;%AppData%&lt;/em&gt; refers to the local user’s AppData directory (&lt;code class=&quot;language-text&quot;&gt;C:\Users\&amp;lt;user_name&gt;\AppData&lt;/code&gt;). This folder is hidden in Windows by default. Enable show hidden items to browse if needed. Beyond that, almost everything in ArcGIS Pro is in the roaming section except for Projections which uses the &lt;em&gt;local&lt;/em&gt; subdirectory.&lt;/p&gt;
&lt;p&gt;Most favorites are now managed by the &lt;code class=&quot;language-text&quot;&gt;Favorites.json&lt;/code&gt; file. This file is located in &lt;code class=&quot;language-text&quot;&gt;%AppData%\Roaming\Esri\ArcGISPro\Favorites&lt;/code&gt; and can contain more than just the Favorites.json file. By default, this is where new favorite files will be created and managed by the favorites pane in ArcGIS Pro. But remember, it’s the JSON file that is the real favorites list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you create a favorite by marking an existing item (sde/server connection file), it will copy the file into the favorites folder &lt;strong&gt;AND&lt;/strong&gt; will add the entry to the favorites.json file.&lt;/li&gt;
&lt;li&gt;If you create a new favorite from the favorites pane, it will create the new file in the favorites folder &lt;strong&gt;AND&lt;/strong&gt; will add the entry to the favorites.json.&lt;/li&gt;
&lt;li&gt;If you manually copy files into the favorites folder it will not show in your favorites list unless you update the favorites.json file manually.&lt;/li&gt;
&lt;li&gt;Removing an item from your favorites list in ArcGIS Pro will update the Favorites.json but will not delete the file itself.&lt;/li&gt;
&lt;li&gt;Creating a folder favorite doesn’t create a shortcut file, it just updates the JSON file with a new virtual entry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 569px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9bcd3e84421bef261d2200724aac11ab/7ca0c/proFavFolder_json.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 83%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABPklEQVR42pVT7XLCMAzj/V+TrRCatLGT1Pn2jpj1BscB0y81rRxLdg8X3GKMpeQQC/8TB+79dJnnFX0srTVm7n/wTszcmS3g99fRe4+Iy7JorY0x60AayDnvRPhNzMzWWq21vCCiOJBSooH4C+Fy3nu/iQFwnmepLd9JeTHyqm1mRsTz+ay1nud5GUDEj8SBYkiZuddaW2tvc7oT19ZXcOfTKYQAABKVtbaUknMupdRady6Pd21ba5VSYtgNeO+JyHsfQiCiEILwbduI6NHzsixyw17+ozmPtGGaJq21UsoMAMDrtG5iimmLubWa0tVVG/gktqs4lbpiWIwRbyEE8Szhv6h1kNN1XY/HIxE556y1+6gR0TkHALKPzz27sdX/GvLdqKZpMsYopQBA1lP+sHdLUmtKaZ+krP7TPh/EP8Sw5QWBKHQKAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Pro favorites.json file&quot;
        title=&quot;&quot;
        src=&quot;/static/9bcd3e84421bef261d2200724aac11ab/7ca0c/proFavFolder_json.png&quot;
        srcset=&quot;/static/9bcd3e84421bef261d2200724aac11ab/0eb09/proFavFolder_json.png 500w,
/static/9bcd3e84421bef261d2200724aac11ab/7ca0c/proFavFolder_json.png 569w&quot;
        sizes=&quot;(max-width: 569px) 100vw, 569px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Coordinate System Projection file favorites&lt;/h3&gt;
&lt;p&gt;The list of coordinate systems to show in your favorites list is an odd duck and managed separately:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All PRJ files in the user-based favorite directory are considered favorites automatically, with no related JSON configuration.&lt;/li&gt;
&lt;li&gt;Marking an out-of-the-box projection as a favorite will create a PRJ file and place it into the user-based directory.&lt;/li&gt;
&lt;li&gt;Removing a projection from your favorites will delete the local PRJ in the directory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 705px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6b890beef38839dabd4ee52588f42a79/f8d10/proFavFolder_projections.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.800000000000004%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAB1UlEQVR42n3Sy3LTMBQGYL//w1AYhhULljBAaUMubePEsaPEsiRLOroe2akdxkkXLAj/fHNGWkj6F8pK6QvhttxVrdchQUAICWIyMcHbFrWPf1Mu2IilgKxhXLZCKSll64x2RlutQLWgJWKICX3wqUuTa7qECU+nTriQzSu22PMttzkzm2na/DLnRJRCWWNaKUOMIU7B6b7oQ0gJqbLZ5435tLYf5uxuVt/N6vcz+u7h8HEl757gnpg+4TiOwzCM4+id01oPw/A6DOfzWZiQral+qdXzob16ImLLza71W+EbCIjR+QAGpge9t26KBmOtqRqRNYwxehC8kYKpVghGMfo+YZ9iwhgQnXNSyhCuxaNzDox1zhY1z1owFSGtUgpAgTHOx9SFiG9wgildF1MTRI84nPqHA2Q2RLLf10fCaM1YwxkFrfquO/U3dV06j5fD0rqfy833VXH/Uv1ak/uX/aKkOdV5Y25ZUyi4fSx5xqVe5NXvDZnl1Wxdrsqm4rBjasfNLQWDSthnwrOmlYSQY308HKdEjN2l2C19P81hOBEusxiDN9qB8ha8hVOH/3H5XRhjeO0ilzqbHfVTY1ZX1CxrWNJ/W1F4PJpvhfpayB/54cty/weGctLVmAqskAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Pro Coordinate System Favorites&quot;
        title=&quot;&quot;
        src=&quot;/static/6b890beef38839dabd4ee52588f42a79/f8d10/proFavFolder_projections.png&quot;
        srcset=&quot;/static/6b890beef38839dabd4ee52588f42a79/0eb09/proFavFolder_projections.png 500w,
/static/6b890beef38839dabd4ee52588f42a79/f8d10/proFavFolder_projections.png 705w&quot;
        sizes=&quot;(max-width: 705px) 100vw, 705px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Custom Transformations&lt;/h3&gt;
&lt;p&gt;Similar to projections, these have their own location and complexities. First off, these aren’t &lt;em&gt;really&lt;/em&gt; favorites, more of a local user configuration. Still worth mentioning as it leverages the user profile and there is no interface to manage these inside ArcGIS Pro. Just place the GTF file into the folder and Pro will pick up the settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A custom GTF is stored in its user-based favorite directory.&lt;/li&gt;
&lt;li&gt;A custom GTF may require a custom binary grid shift file (.gsb) in the Projection Engine resource directory (&lt;code class=&quot;language-text&quot;&gt;resources\pedata&lt;/code&gt; directory).&lt;/li&gt;
&lt;li&gt;Make sure the transformation settings match the names of the projection files (if they are custom too) for the transformation to show as an option.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: Normally, the transformation will not show in any tools as being an available option if the complementing .gsb file is missing (i.e. Canadian NTv2 files). However, some tools will mistakingly still list them - such as the transformation properties of mosaic datasets. For the mosaic situation, this can lead to the issue where the transformation will not take place even if specified. Still, on mosaic properties, it appears there might be a bug where the transformation is still ignored even if both files exist (further investigation is still required as to the cause and might be isolated).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Pro Favorites, Folders, and JSON&lt;/h2&gt;
&lt;p&gt;As you can see from the favorites table earlier, ArcGIS Pro (currently 2.8.3) still has multiple favorite folder locations; and the roaming favorites folder doesn’t manage favorites at all beyond it being where the &lt;code class=&quot;language-text&quot;&gt;Favorites.json&lt;/code&gt; file resides. Most favorites can be managed directly in the JSON file or use ArcGIS Pro’s interface to keep the JSON file up-to-date. For deploying favorites to many users, just make a single JSON file and push to all user roaming directories and keep the related files in a single shared drive for easier updates.&lt;/p&gt;
&lt;p&gt;Again, the JSON file doesn’t include coordinate systems or custom transformations at this time - both of these are  managed in their own user-based favorites folder with no JSON file or shared network options. &lt;a href=&quot;https://community.esri.com/t5/arcgis-pro-ideas/add-projections-favorites-to-favorites-json/idi-p/1100234&quot;&gt;Maybe we can make an Ideas Page?!&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The User Config File&lt;/h2&gt;
&lt;p&gt;Although not a managed favorite, an honourable mention to ArcGIS Pro configuration files. These have a few settings that can be managed by users or administrators via XML files. Yes, because using JSON here wouldn’t make sense I guess?! In ArcGIS Pro, the &lt;code class=&quot;language-text&quot;&gt;user.config&lt;/code&gt; file stores personalized preferences such as geoprocessing, search, and mapping properties. The file also stores the location of recent projects accessed from the start page in ArcGIS Pro.&lt;/p&gt;
&lt;p&gt;User &lt;code class=&quot;language-text&quot;&gt;user.config&lt;/code&gt; configuration file is an XML file located in the user profile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Pro 2.5 and below: C:\Users\&amp;#x3C;user_name&gt;\AppData\&lt;strong&gt;Local&lt;/strong&gt;\ESRI\ArcGISPro.exe_StrongName_&lt;STRONGNAME&gt;\&lt;VERSIONNUMBER&gt;&lt;/li&gt;
&lt;li&gt;In Pro 2.6 and above: C:\Users\&amp;#x3C;user_name&gt;\AppData\&lt;strong&gt;Roaming&lt;/strong&gt;\ESRI\ArcGISPro.exe_StrongName_&lt;STRONGNAME&gt;\&lt;VERSIONNUMBER&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Admin configuration can be created to control a subset of settings from a shared location. This can either be set during an ArcGIS Pro silent install or by editing the Windows Registry. It only controls 4 settings currently: UseLocalHelp, EnableIndexing, IndexNetworkConnections, and SkipServerConnections. This &lt;code class=&quot;language-text&quot;&gt;Pro.settingsConfig&lt;/code&gt; XML file is further described in the &lt;a href=&quot;https://pro.arcgis.com/en/pro-app/latest/get-started/application-setting-management.htm&quot;&gt;Online Help Application Settings&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en/technical-article/000012437&quot;&gt;FAQ Favorite Projections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-pro/data-management/migrate-folder-database-and-server-connections-from-arcgis-desktop-to-arcgis-pro/&quot;&gt;Migrating Favorites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pro.arcgis.com/en/pro-app/latest/help/projects/project-favorites.htm&quot;&gt;Project Favorites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pro.arcgis.com/en/pro-app/latest/help/projects/connect-to-a-database.htm#ESRI_SECTION1_D8FE65665DB14DF49CDBDC90ECEF7889&quot;&gt;Database Favorites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: Microsoft Stock Photo (modified) Sept 21, 2021.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[2021 AODA WCAG Content Compliance in Ontario]]></title><description><![CDATA[Public web content in Ontario must meet Web Content Accessibility Guidelines (WCAG) 2.0 AA as of January 1, 2021. This shouldn’t be a shock…]]></description><link>https://www.spatialtimes.com/2021/08/2021-aoda-wcag-content-compliance-in-ontario/</link><guid isPermaLink="false">https://www.spatialtimes.com/2021/08/2021-aoda-wcag-content-compliance-in-ontario/</guid><pubDate>Sun, 08 Aug 2021 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Public web content in Ontario must meet Web Content Accessibility Guidelines (WCAG) 2.0 AA as of January 1, 2021. This shouldn’t be a shock as the Accessibility for Ontarians with Disabilities Act (AODA) has been around since 2005 and is intended to “reduce and remove barriers for people with disabilities so that Ontario can become more accessible and inclusive for everyone”. Sounds great, no arguments here.&lt;/p&gt;
&lt;p&gt;Although how are organizations in Ontario doing 16 years later with new compliance rules in effect? And what does AODA/WCAG really mean when it comes to accessibility? Let’s take a quick look into the world of AODA and content accessibility.&lt;/p&gt;
&lt;h2&gt;What is AODA and public content compliance&lt;/h2&gt;
&lt;p&gt;With the January 1, 2021 AODA compliance date now behind us, businesses and non-profits in Ontario with 50 or more employees had make their public web content accessible based on Web Content Accessibility Guidelines (WCAG) 2.0 AA (with a few exceptions). On top of that, companies are required to submit a compliance report to the Government on June 30, 2021 (extended deadline). Designated public sector organizations, including municipalities and other identified organizations must file by December 31, 2021 (and every two years).&lt;/p&gt;
&lt;p&gt;Current AODA Web content exceptions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WCAG Success criteria 1.2.4 (live captions)&lt;/li&gt;
&lt;li&gt;WCAG Success criteria 1.2.5 (audio descriptions)&lt;/li&gt;
&lt;li&gt;Web content published before Jan 1, 2012&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The approach for accessible web content seems simple enough: verify your public web content (web pages and related public documents) meet WCAG 2.0 AA and file a report every few years to let the government know you are compliant. Easy peasy. There is also some incentive, oops, I mean possible penalties in the form of fines. Up to $50,000 for an individual, or $100,000 for a Corporation… &lt;strong&gt;per day&lt;/strong&gt;! Oh, and potential fines up to $50,000 per day to directors or officers of a corporation. Incentive. However, the government isn’t driven by potential revenue (they can just raise taxes) so expect much smaller fines or even just some warnings and proof of a strategy to fix issues over the next few years. This makes sense as the intent is long term accessibility, not fines.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7cbd4780c930b7ea6647a0c9007fcb15/78d47/accessibilityLogos.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 22.799999999999997%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAADK/AAAyvwF6t4D2AAABPElEQVR42gExAc7+AEpufXtodEVxfxh1izN+fWqebU2NcB5zhyV4iTiRoTaPoCV3iCB0hkV9h1iCiS13hBl0i06CcYeTU0uDeADgZWz+nZ/be4RIbm+qyXDy8avZ4HhWkGJFoLmF0duS1eBNpLVHdHqompDVx79wfoFSgm/ztR7/4YjywksA+GVq5aeq8Wx5m3dVwNtW9PXo8fGvirFMYrvRwOXqveTqZL7Ob3172MzG2NfSkYyPm5VK/8Ah9M54/9FQAOVmbPxwdNlVX051eaDAR+3rjc7WSliSY0miu4PR3HLJ10Ohsk97gMq8ts+8s3SAglWDbvW6KP/EIvW6KgBMbHuAYG1IcH8XdYs1f31mmVFPjmoec4kkeIk6kqM7kqIkd4ggdIZCdn9VfIEveIYXc4xRg22OllBOgWwzZ6Jn/KZI0gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Visual representation of disability types such as cognitive, visual, auditory, motor, and speech&quot;
        title=&quot;&quot;
        src=&quot;/static/7cbd4780c930b7ea6647a0c9007fcb15/78d47/accessibilityLogos.png&quot;
        srcset=&quot;/static/7cbd4780c930b7ea6647a0c9007fcb15/0eb09/accessibilityLogos.png 500w,
/static/7cbd4780c930b7ea6647a0c9007fcb15/78d47/accessibilityLogos.png 800w&quot;
        sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;The Status of AODA web content in 2021&lt;/h2&gt;
&lt;p&gt;So how are we doing? Are most websites and public documents WCAG 2.0 AA compliant? In short, it doesn’t look very good. Almost all sites I visit have an abundance of errors - although some are more obscure than others. However, many organizations are most likely submitting their compliance reports stating their content is sufficient. But this isn’t as nefarious as it seems. Companies are likely attempting to be truthful, but they just aren’t aware of the non-compliance. And at what point do you say a website isn’t compliant? If 2 web pages aren’t compliant out of 500? 20 pages? What if the website is compliant but not the related documents? Is attempting compliance the same as being compliant? (answers: Unknow, maybe, maybe, not compliant, no/maybe)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2020 Accessibility Compliance Report Question #9: Other than the requirements cited in the above questions, is your organization complying with all other applicable requirements in effect under the Information and Communications Standards?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Issues exist everywhere. Case and point: The Ontario Government web page where you download the &lt;a href=&quot;http://www.forms.ssb.gov.on.ca/mbs/ssb/forms/ssbforms.nsf/FormDetail?OpenForm&amp;#x26;ACT=RDR&amp;#x26;TAB=PROFILE&amp;#x26;SRCH=&amp;#x26;ENV=WWE&amp;#x26;TIT=0237&amp;#x26;NO=009-00237E&quot;&gt;2020 Compliance Report&lt;/a&gt; doesn’t pass an accessibility checker. That’s right, the “steps to open and complete form” list on the page, isn’t a proper list and doesn’t have proper list items. Technically, not passing WCAG 2.0 AA. As we will discuss below, this isn’t necessarily a complete fail or reflection of the bigger site. To be honest, the Ontario.ca site is one of the better sites for meeting WCAG 2.0 AA (especially considering the size and volume of tables/charts). Let’s say this specific example is more of a typo, and likely be be corrected when the next form is posted.&lt;/p&gt;
&lt;p&gt;Wondering how other companies could think non-compliant websites are compliant? Well, a big part of this is based on there not being a fast, easy, automated way to check. But wait, what about all those “accessibility checkers”? Those are a great start but they can’t check everything. An automated check can tell you if the page is non-compliant, but it &lt;strong&gt;can’t&lt;/strong&gt; tell you if a page &lt;strong&gt;is&lt;/strong&gt; compliant. How can an automated check determine if a line of text is supposed to be a paragraph, a heading, or in a list? Is that cell in a table supposed to be a header or data cell? Sure, maybe one day the checkers will use AI to fill this gap, but we aren’t there yet. For now, final review of content accessibility continues to be manual process. This is true for both websites and documents (docx, pdf, etc). Side note: Manual review isn’t complicated, nor does it take long - but it’s still manual and you need to know what to look for.&lt;/p&gt;
&lt;h3&gt;Accessibility Checkers&lt;/h3&gt;
&lt;p&gt;There are lots of free and extremely useful accessibility checkers out there. As well, Microsoft Word continues to improve its built in Accessibility tools, along with Adobe Pro for PDFs. Please use these tools as they are a great starting point.&lt;/p&gt;
&lt;p&gt;Great/free accessibility checkers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wave.webaim.org/&quot;&gt;WebAIM Web accessibility evaluation tool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webaim.org/resources/contrastchecker/&quot;&gt;WebAIM Contrast Checker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://achecker.achecks.ca/checker/index.php&quot;&gt;AChecker Web Accessibility Checker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are also some amazing subscription/cost based checkers that have additional features, automated scheduling, and can crawl the entire site. But regardless of the checker used, we can’t stop there. A manual review is still needed. Remember, the automated checker can’t tell us if a page or document is fully WCAG 2.0 AA compliant. The Adobe Pro Accessibility checker can’t tell us if our PDF is fully accessibile either (it actually tells you a manual check is required for specific items like Reading Order).&lt;/p&gt;
&lt;h3&gt;Accessibility typos&lt;/h3&gt;
&lt;p&gt;If you are striving for accessibility and staff have the proper training to catch and fix issues, you are well on your way to success. We can’t expect accessibility perfection (sadly). There will always be spelling error (typos) that sneak by, and there will most likely be accessibility typos too. Since part of WCAG requires a manual check, the chance for human error/omission remains. Personally, I don’t think finding a single small accessibility typo means a website fails (Ontario.ca). Although if an issue is built into your website framework, it could mean that every single page technically isn’t compliant.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 424px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4ddde6f571950149673c0373ce324d48/4910e/accessibilityTypo.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 35.37735849056604%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAA7BAAAOwQG4kWvtAAABGElEQVR42mNg8KqHIs86BrcaBvdaRu8GGKpn8qpn9G5gArPBqAGh3queAa6T3b9JPKqLN7iVwa2G0bOOwb2Wwa2WwbMBZKJbDQNUpAZdM6NXPYNHrXLyRK/6JQY504XDO4RC20UiOqXj+829S6Wju1RTJ3H6N4tHdcnG9WKz2aue1bfRIGsai0+DTuZU25K5JuWLKssmJiU329cu0UqfbF0yRz9nunnhbIGwdpDXUJ1dz+LT4FA+nyeoRSC4zalmiZRTcVJYuVTSJIvC2Sb5s8Qiu9TTJutnT2f1bQR5Ac1mBrDjGTxq1VInKSZN4HAq5QBx63SzpgqEtjO4VoP0gBA2ZyMZAQ4bn0ZGL3DYutcyeELDmRFVJQC3NXwA8eOPowAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Spelling Typo Example&quot;
        title=&quot;&quot;
        src=&quot;/static/4ddde6f571950149673c0373ce324d48/4910e/accessibilityTypo.png&quot;
        srcset=&quot;/static/4ddde6f571950149673c0373ce324d48/4910e/accessibilityTypo.png 424w&quot;
        sizes=&quot;(max-width: 424px) 100vw, 424px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The goal of a good accessible website is to start with a good and accessible framework/template. This framework will set default fonts, sizes, proper heading styles, colours, and other features that give the opportunity to be WCAG 2.0 AA compliant. Next we need good content that uses the the appropriate styles and features to meet WCAG 2.0 AA. This really means that &lt;strong&gt;creating accessible content is everyones responsibility&lt;/strong&gt;. If we are involved in the technology or the content (website, document), we should keep accessibility in mind.&lt;/p&gt;
&lt;h3&gt;Side-bar: The Co-operators Group&lt;/h3&gt;
&lt;p&gt;A shout-out to the Co-operators group for being open about their content accessibility struggles. In January 2021, the Co-operators group published a web page on &lt;a href=&quot;https://digital.cooperators.ca/design/pdf-accessibility-guide.html&quot;&gt;PDF Requirements &amp;#x26; Guides&lt;/a&gt; that acknowledged they were non-compliant with their public PDFs by the Jan 2021 deadline. They go on to explain their goal to fix this issue by setting project with target date (March 31, 2021) along with training and remediation plans. They would also send bi-weekly email updates on the status to various teams on the project.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 535px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/87a7b33612c3ea9fa63166594361be25/b5bcd/theCooperators.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABHklEQVR42jVQXUsCURDdHxVB0GuRWEImClthBT0UUVFv7u7M3LsfGu6nq5S2oAtrGZYJvgVB9Mti790O83DOmYE5HIWITAQTgSOQABAjIiSGkjAmOYpt4QuhmAj3tlsNZ7eOzwiRmAMaR7BBt0EzQXdAc6AluMHEGwdaRMQRlEaQbQy/155/T9ykGs22Bqtjd3xnu6qfHnnji06/HkwPwlfVS8vxohQv60FWC17K8eL84VHZ672vj342n77OukPVT/ejt9Pu6LodNoJM9SZNN9kerHbjj6abVHrzUvx56E0qvXktmN44fh77qh3t9JeXnVgG5giMkBNYoHM0NG5ZaHACEwwLDI6QS3GmyPQGM0VhjIpW5OQlySL+/YJI/AG8oLV/4dDNHQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;The Co-operators Logo&quot;
        title=&quot;&quot;
        src=&quot;/static/87a7b33612c3ea9fa63166594361be25/b5bcd/theCooperators.png&quot;
        srcset=&quot;/static/87a7b33612c3ea9fa63166594361be25/0eb09/theCooperators.png 500w,
/static/87a7b33612c3ea9fa63166594361be25/b5bcd/theCooperators.png 535w&quot;
        sizes=&quot;(max-width: 535px) 100vw, 535px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We are working towards a target date of completion of March 31, 2021. A few key things about this – if we are audited by the Ministry, we want to have a date to provide them as part of our overall action plan.” &lt;em&gt;~ Source: Co-operators (website quote)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As this Co-operators web page is focused on PDF Accessibility Requirements &amp;#x26; Guides, there is also a wealth of information on making WCAG 2.0 AA compliant PDF. This is an excellent resource overall. Please note there are some minor guidance issues (section on PDF reading order). That said, this is still a great resources to add to your collection.&lt;/p&gt;
&lt;h2&gt;Accessibility can be sexy and good for business&lt;/h2&gt;
&lt;p&gt;Thankfully we don’t need to choose between visually appealing or accessible content. We can, and should, strive for both with public content (web, documents). Matter of fact, why limit this to public content?! If we update our approach to all organizational content, even better. This would add to awareness, everyone would have more experience making accessible content, and makes our organizations more inclusive to draw the best talent.&lt;/p&gt;
&lt;p&gt;Why wouldn’t you want to promote your organization to the 61 million adults in the US that live with a disability? With 26% of adults in the US having some type of disability (&lt;a href=&quot;https://www.cdc.gov/ncbddd/disabilityandhealth/infographic-disability-impacts-all.html&quot;&gt;CDC&lt;/a&gt;), an accessible website can lead to more business opportunities.&lt;/p&gt;
&lt;p&gt;There is no sacrifice here. If we think of our visual and accessibity outcomes while we develop a document or website, both can be acheived with little extra effort. If we ignore accessibility until the end, the remediation effort can be significant.  There are some really great examples of visually appealing websites and documents that are also WCAG 2.0 AA compliant (and Section 508 for that matter).&lt;/p&gt;
&lt;h2&gt;Lets keep moving forward with accessibility&lt;/h2&gt;
&lt;p&gt;I recognize that not every web page or app can be fully accessible. Having alternate formats or willingness to help the public are part of an accessibility plan too. Since this site discusses maps and apps in many cases, I realize this is one of the bigger gap areas for accessibility. But even if our maps can’t be fully accessible, keep moving forward and add as many accessible features as you can. When creating a map, use colours and shapes to your advantage. If you are working on developing a new app, add accessibility requirements to your success criteria (remember it’s easier to include accessibility upfront). If leveraging  an Esri Story Map, use one with &lt;a href=&quot;https://www.esri.com/arcgis-blog/products/story-maps/constituent-engagement/more-new-accessibility-features-in-story-maps/&quot;&gt;improved accessibility features already setup&lt;/a&gt; for you.&lt;/p&gt;
&lt;p&gt;And have fun with it. Use your creativity to find new and innovative ways to include accessibility features in your public content. Contribute code to public repositories that have accessibility baked in. Share your findings and WCAG 2.0 tips with others. Hmmm, that gives me some ideas for future articles too.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wave.webaim.org/&quot;&gt;WebAIM Web accessibility evaluation tool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webaim.org/resources/contrastchecker/&quot;&gt;WebAIM Contrast Checker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://achecker.achecks.ca/checker/index.php&quot;&gt;AChecker Web Accessibility Checker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cdc.gov/ncbddd/disabilityandhealth/infographic-disability-impacts-all.html&quot;&gt;CDC Disability impacts all&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: &lt;a href=&quot;https://unsplash.com/@untodesign_?utm_source=unsplash&amp;#x26;utm_medium=referral&amp;#x26;utm_content=creditCopyText&quot;&gt;Daniel Ali&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/s/photos/accessibility?utm_source=unsplash&amp;#x26;utm_medium=referral&amp;#x26;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt; June 07, 2021.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcMap to Retire]]></title><description><![CDATA[After 2 decades, ArcMap is set to retire. Sure there are still six more years of support, but ArcGIS 10.8.1 is the final release for good…]]></description><link>https://www.spatialtimes.com/2021/07/arcmap-to-retire/</link><guid isPermaLink="false">https://www.spatialtimes.com/2021/07/arcmap-to-retire/</guid><pubDate>Fri, 09 Jul 2021 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After 2 decades, ArcMap is set to retire. Sure there are still six more years of support, but ArcGIS 10.8.1 is the final release for good old ArcMap (ArcGIS Desktop). Esri is saying it for realzies this time. Sure, it’s been said for years: I remember when 10.3 was going the last release until it wasn’t. But the recent announcement on &lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-enterprise/announcements/removal-of-arcmap-based-runtime-from-arcgis-enterprise/&quot;&gt;ArcGIS Enterprise removing ArcMap publishing support&lt;/a&gt; is the nail in the coffin. This is it, and this time they mean it.&lt;/p&gt;
&lt;h2&gt;Why Retire ArcMap Right Now&lt;/h2&gt;
&lt;p&gt;Well, you need to wait until a larger percentage of people have moved to ArcGIS Pro before you flip the switch. ArcGIS Pro was officially launched in 2015 by uptake was very slow. If you move too to retire ArcMap, other options (competitors) might bubble to the surface. Add a dash of integration with ArcGIS Online, and the ability to save database connections as favourites in Pro (finally), and you have reached your destination. We all knew it was happening, we just didn’t have dates until this past year.&lt;/p&gt;
&lt;h2&gt;Don’t Leave Me ArcMap&lt;/h2&gt;
&lt;p&gt;In most cases, ArcMap just worked. After a long run, thousands of issues have been worked out in the software. But the 32-bit ArcMap with Python 2x was showing its age. We live in a 64-bit world with Python 3x now. Our datasets are larger, integration with the web becoming more dominant, and we’ve run out of new names for ArcGIS Desktop. Still, can’t we go a little longer?&lt;/p&gt;
&lt;p&gt;An ArcGIS Desktop by any other name would smell as sweet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArcGIS&lt;/li&gt;
&lt;li&gt;ArcGIS Desktop&lt;/li&gt;
&lt;li&gt;ArcGIS for Desktop&lt;/li&gt;
&lt;li&gt;Desktop for ArcGIS&lt;/li&gt;
&lt;li&gt;ArcMap&lt;/li&gt;
&lt;li&gt;ArcDeskMap-View-Not-Pro&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There could be some hiccups if you are migrating from ArcMap to ArcGIS Pro but there is lots of documentation to help get you through it and explain that you need to make some changes along the way. Concurrent licenses &lt;em&gt;can&lt;/em&gt; work in Pro, but Esri would prefer the user subscription approach which is pretty handy if you use AGOL too; If you use terminal servers to access ArcMap, be prepared to crush your servers with Pro unless you start adding some serious GPU power; Let’s not forget to re-training users too, this will be a mixed bag of emotions unless you hire fresh graduates who never used ArcMap (or ArcInfo Workstation, or Idrisi32, or ArcView 3). I’m officially old.&lt;/p&gt;
&lt;p&gt;Oh wait, they can’t get rid of ArcMap since I need to publish directly to ArcGIS Server. Well, that feature is finally included in ArcGIS Pro so this is no longer an admin/publishing issue thankfully. It was possible starting at Pro 2.3 (with ArcPy/tools), and now with &lt;a href=&quot;https://pro.arcgis.com/en/pro-app/latest/help/sharing/overview/publish-a-map-service.htm&quot;&gt;GUI integration introduced in Pro 2.4&lt;/a&gt;. Now that it’s finally in the GUI, Esri will retire the ability to publish from ArcMap to Server in &lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-enterprise/announcements/removal-of-arcmap-based-runtime-from-arcgis-enterprise/&quot;&gt;future ArcGIS Server releases&lt;/a&gt;. Seems a little harsh but your Admins wouldn’t migrate otherwise (and you know it).&lt;/p&gt;
&lt;p&gt;Many of the other limitations to ArcGIS Pro have been resolved through software updates over the years. Remember when ArcGIS Pro couldn’t store Database connections outside a Project? Thankfully those days are over. And Pro has some real benefits since 64-bit - it can use a crap ton of RAM and native 64-bit processing tools with Python 3x support (yes, like all other GIS software). ArcMap couldn’t leverage extra RAM even if installed after long justifications with the IT department to have a powerful workstation. Let’s not forget one of Pro’s best features: you can auto-update the software (not to be underestimated and simplifies administration).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 610px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/75378867d811ee6da2a0ce7a4d2dbe51/5ad1c/arcmapRetire.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.6%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wgARCAAJABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABgAHCf/EABYBAQEBAAAAAAAAAAAAAAAAAAUDBP/aAAwDAQACEAMQAAAB6D7A0WJEAptQ2f/EABsQAAMAAgMAAAAAAAAAAAAAAAQFBgIDNDU2/9oACAEBAAEFAkZdeTZOc2GmchymRKZV6J/109wv/8QAIREAAwEAAQIHAAAAAAAAAAAAAQIDBAUAERQVISIjMUL/2gAIAQMBAT8BTi9CyMfOOQZnXQpanh2Ba4VZUPwjShzqoKrn1QRqNVyoDTSWbK2eM4totZpgg0Y+re4n9GjAD6UF27KAO56//8QAHxEAAwEAAQQDAAAAAAAAAAAAAQIDBBEABRITITNC/9oACAECAQE/AV7hBLe9+25KqLQqFPsQpOP2Z0CMMpnY8gnRk0VCBAXdxSldWtNV6aEyxgtCGEkHwg8VH5E1JPHLkIgZix8Rzx1//8QAJRAAAgIBAwIHAQAAAAAAAAAAAgMBBAUSExQAEQYVInJzdLO0/9oACAEBAAY/ApTlMdlXhIZzzirdo1wwiiRLTwpYXJBXGA5WzXUItsO3q5HYsSbg9F69HhyMTkEvkELWa8sWzMR2tzw1N2wIoEGFstOsvU/t2jVEssrtwHJjh89CqzprTSpsOREIHcTzTuQppaykY07z4EXHk/Za/tjo/lR+sdM+yf5p6//EABgQAQEBAQEAAAAAAAAAAAAAAAERACAh/9oACAEBAAE/Ial7X/H4DfKhOOsttwPRwyQhyT58dBV2XKeXBmB93f/aAAwDAQACAAMAAAAQ4D//xAAXEQEBAQEAAAAAAAAAAAAAAAABESEA/9oACAEDAQE/EDspGWgOxLOx3p3Q9tMsIfcjV//EABcRAQEBAQAAAAAAAAAAAAAAAAEhEQD/2gAIAQIBAT8Qc6ZqIHjPB6/LAx42ANkvcbG//8QAFhABAQEAAAAAAAAAAAAAAAAAAQAg/9oACAEBAAE/EA9VVhapz3Q4UmGMR4aiDiVJHjg06sKqtL1PCYP/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Esri Recommended Upgrade Path&quot;
        title=&quot;&quot;
        src=&quot;/static/75378867d811ee6da2a0ce7a4d2dbe51/5ad1c/arcmapRetire.jpg&quot;
        srcset=&quot;/static/75378867d811ee6da2a0ce7a4d2dbe51/953fe/arcmapRetire.jpg 500w,
/static/75378867d811ee6da2a0ce7a4d2dbe51/5ad1c/arcmapRetire.jpg 610w&quot;
        sizes=&quot;(max-width: 610px) 100vw, 610px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Pro Du Jour&lt;/h2&gt;
&lt;p&gt;Regardless of your thoughts on ArcGIS Pro, it is powerful and is the current Arc Du jour. Moving from ArcMap has a learning curve, but it’s surprising how quickly you get used to the Pro approach. “ap&lt;strong&gt;PRO&lt;/strong&gt;ach”?! Sorry. I still use both but I gravitate to ArcGIS Pro for my mapping these days. What will I miss the most? &lt;strong&gt;ArcCatalog&lt;/strong&gt;. I just liked having that administrative tool that was separate from the mapping/analysis tools. Akin to Microsoft’s SSMS, or TOAD for MS/Oracle DB management. The dockable window just isn’t the same IMHO. I’ll get over it one day. Maybe a TOAD extension?&lt;/p&gt;
&lt;p&gt;With today’s computers all being 64-bit, we were leaving processing power untapped with ArcMap (well, there are a bunch of 64-bit background GP tools but you know what I mean). Python 2x was also sunset in January 2020 and is no longer support or receiving bug fixes from the Python Software Foundation. Yeah, this is legacy software now. But still usable. I’m not crying ArcCatalog, you are.&lt;/p&gt;
&lt;p&gt;In short, you have lots of time to use ArcMap still. However, if you keep your ArcGIS Server up-to-date, you are going to need to hold back at some point or you will no longer be able to publish from ArcMap/Catalog. This also gives you some time to figure out what you are going to do with your ArcMap Python Add-Ins, since… yup, those don’t exist in Pro. To the SDK we go!&lt;/p&gt;
&lt;p&gt;Well, time to go manually patch ArcMap now as I’m not ready to move on just yet.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-enterprise/announcements/removal-of-arcmap-based-runtime-from-arcgis-enterprise/&quot;&gt;Esri Blog on ArcMap and Server removal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en/arcmap-esri-plan&quot;&gt;ArcMap Continued Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-enterprise/announcements/whats-new-in-arcgis-enterprise-10-9/&quot;&gt;ArcGIS Enterprise 10.9&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: &lt;a href=&quot;https://unsplash.com/@austinchan?utm_source=unsplash&amp;#x26;utm_medium=referral&amp;#x26;utm_content=creditCopyText&quot;&gt;Austin Chan&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/photos/ukzHlkoz1IE&quot;&gt;Unsplash&lt;/a&gt; June 07, 2021.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JavaScript map libraries with WMS Radar data]]></title><description><![CDATA[In a recent post, we discussed the Canadian Government’s open platform to share Meteorological data, MSC GeoMet. MSC GeoMet provides public…]]></description><link>https://www.spatialtimes.com/2021/05/javascript-map-libraries-with-wms-radar-data/</link><guid isPermaLink="false">https://www.spatialtimes.com/2021/05/javascript-map-libraries-with-wms-radar-data/</guid><pubDate>Sat, 08 May 2021 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In a &lt;a href=&quot;/2021/04/canadian-radar-online-access/&quot;&gt;recent post&lt;/a&gt;, we discussed the Canadian Government’s open platform to share Meteorological data, MSC GeoMet. &lt;a href=&quot;https://eccc-msc.github.io/open-data/msc-geomet/readme_en/&quot;&gt;MSC GeoMet&lt;/a&gt; provides &lt;strong&gt;public&lt;/strong&gt; access to the Meteorological Service of Canada (MSC) and Environment and Climate Change Canada (ECCC) data via interoperable web services and application programming interfaces (API).&lt;/p&gt;
&lt;h2&gt;Web Map Services&lt;/h2&gt;
&lt;p&gt;GeoMet provides direct access to meteorological data via Web Map Services. If you aren’t familiar with Web Map Services (WMS), it is a standard protocol for serving georeferenced maps over the Internet. These services are easily consumed in many web map libraries to build your mapping websites and applications. In our examples, we will use the GeoMet service and the main map request type, GetMap, to talk to the WMS server. Some of the JavaScript libraries also leverage GetCapabilities requests, but since we already know what layers we want to use, we don’t need to specify both requests. Both of these Get requests are required by WMS servers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;GetCapabilities – returns parameters about the WMS (such as map image format and WMS version compatibility) and the available layers (map bounding box, coordinate reference systems, URI of the data and whether the layer is mostly opaque or not)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GetMap – returns a map image. Parameters include: width and height of the map, coordinate reference system, rendering style, image format&lt;/p&gt;
&lt;p&gt;~&lt;a href=&quot;https://en.wikipedia.org/wiki/Web_Map_Service&quot;&gt;Wikipedia.org&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When a map is published as a WMS, GetCapabilities is typically used to discover what is available in the service. The layers, symbology, time intervals, and metadata can be searched. Once you know what you want, you can request a map image using the GetMap request with some parameters to describe what you are interested in. Most of the GetMap parameters are handled by the JavaScript Library and are automatically configured. When panning and zooming on the map, the library will update the coordinate parameters and send a new request to update the map.&lt;/p&gt;
&lt;h2&gt;Building a Web Map&lt;/h2&gt;
&lt;p&gt;The goal is simple - Add the WMS data to many different web mapping API/frameworks. I hope these examples are easy to understand, as the steps taken will work with most WMS endpoints. We could get more advanced and query the time slices available in the radar datasets, but let’s start with a basic &lt;em&gt;Hello Map&lt;/em&gt; for some of the more popular javascript mapping libraries: Leaflet, ArcGIS JavaScript API, and OpenLayers.&lt;/p&gt;
&lt;p&gt;Keeping the examples simple and with similar requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Map: Basic full-screen map
&lt;ul&gt;
&lt;li&gt;Set zoom and map center&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Map Options: Map library defaults&lt;/li&gt;
&lt;li&gt;Basemap: Open Street Map&lt;/li&gt;
&lt;li&gt;Layers: WMS service from GeoMet with 1 Radar layer
&lt;ul&gt;
&lt;li&gt;Layer Name: RADAR_1KM_RRAI&lt;/li&gt;
&lt;li&gt;Add attribution&lt;/li&gt;
&lt;li&gt;Specify WMS version 1.3.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although we are using many JavaScirpt libraries, this isn’t meant to be a comparison/competition between them. Way too much to unpack there, and not the purpose of this article. In some ways, this article shows how it doesn’t matter which library you use - WMS data can be leveraged by all of these libraries. WMS is handled a bit differently, but these differences are minor - many bigger application factors will determine the library that works for you.&lt;/p&gt;
&lt;h3&gt;Leaflet&lt;/h3&gt;
&lt;p&gt;Leaflet is a very popular open-source JavaScript library for building interactive maps. It has a very simple and effective WMS implementation. It doesn’t natively support the GetCapabilities request - but that isn’t required for our examples. If you know what you want (map layers from the service), just set it up, and Leaflet will take care of the rest.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Add a wms service and specify the layer(s) of interest&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; wmsLayer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tileLayer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;wms&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://geo.weather.gc.ca/geomet?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;RADAR_1KM_RRAI&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Beyond the basic &lt;em&gt;layers&lt;/em&gt; parameter, we can specify a few additional parameters to handle transparency, preferred image format, and attribution. If you investigate the GetCapabilities request manually, you can find the parameters and values that are available for this service.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Add the GeoMet WMS (Radar layer) with some additional parameters&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; wmsLayer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tileLayer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;wms&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://geo.weather.gc.ca/geomet?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;RADAR_1KM_RRAI&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//missing comma&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;1.3.0&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;transparent&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;image/png&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;attribution&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;a href=&quot;https://eccc-msc.github.io/open-data/licence/readme_en/&quot;&gt;ECCC&amp;lt;/a&gt;&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;map&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now, all we need to do is create the basic HTML page, the Leaflet JavaScript library source code and our WMS code. Based on our general requirements, we will add a basemap.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1rem&quot; &gt; &lt;iframe src=&quot;/html/2021-05-eccc-radar-leaflet.html&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt; &lt;/iframe&gt; &lt;/div&gt;
&lt;h3&gt;ArcGIS JavaScript API (Multiple versions)&lt;/h3&gt;
&lt;p&gt;Esri’s ArcGIS API for JavaScript has been around for a long time. Version 3x is now considered Esri’s ”&lt;strong&gt;legacy&lt;/strong&gt;” JavaScript API with no new feature development underway. The good news, it is a very mature library with some features still not available in the 4x replacement. ArcGIS JavaScript API 4x is at version 4.19 at the time of writing and has almost reached parallel functionality - and moved beyond 3x in many areas (2D/3D views). Both versions use an Asynchronous Module Definition (AMD) format - this was to ”&lt;em&gt;make code easier to author and debug&lt;/em&gt;” (&lt;a href=&quot;https://dojotoolkit.org/documentation/tutorials/1.10/modules/&quot;&gt;DojoToolkit&lt;/a&gt;) but it does come with its learning curve. This adds some additional lines of code for simple apps - with the benefit of a large functionality matrix and feature-rich modules for bigger applications that go beyond &lt;em&gt;mapping&lt;/em&gt; and deeper into the world of &lt;em&gt;GIS&lt;/em&gt;.&lt;/p&gt;
&lt;h4&gt;ArcGIS JavaScript API 3x&lt;/h4&gt;
&lt;p&gt;Unlike Leafet, the ArcGIS JavaScript API 3x default behaviour is to execute a GetCapabilities request when a WMS Layer is added to the map. Unfortunately, this might lead to some CORS issues - although you can use a simple proxy if you get stuck. To bypass the automatic GetCapabilities request (and possible CORS issue), we can create a &lt;em&gt;resourceInfo&lt;/em&gt; object and include it with the WMSLayer. Much like Leaflet, by including the resourceInfo data, a getMap request is made directly.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// resourceInfo object to describe the WMS layers (and bypass the GetCapabilities request)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; resourceInfo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;extent&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Extent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;126.40869140625&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;31.025390625&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;109.66552734375&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;41.5283203125&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;wkid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3857&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Radar&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;layerInfos&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;layer1&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;RADAR\_1KM\_RRAI&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.3.0&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Now we can add the WMS layer details with our resourceInfo object&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//   in the wmsLayer constructor&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; wmsLayer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WMSLayer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://geo.weather.gc.ca/geomet/?lang=en&amp;amp;service=WMS&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;resourceInfo&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; resourceInfo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;copyright&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ECCC&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;visibleLayers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;RADAR_1KM_RRAI&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
map&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addLayers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;wmsLayer&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Same with the last example, we build the remaining HTML page and add our basemap.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1rem&quot; &gt; &lt;iframe src=&quot;/html/2021-05-eccc-radar-esri3x.html&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt; &lt;/iframe&gt; &lt;/div&gt;
&lt;h4&gt;ArcGIS JavaScript API 4x&lt;/h4&gt;
&lt;p&gt;Similar to 3x, the ArcGIS JavaScript API 4x default behaviour is to execute a GetCapabilities request when a WMS Layer is added to the map. Missing in the new version is a way to work around this. So currently there is no resourceInfo object and we can’t bypass the getCapabilities request.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“The WMSLayer is used to create layers based on OGC Web Map Services (WMS). The WMSLayer initially executes a WMS GetCapabilities request, which might require CORS or a proxy page.” ~ &lt;a href=&quot;https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-WMSLayer.html&quot;&gt;Esri WMSLayer reference&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Create the WMS layer and specify sublayers&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; wmsLayer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;WMSLayer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://geo.weather.gc.ca/geomet/?lang=en&amp;amp;service=WMS&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;sublayers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;RADAR_1KM_RRAI&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;RRAI Radar&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Radar&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;copyright&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;a href=&quot;https://eccc-msc.github.io/open-data/licence/readme_en/&quot;&gt;ECCC&amp;lt;/a&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;radarWMS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Radar PN&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1.3.0&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1rem&quot; &gt; &lt;iframe src=&quot;/html/2021-05-eccc-radar-esri4x.html&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt; &lt;/iframe&gt; &lt;/div&gt;
&lt;h3&gt;OpenLayers&lt;/h3&gt;
&lt;p&gt;The OpenLayers map library continues to be a free, Open Source JavaScript option that doesn’t get much press but continues to have a strong user base. For some reason, it gets compared to Leaflet and mislabelled as “more complicated”. True in some ways, but it really will depend on what you are trying to accomplish. OpenLayers has more in common with the ArcGIS APIs: It crosses over the web-map to web-GIS threshold in similar ways: Feature-rich and able to do more complicated tasks with ease.&lt;/p&gt;
&lt;p&gt;Back to OpenLayers… to add WMS layers we use the ImageWMS image source to connect to the GeoMet service. In the config, we add a &lt;em&gt;params&lt;/em&gt; object with the list of layers (this is mandatory). The version defaults to 1.3, but added her to posterity, along with our attribution.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Add the Image layer with WMS source&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ol&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;layer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ol&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;source&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ImageWMS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;https://geo.weather.gc.ca/geomet/&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token constant&quot;&gt;LAYERS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;RADAR_1KM_RRAI&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token literal-property property&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;1.3.0&apos;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;attributions&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&apos;Radar &amp;lt;a href=&quot;https://eccc-msc.github.io/open-data/licence/readme_en/&quot;&gt;ECCC&amp;lt;/a&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ol&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;source&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;OSM&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;ATTRIBUTION&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1rem&quot; &gt; &lt;iframe src=&quot;/html/2021-05-eccc-radar-openlayers.html&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt; &lt;/iframe&gt; &lt;/div&gt;
&lt;h2&gt;Map Libraries and WMS&lt;/h2&gt;
&lt;p&gt;Regardless of the mapping library, the GeoMet service has a vast amount of data available to enrich your app. Don’t go by the amount of code, as this can be misleading. Easy things might take more lines of code, but complex items might take less, or not available in all libraries. Also not saying my approach is crafted to perfection.&lt;/p&gt;
&lt;p&gt;One thing to note, since the GeoMet WMS has many layers, the service is not small. The impact of running a GetCapabilities request is noticeable and may impact map load performance. If you can avoid this extra request, do so. Other WMS servers may also have CORS issues with a proxy required for GetCapabilities. Two good reasons if you can avoid it and you know the service isn’t going to change.&lt;/p&gt;
&lt;p&gt;The GeoMet WMS works great in all libraries, which is a real benefit of WMS and its open/standard protocol. WMS also has time-aware layer information if you want to take your radar application to the next level - play the last 3 hours of radar data in a simulation, or specify from one of a few symbology settings, etc.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://eccc-msc.github.io/open-data/msc-geomet/readme_en/&quot;&gt;MSC-GeoMet Service readme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://leafletjs.com/&quot;&gt;Leaflet JavaScript library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.arcgis.com/javascript/3/&quot;&gt;ArcGIS JavaScript API 3x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.arcgis.com/javascript/latest/&quot;&gt;ArcGIS JavaScript API 4x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openlayers.org/&quot;&gt;OpenLayers JavaScript library&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: CC-BY Dirk Breuel (&lt;a href=&quot;https://www.flickr.com/photos/dirkb86/36222892861/&quot;&gt;Flickr&lt;/a&gt;) May 07, 2021. Modified from original.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS JavaScript API Key Please]]></title><description><![CDATA[It’s not just technology and underwear that change frequently, software requirements and Terms of Service (TOS) can change quickly too. Even…]]></description><link>https://www.spatialtimes.com/2021/04/arcgis-javascript-api-key-please/</link><guid isPermaLink="false">https://www.spatialtimes.com/2021/04/arcgis-javascript-api-key-please/</guid><pubDate>Sun, 25 Apr 2021 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It’s not just technology and underwear that change frequently, software requirements and Terms of Service (TOS) can change quickly too. Even if &lt;em&gt;you&lt;/em&gt; don’t do anything, external factors can turn your app into 404 without warning. This can happen for many reasons, including when changes come to the APIs we use. Don’t worry, you are just an API Key away from success in some cases. What API Key? Do I need one? Let’s dive in.&lt;/p&gt;
&lt;h2&gt;What API Key?&lt;/h2&gt;
&lt;p&gt;The ArcGIS JavaScript API has been around for a long time. Since the beginning, there has always been free (not Open) access to the JavaScript API, and additional developer subscription levels for the hard-core. With Esri, API Keys were focused on the subscriptions, while smaller and non-revenue generating sites weren’t impacted. This is still partially true, but things are continuing to evolve.&lt;/p&gt;
&lt;p&gt;I was building an ArcGIS JavaScript API 4x sample to demonstrate Canadian radar data with Esri. Suddenly, the demo stopped working. I opened the chrome dev console to look for clues. The code syntax looked fine (no missing semicolons, etc). Everything worked 30 seconds ago and I only changed the basemap. It wasn’t until I jumped into the Chrome developer tools’ network window that I noticed something was blocking the Esri JavaScript API. Oh crap, a ”&lt;strong&gt;No API Key&lt;/strong&gt;” error. Wait, what?! Was I no longer able to build my app because I changed the basemap? I tried removing the basemap, but it was too late, the cache had me. I &lt;em&gt;could&lt;/em&gt; clear my cache or go and get a developer API Key, but I wanted to know why. Some searching led me to an old/familiar location -  the “Getting Started” section of the ArcGIS JavaScript documentation (haven’t been to that page in a while). Looks like API Keys are becoming the norm now with some new requirements for some services (and an updated terms of service).&lt;/p&gt;
&lt;h2&gt;A Switcheroo?&lt;/h2&gt;
&lt;p&gt;I’ll admit, I don’t re-read &lt;em&gt;Getting Started&lt;/em&gt; pages or TOS documents often. But I was pretty sure just a few years ago an API Key wasn’t a requirement for ArcGIS JavaScript 4x maps (unless you were a developer generating revenue).&lt;/p&gt;
&lt;p&gt;As recently as 2018, Esri was promoting that Google developers migrate to the ArcGIS JavaScript API (4x) - One of the selling features mentioned: “You won’t need an API key; you can simply reference the API”. Yeah, that part. That’s only 14 months ago if we don’t include COVID months (since COVID months should never count). Fine, 2.5 years for the purists. To be clear - you don’t need a key to access the JavaScript API, just the services.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 661px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/718f627884e5cd8d961654c985ecef01/4128c/apiKey-esriAnnouncements2018.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 29.400000000000006%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA7UlEQVR42iWQWZLDIAxEff8zZiaOATuOIwkCEkxYPAXuUml51frpyXsfhkSYmb33IhJTCiEwswinlDqJkYVFhMPwxHie5/RxH+ectRYJEQkACNFaIqI3AA0BAEIXEQJgSinn3J9rLbWrlJK/OZdac635WkYvpQxe8nCWUlpr7TxbaxNRMBo3tIg2rbuo7c/sH3IGyb8wqi0emPa3PA/WO+/A5inPl2xHBJoA3O/Pdl/29XjjYuxtdoshvcJD0aztrO19sQ+9qV3dt/m2OnSRWXyIIUzOOaWU0cZo3dtVWvVTqQtfUPW58giv58f8D0FOUdiXxok1AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Esri 2018 Announcement&quot;
        title=&quot;&quot;
        src=&quot;/static/718f627884e5cd8d961654c985ecef01/4128c/apiKey-esriAnnouncements2018.png&quot;
        srcset=&quot;/static/718f627884e5cd8d961654c985ecef01/0eb09/apiKey-esriAnnouncements2018.png 500w,
/static/718f627884e5cd8d961654c985ecef01/4128c/apiKey-esriAnnouncements2018.png 661w&quot;
        sizes=&quot;(max-width: 661px) 100vw, 661px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Source: Esri Blog Announcement Aug 2018 &lt;a href=&quot;https://www.esri.com/arcgis-blog/products/js-api-arcgis/announcements/migrating-from-google-maps-javascript-api-to-arcgis-api-for-javascript/&quot;&gt;Migrating from Google Maps JavaScript API to ArcGIS API for JavaScript&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Thankfully, the online documentation is now littered with reminders for API Keys if you are looking. The &lt;a href=&quot;https://developers.arcgis.com/javascript/latest/api-reference/esri-Map.html&quot;&gt;Map class&lt;/a&gt; basemap section has a list titled “Basemaps for use with API keys”. That explains the issue from earlier. Another example, the &lt;a href=&quot;https://developers.arcgis.com/javascript/latest/get-started/&quot;&gt;Getting Started&lt;/a&gt; section plays it more direct - it mentions these 3 things to get you started:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Setup the API&lt;/li&gt;
&lt;li&gt;Get an API key&lt;/li&gt;
&lt;li&gt;Start the tutorial&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Not a sneaky switcheroo, another change to technology over time. Although, if you migrated from Google based on the 2018 marketing, I could understand if you are a little pissed. One silver lining is that the 2018 article mentioned 1 million free map transactions per month with a developer subscription. Today, that number has increased to 2 million. You can still be pissed, but take the 2 million map requests.&lt;/p&gt;
&lt;h2&gt;Things Change&lt;/h2&gt;
&lt;p&gt;This shouldn’t be a surprise as companies review their approaches, TOS, and bank accounts all the time. Providing API Keys for access to enhanced services is the norm, with free services still available in most cases. The ArcGIS JavaScript API integration with Portal Maps, specialized basemaps, enhanced search services (routing and demographics) were all signs it was moving more this way. Yup, Esri recently announced the &lt;a href=&quot;https://www.esri.com/arcgis-blog/products/developers/developers/introducing-arcgis-platform/&quot;&gt;ArcGIS Platform (PaaS)&lt;/a&gt; for developers. Use one of many APIs to access Esri enriched services to build your apps - which is where the API keys come in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can work directly with our location services using open-source mapping libraries like Leaflet, GL JS, OpenLayers, and ArcGIS REST JS. &lt;sub&gt;~Esri &lt;a href=&quot;https://www.esri.com/arcgis-blog/products/developers/developers/introducing-arcgis-platform/&quot;&gt;ArcGIS Platform (PaaS)&lt;/a&gt; blog&lt;/sub&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This doesn’t mean it will take your beer money - there is still a free tier with a developer API key and… oh wait, it’s the same as Goog… Yes, a free tier for most services and some premium services are also available.  And you don’t need an API key for everything (yet). My demo is back and running without a key and it gets the job done - it’s just a demo and will cap out to less than 2 million monthly requests even if I needed a key. Not that I make any beer money from it anyway.&lt;/p&gt;
&lt;p&gt;So, you need an API Key for Google, Esri, and many other services. Not a big deal. If you want to avoid API Keys, you do have other options - but remember, API Keys aren’t evil. OpenStreetMap and the popular Leaflet API both have lots of options. And yes, Esri has an extension to Leaflet to integrate with Esri. However, if you want to use premium Esri services (basemaps, routing, etc), you will still require an Esri API Key (I looked it up, it’s in the docs). On the flip side, you can use whatever API you like and still access premium services with the key. Glass half full.&lt;/p&gt;
&lt;h2&gt;Esri Developer Terms of Service&lt;/h2&gt;
&lt;p&gt;Since I was digging into things, I also reviewed the current Terms of Service. There are a few items related to developers creating value-added applications (revenue-generating) that might be of interest to a select few.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Value-added applications built with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The current generation client APIs (i.e. JavaScript 4.x and Runtime SDKs 100.x) is required to use API Keys in their applications by Aug 1, 2021.&lt;/li&gt;
&lt;li&gt;The older generation client APIs (i.e. JavaScript 3.x and Runtime SDKs 10.x) is required to use API Keys in their applications by January 1, 2023.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Source: Developer Products footnote #91 of the &lt;a href=&quot;https://www.esri.com/content/dam/esrisites/en-us/media/legal/product-specific-terms-of-use/e300.pdf&quot;&gt;Esri Terms of Service e300&lt;/a&gt;. The TOS has more details if interested. Also check out footnotes #16 and #64 for JavaScript Web API specific items.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;What’s the Point?&lt;/h2&gt;
&lt;p&gt;The point is, web development is always changing, and so are the requirements to access services. Keep an eye on the APIs and services you use and the changes that are happening. Old applications can be impacted without warning, so don’t forget to check the documentation and requirements before you start pulling your application apart. API Keys are just one of many types of changes. Breaking changes can also be introduced with new API versions (ArcGIS 3x to 4x for example). Heck, my Wyze camera stopped its in-camera person detection one day - Why? The company that made that piece of software (Xnor.ai) was acquired by Apple, so  Wyze had to change its terms and no more onboard AI software.&lt;/p&gt;
&lt;p&gt;In short, RTFM once a year for all the APIs and web services you use just to make sure everything will keep ticking. As well, a big tech company might buy something and screw your recent home camera purchase.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/arcgis-blog/products/js-api-arcgis/announcements/migrating-from-google-maps-javascript-api-to-arcgis-api-for-javascript/&quot;&gt;Esri - Migrating from Google to ArcGIS JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/content/dam/esrisites/en-us/media/legal/product-specific-terms-of-use/e300.pdf&quot;&gt;Esri - Terms of Service e300&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.arcgis.com/javascript/latest/get-started/&quot;&gt;Getting Started with 4x&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: Silas Köhler (&lt;a href=&quot;https://unsplash.com/photos/C1P4wHhQbjM?utm_medium=referral&amp;#x26;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;) April 17, 2021.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Canadian Radar Online Access]]></title><description><![CDATA[When browsing the Canadian weather website the other day I was surprised to read the bold notice “New Weather Radar Map”. I then scrolled…]]></description><link>https://www.spatialtimes.com/2021/04/canadian-radar-online-access/</link><guid isPermaLink="false">https://www.spatialtimes.com/2021/04/canadian-radar-online-access/</guid><pubDate>Thu, 15 Apr 2021 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When browsing the Canadian weather website the other day I was surprised to read the bold notice “New Weather Radar Map”. I then scrolled down to find a simple, clean, easy-to-use Weather Radar map. Thank you ECCC/MSC (AKA Canadian NOAA)!&lt;/p&gt;
&lt;h2&gt;New Weather Radar Map&lt;/h2&gt;
&lt;p&gt;This map is a huge improvement over the old GIFs. Now we have a single mosaic image, GIS data in a WMS API, an actual ‘map’, and accessible navigation too. The framework appears to use Vue with the OpenLayers API in a module called &lt;a href=&quot;https://vuelayers.github.io/&quot;&gt;VueLayers&lt;/a&gt;. VueLayers is best described by their tagline &lt;em&gt;“Web map Vue components with the power of OpenLayers”&lt;/em&gt;. Free to use by the way.&lt;/p&gt;
&lt;p&gt;The map has a few options as well: rain/snow modes depending on temperature (rain and snow reflect differently), two animation timeframes, and two symbology options. From GIFs to web maps - that’s like french fries to poutine!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 757px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c6b3277198513fa881f3fec68f42378e/efd2f/ecccRadar_website.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.6%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wgARCAAJABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAUEBgcJ/8QAFgEBAQEAAAAAAAAAAAAAAAAABQQG/9oADAMBAAIQAxAAAAHtIhtS+k6MZ0O5j//EABwQAAEEAwEAAAAAAAAAAAAAAAIBAwQzBQYUNP/aAAgBAQABBQIoQG4ac6js+OIGvQxfNu//xAAgEQACAgAGAwAAAAAAAAAAAAABAgMRBAUSEyEiAEFC/9oACAEDAQE/AS0uIXpJsMGYBgqvR34IFem9qJbIvSw1Ky9rWDPM0aGMyyYdpCg1lMOUQt9FUaaRkUkcKZHKjgu1X5//xAAiEQEAAQMBCQAAAAAAAAAAAAABAgMRIQAEBRMxQUNiY3H/2gAIAQIBAT8BlCnQkDHiDTjOzJO21JQbc4qY6iDfFme6tjjJAqY9nzx1/8QAJhAAAQQBAgQHAAAAAAAAAAAAAgEDERIAEyEEIoKxI0FCUXKRsv/aAAgBAQAGPwKyOFYRRFoZNnEJE15fZd/vLRxLjgiZEmsZX0l9KSja1GxH5rRAiypLZaPEu+GMOC2MHG07vAszMyOO/I+44XX+3M6U7rn/xAAbEAEBAAMAAwAAAAAAAAAAAAABEQAhMSBBUf/aAAgBAQABPyFLCajkgVPSNvYcoBl3dBqOD3ChiI4TAoUmExIBp8nhU3N//9oADAMBAAIAAwAAABBTz//EABgRAQADAQAAAAAAAAAAAAAAAAEAESEx/9oACAEDAQE/ENliRogjxjoeKyrG0/8AAXYC9Ahb/8QAGhEAAgMBAQAAAAAAAAAAAAAAAREAIVExQf/aAAgBAgEBPxApHjK2wVWahkbQQZkEwfC8HKrME//EABkQAQEBAAMAAAAAAAAAAAAAAAERABAxof/aAAgBAQABPxBlIPQiTqihXNSIqjJRHJtICKsJmIIhGS9veV8QHnw6dH//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Canadian Weather Radar&quot;
        title=&quot;&quot;
        src=&quot;/static/c6b3277198513fa881f3fec68f42378e/efd2f/ecccRadar_website.jpg&quot;
        srcset=&quot;/static/c6b3277198513fa881f3fec68f42378e/953fe/ecccRadar_website.jpg 500w,
/static/c6b3277198513fa881f3fec68f42378e/efd2f/ecccRadar_website.jpg 757w&quot;
        sizes=&quot;(max-width: 757px) 100vw, 757px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;source: &lt;a href=&quot;https://weather.gc.ca/map_e.html&quot;&gt;weather.gc.ca&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now that we have a real map, could that mean… a real API to weather data that is Open and available to developers? Sure does. Welcome to MSC GeoMet.&lt;/p&gt;
&lt;h2&gt;MSC GeoMet Online Access&lt;/h2&gt;
&lt;p&gt;MSC GeoMet has been around for a while now but has stayed &lt;em&gt;under the radar&lt;/em&gt; (sorry). So what is &lt;a href=&quot;https://eccc-msc.github.io/open-data/msc-geomet/readme_en/&quot;&gt;MSC GeoMet&lt;/a&gt;? A platform that provides &lt;strong&gt;public&lt;/strong&gt; access to the Meteorological Service of Canada (MSC) and Environment and Climate Change Canada (ECCC) data via interoperable web services and application programming interfaces (API). In short, open weather/climate APIs. Precipitation is just one of the hundred or so layers available at this point. Some even mosaic NOAA data for a seamless dataset. Weather needs no passport.&lt;/p&gt;
&lt;p&gt;So now that the government radar site is using live Web Mapping Services (WMS), shouldn’t we all start mashing it into our apps?! Maybe we can all stop screen scrapping the GIFs?! Although, when it comes to consistency, those GIF scripts have worked without issue for a decade. Respect.&lt;/p&gt;
&lt;h2&gt;What’s Next&lt;/h2&gt;
&lt;p&gt;Hoping the next step for MSC GeoMet is to find a better way to search available data. Leveraging the &lt;a href=&quot;https://open.canada.ca/en&quot;&gt;OpenGov&lt;/a&gt; site and combing through the layers in the services is a good start, but hoping for a possible discovery/search tool. This would help more beginners navigate and find some interesting data and lower the bar to adoption. But right now I can’t complain - well done ECCC/MSC, and keep going. There are even a few examples of how to build a simple web map with their data. A few additional examples would be helpful as well, possibly for the layers that are harder to understand - such as Forecasting and modelling data.&lt;/p&gt;
&lt;p&gt;I guess the best way to help would be to create some examples as well.  I’ll start putting together a follow-up article where we can start leveraging these services with a bunch of web mapping APIs: Leaflet, ArcGIS JavaScript API v3x and v4x, and OpenLayers for good measure.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://eccc-msc.github.io/open-data/msc-geomet/readme_en/&quot;&gt;https://eccc-msc.github.io/open-data/msc-geomet/readme_en/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://open.canada.ca/en&quot;&gt;https://open.canada.ca/en&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Append using ArcPy cursors]]></title><description><![CDATA[If we are using Python with ArcGIS, there are existing tools to append data. However, calling a Geoprocessing tool
from Python doesn’t feel…]]></description><link>https://www.spatialtimes.com/2021/01/append-using-arcpy-cursors/</link><guid isPermaLink="false">https://www.spatialtimes.com/2021/01/append-using-arcpy-cursors/</guid><pubDate>Sun, 03 Jan 2021 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If we are using Python with ArcGIS, there are existing tools to append data. However, calling a Geoprocessing tool
from Python doesn’t feel very Pythonic. It also doesn’t give us access to the data before loading. Instead of calling the
Append Tool, we can use cursors to append data and open the door to other data manipulation options. More specifically, we will use a
SearchCursor on source input data, and an InsertCursor on a Target schema to show how we can replicate or enhance our Python script.
Both the Append Tool and the Cursor approach have their pros and cons - just nice to have some options.&lt;/p&gt;
&lt;h2&gt;A Cursory Overview&lt;/h2&gt;
&lt;p&gt;Cursors are an extremely fast way to read/write features while giving you lots of control over the features, attributes, and
filters. Cursors can include a SQL clause or deconstruct features into their individual points
or vertices.&lt;/p&gt;
&lt;p&gt;A cursor is a data access object that can be used either to iterate through the set of rows in a table or to insert new rows
into a table. In our case, we are going to read and write features. If using ArcMap, there are two different classes of
cursors - old and new. No need to discuss the old ones, just disregard them and just use the new &lt;strong&gt;arcpy.da.&lt;em&gt;cursor&lt;/em&gt;&lt;/strong&gt; classes.&lt;/p&gt;
&lt;h2&gt;SearchCursor&lt;/h2&gt;
&lt;p&gt;First, we need to read the input features from a Feature Class that we want to append somewhere. Since we just need to read
these features we can use a SearchCursor. This SearchCursor requires a minimum of two parameters, the input features (Feature
Class, Layer, Table, Table View), and a list of field names. Use an asterisk (*) instead of a list of fields if you want
to access all fields from the input table. There are some limitations with the asterisk which we will get into later.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Setup a search cursor on our new data and iterate the rows&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;da&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;SearchCursor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C:/input.gdb/newPoints&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; cursor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; row &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; cursor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;#Do stuff with each row&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once we have access to every row of input data, we can insert the records into another layer, or even manipulate the attributes
before loading. The issue with the wildcard attribute approach (asterisk) is knowing how to access the correct attribute of interest.
If the attributes are specified, the SearchCursor will maintain the attribute order as listed so we know how to access them.&lt;/p&gt;
&lt;h2&gt;Append data with the InsertCursor&lt;/h2&gt;
&lt;p&gt;The great thing about the Append Tool is the ability to auto-match fields with the schema_type parameter. You can either specify the
matching fields or if the field names/types are the same, allow the tool to take care of it for you. When working with SearchCursors
and InsertCursors, we don’t have the same luxury. If you know your input and target layers have the same schema and field order you
can use the wildcard approach. If not, you will need to define the fields.&lt;/p&gt;
&lt;p&gt;Let’s assume our schemas are identical for now. How would we load into our target layer? Let’s add the InsertCursor to our working
sample. We will set up our new InsertCursor at the beginning, and with one more line of code inside the SearchCursor loop, we can add
the data to our target dataset.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Create an InsertCursor on our Target dataset&lt;/span&gt;
targetCursor &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;da&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;InsertCursor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C:/out.gdb/Points&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Setup a search cursor on our new data and interate the rows&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;da&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;SearchCursor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C:/input.gdb/newPoints&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; cursor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; row &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; cursor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;#Insert into the target dataset (only Points or tabular data if using an asterisk)&lt;/span&gt;
        targetCursor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;insertRow&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If we are loading point data or table data, this will work without issue if the fields list and field order match. However,
there is a small issue with the default SHAPE field when updating multi-point, line, or polygon data.&lt;/p&gt;
&lt;h3&gt;A SHAPE issue?&lt;/h3&gt;
&lt;p&gt;This &lt;em&gt;is&lt;/em&gt; technically documented, but it can be confusing why our previous sample would work on tables and point layers, then suddenly
fail (silently) on a line or polygon layer. It will finish running with other attributes populated, but previewing the map  will
not return any spatial data.&lt;/p&gt;
&lt;p&gt;Why does this happen? Performance defaults. Accessing geometry can be an expensive operation, so the default Geometry token is
set to SHAPE (SHAPE@XY) to save precious time. This means if we want to load point data, the performance will be much better than for
other geometry types. Yes, even faster than the Append Tool itself.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When using * (field list), geometry values will be returned in a tuple of the x,y-coordinates (equivalent to the SHAPE@XY&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;token) ~Esri&lt;/p&gt;
&lt;p&gt;Again, this default is fine if inserting points with an InsertCursors (and non-existent for tables). But polygon, polyline,
or multipoint features can only be created using the SHAPE@ token which will cost us some performance and extra lines of code.&lt;/p&gt;
&lt;h3&gt;SHAPE it up&lt;/h3&gt;
&lt;p&gt;We can deal with this SHAPE issue in many ways. The overall goal is to replace the &lt;strong&gt;SHAPE (SHAPE@XY)&lt;/strong&gt; token reference with the full geometry &lt;strong&gt;SHAPE@&lt;/strong&gt; token. We can grab the attributes with &lt;code class=&quot;language-text&quot;&gt;arcpy.Describe&lt;/code&gt; or the &lt;code class=&quot;language-text&quot;&gt;arcpy.ListFields&lt;/code&gt; function. ListFields is
faster, while Describe provides multiple properties, such as data type, fields, indexes, and many others. Once we have the
fields, we pass into the cursors. Again, still assuming the fields are the same. If there is a change the order is different,
just sort the list.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;inFC &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;C:/input.gdb/newRoads&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#Collect all fields except the Geometry field&lt;/span&gt;
lstFields &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; field &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ListFields&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inFC&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; field&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Geometry&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
lstFields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;SHAPE@&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# add the full Geometry object&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Similar to previous with fields specified&lt;/span&gt;
targetCursor &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;da&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;InsertCursor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C:/out.gdb/Roads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;lstFields&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;da&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;SearchCursor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inFC&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;lstFields&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; cursor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; row &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; cursor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        targetCursor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;insertRow&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;We now have some raw code to append data using ArcPy cursors. From here we could start refining the code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check the datatype in advance to see if we need to change the SHAPE geometry&lt;/li&gt;
&lt;li&gt;Verify the fields match b/w the inputs and target&lt;/li&gt;
&lt;li&gt;Append multiple datasets&lt;/li&gt;
&lt;li&gt;Manipulate attributes before loading&lt;/li&gt;
&lt;li&gt;Optionally remove other read-only fields if you aren’t using them (ObjectID, shape.length, shape.area)
&lt;ul&gt;
&lt;li&gt;These are ignored if you try to update anyway&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Example: Append multiple datasets&lt;/h3&gt;
&lt;p&gt;Here is one additional example where we add multiple datasets to the append list. This example still assumes
all the layers have an identical schema. Since we are loading lines, we will update the Geometry object.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; arcpy
lstFCs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C:/input.gdb/Road_North&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;C:/input.gdb/Road_South&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     &lt;span class=&quot;token string&quot;&gt;&quot;C:/input.gdb/Road_East&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;C:/input.gdb/Road_West&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#List all the fields and add the full Geometry object&lt;/span&gt;
lstFields &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;field&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; field &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ListFields&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inFC&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; field&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Geometry&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
lstFields&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;SHAPE@&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Set the target and Loop all input layers to insert&lt;/span&gt;
targetCursor &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;da&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;InsertCursor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;C:/out.gdb/Roads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;lstFields&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; inFC &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; lstFCs
    &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;da&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;SearchCursor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inFC&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;lstFields&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; cursor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; row &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; cursor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            targetCursor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;insertRow&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;del&lt;/span&gt; targetCursor&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-data-access/insertcursor-class.htm&quot;&gt;https://desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-data-access/insertcursor-class.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-data-access/searchcursor-class.htm&quot;&gt;https://desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-data-access/searchcursor-class.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-functions/listfields.htm&quot;&gt;https://desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-functions/listfields.htm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: CC-BY Yohanes Sanjaya (&lt;a href=&quot;https://www.flickr.com/photos/valiantize/19973182744/&quot;&gt;Flickr&lt;/a&gt;) Jan 03, 2021. Modified from original.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Using multiple versions of Python with ArcGIS]]></title><description><![CDATA[As Python continues its dominance as the defacto scripting language for GIS software, we hit a point when one Python environment isn’t…]]></description><link>https://www.spatialtimes.com/2020/10/using-multiple-versions-of-python-with-arcgis/</link><guid isPermaLink="false">https://www.spatialtimes.com/2020/10/using-multiple-versions-of-python-with-arcgis/</guid><pubDate>Wed, 14 Oct 2020 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As Python continues its dominance as the defacto scripting language for GIS software, we hit a point when one Python environment isn’t enough. Even if we try to keep a clean system, ArcGIS applications need to install their version(s) of Python. ArcGIS Desktop has two flavours alone, and a third if we include ArcGIS Pro (which can have many itself). How do Desktop users open a &lt;em&gt;.py&lt;/em&gt; file in the desired version of Python? Can we make this a little easier? If you don’t mind updating the Windows Registry, some little tweaks can make a big difference and save you some hassle.&lt;/p&gt;
&lt;p&gt;To preface, this article is for “GIS Desktop power users” with multiple ArcGIS Python versions that want to create/run scripts on their local machine. If installing Python independently, this article isn’t for you. Great package managers like Conda (Anaconda/Miniconda) exist for these purposes. Conda makes managing multiple environments a breeze - and cross-platform too. If you are a more dedicated ArcGIS developer and using the ArcGIS API for Python, you might still want to consider Conda. If you just need ArcGIS Desktop and/or ArcGIS Pro and want to open/edit a specific version of Python to run some code, keep reading.&lt;/p&gt;
&lt;h2&gt;ArcGIS and Python&lt;/h2&gt;
&lt;p&gt;ArcGIS for Desktop software (ArcMap and ArcCatalog) are tied to Python v2.x. The initial install of Desktop will install the 32-bit version since ArcGIS Desktop is… 32-bit. Desktop Background Geoprocessing installs the 64-bit version of Python. Both 32/64-bit will run 99% of v2.x scripts without issue. There are a few Esri tools that fail if run in the wrong version which is why I started down this path in the first place.&lt;/p&gt;
&lt;p&gt;ArcGIS Pro on the other hand is based on Python 3.x 64-bit. If only using Pro, you shouldn’t have any issues. In this case, you can even manage additional Python environments directly in ArcGIS Pro! Yup, ArcGIS Pro has a Python Package Manager built-in (err, you guess it - Conda is integrated into Pro). Side note: GDAL is also installed with Pro - a topic for another time.&lt;/p&gt;
&lt;h2&gt;Selecting the right IDLE/IDE&lt;/h2&gt;
&lt;p&gt;At this point, we have three Python environments installed. Setting a default can be done as an environment variable but switching between them isn’t as simple. If wanting to select a specific environment we can take advantage of a small registry update. For this example, we will use the installed IDLE application but the same approach can be used for the editor/IDE of your choice.&lt;/p&gt;
&lt;h3&gt;Registry Disclaimer&lt;/h3&gt;
&lt;p&gt;Don’t screw up the registry. You’ve been warned. If you don’t understand what you are doing, this isn’t the sandbox to learn in. Try it out on a virtual machine, or ex-friends’ computer first.&lt;/p&gt;
&lt;h3&gt;Registry CLASSES&lt;/h3&gt;
&lt;p&gt;To add options to the right-click menu, we just need to update the CLASSES registry and file name extension information. This info is stored in three places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HKEY_LOCAL_MACHINE (HKLM)&lt;/li&gt;
&lt;li&gt;HKEY_CURRENT_USER (HKCU)&lt;/li&gt;
&lt;li&gt;HKEY_CLASSES_ROOT&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We should never touch HKEY_CLASSES_ROOT directly as it provides a view of the registry that merges the information from these other two sources. HKEY_CLASSES_ROOT also provides this merged view for applications designed for historic versions of Windows.&lt;/p&gt;
&lt;p&gt;Where we update depends on who we want this to work for. HKLM if we want these changes to show for all users - or HKCU for the current user only. If you accidentally write values to a key under HKEY_CLASSES_ROOT and the key already exists under HKCU\Software\Classes, the system will store the information there instead of under HKLM\Software\Classes.&lt;/p&gt;
&lt;h3&gt;Registry changes&lt;/h3&gt;
&lt;p&gt;First, we should confirm the &lt;code class=&quot;language-text&quot;&gt;HKLM\SOFTWARE\Classes\Python.File\shell&lt;/code&gt; section exists. It is created when you install Python or ArcGIS for the first time but worth a quick check. From there we will add all options that don’t already exist and/or can tweak the naming of existing. The name of the keys inside will be the name shown in the context menu (r-click). To each key, we add a command sub-key to provide the IDLE environment reference.&lt;/p&gt;
&lt;p&gt;The final results will look similar to this:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 348px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/154b871251b463017e2539385f8c7907/6817d/pyContextMenu.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 94.82758620689657%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wgARCAATABQDASIAAhEBAxEB/8QAGQABAQADAQAAAAAAAAAAAAAAAAYEBQcJ/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAIFAf/aAAwDAQACEAMQAAAB8ocq3mdW+chKWs0DagRbP//EABwQAAIDAQADAAAAAAAAAAAAAAEEAgMFBhQiMv/aAAgBAQABBQJfIvZorS8Nno9bm9LQy5SpRaslcxL7xjJjEJJMz7//xAAjEQABAgILAAAAAAAAAAAAAAABABECYRIUITEyQWKSscHx/9oACAEDAQE/AWBcMcx14qoNW8ykjeVCBRhsGEcL/8QAIREBAAAFAwUAAAAAAAAAAAAAAQACESFRAzFBBDJxsfH/2gAIAQIBAT8BJmyNdnJn7B1yWpp2zKLxytYNiJu6by+4/8QAKRAAAgIBAwIEBwEAAAAAAAAAAQIDEhEABCEFIhMUMUEyQlFxcoGRsf/aAAgBAQAGPwLx4nRuVBj58TuW9vZCo9+7OfRTrbvulyiyI7xYVrxqwsuLleR7PgfrQ3HSeiRdH2/loIpNnDt4zF5iMESyx1qAJe1scm2SWJOriGd8hHAAAulaXiyMyKK1auTawX4Wq7spQkhQrCpVV4UMOOQPXOm/I6YyszGGLMZsy1rDJIMUK/OxPP8Amskkn6k5P9Om++v/xAAdEAEBAAMAAgMAAAAAAAAAAAABEQAhMUFRYXHw/9oACAEBAAE/IWEAUCNoWRgpsQbJpOs1hqLlsLvEbpwI7ujD7uuB2lZ6aO9t30C+IikCuJpEK9rdvcIbfx36emODiJroVAR6FYiAECE1Uj7UVflcTr55/9oADAMBAAIAAwAAABAA30L/xAAcEQEAAQUBAQAAAAAAAAAAAAABEQAhMVFhgbH/2gAIAQMBAT8QiIF1GRsqSHDErSJFEBnj046L3WVVWW5HMv2mMyaTTlf/xAAbEQEAAgMBAQAAAAAAAAAAAAABESEAMVHR8P/aAAgBAgEBPxAkZQ9WBBGRjQuxMDJso7qUqTbtqQAAAAAAAQFBXMTs+nhn/8QAGxABAQADAAMAAAAAAAAAAAAAAREAITFBcaH/2gAIAQEAAT8QAwGCHULq5iNuCrdtbShhkoEIbQ68cl3DqxGr3H/PVC2xNrpSwKME58qkYAtJOIxQwKJGIRfIehMRd9p4k1N2ZRzKhcZ7SGDYddyUrQnOED5n/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Context Menu Results&quot;
        title=&quot;&quot;
        src=&quot;/static/154b871251b463017e2539385f8c7907/6817d/pyContextMenu.jpg&quot;
        srcset=&quot;/static/154b871251b463017e2539385f8c7907/6817d/pyContextMenu.jpg 348w&quot;
        sizes=&quot;(max-width: 348px) 100vw, 348px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here are all three ArcGIS IDLE environment settings for the Registry assuming the default install directories were used:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python v3 64-bit installed with ArcGIS Pro&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[HKLM\SOFTWARE\Classes\Python.File\shell\Edit with IDLE (ArcGIS Pro)]
[HKLM\SOFTWARE\Classes\Python.File\shell\Edit with IDLE (ArcGIS Pro)\command] : @=&quot;\&quot;C:\\Program Files\\ArcGIS\\Pro\\bin\\Python\\envs\\arcgispro-py3\\pythonw.exe\&quot; \&quot;C:\\Program Files\\ArcGIS\\Pro\\bin\\Python\\envs\\arcgispro-py3\\Lib\\idlelib\\idle.pyw\&quot; -e \&quot;%1\&quot;&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Python v2 32-bit installed with ArcGIS Desktop&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[HKLM\SOFTWARE\Classes\Python.File\shell\Edit with IDLE (v2 x32)]
[HKLM\SOFTWARE\Classes\Python.File\shell\Edit with IDLE (v2 x32)\command] : @=&quot;\&quot;C:\\Python27\\ArcGIS10.7\\pythonw.exe\&quot; \&quot;C:\\Python27\\ArcGIS10.7\\Lib\\idlelib\\idle.pyw\&quot; -e \&quot;%1\&quot;&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Python v2 64-bit installed with ArcGIS Desktop Background GP&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[HKLM\SOFTWARE\Classes\Python.File\shell\Edit with IDLE (v2 x64)]
[HKLM\SOFTWARE\Classes\Python.File\shell\Edit with IDLE (v2 x64)\command] : @=&quot;\&quot;C:\\Python27\\ArcGISx6410.7\\pythonw.exe\&quot; \&quot;C:\\Python27\\ArcGISx6410.7\\Lib\\idlelib\\idle.pyw\&quot; -e \&quot;%1\&quot;&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;At this point, we could add more options for additional IDE’s/editors (VS Code, PyCharm, Atom, NPP), or start scripting. Don’t forget to backup your registry before you start just in case.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pro.arcgis.com/en/pro-app/arcpy/get-started/what-is-conda.htm&quot;&gt;https://pro.arcgis.com/en/pro-app/arcpy/get-started/what-is-conda.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/analytics-vidhya/creating-cascading-context-menus-with-the-windows-10-registry-f1cf3cd8398f&quot;&gt;https://medium.com/analytics-vidhya/creating-cascading-context-menus-with-the-windows-10-registry-f1cf3cd8398f&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;sub&gt;Cover image: CC-BY-SA Opensource.com (&lt;a href=&quot;https://opensource.com/article/19/5/python-3-default-mac&quot;&gt;https://opensource.com/article/19/5/python-3-default-mac&lt;/a&gt;) Oct 14, 2020.&lt;/sub&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Server Print Service Produces a Pixelated Legend]]></title><description><![CDATA[Custom print services allow us to create unique layouts with custom elements such as dynamic legends, scales and automated text labels…]]></description><link>https://www.spatialtimes.com/2020/02/arcgis-server-print-service-produces-a-pixelated-legend/</link><guid isPermaLink="false">https://www.spatialtimes.com/2020/02/arcgis-server-print-service-produces-a-pixelated-legend/</guid><pubDate>Tue, 18 Feb 2020 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Custom print services allow us to create unique layouts with custom elements such as dynamic legends, scales and automated text labels. Dynamic legends can be a great feature to automatically toggle layers in the output legend area - but sometimes printed legend patches may appear garbled/pixelated/grainy. This is a known issue that may occur but thankfully there are some fixes available. The issue may appear after a server or software upgrade and will happen consistently when requesting the same print size and DPI. There are many possible causes including the map document (MXD) layout,  ArcGIS Server configuration, or even much deeper into the server settings.&lt;/p&gt;
&lt;h2&gt;Troubleshooting&lt;/h2&gt;
&lt;p&gt;Before jumping into the server settings, make sure the legend issue doesn’t occur in ArcGIS Desktop when printing from the same template. Second, do a quick check of the print service DPI settings in your print service and your application. Low DPI requests can generalize the output graphics, especially if using custom fills or transparencies. Try using a value of at least 96 DPI, up to 600 DPI to see the impacts this setting has on your outputs. Beware, setting DPI too high results in each print request taking more time, so don’t go overboard unless your users are prepared to wait. If DPI isn’t specified, 96 is the default for the &lt;a href=&quot;https://enterprise.arcgis.com/en/server/latest/create-web-apps/windows/exportwebmap-specification.htm&quot;&gt;ExportWebMap specification&lt;/a&gt;. Print services are Synchronous by default but can be set up as Asynchronous if requests are expected to take a while do to size or high DPI. Side note: print services used in the ArcGIS Enterprise portal must be Synchronous.&lt;/p&gt;
&lt;h2&gt;Using Windows Server and still not working?&lt;/h2&gt;
&lt;p&gt;On Windows, ArcGIS Server printing services rely on the underlying Windows Graphics Device Interface (GDI) Print API. The GDI Print API provides applications with a device-independent printing interface. ArcGIS Server uses this GDI to render text and graphics returning the results to ArcGIS Server which passes the results back to the user.&lt;/p&gt;
&lt;p&gt;When leveraging the Windows OS environment for AGS, Esri notes that &lt;em&gt;“If a legend patch with a picture fill or marker symbol type falls outside the default page size of the Windows default printer, Windows GDI drawing calls used by Print Service may not properly draw the object or image on output.”&lt;/em&gt; Cool. In short, the GDI configuration is based on your default printer setup. The most likely culprit is requesting a map output larger than the default printer’s default paper size. Since the print GDI rendering starts in the top-left, legend issues become more common the further they are to the right and lower corner where they can extend beyond the default page.&lt;/p&gt;
&lt;h2&gt;Possible Windows GDI fixes&lt;/h2&gt;
&lt;p&gt;Since ArcGIS Server leverages the default printer settings for the GDI, we can update the default settings to fix it. To update, we need to log into the server under the &lt;em&gt;ArcGIS Server Account&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: This is the account that was chosen during the ArcGIS Server setup. Windows Task Manager can also be used on the server machine to find out which user is being used to run the ArcSOC.exe process.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once logged in, review and update the default page size and orientation printing settings. When complete, you will need to restart the ArcGIS Server service as an admin, or reboot. It’s recommended to set the page size to the same or larger than the biggest map layout needed.&lt;/p&gt;
&lt;p&gt;If a pixelated legend persists, change the default printer completely. This isn’t a proposed solution in the &lt;a href=&quot;https://support.esri.com/en/technical-article/000011636&quot;&gt;bug report&lt;/a&gt; but it has been the one solution that has worked in the past for me: Changed the default printer and still used the same page settings. To change to a new printer you may need to log in as a local administrator to add the printer to the server first, then it will be available to the ArcGIS Server account (the ArcGIS Server account is a local user account with very limited permissions). Again, you will need to restart the ArcGIS service as an administrator or reboot for changes to take place. Side note: Esri recommends stopping the service first (admin account), change the print defaults (&lt;strong&gt;arcgis&lt;/strong&gt; account), start the service again (admin account).&lt;/p&gt;
&lt;p&gt;After the problem is resolved it’s recommended to binge the movie &lt;strong&gt;Office Space&lt;/strong&gt; so you can watch someone take a baseball bat to a printer for a few minutes - very therapeutic.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Touch GIS Provides Free Access with GeoInt]]></title><description><![CDATA[Touch GIS is one of the latest mobile data collection apps to be launched for the field workforce. It has many of the professional field…]]></description><link>https://www.spatialtimes.com/2020/01/touch-gis-provides-free-access-with-geoint/</link><guid isPermaLink="false">https://www.spatialtimes.com/2020/01/touch-gis-provides-free-access-with-geoint/</guid><pubDate>Fri, 31 Jan 2020 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Touch GIS is one of the latest mobile data collection apps to be launched for the field workforce. It has many of the professional field collection and visualization capabilities needed for successful fieldwork including offline workflows, and support for many file-based spatial formats. SpatialTimes hasn’t done a full review of the app yet, but it’s worth mentioning that Touch GIS just announced it is now available at no cost to credentialed U.S. government employees, first responders, and the Department of Defense.&lt;/p&gt;
&lt;p&gt;“&lt;em&gt;We’re very excited to offer Touch GIS on the GEOINT App Store&lt;/em&gt;” says Joe Wilson, Head of Product. “&lt;em&gt;Touch GIS is useful for a wide variety of field uses, and offers best-in-class data collection, mapping, and visualization tools. The app is especially helpful when working offline. The best part? It runs on the device that’s already in your pocket!&lt;/em&gt;”&lt;/p&gt;
&lt;h2&gt;GEOINT App Store Access&lt;/h2&gt;
&lt;p&gt;Touch GIS is now available at no cost from the National Geospatial-Intelligence Agency (NGA) for approved users via the GEOINT App Store. The GEOINT App Store provides online on-demand access to GEOINT content and services through mobile apps, web apps, and web services. GEOINT is available to all Department of Defence (all apps), Federal Government and Mission Partners (limited apps).&lt;/p&gt;
&lt;h2&gt;Public Access, NPO, and Education&lt;/h2&gt;
&lt;p&gt;If you don’t qualify for the no cost GEOINT version, Touch GIS is still available to the general public from Apple’s App Store. Pricing is reasonable and Touch GIS also offers a free trial and special rates for non-profit groups and educational institutions.&lt;/p&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.touchgis.app/&quot;&gt;https://www.touchgis.app/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.nga.mil/Home/Store&quot;&gt;https://apps.nga.mil/Home/Store&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Python Script to Overwrite Existing Service in ArcGIS Server]]></title><description><![CDATA[ArcGIS Desktop’s ArcPy package gives us the ability to publish a map service from a map document (MXD) inside Python. This can be very…]]></description><link>https://www.spatialtimes.com/2019/09/python-script-to-overwrite-existing-service-in-arcgis-server/</link><guid isPermaLink="false">https://www.spatialtimes.com/2019/09/python-script-to-overwrite-existing-service-in-arcgis-server/</guid><pubDate>Thu, 12 Sep 2019 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ArcGIS Desktop’s ArcPy package gives us the ability to publish a map service from a map document (MXD) inside Python. This can be very helpful for migrations, backups, and maintenance activities such as changing layers/symbology and overwriting the existing service. Wait a sec, there isn’t an option to overwrite when using the GP Tool in Python… or is there.&lt;/p&gt;
&lt;h2&gt;Publish a map service with Python&lt;/h2&gt;
&lt;p&gt;Before we overwrite a map service, let’s start with the basics of publishing an MXD to a new service with Python. The code here is based on Esri’s &lt;a href=&quot;https://enterprise.arcgis.com/en/server/latest/administer/windows/example-publish-a-map-service-from-a-map-document-mxd-.htm&quot;&gt;online help sample&lt;/a&gt;. This will require an existing ArcGIS Server connection file (.ags) created in ArcCatalog.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; os
cwd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getcwd&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Setup main variables&lt;/span&gt;
agsCon &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cwd &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sep &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AGS_Publish_Connection.ags&quot;&lt;/span&gt;
agsDirectoryName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ServiceDirectory&quot;&lt;/span&gt;
agsServiceName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ServiceName&quot;&lt;/span&gt;
mapDoc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mapping&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MapDocument&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cwd &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sep &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;helloWorld.mxd&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Setup Service Details&lt;/span&gt;
sddraft &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cwd &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sep &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; agsServiceName &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;.sddraft&apos;&lt;/span&gt;
sd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cwd &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sep &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; agsServiceName &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;.sd&apos;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Create service definition draft&lt;/span&gt;
arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mapping&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CreateMapSDDraft&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mapDoc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sddraft&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; agsServiceName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;ARCGIS_SERVER&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; agsDirectoryName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Analyze the service definition draft&lt;/span&gt;
analysis &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mapping&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AnalyzeForSD&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sddraft&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Stage and upload the service if the sddraft analysis did not contain errors&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; sdAnalyze&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;errors&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Execute StageService to create the service definition&lt;/span&gt;
    arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;StageService_server&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sddraft&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Execute UploadServiceDefinition to upload the service definition and publishes the service&lt;/span&gt;
    arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;UploadServiceDefinition_server&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sd&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; agsCon&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Service Published&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 
    &lt;span class=&quot;token comment&quot;&gt;# if the sddraft analysis contained errors, display them&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; analysis&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;errors&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Overwrite an existing service with Python&lt;/h2&gt;
&lt;p&gt;Once we have the map service published, a few tweaks can add the ability to overwrite. The trick here is to open the &lt;code class=&quot;language-text&quot;&gt;.sddraft&lt;/code&gt; file before we stage and upload the service. It’s inside this file where a specific element can be modified to allow for overwriting a service. Thankfully the sddraft file is really just an XML file rebranded with a different extension. A few online community members provide solutions by going the extra mile and use Python XML modules (minidom, ElementTree) to modify the XML data. This is a much more robust approach, especially if you want to modify other values of the XML/sddraft file. You can see an example of the XML module approach in the Helpful Links section at the end if interested.&lt;/p&gt;
&lt;p&gt;In our example, we just want to overwrite an existing service so an XML module won’t be needed. We just need to replace the service type Esri constant &lt;code class=&quot;language-text&quot;&gt;esriServiceDefinitionType_New&lt;/code&gt; value inside the XML with the overwrite constant &lt;code class=&quot;language-text&quot;&gt;esriServiceDefinitionType_Replacement&lt;/code&gt;. We can leverage Python’s String replace() method as this constant is a unique value.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;## Change the SDDraft to overwrite existing service&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Read the file&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sddraft&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;r&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    filedata &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Replace the target string&lt;/span&gt;
filedata &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filedata&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;esriServiceDefinitionType_New&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;esriServiceDefinitionType_Replacement&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Write the file out again&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sddraft&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;w&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filedata&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The code above should be inserted into the main script after creating the sddraft file. You could also place it directly before creating the staging service (arcpy.StageService_server) as it is only needed if there are no errors during the analysis review. I should also mention that this isn’t offically supported - so remember to test, test, test.&lt;/p&gt;
&lt;h2&gt;Tips and Tricks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I was receiving some Python errors when running this script with Python 64-bit. The StageService_server (10.7) not liking the 64-bit version. Both 32-bit and 64-bit could be installed by ArcGIS (32-bit installed with ArcGIS, 64-bit installed with Background Geoprocessing). Everything did work fine when making sure to use Python 32-bit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As previously mentioned, the sddraft file is really just an XML file. If you rename to XML, you can open in Excel/NPP to checkout some of the other interesting elements. If wanting to modify more values it’s recommended to use an XML module for greater support and functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What about the SD file, is it an XML file too? Nope, the the &lt;code class=&quot;language-text&quot;&gt;.sd&lt;/code&gt; file is actually just a renamed &lt;code class=&quot;language-text&quot;&gt;.7z&lt;/code&gt; extension. If you have a copy of 7-zip (Open Source), you can rename to .7z and extract the contents of the SD to see what’s inside this file as well. This compressed file can also include data if it needs to pass it to the server which is why it can get pretty big.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://enterprise.arcgis.com/en/server/latest/administer/windows/example-publish-a-map-service-from-a-map-document-mxd-.htm&quot;&gt;https://enterprise.arcgis.com/en/server/latest/administer/windows/example-publish-a-map-service-from-a-map-document-mxd-.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://community.esri.com/thread/103478#comment-578194&quot;&gt;https://community.esri.com/thread/103478#comment-578194&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Parallel Processing in ArcGIS]]></title><description><![CDATA[We’ve all been there - Staring at the progress bar, wondering why task manager continues to say our 32-cores are sitting nearly idle while…]]></description><link>https://www.spatialtimes.com/2019/05/parallel-processing-in-arcgis/</link><guid isPermaLink="false">https://www.spatialtimes.com/2019/05/parallel-processing-in-arcgis/</guid><pubDate>Sun, 05 May 2019 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’ve all been there - Staring at the progress bar, wondering why task manager continues to say our 32-cores are sitting nearly idle while we run a geoprocessing tool on a huge dataset. OK, that huge dataset isn’t so large anymore - it’s the new normal. But why is ArcMap/Pro toying with us? We did the usual tweaks: data is local, fast drives, 64-bit BGP (for ArcMap), lots of free RAM. Still, the abnormally powerful “GIS workstation” computer (the one we had to beg for and write a justification document to get) is sitting there barely rotating the computer fans? Could be we aren’t taking advantage of the &lt;em&gt;Parallel Processing Factor&lt;/em&gt; in ArcGIS.&lt;/p&gt;
&lt;h2&gt;Parallel Processing?&lt;/h2&gt;
&lt;p&gt;Parallel processing is a technique which splits up a task into many smaller chunks. The chunks are then assigned to multiple CPUs, cores, or processes to work on parts of the job at the same time. This technique can often result in faster processing times for larger datasets. For the past few releases, Esri has been increasing the number of tools that can take advantage of parallel processing. This allows &lt;em&gt;some&lt;/em&gt; tools to distribute their work across multiple cores. Very handy if you have a good computer and want to take advantage of the extra power.&lt;/p&gt;
&lt;p&gt;There are some limitations of course. First, not all tools currently take advantage of this. Over time the number of tools has been expanding, so worth reviewing your favourite tools after an upgrade. Second, you might not get the performance boost you’d expect due to the data or analysis you are trying to perform. If using ArcMap, make sure the tool is running in 64-bit mode via Background Geo-Processing as well (BGP).&lt;/p&gt;
&lt;h2&gt;64-bit and multithreading&lt;/h2&gt;
&lt;p&gt;Parallel processing is related to 64-bit and multithreading, but there are differences. For most geoprocessing tools, performance is roughly the same between ArcGIS Pro and ArcMap (if using BGP), while some tools in Pro are being updated to be faster/improved over time. 64-bit geoprocessing does not automatically make tools faster - but it does allow for more memory allocation during processing. 32-bit is limited to 2GB memory, while 64-bit doesn’t have this limitation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;64-bit geoprocessing is more robust, results will be more accurate, and processes that previously hung, crashed, or ran out of memory may be able to complete successfully ~ Esri&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Likewise, multithreading doesn’t increase the performance of geoprocessing directly. However, with a decent computer, multithreading allows geoprocessing to take place in its own thread. Running independently, this allows other functions to continue on the main thread such as pan/zoom on a map, work with symbology, etc. So multithreading is still very useful if you want to work on other items in your map while the analysis works away on its own thread. Multithreading is used in both Pro and ArcMap (if using background processing in ArcMap).&lt;/p&gt;
&lt;h2&gt;ArcGIS Parallel processing&lt;/h2&gt;
&lt;p&gt;So how can we speed up the process? One possible way is to take advantage of the Parallel Processing Factor in ArcGIS. Again, not all tools are set up to take advantage of Parallel processing but Esri has mentioned that more tools will have this feature at every release. ArcGIS Pro 2.1 has 70 geoprocessing tools and ArcMap 10.6 has approximately 30 tools.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 811px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f1b6a87c9e00f0f013cf341da547c63c/55bfd/parallelProcessing-env.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.2%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABQUlEQVR42m3OTU7DMBAF4NymLY09mR87dkISJ8UubUhQJYRAwAKJ+58BpSCoBE/f4s1sZrLcJ318V+lFpxe9f9PpFbppEWYIUxHm7/EC9ff++IzXKYMCue7Zd+yu2bfsW0HNkNNiS3opUqhLhsAJUqEzY8zQB0Jgwi/E3LRdTPsY0+3hEFNy3hMzi3xBoi4E53yGiM45IiJmY0SEmdAKu3OqqvLen7e/ISLnPLFkJLKL8SbGvu/DLo2nx8N8mh+eumEHAIiEuPxyQQgBwxGqIROlxraZ+2FsmnG4mfbTtL8b4xis7wg75gXRpZawt5VO75lTylvLzFigMAsVQoig1uvV5r9cXW1W65UF4MPHcrnW2m63Ls9dnpfbvDwXr9RfNUBgbllCHWrDmYbCGmuNFRHz47+ISFmWdVXXTYDdScR+AvaBdFBeGCifAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Pro PPF Environment Variable&quot;
        title=&quot;&quot;
        src=&quot;/static/f1b6a87c9e00f0f013cf341da547c63c/55bfd/parallelProcessing-env.png&quot;
        srcset=&quot;/static/f1b6a87c9e00f0f013cf341da547c63c/0eb09/parallelProcessing-env.png 500w,
/static/f1b6a87c9e00f0f013cf341da547c63c/55bfd/parallelProcessing-env.png 811w&quot;
        sizes=&quot;(max-width: 811px) 100vw, 811px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ArcGIS Parallel processing is managed by the Parallel Processing Factor environment variable. Some tools now default to parallel processing, while most tools still require you to set the parallel processing factor. The documentation does a good job at letting you know which ones, however you can always set the parameters just in case - or to override the default. In ArcGIS, the environment section will list this variable if the option is available. You can set this variable using the following options:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1147px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b0f5b175ad26bf50a42c42bc0bd0a091/c17af/parallelProcessing-values.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 19.4%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA9ElEQVR42hXGyU6DQAAAUP7SDzBa0loPnjz4CSa9GNfSA1ePBkINJPQoy7CMnc6wjNJ0bJBSxhBj0mrGcHl5ErqS38enL5eH7ug4u5HZQ58pJx/KgCkDNu5cT4bryXB511vey2/XR8Vt71M9+3k8f7o4kJr2u9o2EGGIiBfGThD70TxGJELE7f4azjHEaVk3Zc3Lutnwr93vnxDCsm1JCLGpKoxxmqYIoSxNEkIopXixIJgkhEAI8zxbMUYp5Zy3bbut6/1ur+u6VBQFhPB5OtU0zTRNyzLt2cwwDN/3YRwHQRB1AgCAD4DneVEYuo6T57mqqv+9wL0qTYGSZwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Parallel Processing Values&quot;
        title=&quot;&quot;
        src=&quot;/static/b0f5b175ad26bf50a42c42bc0bd0a091/c17af/parallelProcessing-values.png&quot;
        srcset=&quot;/static/b0f5b175ad26bf50a42c42bc0bd0a091/0eb09/parallelProcessing-values.png 500w,
/static/b0f5b175ad26bf50a42c42bc0bd0a091/1263b/parallelProcessing-values.png 1000w,
/static/b0f5b175ad26bf50a42c42bc0bd0a091/c17af/parallelProcessing-values.png 1147w&quot;
        sizes=&quot;(max-width: 1147px) 100vw, 1147px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The Parallel Processing Factor is also available when using the ArcPy module with Python. This can be set the same as other variables at the top of your script if you want to leverage for all tools that accept it: &lt;code class=&quot;language-text&quot;&gt;arcpy.env.parallelProcessingFactor = &quot;80%&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Final tips&lt;/h2&gt;
&lt;p&gt;Following the usual best practices, along with leveraging Parallel Processing should reduce the amount of time you spend watching the progress bar. However, don’t go overboard. If you specify more processes than you have available, you could negatively impact performance. One exception to that rule is when the analysis is I/O heavy or processing directly to an Enterprise database connection:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Add Rasters to Mosaic Dataset tool is I/O bound when the mosaic dataset is stored in an enterprise database. Also, the Build Overviews tool is primarily I/O bound to the disk. You can use more processes than your machine has cores by either specifying a percent value greater than 100% or a number of processes greater than the number of cores on your machine. ~Esri&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Helpful Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Parallel_computing&quot;&gt;https://en.wikipedia.org/wiki/Parallel_computing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.techopedia.com/definition/4598/parallel-processing&quot;&gt;https://www.techopedia.com/definition/4598/parallel-processing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pro.arcgis.com/en/pro-app/tool-reference/environment-settings/parallel-processing-factor.htm&quot;&gt;https://pro.arcgis.com/en/pro-app/tool-reference/environment-settings/parallel-processing-factor.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://desktop.arcgis.com/en/arcmap/latest/tools/spatial-analyst-toolbox/parallel-processing-with-spatial-analyst.htm#ESRI_SECTION1_BB63FA79C2A9411690A1AC958EECFC05&quot;&gt;http://desktop.arcgis.com/en/arcmap/latest/tools/spatial-analyst-toolbox/parallel-processing-with-spatial-analyst.htm#ESRI_SECTION1_BB63FA79C2A9411690A1AC958EECFC05&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Create a JavaScript Weather App with Location Data Part 2]]></title><description><![CDATA[In part 1 we went over the main components to create a JavaScript weather app with location data. From finding the device location, getting…]]></description><link>https://www.spatialtimes.com/2019/03/Create-a-JavaScript-Weather-App-with-Location-Data-Part-2/</link><guid isPermaLink="false">https://www.spatialtimes.com/2019/03/Create-a-JavaScript-Weather-App-with-Location-Data-Part-2/</guid><pubDate>Thu, 21 Mar 2019 08:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In &lt;a href=&quot;/2019/01/Create-a-JavaScript-Weather-App-with-Location-Data-Part-1/&quot;&gt;part 1&lt;/a&gt; we went over the main components to create a JavaScript weather app with location data. From finding the device location, getting weather data from the internet machine (DarkSky API), and building a basic HTML interface. However, one limitation mentioned was how to keep the DarkSky “secret key” a secret.&lt;/p&gt;
&lt;p&gt;In part 2 we will build a simple reverse proxy to hide our key on a server. A reverse proxy is when we redirect resources on behalf of the client from one or more servers. These resources are then returned to the client, appearing as if they originated from the proxy server itself. To create the proxy, we will use Node.js (server-side JavaScript). There are many other approaches, but Node.js allows us to use JavaScript and is one of the most powerful runtimes in use today. And who doesn’t love a little JavaScript!&lt;/p&gt;
&lt;p&gt;The team at DarkSky also highly recommends you to protect your key. They feel strongly enough that they disabled cross-origin resource sharing (CORS) as a security precaution.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your API call includes your secret API key as part of the request. If you were to make API calls from client-facing code, anyone could extract and use your API key, which would result in a bill that you’d have to pay. We disable CORS to help keep your API secret key a secret. To prevent API key abuse, you should set up a proxy server to make calls to our API behind the scenes. Then you can provide forecasts to your clients without exposing your API key. ~ &lt;a href=&quot;https://darksky.net/dev/docs/faq#cross-origin&quot;&gt;DarkSky FAQ&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah, let’s do that… with JavaScript (Node.js)!&lt;/p&gt;
&lt;h2&gt;Node.js in a nutshell&lt;/h2&gt;
&lt;p&gt;Node is simply a runtime (environment) that allows us to run JavaScript outside a browser. With Node, we can build web servers, server APIs, web apps, desktop apps, and much more. When running JavaScript server side, you also don’t need to worry about Web Browser compatibility since the JavaScript engine is always the same  - and built on Chrome’s JavaScript engine.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. ~ &lt;a href=&quot;https://nodejs.org/&quot;&gt;Node.js&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Node.js also uses packages to provide additional functionality, much like modules in Python. Many are included by default, but there are thousands of other great external packages that can help when needed.&lt;/p&gt;
&lt;p&gt;For more details on Node.js, there are lots of amazing resources out there. Check out the Node.js website, along with a large library of YouTube videos, and Medium articles should give you an in-depth look into this very popular runtime.&lt;/p&gt;
&lt;h2&gt;The Proxy&lt;/h2&gt;
&lt;p&gt;For the proxy, we are going to use 3 modules. We will add a few more optional ones later for some additional security and validation. Dot-Env is also listed here, but could also be considered optional. Dot-Env will keep the key outside of the main code (if you want to post your code to gitHub, but not your key), there are many other ways we could perform that step as well. Here are the main packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Express: Web application framework that provides a robust set of features for web and mobile applications.&lt;/li&gt;
&lt;li&gt;Request: Request is designed to make HTTP calls. It supports HTTPS and follows redirects by default.&lt;/li&gt;
&lt;li&gt;Dot-Env: A zero-dependency module that loads environment variables from a file. This stores the configuration in the environment separate from the code.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;The Project Setup&lt;/h3&gt;
&lt;p&gt;We will use a very simple project structure for this work. A server-side JavaScript file (server.js), and a Dot-Env file (.env) to store our secret key.&lt;/p&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;.env&lt;/code&gt; file will contain a single variable with the key. The variable can be named whatever you would like - however, no spaces, and all CAPS is recommended. Let’s set this up as “DARKSKY_SECRET”. When we are ready to access this variable inside the server application, we just prefix the variable name “process.env.[variable]“. Based on our variable name above: &lt;code class=&quot;language-text&quot;&gt;process.env.DARKSKY_SECRET&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//.env file&lt;/span&gt;
&lt;span class=&quot;token constant&quot;&gt;DARKSKY_SECRET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;abc123&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;The Code&lt;/h2&gt;
&lt;p&gt;To build the reverse proxy server we start by creating the server.js file and add some of the modules we will be using.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//server.js - load the modules&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; express &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;express&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; request &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;request&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;dotenv&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;express&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With the modules loaded it’s time to define a route (API endpoint). This endpoint will take the request from the client web application along with URL parameters. Once we have the request on the server, we will add our key and send our own request to the DarkSky API from the server. The response from DarkSky will be handed back to the client.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1124px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a511179ccd6222344974fbd66644c7d6/ec55d/weather-reverseProxy.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 53.2%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABcSAAAXEgFnn9JSAAADNElEQVR42o2QXUxTBxiGX4hxMWbMzI1opnMx6mK2RaMmZBkbFIooVbdkwsXUlJRSbUD+HI4hPwaVlSoeLFJgTDpcpNAfDi09nEJNqR5gKD1QzJbMZVsytzGhuzEjo6fW85m6mOxyT/JcvTdvHkRdlZAcxZAGyhCx6SGx5Xg42ABh4ffEet9dNE39mKkZFsNFvlBYNzK7qB+dDZ94ZihcwM+E1ZwYdyGfC/5dc+u7IkTdn1VGBsqKJfZUScRZWiy5Tp/+a9jwNhEB1YQy73T93n6BtMNBWccHSe2ZJr1XpGKvSLkDk6TsDVB23215n22CdLzIYtl+kiJsBS1btfRP+36Kdn9MU5ePnQWwrpsx5B0+f6VJ+dUQZXa5HyvMDlnZ5ZbT2xxyWmu/nGF2yspOVs7qGooedH5Lx3nRit+MCvrZoIg8Miljy62KiNSpovvm/FIASV82NXyUe8F0UXmNo70WXsroHIwprnExZZc7ltHBxlKY3lhKi/VJiskupXUM0nHurhVL7QfoUdv+x0sdKnmpPScqWQ5TwPBJLYBN64HX8i52tqSbnfRBm4MyzQ46YnFTaqudcnq81DEiUO/YJDmEO1TGBiifC7KY9xjT//QY33vgMrz/K9uYOs81pw9dPbMRwMp4x6r+4d0a5y3vUdvYqNrmHy2y3+Ryezhvntnq90xMDfoCge/HbguTTbzAl/DTh7DgOocH9jqwFzRwNRbA13IS5UdVeI6ioh4oNAGvfAhs1IGIXvi8xPiqIlW1BTcpcUfGgex31eVbiWgljjgAut+dWKfOWvF68pq12zclJ731xrqXklavWgNgNYCXk9ZvWKW6R4nfuH9AQ+/MriqLOF9zPbR4pmd24eyNuUX91amH6uaJPzTMxHKVRfzi+ZEEADsB7AHwDoBtAHYDeBPAi2GihJrrc6jtEVVqo5+0zX46ZvDRCWaM8s6NUHbVkJxT7SHdZb8T/yHebTOADQCSAWyNd4wPmrqvVzTcmEVj35zqUC1HaaV9lFlhI0W5jbI+dVB25b8WXvKx+D+0878kMPYgTE5xu940Pq1lxu8VtoyH4moZIVTACDNaRvipuvvOqae7lbUSLJSI1wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Reverse Proxy&quot;
        title=&quot;&quot;
        src=&quot;/static/a511179ccd6222344974fbd66644c7d6/ec55d/weather-reverseProxy.png&quot;
        srcset=&quot;/static/a511179ccd6222344974fbd66644c7d6/0eb09/weather-reverseProxy.png 500w,
/static/a511179ccd6222344974fbd66644c7d6/1263b/weather-reverseProxy.png 1000w,
/static/a511179ccd6222344974fbd66644c7d6/ec55d/weather-reverseProxy.png 1124w&quot;
        sizes=&quot;(max-width: 1124px) 100vw, 1124px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In the client app, we will change our original code from Part 1 that talks to DarkSky directly - subbing in our server route &lt;code class=&quot;language-text&quot;&gt;/darksky/:lat,:long&lt;/code&gt;. Both the “:lat” and “:long” keywords are placeholders on the server that will be populated when the client makes a request. A sample request from the client would look like &lt;code class=&quot;language-text&quot;&gt;https://myDomain.com/darkSky/-80.123,45.123&lt;/code&gt;. The server will interrogate the request and if it matches route name, the request will be forwarded. To access our lat/long variables in the request, we prefix with &lt;em&gt;req.params.&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//server.js - setup the route&lt;/span&gt;
app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/darkSky/:lat,:long&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//DarkSky URL we will send the request to&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dsURL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;https://api.darksky.net/forecast/&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Define a variable pointing to our secret key&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dsSecret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;DARKSKY_SECRET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Additional DarkSky  URL parameters (optional)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dsSettings &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;?exclude=minutely,hourly,daily,alerts,flags&amp;amp;units=auto&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Build the full DarkSky URL&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dsURL &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; dsSecret &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lat &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;,&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;long &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; dsSettings&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Send the request and direct the results back to the user&lt;/span&gt;
    req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//app starts a server and listens on port 3000 for connections&lt;/span&gt;
app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;server ready&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If we were to stop here, this entire exercise wouldn’t be worth the effort. We’ve created a reverse proxy that hides the key, but it doesn’t stop anyone else from using our proxy/routes with external apps. So anyone could leverage the proxy - while DarkSky sends us the bill. We aren’t going to add a full authentication tier, but it’s something to consider for production sites.&lt;/p&gt;
&lt;h3&gt;Basic protection&lt;/h3&gt;
&lt;p&gt;With the key hidden, let’s focus on adding some server protection. More could/should be done, and we should consider the below example a bare minimum. To keep this painless, let’s add a few additional modules to do the heavy lifting for us.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Helmet: Helps secure your Express apps by setting/blocking various HTTP headers&lt;/li&gt;
&lt;li&gt;host-Validation: Extends Express (middleware) that protects Node.js servers from DNS Rebinding attacks by validating Host and Referer headers from incoming requests&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//server.js - add protection&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; helmet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;helmet&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hostValidation &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;host-validation&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//configure hostValidation to only accept requests from a specific host () and referer&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//  if the following hosts/referers don&apos;t match the client, the request will be rejected&lt;/span&gt;
app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hostValidation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;hosts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;myDomain.com&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;referers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://myDomain.com/weather.html&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//Use helmet&apos;s default header rules for added security&lt;/span&gt;
app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;helmet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Rate Limiting&lt;/h3&gt;
&lt;p&gt;Rate limiting is used to control the rate of traffic received by the server and is used to prevent DoS attacks. We aren’t going to throttle (slow) each request to our server, just make sure each client doesn’t abuse the server and make thousands of requests per minute (remember, we want to keep this API from spending our beer money). We can set both a timeframe and the maximum number of requests to allow within that timeframe - for each IP requesting a weather update.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//server.js - add rate limiting&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; rateLimit &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;express-rate-limit&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//app.enable(&quot;trust proxy&quot;); //if already behind a reverse proxy&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; limiter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rateLimit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;windowMs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 5 minutes&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// limit each IP to 20 requests per windowMs&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;limiter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//apply to all requests&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Putting it all together&lt;/h2&gt;
&lt;p&gt;Here is all the code put together. In total, we will need &lt;code class=&quot;language-text&quot;&gt;server.js&lt;/code&gt; and the &lt;code class=&quot;language-text&quot;&gt;.env&lt;/code&gt; file in the root of the project along with all of the modules in the default node_modules folder.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//server.js&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; express &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;express&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; request &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;request&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;dotenv&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; helmet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;helmet&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; hostValidation &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;host-validation&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; rateLimit &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;express-rate-limit&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;express&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;hostValidation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;hosts&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;spatialtimes.com&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;referers&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://www.spatialtimes.com/weather.html&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;helmet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; limiter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rateLimit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;windowMs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;limiter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;//Setup route for DarkSky&lt;/span&gt;
app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/darkSky/:lat,:long&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;req&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dsURL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;https://api.darksky.net/forecast/&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dsSecret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; process&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;env&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;DARKSKY_SECRET&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dsSettings &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;?exclude=minutely,hourly,daily,alerts,flags&amp;amp;units=auto&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; url &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dsURL &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; dsSecret &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lat &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;,&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;params&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;long &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; dsSettings&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  req&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; port &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8001&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;port&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;server ready&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now that our server is ready with the reverse proxy we would just need to change the URL request in the HTML file to call our new endpoint instead of going to the DarkSky API directly.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Create a JavaScript Weather App with Location Data Part 1]]></title><description><![CDATA[In the previous post, we discussed the possibility of writing our own location-based weather application. So let’s try it! In part 1 we will…]]></description><link>https://www.spatialtimes.com/2019/01/Create-a-JavaScript-Weather-App-with-Location-Data-Part-1/</link><guid isPermaLink="false">https://www.spatialtimes.com/2019/01/Create-a-JavaScript-Weather-App-with-Location-Data-Part-1/</guid><pubDate>Tue, 15 Jan 2019 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the &lt;a href=&quot;/2019/01/weather-apps-and-location-data-in-the-news/&quot;&gt;previous post&lt;/a&gt;, we discussed the possibility of writing our own location-based weather application. So let’s try it! In part 1 we will build a simple app that gets the users’ location and fetches weather data from an API using HTML and JavaScript. This approach is similar to using various mapping APIs to find the user location and will take us a bit behind the scenes on how some of the pre-built location map widgets really work.&lt;/p&gt;
&lt;p&gt;Here are the steps we will work through to build the app:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Get user coordinates using the HTML5 GeoLocation API&lt;/li&gt;
&lt;li&gt;Request weather data for the coordinates using an online weather API&lt;/li&gt;
&lt;li&gt;(optional) Reverse Geocode the coordinates to get additional location details&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;* Not required for most weather APIs, but worth touching on&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Before we begin: The GeoLocation API&lt;/h2&gt;
&lt;p&gt;To request a user location (lat/long coordinates) within the web browser we will leverage the HTML5 GeoLocation API. This functionality is available in all major browsers (desktop and mobile) and &lt;strong&gt;includes IE&lt;/strong&gt; - yeah, crazy I know. But just because it’s supported, doesn’t mean our code will always bring back a valid location. There are a few reasons why we might not get what we are looking for:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When using the API in most browsers the GeoLocation results are only available over secure connections (HTTPS). So the final product should be hosted with HTTPS (we can enable this &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;&lt;strong&gt;for free&lt;/strong&gt;&lt;/a&gt; these days, so this shouldn’t be a show-stopper).
&lt;ul&gt;
&lt;li&gt;An exception to the HTTPS rule is local &lt;code class=&quot;language-text&quot;&gt;file://&lt;/code&gt; testing which still works.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Geolocation API might be blocked by the user/settings. In most desktop/mobile operating systems users have the ability to block location services from being exposed to the browser. In addition, the user will be prompted to provide permission for an individual website as per W3C specifications.&lt;/li&gt;
&lt;li&gt;A request timeout can occur if the data takes too long to return. An optional &lt;code class=&quot;language-text&quot;&gt;PositionOptions&lt;/code&gt; object has a timeout setting representing the maximum length of time (in milliseconds) the device is allowed to wait for a return a position.
&lt;ul&gt;
&lt;li&gt;The default timeout value is Infinity, which is a &lt;em&gt;long&lt;/em&gt; time to wait. It’s a good idea to set a reasonable timeout. Even slower response times should be expected if using this in combination with &lt;code class=&quot;language-text&quot;&gt;PositionOptions.enableHighAccuracy&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: As of Chrome 50, the Geolocation API will only work on secure contexts such as HTTPS. If your site is hosted on a non-secure origin (such as HTTP) the requests to get the users location will no longer function ~ &lt;a href=&quot;https://www.w3schools.com/html/html5_geolocation.asp&quot;&gt;w3schools.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thankfully the Geolocation API has some error checking available to provide some details when troubles occur, including timeouts. It’s then possible to add alternate location approaches such as IP Address lookup, prompt the user for a city, or to change their browser settings.&lt;/p&gt;
&lt;h2&gt;1. Get user coordinates using the HTML5 GeoLocation API&lt;/h2&gt;
&lt;p&gt;To start, we should determine if the browser has basic support for the Geolocation API. Again, even IE9+ supports this but still a good idea to test and very simple to implement. If for some reason there is no support, we can send the user a message letting them know their browser sucks.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Check if the geolocation API exists&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;geolocation&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//true&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Lets get the location (placeholder)&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//false&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;geolocation not available?! What browser is this?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// prompt for city?&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Assuming everything goes well we can swap our placeholder with some code to request the actual location coordinates. The GeoLocation API has three main methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;getCurrentPosition() - used to return the user’s position. A single request per call. This is the one we will use for the example&lt;/li&gt;
&lt;li&gt;watchPosition() - Returns the current position of the user and continues to return updated position as the user moves&lt;/li&gt;
&lt;li&gt;clearWatch() - Stops the watchPosition() method&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code class=&quot;language-text&quot;&gt;getCurrentPosition&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;watchPosition&lt;/code&gt; methods are asynchronous, which means we create a callback to deal with the location data whenever it’s returned (or when an error is returned). A successful return can have up to 8 properties, however, only 3 of these are guaranteed: latitude, longitude, accuracy.&lt;/p&gt;
&lt;p&gt;Here is a short sample with no error checks with an inline success callback so we can easily identify the basics:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//Short sample version with inline success callback&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;geolocation&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Initial a request for the location&lt;/span&gt;
    navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;geolocation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getCurrentPosition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;pos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;//&apos;pos&apos; return object has many properties we can grab&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; geoLat &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; geoLng &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;longitude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; geoAcc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;accuracy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is a more complete sample with both the success and error callbacks in place. Error messages are broken out just in case we want to add more options in the future.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;//More complete version&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;geolocation&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// Request the current position&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// If successful, call getPosSuccess; On error, call getPosErr&lt;/span&gt;
    navigator&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;geolocation&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getCurrentPosition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;getPosSuccess&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; getPosErr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;geolocation not available?! What year is this?&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// IP address or prompt for city?&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// getCurrentPosition: Successful return&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getPosSuccess&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;pos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Get the coordinates and accuracy properties from the returned object&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; geoLat &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; geoLng &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;longitude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; geoAcc &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;accuracy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// getCurrentPosition: Error returned&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getPosErr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;code&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;PERMISSION_DENIED&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;User denied the request for Geolocation.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;POSITION_UNAVAILABLE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Location information is unavailable.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;TIMEOUT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;The request to get user location timed out.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;An unknown error occurred.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That’s all it takes. If all goes well we now have the latitude and longitude coordinates. With this information available, we can to pass it to a weather API and/or convert the coordinates into a known location (reverse geocode).&lt;/p&gt;
&lt;h2&gt;2. Request weather data for the coordinates using an online weather API&lt;/h2&gt;
&lt;p&gt;There are many weather APIs available, and most of them have a free tier (for low usage and/or testing). Each will have some pros and cons, including various advanced features (15-day forecast, multiple forecast models, etc). One major change in this area is the recent shutdown of the very popular &lt;em&gt;Yahoo! Weather API&lt;/em&gt;, probably one of the most used weather APIs over the past decade. As of January 3rd, 2019 the service is offline with a replacement service just starting its “by-request onboarding” phase. Since that’s currently not available, we are going to use &lt;a href=&quot;https://darksky.net/dev&quot;&gt;DarkSky&lt;/a&gt;. This API has an easy to use free tier and accepts Lat/Long inputs. If using for production purposes it’s advised to review all of the APIs to find one that best fits your needs along with appropriate &lt;em&gt;Terms of Use&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Side note on Weather APIs&lt;/strong&gt;: Looks like this world is collapsing into more of an oligopoly. Weather Underground was purchased by The Weather Channel (2012), which was then acquired by IBM (finalized in 2017). Weather Underground was set to retire their API Dec 31, 2018, but have &lt;a href=&quot;https://apicommunity.wunderground.com/weatherapi/topics/weather-underground-api-update&quot;&gt;extended this to February 15, 2019,&lt;/a&gt; to allow more transition time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Side note on Dark Sky&lt;/strong&gt;: This is not a sponsored post and I have no affiliation/relationship with DarkSky. The use of their API is based on it being easy to use, good documentation, and a free usage tier.&lt;/p&gt;
&lt;h3&gt;Using DarkSky’s Weather API&lt;/h3&gt;
&lt;p&gt;The DarkSky developer API will require you to register an account to get access to a key. Once complete, a request is fairly simple:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- API Params --&gt;&lt;/span&gt;
https://api.darksky.net/forecast/[key]/[latitude],[longitude]
&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Sample Request --&gt;&lt;/span&gt;
https://api.darksky.net/forecast/myFakeKey123abc/43.642567,-79.387054&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The resulting JSON data returned from a request like this can be pretty substantial. We can reduce the response using query parameters (filters) to focus on what we want, and also set the measurement units (si, ca, us, uk2, auto). Now we can make a more streamlined request:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- API Params for filters and units (auto) --&gt;&lt;/span&gt;
https://api.darksky.net/forecast/[key]/[latitude],[longitude]?exclude=minutely,hourly,daily,alerts,flags&amp;amp;units=auto
&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Sample Request with filters and units --&gt;&lt;/span&gt;
https://api.darksky.net/forecast/myFakeKey123abc/43.642567,-79.387054?exclude=minutely,hourly,daily,alerts,flags&amp;amp;units=auto&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here is the returned JSON object at the CN Tower in Toronto, Ontario, Canada (43.642567, -79.387054) with filters and units set:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;latitude&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;43.642567&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;longitude&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;-79.387054&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;timezone&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;America/Toronto&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;currently&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;time&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1546832805&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;summary&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Partly Cloudy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;icon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;partly-cloudy-night&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;nearestStormDistance&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;219&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;nearestStormBearing&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;75&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;precipIntensity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;precipProbability&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;temperature&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;-5.11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;apparentTemperature&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;-10.56&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;dewPoint&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;-13.61&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;humidity&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.51&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;pressure&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1032.58&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;windSpeed&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;14.42&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;windGust&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;26.78&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;windBearing&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;38&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;cloudCover&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.59&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;uvIndex&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;visibility&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;16.09&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;ozone&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;247.23&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;offset&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;-5&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Much easier to work with this smaller dataset, but it does remove some advanced attributes we might want to tap into later. For now, we sent a request based on user location and received the weather data. Time to build a basic GUI and grab a beer (who cares if it’s -5 celsius outside). While we let our beer warm up and breathe a little, we will wrap this request into JavaScript.&lt;/p&gt;
&lt;h3&gt;Building the request in JavaScript&lt;/h3&gt;
&lt;p&gt;With the DarkSky URL syntax ready to go, we just need to make the call in our code. Well, &lt;em&gt;almost&lt;/em&gt; ready. There is one last hurdle: &lt;em&gt;CORS&lt;/em&gt;. DarkSky has disabled Cross-Origin Resource Sharing (CORS) on their servers, and for good reason. As recommend by Dark Sky, you should leverage a secure proxy where you can store your Secret API Key (don’t put this in client-side JavaScript or bad people will do bad things with it).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your API call includes your secret API key as part of the request. If you were to make API calls from client-facing code, anyone could extract and use your API key, which would result in a bill that you’d have to pay. We disable CORS to help keep your API secret key a secret ~ &lt;a href=&quot;https://darksky.net/dev/docs/faq#cross-origin&quot;&gt;Dark Sky FAQ&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Argghhh, the CORS limitation doesn’t help when building a JavaScript example. As a quick workaround, I’m going to leverage the &lt;em&gt;“Heroku method”&lt;/em&gt; which will use the Heroku public CORS proxy and send the secret key directly from the client. &lt;strong&gt;THIS IS FOR TESTING ONLY&lt;/strong&gt; so please don’t use this approach in your published code. Only a private proxy or create your own with your secret behind the scenes. It’s called a “secret” for a reason.&lt;/p&gt;
&lt;p&gt;CORS limitations behind us, we just need to make our JavaScript request and use the results for our interface. For this, we are using jQuery’s &lt;code class=&quot;language-text&quot;&gt;getJSON()&lt;/code&gt; method. jQuery isn’t required here, it’s just a shorthand call to the &lt;code class=&quot;language-text&quot;&gt;XMLHttpRequest()&lt;/code&gt; constructor which you could use instead. I’ll place this in a separate function to keep things easy, &lt;strong&gt;and&lt;/strong&gt; because you could put this entire function in your proxy if desired (just send &lt;code class=&quot;language-text&quot;&gt;geoLat&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;geoLong&lt;/code&gt; to the proxy to keep your secret key hidden).&lt;/p&gt;
&lt;p&gt;jQuery’s &lt;code class=&quot;language-text&quot;&gt;getJSON()&lt;/code&gt; will request JSON-encoded data from the server using a GET HTTP request. In general, it takes a URL (like the weather ones we crafted earlier), and returns a &lt;a href=&quot;https://api.jquery.com/category/deferred-object/&quot;&gt;Deferred object&lt;/a&gt;. In this case, it implements the Promise interface so we can provide multiple callbacks. A successful callback will route to &lt;code class=&quot;language-text&quot;&gt;.done()&lt;/code&gt;, while an error response will be directed to &lt;code class=&quot;language-text&quot;&gt;.fail()&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;_dsSecret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;yourSecret&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;//Again, for testing only, should be hidden in proxy&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fn_getWeatherByLL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;geoLat&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;geoLng&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//API Variables&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; proxy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;https://cors-anywhere.herokuapp.com/&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dsAPI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://api.darksky.net/forecast/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dsKey &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _dsSecret &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; dsParams &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;?exclude=minutely,hourly,daily,alerts,flags&amp;amp;units=auto&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;//Concatenate API Variables into a URLRequest&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; URLRequest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; proxy &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; dsAPI &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; dsKey &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;geoLat&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;,&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;geoLng&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; dsParams
  &lt;span class=&quot;token comment&quot;&gt;//Make the jQuery.getJSON request&lt;/span&gt;
  $&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getJSON&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; URLRequest &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Success promise&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; wSummary &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currently&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;summary&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; wTemperature &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currently&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;temperature&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// lots of results available on the data object&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;// use the results to populate the GUI here&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;//Error promise&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fail&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Sorry, something bad happened when retrieving the weather&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Have Weather &gt; populate GUI&lt;/h3&gt;
&lt;p&gt;Once we have weather data for the location, we can populate the user interface. In the code above, the &lt;code class=&quot;language-text&quot;&gt;data&lt;/code&gt; object contains all the information needed to build your weather dashboard. From current temperature, daily max/mins, and short-term forecast - how you present this to the user is up to you.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1022px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/afe6017c37012013ed7d4744fb1fe99e/e5fd4/weather-gui.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.800000000000004%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA50lEQVR42pWRv0vDQBTH+w+7d3YULIiLOBV0LaLQQQhBhQ7XcOEIBZczQoa7SM82loOSvB8nsWCHNpC+4S1fPt/35fsG4XC4XVvPWtL7jPyaw7EBgMFxoQmLNxoPm8kFLF6xL8x/Z17u8fkWn67g5qxOpgj1PlEnvCNtTpPLJoTgDN2d12VOrcL9YjMH8cDTa3wc0afif9M+sbksjVvZQq++7Ppn871cuqqqesFEVBSFEHOVyY9cCzFPkkRrHQ6id7bNzACAiESEeELbrb1zTimVZVkURdba0/5sjJFSpmkax7H3vgv+BS03P22dIxsIAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Weather GUI&quot;
        title=&quot;&quot;
        src=&quot;/static/afe6017c37012013ed7d4744fb1fe99e/e5fd4/weather-gui.png&quot;
        srcset=&quot;/static/afe6017c37012013ed7d4744fb1fe99e/0eb09/weather-gui.png 500w,
/static/afe6017c37012013ed7d4744fb1fe99e/1263b/weather-gui.png 1000w,
/static/afe6017c37012013ed7d4744fb1fe99e/e5fd4/weather-gui.png 1022w&quot;
        sizes=&quot;(max-width: 1022px) 100vw, 1022px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The image above is based on an example JSFiddle adding results that I’ve already requested in advance using the methods above. The only thing needed is to update the HTML text of the IDs when the &lt;code class=&quot;language-text&quot;&gt;data&lt;/code&gt; object is returned in the promise.&lt;/p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;300&quot; src=&quot;https://jsfiddle.net/mcin8130/j9ye7wvk/embedded/result,html,js,css,resources/&quot; allowfullscreen=&quot;allowfullscreen&quot; allowpaymentrequest frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Notice we don’t have a city/place name on the page, just latitude and longitude - Turns out this information isn’t available in the return object. If you want to find the place name of the current location, see the Reverse Geocoding section below.&lt;/p&gt;
&lt;h3&gt;Dark Sky Forecast Embeds&lt;/h3&gt;
&lt;p&gt;At this point, I should probably confess that Dark Sky also has a number of &lt;a href=&quot;https://darksky.net/widgets&quot;&gt;embeddable weather widgets&lt;/a&gt;. Don’t be mad, if I started with this information, we wouldn’t know what it takes to make it all happen - and possibly miss out on some JavaScript goodness. You’re welcome. Dark Sky has many ways to include their widgets if you can agree to their &lt;a href=&quot;https://darksky.net/widgetterms&quot;&gt;widget terms of service&lt;/a&gt;. These can be accessed directly from Dark Sky as scripts, an iframe (via &lt;a href=&quot;https://Forecast.io&quot;&gt;Forecast.io&lt;/a&gt;), and from &lt;a href=&quot;https://Weatherwidget.io&quot;&gt;Weatherwidget.io&lt;/a&gt;.&lt;/p&gt;
&lt;iframe id=&quot;forecast_embed&quot; frameborder=&quot;0&quot; height=&quot;245&quot; width=&quot;100%&quot; src=&quot;https://forecast.io/embed/#lat=43.642567&amp;lon=-79.387054&amp;units=ca&amp;name=CN Tower Toronto&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;If you just want a widget on your page, good news, &lt;ins&gt;no secret keys&lt;/ins&gt;! Just get the location from the &lt;a href=&quot;#1.-Get-the-current-location-using-GeoLocation-API&quot;&gt;Geolocation API&lt;/a&gt; and create an iframe on the page dynamically.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getPosSuccess&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;pos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Get the coordinates of the current possition.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; geoLat &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;latitude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; geoLng &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;coords&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;longitude&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toFixed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;//Create an iframe and use the current location data&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; iSource &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://forecast.io/embed/#lat=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; geoLat &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;amp;lon=&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; geoLng &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;amp;name=Woot&amp;amp;color=#00aaff&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&amp;lt;iframe&gt;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Creates the element&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;src&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; iSource&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Sets the attribute spry:region=&quot;myDs&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;height&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;245&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Set the height&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;width&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;100%&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Set the width&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#id-weather&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Append to an existing element ID&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Code Complete&lt;/h2&gt;
&lt;p&gt;That covers the basics of finding the device location, getting weather data from the internet machine (DarkSky API), and building a basic HTML interface. Now you can play with the weather data and determine how to enhance the interface.&lt;/p&gt;
&lt;p&gt;This is really it for part 1. In part 2 we will build a proxy using Node.js (server-side JavaScript) to show one approach to dealing with secret keys.&lt;/p&gt;
&lt;p&gt;Oh, I did mention we could reverse geocode the coordinates as well…&lt;/p&gt;
&lt;h2&gt;3. Reverse Geocode the coordinates to get additional location details (optional)&lt;/h2&gt;
&lt;p&gt;For weather data, we don’t need amazing accuracy because weather data doesn’t change at the street level. So even if the accuracy sucks, it should have little consequence. But if you want to find and show the current city, address, or include a pin on a map, reverse geocoding to the rescue. Using a Reverse Geocoding API is pretty much identical to using a weather API - Provide coordinates in a URL and wait for results.&lt;/p&gt;
&lt;p&gt;Again, we have lots of API sources to reverse geocode a lat/long to an address: Esri search API, Google Maps/places API, Bing Maps API, and OpenStreetMap API to name just a few. A future article will explore these options in more detail. For now, let’s take a quick look at &lt;em&gt;OSM Nominatim&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;OSM Nominatim&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.openstreetmap.org/wiki/Nominatim#Reverse_Geocoding&quot;&gt;OpenStreetMap “Nominatim”&lt;/a&gt; has a REST endpoint to reverse geocode a pair of coordinates. The wiki help does an excellent job getting into all the options here but it is actually handled the same way as DarkSky. Nominatim requires three parameters: &lt;code class=&quot;language-text&quot;&gt;format&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;latitude&lt;/code&gt;, and &lt;code class=&quot;language-text&quot;&gt;longitude&lt;/code&gt;. Using the &lt;code class=&quot;language-text&quot;&gt;format&lt;/code&gt; option in the example below, a JSON object is returned with lots of information.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Sample request --&gt;&lt;/span&gt;
https://nominatim.openstreetmap.org/reverse?format=jsonv2&amp;amp;lat=43.642567&amp;amp;lon=-79.387054&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// return object&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
   &lt;span class=&quot;token property&quot;&gt;&quot;place_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;84050944&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;licence&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;osm_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;way&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;osm_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;32742038&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;lat&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;43.6425637&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;lon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-79.3870871832047&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;place_rank&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;30&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;category&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tourism&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;attraction&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;importance&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;0.466188092284943&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;addresstype&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tourism&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;CN Tower&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;display_name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;CN Tower, 301, Front Street West, Entertainment District, Old Toronto, Toronto, Ontario, M5V 2X3, Canada&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;address&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;  
      &lt;span class=&quot;token property&quot;&gt;&quot;attraction&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;CN Tower&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;house_number&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;301&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;road&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Front Street West&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;neighbourhood&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Entertainment District&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;city_district&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Old Toronto&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;city&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Toronto&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Ontario&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;postcode&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;M5V 2X3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;country&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Canada&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;country_code&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ca&quot;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;boundingbox&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;  
      &lt;span class=&quot;token string&quot;&gt;&quot;43.6423338&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;43.6427965&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;-79.3874416&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;-79.3867985&quot;&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This provides lots of location information. Worth checking in various rural/urban areas to see how the results differ, but overall this gives a good idea of what to expect.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Weather apps and location data in the news]]></title><description><![CDATA[For some reason, my news feeds have recently been filled with articles about Weather Apps and how many of them are selling our location data…]]></description><link>https://www.spatialtimes.com/2019/01/weather-apps-and-location-data-in-the-news/</link><guid isPermaLink="false">https://www.spatialtimes.com/2019/01/weather-apps-and-location-data-in-the-news/</guid><pubDate>Tue, 08 Jan 2019 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For some reason, my news feeds have recently been filled with articles about Weather Apps and how many of them are selling our location data to the highest bidder. After reading a few, I started to look at my weather apps (yes, I have a few) in more detail.&lt;/p&gt;
&lt;h2&gt;Location data in the news&lt;/h2&gt;
&lt;p&gt;Location-based Weather apps are everywhere but lately, they’ve been in the news for the wrong reasons. Turns out, many App Developers are taking our location data, even if we say not to, and selling it to third parties. If we grab a &lt;strong&gt;“free”&lt;/strong&gt; app, we should assume that most of the time the App Developer still wants to make money. How do they make bank? By selling the data they collect. Location data among it. So why do weather apps get stuck holding the headlines as they surely aren’t the only ones doing this (Facebook)? Well, a few reasons off the top of my head why weather apps are at the forefront:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;There are so many of them:
&lt;ul&gt;
&lt;li&gt;Website &lt;a href=&quot;https://42matters.com/stats&quot;&gt;42Matters&lt;/a&gt; stats reveal iOS having 4,951 free weather apps listed for iOS (on 2019-01-07)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Weather apps require the user to share location for them to work fully (might still work otherwise, but we tend to share our location for these apps)&lt;/li&gt;
&lt;li&gt;They are used daily, so lots of ongoing data gathering&lt;/li&gt;
&lt;li&gt;Weather apps are pretty easy to create&lt;/li&gt;
&lt;li&gt;Some smart people looked into this and yikes, it scary:
&lt;ul&gt;
&lt;li&gt;New York Times: &lt;a href=&quot;https://www.nytimes.com/interactive/2018/12/10/business/location-data-privacy-apps.html&quot;&gt;Weather Bug and Weather channel sending data directly to third parties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Wall Street Journal &lt;a href=&quot;https://www.wsj.com/articles/popular-weather-app-collects-too-much-user-data-security-experts-say-11546428914&quot;&gt;popular-weather-app-collects-too-much-user-data-security-experts-say&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Motherboard: &lt;a href=&quot;https://motherboard.vice.com/en_us/article/gy77wy/stop-using-third-party-weather-apps&quot;&gt;Weather apps including The Weather Channel, Accuweather, and WeatherBug—have shown that they share your location data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Location, Location, Location&lt;/h2&gt;
&lt;p&gt;Location data - there used to be only a small niche working with this data - the GIS Geek. We would go to conferences and repeat one of our favourite truisms: &lt;strong&gt;“80% of all data is spatial”&lt;/strong&gt;. Sure, we have a hard time proving where that stat came from, but if anything, in today’s world we are probably underestimating.&lt;/p&gt;
&lt;p&gt;These days, no matter what you are doing with technology, there is a chance someone is getting the tracking data of where you are while doing it. Why not?! Location analytics has also come a long way with big data, AI, and demographic profiling tools at our fingertips. As someone who’s worked in GIS for many years, I’m not shocked this is happening, more shocked people now know more about my chosen profession.&lt;/p&gt;
&lt;h2&gt;Technology is Location Aware&lt;/h2&gt;
&lt;p&gt;With phones and watches having embedded GNSS chips, and in an &lt;em&gt;always-connected&lt;/em&gt; world where we can even trace an IP address to a city block - location data is proliferating. Every site we sign-up with can get our IP address, and probably ask us for our home address or zip/postal. Companies see the value in this data and are finding more ways to collect and leverage it. This is no different than the old Nielsen ratings that started back in 1947. Companies have always wanted to know how they were doing and to know more about who their audience is since this can help sell ads and better understand the customer. The data itself is also worth a pretty penny. Combining location and usage data with census information and profiles - can give a very detailed picture.&lt;/p&gt;
&lt;h2&gt;How To Protect Yourself&lt;/h2&gt;
&lt;p&gt;To be honest, most people are probably &lt;em&gt;somewhat&lt;/em&gt; aware this is happening but don’t care. Privacy seems like a thing of the past in the digital world. We may even trust some companies with our data. We also assume that the data is secure, and if shared/sold, we pretend they are secure too. &lt;em&gt;Really?!&lt;/em&gt; In Canada, there is a federal privacy law (&lt;a href=&quot;https://www.priv.gc.ca/en/privacy-topics/privacy-laws-in-canada/the-personal-information-protection-and-electronic-documents-act-pipeda/&quot;&gt;PIPEDA&lt;/a&gt;) setting rules for acquiring “meaningful consent” if a company wants to share your personal information. After reading a few Terms of Use, pretty sure some are even in violation of federal laws in their sharing of data with third parties. Especially if they track your location without permission (you can still block this using your os privacy settings).&lt;/p&gt;
&lt;p&gt;Time and time again we hear about another database being hacked. That data we were comfortable sharing initially is now in the hands of the unknown. Still, some might not care (if it doesn’t include their favourite/only password). From a GIS perspective, just think about what &lt;em&gt;you&lt;/em&gt; could do with this location data. Hopefully, criminals don’t have a GIS background, or they could do some pretty crazy stuff - beyond understanding their “potential customers” better. Perhaps even a choropleth map.&lt;/p&gt;
&lt;p&gt;So think about the vast mountain of data you are sharing with apps and in what combination. Then put on your hacker/GIS hat and think about what you could do with a dataset of 500 million records (&lt;a href=&quot;https://www.wired.com/story/marriott-hack-protect-yourself/&quot;&gt;Marriott&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;How To Protect Others&lt;/h2&gt;
&lt;p&gt;Education and implementation. We should remind ourselves and others that our data is ours, and has value - so worth guarding. Use a password manager or at least make sure to use unique passwords that aren’t easy to guess. Don’t use the same password for your email account (Gmail, etc) on any other website where you use the same email to register. Only share location data if you think it is worth it and adds value to your use of the app.&lt;/p&gt;
&lt;p&gt;Most importantly, there are lots of great articles out there on how to secure your digital self. A good time to explore a few. Then delete some of the 4,951 weather apps from your devices.&lt;/p&gt;
&lt;h2&gt;Where do we go from here?&lt;/h2&gt;
&lt;p&gt;Maybe it’s time to try writing our own location-based weather app?! Hmmm, stay tuned…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Upgrading Spatial Times]]></title><description><![CDATA[Spatial Times is getting an upgrade. OK, more of a rebuild from scratch. After 5 years, it was time to update the interface and clean-up…]]></description><link>https://www.spatialtimes.com/2019/01/upgrading-spatial-times/</link><guid isPermaLink="false">https://www.spatialtimes.com/2019/01/upgrading-spatial-times/</guid><pubDate>Wed, 02 Jan 2019 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Spatial Times is getting an upgrade. OK, more of a rebuild from scratch. After 5 years, it was time to update the interface and clean-up some server code. There will be some growing pains over the coming weeks, but it will be worth it (&lt;em&gt;he said with trepidation&lt;/em&gt;). The biggest changes are behind the scenes, as the site is moving from a sluggish Wordpress site to a newer Static Site Generated (SSG) approach leveraging React and GraphQL. Selfishly, this also reduces my hosting cost which isn’t a bad thing either.&lt;/p&gt;
&lt;h2&gt;Static Site Generated with Gatsby&lt;/h2&gt;
&lt;p&gt;After lots of trial and error, I decided to go with &lt;a href=&quot;https://www.gatsbyjs.org/&quot;&gt;Gatsby&lt;/a&gt; to build the new version of the site. This gave me the opportunity to continue my dive into modern development approaches with React.js, Webpack, GraphQL, and TypeScript (honourable mention to NPM, git, Node.js and VS Code of course). Over time I will add more Progressive Web App (PWA) functionality for better offline experience - but one step at a time.&lt;/p&gt;
&lt;p&gt;All of the posts have been converted to markdown files as I embrace the &lt;a href=&quot;https://jamstack.org/&quot;&gt;JAMstack&lt;/a&gt; way of life. With all these changes, some things are bound to break. But if I miss something today, I will hopefully fix it tomorrow. Although if you see something wonky that persists for a while, let me know.&lt;/p&gt;
&lt;h2&gt;Why Upgrade Spatial Times?&lt;/h2&gt;
&lt;p&gt;Beyond what’s already been said, the upgrade lends itself to a learning opportunity. As most of the posts are GIS related, this learning isn’t limited to Spatial Times. GIS and the web are constantly evolving. Companies like Google, Esri, and Microsoft are all moving in this direction: Esri recently added the JavaScript API to NPM for creating custom builds; Google is focused on making PWA’s the future of web/app development; Microsoft bought GitHub (and big contributor), makes VS Code freely available (best code editor IMHO and built on Node/Electron), and Edge is moving to Chromium engine.&lt;/p&gt;
&lt;p&gt;And there’s &lt;strong&gt;performance&lt;/strong&gt;. Below is an audit report from Lighthouse to the original Spatial Times site using Wordpress. You can see the site was pretty good in the SEO and Best Practices categories, has decent accessibility, and dismal performance. To be fair, I didn’t spend too much time trying to squeeze performance out of the site - but shouldn’t it be fast by default?!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 730px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/cff3491bfc2ce6ac90c695afc95a0665/a6a70/website-audit-old.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 18.999999999999996%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAnUlEQVR42n2OvW4DMQyD7/3fLEOG7gGyFUGSq6RaPkuyfgpf93AiwI8Et4jwMepUZk7EjFi+yvknp/xH0SFtYR7+jY+uR1VtOqQT5dlUEd53M1uQSbtdvOPyOvh+Nd6raphc71/P3/cqMzMATp9mBgDUGhGdQ2N/v1S1qojo9Xw0gAyPqYAgKhm55Qedd9yde5chQiijSwM+Dmxoqn/ccehNjNkyFQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;lighthouse audit of the old site&quot;
        title=&quot;&quot;
        src=&quot;/static/cff3491bfc2ce6ac90c695afc95a0665/a6a70/website-audit-old.png&quot;
        srcset=&quot;/static/cff3491bfc2ce6ac90c695afc95a0665/0eb09/website-audit-old.png 500w,
/static/cff3491bfc2ce6ac90c695afc95a0665/a6a70/website-audit-old.png 730w&quot;
        sizes=&quot;(max-width: 730px) 100vw, 730px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;lighthouse audit of the old site&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Without any tweaking of the starting template, the new site is getting a more favourable audit. The new site has a drastic improvement in many areas with Performance and Accessibility being my primary focus. I will spend some time making updates for PWA and SEO, but not going to lose any sleep with these new results.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 730px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2cabf2cf1205a2b26d807d84986cd952/a6a70/website-audit-new.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 18.999999999999996%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAsUlEQVR42lWOzU4DMRCD9/1frEhFQj1woeJQBEUlzd9OsslMJmO0nKhP9idZ9lJ7vWVnZgDMoMWbCgBRuWUnOv78+IrffTAAnfNOofIGYPn01+P7y7QJgHurl5PUBGDd6On8TK0AoEaHt2MoO2/STx+vbvV7mQr54HWoiMQYcoo5ZzNj5rv3zPvamlf34yhGmzoHhxgad5u22P7Y/ukhmJmqllp7az2n3mqnWLYtURLmX4z/5nRRKBVFAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;lighthouse audit of the new site&quot;
        title=&quot;&quot;
        src=&quot;/static/2cabf2cf1205a2b26d807d84986cd952/a6a70/website-audit-new.png&quot;
        srcset=&quot;/static/2cabf2cf1205a2b26d807d84986cd952/0eb09/website-audit-new.png 500w,
/static/2cabf2cf1205a2b26d807d84986cd952/a6a70/website-audit-new.png 730w&quot;
        sizes=&quot;(max-width: 730px) 100vw, 730px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;lighthouse audit of the new site&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;A Few Changes&lt;/h2&gt;
&lt;p&gt;I’ve been working to keep the links to articles the same as to not impact any existing bookmarks or hyperlinks to the site. There are some changes as well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The site is moving to HTTPS. Seems simple enough, but this means the entire site URL is changing. Even with post slugs remaining the same, the root will be different. All inter-site links are updated, but external sites may have an issue. I’m working on a redirect now but might take some time.&lt;/li&gt;
&lt;li&gt;The Search widget has been removed. Let’s be honest: almost nobody used the search feature anyway. Search engines (Google, Bing, Duck-Duck-Go) are how we all search these days. They even have features to search within a specific site. Not worth adding to the competition at this point.&lt;/li&gt;
&lt;li&gt;Post content has streamlined styling. Markdown files keep it simple when writing a new post. Custom CSS is possible, but not needed. This is a good thing as sometimes too much time is spent finding a custom style to highlight a point. Way too much time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What’s Next&lt;/h2&gt;
&lt;p&gt;Hopefully everything goes as planned, but I’ll let the dust settle before making more changes. Maybe even find some time to publish some posts that have been sitting in the attic.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Online User Levels are Changing]]></title><description><![CDATA[A major change to ArcGIS Online User Levels are coming December 4th, 2018. This is a welcome change to the current “Level 1” and “Level…]]></description><link>https://www.spatialtimes.com/2018/11/arcgis-online-user-levels-are-changing/</link><guid isPermaLink="false">https://www.spatialtimes.com/2018/11/arcgis-online-user-levels-are-changing/</guid><pubDate>Fri, 16 Nov 2018 16:50:25 GMT</pubDate><content:encoded>&lt;p&gt;A major change to ArcGIS Online User Levels are coming December 4th, 2018. This is a welcome change to the current “Level 1” and “Level 2” setup, but it will come with some growing pains. These User Levels will be converted to the newer ‘User Types’, and each User Type will have a mix of capabilities and Apps available.&lt;/p&gt;
&lt;h2&gt;What’s changing?&lt;/h2&gt;
&lt;p&gt;With the December release of ArcGIS Online, all existing Level 1 and Level 2 users will be changed to new User Types, along with 3 additional User Types being added. The new names are: ArcView and ArcIn… just kidding! For existing accounts, this is more of a re-branding since nobody wanted to be Level 3 with a sibling that was Level 4 (that is dating a Level 1 that used to be a level 5). &lt;em&gt;Drama&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The bigger change here is the introduction of a new “GIS Professional” type. It’s this new type that has access to ArcGIS Pro, and isn’t directly related to the current Level 2 account. Maybe a chart and picture will help:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 316px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7d3f636b9d84498ed855a193231df459/a8d06/AGOL-Dec2018.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 50.9493670886076%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAB/klEQVR42k2SW08TURSF51f6YpoSfNIX/4KPeGlFIpFrAoFyMURJbWOCQZFCLyodOy2dCgpjA6Uz09Mz7bnO9FzMlIT4Pezs7LWTtXeyjCgaSaGl1FIqIZSSWgoVRVJKdTuMq9BK6bs1pbQQSkppIBzM7TxOrydfbU5Ob0w8W0mkM8mVvYdPlxPTWw9mNidfZibSG8mppfsvVhOptWRqPflk9t7rrUc8IgZCwXZuZu39881cKv91YffTfP5w6eDnyurOVCab2s6ld/fnPhaX3+Zms5/nP3xZyB8uvtt7k91f5CE1KMZ2/ddZy3EuOpxIEeoR13gQNWoty2w2rHMyjCKmR6GKeCxFTCmhgT/kPDQIIUEAlZJhyBmjlFHGGR4GtZpZP224rqukGI0ixhkdq5RSHnLP98IwNDAm19edwWAAIQRj+v2+53Yr5eJB4fjkx/fjo+OjQsH524YQ9no9AACEsN1uc84NgtH52ZnTbl86lwghQgildBAEtt1s2fZp0+66Xr8PEEKMMUIIxpgx5rpu7EwIbtnN338uLh1nOBxijMePBGa1Wj05Mc1a5+amB4DneZ7vE0IQQpTSbrcbO99247P7vTEAANftVirfLMsyzWqpWCyWSuVyqWbVIYS+7wMArq6uYmcppRBiNEb8h4pTEEckzoSKud28Q2v9D3sECu3f+E20AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Compare old and new User Types&quot;
        title=&quot;&quot;
        src=&quot;/static/7d3f636b9d84498ed855a193231df459/a8d06/AGOL-Dec2018.png&quot;
        srcset=&quot;/static/7d3f636b9d84498ed855a193231df459/a8d06/AGOL-Dec2018.png 316w&quot;
        sizes=&quot;(max-width: 316px) 100vw, 316px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Compare old and new User Types&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 361px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/10c1f9099a5da4bf7740083d00a0fc37/88969/AGOL-Dec2018-esri-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 31.578947368421055%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeUlEQVR42gFuAZH+ADs1ZU1IcUZCYkE7b0Q8c1RPdVNOcEA5b0pEeE5KbD85ZEI7dEU/a0pGZUQ+ckI7cVJNcElFaEE6czMuXQBaVIOFg5R1dXZjXY1pYpR/foWHh4lXUYOHgquQj5ZlYnpkXpWKh56DgoJzbZljXY6CgYRfX2BaU4Y6NWkAV1F9oqGpiYmIe3adUkx5VFRTYWJdPztjd3SSbm9oUVBUT0p4VFJgbm5oQT9VbmmXgYCEXFxXS0dsODFmAExFdHhzmISAm2BaiE9IfFlVemNgf01HeldQgV1YdVlUeE9IfElDa2Rge05IdFlSh1hTeE9KalJLf0dBcADU1NrS0ePMyt3n5vDy8fnQ1uXN0+Lz8vrq6vPAyNrT2Ob18/re4e3Iz9/g5O/s7PPW2ujP1OT09PzNzdIA0NDO3+Pk29/f5+jn6+vp5efl5ebl7e3q3N/fxc3Qz9XW6+vp3eHh193d4OPj1tvbydHTytHT09rcx8fG7EHGNy2xOlMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;New User Types (via Esri)&quot;
        title=&quot;&quot;
        src=&quot;/static/10c1f9099a5da4bf7740083d00a0fc37/88969/AGOL-Dec2018-esri-1.png&quot;
        srcset=&quot;/static/10c1f9099a5da4bf7740083d00a0fc37/88969/AGOL-Dec2018-esri-1.png 361w&quot;
        sizes=&quot;(max-width: 361px) 100vw, 361px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;New User Types (via Esri)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Comparing User Types&lt;/h2&gt;
&lt;p&gt;User Types will be the new way to setup users in your organization based on the Capabilities and Apps required to do their work. Some of these new User Types will also have additional add-ons that can be configured to enhance the standard set of apps available.&lt;/p&gt;
&lt;p&gt;The primary capabilities for each User Type is an expansion on the Level 1 and Level 2 users of today. I’ve taken the list from Esri and removed the App bundles to focus on the primary capabilities, but I strongly encourage reviewing their documentation for full details.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 596px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a49ff2c44a14f0f456cf81936fc79ac8/fe133/AGOL-Capabilities.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.4%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABPElEQVR42j2LW0sCQRhA9/+/1ItvRVDkg5q6lV0xUVEXx3bV9UZXGK2ZUWdmZ7+5JBKEBZ23c+B4mM6aYSEYnkfPlejlavB6HcT+Ze3w7CZTqGQuagfZ0n6ukmlGxc6gHMR+Kyq1B+VGmH9fjLx41j0p7Pm3R9XgtIayd+3j+3a2FfqtyG/2SmhSaXSLdVSuo2K1nWv0zlqhXwsKD53801vf+1iQeDhZzNmSSr5UCTd8pTZf31JAmthUWiU1KAepSziIdersNpXGmS2kxptjjHooHsX9fvTYQ0JwIYS1Zr1ea60TlQjBtdZSitUvAMA5T1OllPIwxl2Eoigcj8fT6QRjzBhLkoQQIsRuYIwppRhjlFLyuYuUEM65lNIDAEIIpVRKudlsrLUA4JwDAGutMUZr/a9a679ijHHO/QAByjZsWYHYDwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;AGOL Capabilities&quot;
        title=&quot;&quot;
        src=&quot;/static/a49ff2c44a14f0f456cf81936fc79ac8/fe133/AGOL-Capabilities.png&quot;
        srcset=&quot;/static/a49ff2c44a14f0f456cf81936fc79ac8/0eb09/AGOL-Capabilities.png 500w,
/static/a49ff2c44a14f0f456cf81936fc79ac8/fe133/AGOL-Capabilities.png 596w&quot;
        sizes=&quot;(max-width: 596px) 100vw, 596px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;AGOL Capabilities&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The Apps provided for each level are grouped together in named bundles. This is because we didn’t have enough new terminology at this point (and much easier to refer to a long list of apps if Esri bundle’s them). Either way, here is the breakdown with a selection of pastel colours I was able to find in Excel:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 703px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1237161f7b9a2b3924ade72cbcb1914b/dac1b/AGOL-Bundles.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 42%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAA7DAAAOwwHHb6hkAAABzUlEQVR42l3GW2vTUADA8XwtwQdBH30RfPHBz+DTYAgTEVTUyaSoU6eg4rBztesqpc7WtsmWrk3TrqdtkubkJCeXJs3NNJeuFxSRIfgg/PnxJ+L50p3OwuVvgFpl9m1D/NSEGVbeo0A6U3q6X325X9ssHL1OF1Pfmh8q7W0K7JSY7QL9RtRY4llHubLXvJpvb1AM1W0UW0cMhgPXGDgGMDHvmcBUec88GWHONds66ts6sNSWLlnJhLhPds+9yJ3f+rJeZVkeUT2R5pBgRzhaQC9RwjNxOId+osVLyZ/icKFMZtA//TH/RTxqKRd2Wxez7Qdkjwb9Wl/k7ABFcxTOeCdE4Uxwo7N3QyVe8G6EJjMYnHJu7M9/EjvlzzeerK48X3uff3dY/16jy2y/CTVOMYYSHvxV1gVBAngkCgjIuiCpHC91/YlDHGQ3Hq5eSt2+nP94l6rmDiuZykFa6FUNmcGwrkrHqnSMYR1ypIYa4oDEsC4P6WG/EniY2H1VWLl27+b19cxW4YQFDN1h6+1ehzdky8S2pdr/HGuOCg0T24Zs4aEeBQkBssXSrcfknVQv91XmhyMRBbrpKGpo2snY+6/Ycqe2H1tuaIwX8fQPfp2FWozgCJkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Apps by bundle and user type&quot;
        title=&quot;&quot;
        src=&quot;/static/1237161f7b9a2b3924ade72cbcb1914b/dac1b/AGOL-Bundles.png&quot;
        srcset=&quot;/static/1237161f7b9a2b3924ade72cbcb1914b/0eb09/AGOL-Bundles.png 500w,
/static/1237161f7b9a2b3924ade72cbcb1914b/dac1b/AGOL-Bundles.png 703w&quot;
        sizes=&quot;(max-width: 703px) 100vw, 703px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Apps by bundle and user type&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Wondering where some of the niche Apps went? Not to fear - Navigator for ArcGIS, ArcGIS Business Analyst, Insights, Drone2Map, and Maps for Adobe Creative are all still available to add to your subscription.&lt;/p&gt;
&lt;p&gt;Mark your calendars!&lt;/p&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/en-us/arcgis/products/arcgis-online/pricing/arcgis-online-subscriptions&quot;&gt;ArcGIS Online Subscription User Types: Esri Help&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.esri.com/arcgis-blog/products/arcgis-online/announcements/whats-coming-in-arcgis-online-introducing-user-types/&quot;&gt;Article on the new update to User Types: Esri Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Use ArcPy to Connect to SDE and Versions]]></title><description><![CDATA[This post will discuss how to use ArcPy to Connect to SDE, create a new version, and switch to that version all inside a Python script. At…]]></description><link>https://www.spatialtimes.com/2018/10/use-arcpy-to-connect-to-sde-and-versions/</link><guid isPermaLink="false">https://www.spatialtimes.com/2018/10/use-arcpy-to-connect-to-sde-and-versions/</guid><pubDate>Mon, 01 Oct 2018 15:52:15 GMT</pubDate><content:encoded>&lt;p&gt;This post will discuss how to use ArcPy to Connect to SDE, create a new version, and switch to that version all inside a Python script. At first glance this should be pretty straight forward - provide some connection details and a version name. Well, ArcPy isn’t really designed for that approach. There currently isn’t an ArcPy function to connect to SDE within code, or to deal with new/changing versions. The current documented approach is to use Toolbox tools or create the version in advance, create a connection file pointing to a version, and use this as a reference in a script.&lt;/p&gt;
&lt;p&gt;There are many reasons why the documented approach might not meet our needs: We want everything inside one script without any related files required; We don’t know the new version name in advance; We want to run on Linux (ArcGIS server); Or we simply just want the option to use a single script for our &lt;em&gt;scripty&lt;/em&gt; stuff.&lt;/p&gt;
&lt;h2&gt;Creating a SDE connection file in ArcPy&lt;/h2&gt;
&lt;p&gt;At this point, it might be easier to open ArcCatalog, create the SDE connection file, and point your script to it. But if you want the “everything we need is in this script” approach, how far can we go? Well, not too far unless we are willing to use some Toolbox tools along the way.&lt;/p&gt;
&lt;p&gt;Creating the SDE connection file isn’t a problem since there is a toolbox tool to create one. Inside our Python script we can call the &lt;strong&gt;CreateDatabaseConnection_management&lt;/strong&gt; tool directly and save the connection file for later use.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;CreateDatabaseConnection_management&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out_folder_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
    database_platform&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; instance&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;account_authentication&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;username&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;password&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;save_user_pass&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;database&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;schema&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;version_type&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;version&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We are going to use Windows Authentication so we don’t need to expose any user credentials for now. When creating the connection, we need to supply a few parameters that impact our script:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;‘version’: The name we specify here must already exist. In this example, we will use the Default version.&lt;/li&gt;
&lt;li&gt;An output folder path (directory) for the file that is created. If on a server, there is a chance we aren’t sure where to save, or the script directory is read-only, and saving to c:\temp makes some admins a little nervous. Hmmmm, where to put the file?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What if we used the ArcPy “inMemory” space for the output? This would meet our needs, but inMemory doesn’t currently support this technique. Thankfully there is a great module called “tempfile” that comes included with core Python to handle this much the same as inMemory. The tempfile module generates temporary files and directories. It also works on all Python supported platforms.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;tempfile&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mkdtemp&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;suffix&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; prefix&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;tmp&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;dir&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Within the tempfile module, there are commands for both directories and files that we can use much like the inMemory feature. The directory will be secure and accessible by the account running the script, just make sure to cleanup the temp directory when you are done.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;sdeTempPath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tempfile&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mkdtemp&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CreateDatabaseConnection_management&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sdeTempPath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&apos;ConnName.sde&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;SQL_SERVER&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;db\\instance&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&apos;OPERATING_SYSTEM_AUTH&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;#&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Database&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Creates a temporary directory in the most secure manner possible. There are no race conditions in the directory’s creation. The directory is readable, writable, and searchable only by the creating user ID. The user of mkdtemp() is responsible for deleting the temporary directory and its contents when done with it. ~Python Software Foundation, Overview of Tempfile&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Create a new version in ArcPy&lt;/h2&gt;
&lt;p&gt;Toolbox is again required to create a version, using the &lt;strong&gt;CreateVersion_management&lt;/strong&gt; tool.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;CreateVersion_management &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;in_workspace&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; parent_version&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  version_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;access_permission&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;When creating a version in a DB like SQL Server, it will prefix the version name with the name of the user - even though we didn’t supply ours directly, it was determined when we created the connection file with reference to the current Windows Account. So before we can use the version, we will need to find it. Side note: We are assuming the version doesn’t already exist - you might want to check before creating.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CreateVersion_management&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sdeTempPath &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sep &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&apos;ConnName.sde&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;sde.DEFAULT&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
  sdeVersionName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;PUBLIC&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Using the new version&lt;/h2&gt;
&lt;p&gt;To continue complicating things, we can’t just switch our newly created version in the connection we already created. The only way to reference a version in ArcPy is to use a connection file that already points to that version. A little redundant, but good news is that we just learned how to create a SDE connection file, so we just need to find the full version name (user.version) and create a connection one more time with the new version name included.&lt;/p&gt;
&lt;h2&gt;The Code&lt;/h2&gt;
&lt;p&gt;Here is a script that will use ArcPy to Connect to SDE, create a new version, and switch to that version all inside a Python (ArcPy) script. This is just a sample and it is recommended to add more error handling, trap for correct licenses, check if the version exists, etc.&lt;/p&gt;
&lt;iframe
  src=&quot;https://gist.github.com/TheBryanMac/6b6c156f908d9dd08aaf3eb5831ce727.pibb&quot;
  style=&quot;width: 100%; height: 300px; border: 0;&quot;
&gt;&lt;/iframe&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://desktop.arcgis.com/en/arcmap/latest/tools/data-management-toolbox/create-database-connection.htm&quot;&gt;Create SDE database connection (Esri Help)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://desktop.arcgis.com/en/arcmap/latest/tools/data-management-toolbox/create-version.htm&quot;&gt;Create SDE version (Esri Help)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.python.org/2/library/tempfile.html#tempfile.mkdtemp&quot;&gt;tempfile python module (Python Help)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Collector for ArcGIS Updated v18.0.1]]></title><description><![CDATA[Collector for ArcGIS v18.0.1 is now released for all supported platforms. For iOS users, this includes the use of Leica’s Zeno GG04 plus…]]></description><link>https://www.spatialtimes.com/2018/04/collector-for-arcgis-updated-v18-0-1/</link><guid isPermaLink="false">https://www.spatialtimes.com/2018/04/collector-for-arcgis-updated-v18-0-1/</guid><pubDate>Sun, 22 Apr 2018 13:59:57 GMT</pubDate><content:encoded>&lt;p&gt;Collector for ArcGIS v18.0.1 is now released for all supported platforms. For iOS users, this includes the use of Leica’s Zeno GG04 plus. All platforms get an enhancement for offline tile usage security, and many bug fixes.&lt;/p&gt;
&lt;p&gt;The bug fixes for iOS include many of the minor, yet annoying, issues that create some confusion with field staff:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en/bugs/nimbus/QlVHLTAwMDA5MTkyMg==&quot;&gt;BUG-000091922&lt;/a&gt;: After searching for a feature in Collector for ArcGIS (iOS) on an iPad Air, there is no option to Copy, Edit, Delete, Zoom to, or Get Directions to the feature&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en/bugs/nimbus/QlVHLTAwMDA5Mjc2Mg==&quot;&gt;BUG-000092762&lt;/a&gt;: Orphaned replicas are seen under the REST endpoint of a hosted feature service after removing a map from a mobile device via the Collector for ArcGIS (iOS 8.x) application without synchronizing the edits&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en/bugs/nimbus/QlVHLTAwMDA5Mzc3Ng==&quot;&gt;BUG-000093776&lt;/a&gt;: Collector for ArcGIS (iOS) shows duplicate results if multiple searches and selections are executed for the same feature using the Find Locations By Layer application setting&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en/bugs/nimbus/QlVHLTAwMDA5NTU4NA==&quot;&gt;BUG-000095584&lt;/a&gt;: Unable to add attributes to a related table after searching the feature with a hosted feature layer in Collector for ArcGIS (iOS)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en/bugs/nimbus/QlVHLTAwMDEwOTAxNQ==&quot;&gt;BUG-000109015&lt;/a&gt;: After searching for a feature in Collector for ArcGIS (iOS), updating a field that controls a feature’s symbology from these search results causes the symbology of the feature not to update, even though the field is updated.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.esri.com/en/bugs/nimbus/QlVHLTAwMDEwOTg5NA==&quot;&gt;BUG-000109894&lt;/a&gt;: Collector for ArcGIS (iOS) location tracking stops when the basemap is changed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make sure to update all your devices, and have fun in the field!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SXBlue Platinum, In the Field]]></title><description><![CDATA[It was finally time to get bundled up and test the SXBlue Platinum in nature. Not only to test the functionality, but with the recent -20c…]]></description><link>https://www.spatialtimes.com/2018/02/sxblue-platinum-field/</link><guid isPermaLink="false">https://www.spatialtimes.com/2018/02/sxblue-platinum-field/</guid><pubDate>Wed, 07 Feb 2018 22:45:48 GMT</pubDate><content:encoded>&lt;p&gt;It was finally time to get bundled up and test the SXBlue Platinum in nature. Not only to test the functionality, but with the recent -20c outside, to test the device in a traditional Canadian winter. Before heading out, it was time to setup the device with ArcGIS Collector (v17.0.4). Just in case, the device comes with a great quick start guide to explain the status lights, and how to pair with iOS and Android. It goes even further and helps you setup the SXBlue Platinum with ArcGIS Collector which was a great reminder on the “Provider” adjustments that may be needed.&lt;/p&gt;
&lt;h2&gt;SXBlue Platinum and ArcGIS Collector Setup&lt;/h2&gt;
&lt;p&gt;There are many ways to use the SXBlue Platinum with ArcGIS Collector. The basic setup is to configure the Provider to SXBlue and leave the Location Profile defaults (AKA, do nothing). This is the one to use when the device is reading SV’s from GPS/GLONASS, etc. without any additional augmentation/corrections. Here in Ontario, there is a very likely chance the device will pickup SBAS (WAAS). With this bonus augmentation, there is a setting change to the Location Profile to get the optimal config in Collector (you need to tell Collector about the signal). Don’t worry, the Quick Start guide covers that too!&lt;/p&gt;
&lt;p&gt;By checking the SXBlue status indicators or the status screen in Collector, you can determine if you are currently connected to SBAS.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 368px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b3b2e225cd006460b3fb160ddc7ccc27/55493/SXBlue-SBAS.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 96.73913043478261%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAACRklEQVR42pVT244SURA83+26T5rIX+jqkybsB+jqE4lrAogDMlzDRS7DReZ+Y2YoU42zYVlY104qZziH06e6q1q9eF/CxZtPePb6o+Di6gaX777g8u1nPL+6wcsPJRSuv+FV8SsKxVsUrk+geHt3ppLQg659R1OrovNTQ1dvYNDRYfwaot34gSR0cT92R7h/poIwgmlZcD0PtuPAsm24ng/H9WTP8305n80N/N5skO12SNJMkGYZwigGcxDxNoFyHAe6rqPT6aBer0PTNAwGA3S7XTQaDfT7fUG1WkW73d7z2O0EjCAIYVkWLMtGHMVQ+M/Ikx0mPQzleZ6wIstmsylMe70eWq0WRqOR7JVKJQyHw5MJCddxYZoWopwhkwZBAN/34bou2AaWwdX3AymHZ+dYZVmGNE2Rpdme4Xq9hm3bsiZJ8mi5vGjbDhzHlUd4n+Dj2+12L8pkMsF0OpWmh2F4tjQGH2R5pmkKc36zGhKK4+1DUUj/VLJz5T4QhS/RErVaTaxCMfLET1GaEUURDGMhOqj88qkE+f45HDLmN/cUGzudTMUWBPs5Ho/F3Pmlc23gXQpEZ5gbE3EcQ5HubDbDfD4XYRaLBQzDEA/+K+g7JmNiikvBFF/iByXnSjZcaQ/+Mfcnz0/177A13FOUu1KpiDD5HHPlb84257lcLksFecJjgZbLlYhCy6mnzm6a7qfhGIdiZtlfhhSDs0xj5wxpI/b3nMlzMAkZEjLLpLlcLgUcPTaZ62q1uhvDxwy9VzuQXpPxHywxqfGSEFgXAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;SXBlue Platinum - SBAS for all!&quot;
        title=&quot;&quot;
        src=&quot;/static/b3b2e225cd006460b3fb160ddc7ccc27/55493/SXBlue-SBAS.png&quot;
        srcset=&quot;/static/b3b2e225cd006460b3fb160ddc7ccc27/55493/SXBlue-SBAS.png 368w&quot;
        sizes=&quot;(max-width: 368px) 100vw, 368px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;SXBlue Platinum - SBAS for all!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update Note Feb 08, 2018&lt;/strong&gt;: The items in the image to help verify SBAS are the “Fix Type”, “Station ID”, and “Correction Age”. The Location Profile name “SBAS” is my own naming of a profile and doesn’t reflect the current WAAS status.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you are using additional correction services for increased accuracy such as Atlas, CAN-Net, Top-Net, etc - you will also need to change the Location Profile to match the signal from the correction service.&lt;/p&gt;
&lt;h2&gt;Vertical Elevation&lt;/h2&gt;
&lt;p&gt;ArcGIS Collector doesn’t currently support adding a GEOID for Orthometric height. The SXBlue Platinum, like every GNSS device, will output Ellipsoidal elevations directly to the application it’s paired with. The device doesn’t store GEOIDs inside (not unlimited space), but does work with Apps/Software that do support GEOID files. So no matter what you are collecting in ArcGIS Collector, all vertical data is being stored in Ellipsoidal height. If you really want to store Orthometric elevation values, the SXBlue Platinum does work with other iOS/Android apps that have this ability. In short, this is a limitation of ArcGIS Collector, not the SXBlue Platinum. Maybe a future release from Esri will incorporate this feature - although you can always post process.&lt;/p&gt;
&lt;h2&gt;In the Field&lt;/h2&gt;
&lt;p&gt;My preference it to mount the antenna to a pole or a small extender on a backpack depending on accuracy needs. These approaches give the antenna 360 degrees of SV potential. In collector you can set a mounting height in the Provider setup screen. With the DGPS light glowing and Collector Status showing that I have WAAS, I can see that the Blue circle on the map is nice and tiny - a good sign of high accuracy beyond the status window. At this point, the accuracy was… 49cm (1.6 ft). Reviewing with some controls, accuracy was definitely up there. So overall, the SXBlue Platinum is sending data at the level of accuracy we would hope for.&lt;/p&gt;
&lt;p&gt;As mentioned in the &lt;a href=&quot;https://www.spatialtimes.com/2018/01/sxblue-platinum-introduction/&quot;&gt;SXBlue Platinum Introduction&lt;/a&gt;, the RTK package comes with 1Hz by default. This is great for any foot powered mission. And if you want to upgrade to 10Hz or 20Hz and mount to a race car, those options are still unlock-able at any time. As I walked through the trails and on the sidewalk I would keep my eye on the status window - nothing much to report as I had strong accuracy readings all afternoon. Every once in a while I would switch to the SXBlue app for a more detailed look at what the device was doing.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 366px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/09f0506d750ce5701720ac605b6e19c8/b18e8/SXBlue-RTN.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 86.33879781420765%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACM0lEQVR42mWTycpaQRCFL15RE8GIAQ2Iu+C8Ci4M0YdwnsV5nl3o21f4Skr0d1H27epzTp2qbp1GoyG1Wu0Z7KvVqozHY9lut7Jer6Xb7UqlUpFOp6N7YrFYKK5eryvHVocPCL1eTwnsWSeTiSyXSyUjDhgMQuRXq5X0+31pNptPMRXk53g8yuFwkM1mo1Xn87nsdjsNOzMxcvv9Xk6nk3ZgJp6CrVZLDyBBRgwQBMuxgplOp7pa7nq9as5GpYJYpiIA2iBJu+Re2yIQu91u6pJ9u90WDH04hAgYd7RsgsyKcxxAQoB5s7K3eLsUCMwOQYaPIK5oGdFXMKuJm6Ov528tM3gIOKAIBWw+r26+ir0J4pCZ4BCRwWCgreJyOBzK+XzWYohzRgcUYY8ReK9zVIcI2mMFMBqNlISg5XFthXkFCFKMmb5dirWMO8hcEEEe8Gw2U7LNmieDOMUoYBf01jKVACLMTXMh1jLucGxzpX04tM/+Q9De13qzUWcIIowzSDwhEwSHK8ic0ZH99SwcnOBus17K+Xx6PlaA/Avu97sSwfGoL5eL4rk4HBoWHrN1ksmkZLJ5yf75J7lcXlKp1DMKhYLkcjn9TqfTkslkJJ/PSzab1W9W8sViUXFoOY7jiON4xfn1Vx7fj/B4PFIul99yRCKR+MiVSiUJBoOPveu64v0eEe/P3+J++yGu6xGP60ooFJJoNKpAMITP55NYLCaBQEALsg+HwxKPxyUSiYjf75f/WD+aTNMpFWMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;iSXBlue RTN App for iOS&quot;
        title=&quot;&quot;
        src=&quot;/static/09f0506d750ce5701720ac605b6e19c8/b18e8/SXBlue-RTN.png&quot;
        srcset=&quot;/static/09f0506d750ce5701720ac605b6e19c8/b18e8/SXBlue-RTN.png 366w&quot;
        sizes=&quot;(max-width: 366px) 100vw, 366px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;iSXBlue RTN App for iOS&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lots of SVs, strong signals: so boring - and boring is great. I tried picking up my pace and running (relatively speaking) through a few sections and the SXBlue was doing a great job updating the paired Collector app.&lt;/p&gt;
&lt;p&gt;Overall, the SXBlue Platinum did a great job - and this is without some of the more advanced features like an additional correction services. In reflection, it was just easy, worked as expected, and exceeded my accuracy expectations (full report on that another time). All good stuff when getting out into the elements!&lt;/p&gt;
&lt;h2&gt;More Info&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sxbluegps.com/&quot;&gt;SXBlue Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sxbluegps.com/wp-content/uploads/2017/09/SXblue-Quickstart-web.pdf&quot;&gt;SXBlue Quick Start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.arcgis.com/en/collector/&quot;&gt;Collector for ArcGIS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[SXBlue Platinum, an Introduction]]></title><description><![CDATA[The SXBlue Platinum is one of the newer members to Geneq’s SXBlue family. As discussed below, there is really more than one Platinum - with…]]></description><link>https://www.spatialtimes.com/2018/01/sxblue-platinum-introduction/</link><guid isPermaLink="false">https://www.spatialtimes.com/2018/01/sxblue-platinum-introduction/</guid><pubDate>Sun, 14 Jan 2018 22:00:05 GMT</pubDate><content:encoded>&lt;p&gt;The SXBlue Platinum is one of the newer members to Geneq’s SXBlue family. As discussed below, there is really more than one Platinum - with 3 packages and some additional options available. This first post on the SXBlue Platinum is an introduction to the device, not an in-depth review. The goal is to help explain the features and capabilities of this little blue box. Once the -30 degrees C (-22 F) cold snap ends I’ll get my butt outside to do some field testing with ArcGIS Collector and related apps.&lt;/p&gt;
&lt;h2&gt;What is the SXBlue Platinum?&lt;/h2&gt;
&lt;p&gt;What is the SXBlue Platinum? Well, like many GNSS devices these days, it depends on the features you have enabled. What’s physically included in the little blue box? &lt;em&gt;&lt;strong&gt;Everything&lt;/strong&gt;&lt;/em&gt;. However, it just might not all be enabled by default. Depending on your needs, this can be a good thing, or a little confusing. Want to start out with an update rate of 1 Hz, and possibly unlock 10 Hz or 20 Hz at a later date? No problem. Or maybe use DGPS using the Atlas L-band correction service? Sure thing. Or possibly start leveraging RTK? You can do that too. But if you are only interested in basic functionality, there is an aptly named “basic” package that neuters the features (completely reversible procedure of course).&lt;/p&gt;
&lt;h2&gt;Specs and Accuracy&lt;/h2&gt;
&lt;p&gt;Ah yes, what most of us are interested in: Specs and accuracy. This varies by package/options, but the stated horizontal accuracy ranges from 8 mm + 1 ppm (RTK) to 1.2m (autonomous). I should also mention the accuracy measurement used here is Horizontal Root Mean Square (HRMS). The range is based on which components are enabled and available. The usual location considerations also have an impact (multi-path, signal strength, SVs in view, PDOPy stuff).&lt;/p&gt;
&lt;p&gt;The SBAS/WAAS accuracy is up to 30cm, which is great considering no RTK or rovers are needed for this. Vertical accuracy isn’t listed on their website (yet) but Geneq confirmed it is 60cm VRMS for SBAS which is pretty typical considering the horizontal (V is usually 2 to 3 times H). It should be noted that the older SXBlue II spec sheets used the 2dRMS SBAS accuracy stats - so this isn’t a change from the older model specs, just a different representation. The 30cm HRMS of today is the same as 60cm 2dRMS of yesterday .&lt;/p&gt;
&lt;p&gt;This switch to stating accuracy using RMS shouldn’t be a surprise to anyone as it aligns with many other vendors (and looks better in brochures). I do like that they include this information in their media as some vendors still mislead by omitting the statistics being communicated (looking at you Garmin).&lt;/p&gt;
&lt;p&gt;But accuracy isn’ the only spec worth checking out with the SXBlue Platinum. The signals are definitely worth mentioning here as well. As stated earlier, everything is included inside this device. Access to 5 systems (4 global and 1 regional), as well as 3 GPS bands/signals, with 394 channels, and a replaceable/rechargeable Lithium-Ion battery (~10 hours on a full charge).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 430px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4b107d6678e7bf8e6f7a70b647c5e02f/bc750/SX-Bands.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.74418604651163%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABcSAAAXEgFnn9JSAAAB2klEQVR42nWR0WuSYRTGf4Pt009Tp2tmK7PVmm6mteaWNYKg/6DrGLtwVxFBZaFNC11bsLwoCuuiYTNKK7ZBtggqWlhQBkVdxPbPnPjGGXjTxcP7nfc97+85z/vx5U9VVj/ck8V6QSqvbkn9zR1p/q7K519PpLVZk29/n0lroyZPV2/L41pBlpbn5GE1J5WXs1vfH38sSmuzLt83arL+syIsLc/Nz5YuFC9lJ9OZQipdKqfTb5vldK2xcGPl/d3860/3r7/7+iibLU7fTJ0/m7l47Vw+U0hdtdYruanci7VSprH+YGatWc48byzkAaLA/mxxmsszU1RX5hERa78HGAB6VX2AHTgAmMAhYDewC9gH7Ny643I7kg6nOWYYXWdsdmPCucOMjR6Pul1u57ivxzPk8bri3T5XzDRtSYfTHrbZjZO9fq8/GAp4gqFAd3i43xuND3hHEhFP316/ZUoCOALEgEF17NS6HwhbCYCAyprKCXQBNsDQ1aq9FvC0Qkf0Qqc2TGjkUYWgZx0KcWj0bdn0mTimMEv+NucIkAQOqqw6BIxrX8f/JjwBjAFDumGo46CahBV4WKPHNYlP++wqY3vCUwrdo5HMtr+Y0MkiCgwCw2pwVEHtkX3/AA3LgsXOeKSIAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;SXBlue Systems &amp;amp; Signals&quot;
        title=&quot;&quot;
        src=&quot;/static/4b107d6678e7bf8e6f7a70b647c5e02f/bc750/SX-Bands.png&quot;
        srcset=&quot;/static/4b107d6678e7bf8e6f7a70b647c5e02f/bc750/SX-Bands.png 430w&quot;
        sizes=&quot;(max-width: 430px) 100vw, 430px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;SXBlue Systems &amp;#x26; Signals&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Multiple bands, SBAS, and Sat. Systems will definitely help over the long run. The addition of planned GPS L5 band is beneficial as the rollout of this newest modernization continues through &lt;a href=&quot;https://www.gps.gov/systems/gps/modernization/civilsignals/&quot;&gt;2024&lt;/a&gt;. This band is more powerful allowing to track weaker signals, and better “ionospheric effect attenuation” when using in combination with another signal (in laymen terms: 2 signals are better than one). Ditto with 3 signals:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Through a technique called trilaning, the use of three GPS frequencies (L1,L2,L5) may enable sub-meter accuracy without augmentations, and very long range operations with augmentations. ~ &lt;a href=&quot;https://www.gps.gov/systems/gps/modernization/civilsignals/&quot;&gt;GPS.gov&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For a full list of specifications, check out their &lt;a href=&quot;http://www.sxbluegps.com/product/platinum/&quot;&gt;product page and brochure&lt;/a&gt; for a slew of geeky stuff. But one last feature worth mentioning is the inclusion of a battery meter on the device. I know it’s a small thing but the ability to see how much battery you have remaining in the field will help you plan ahead - and stay more productive.&lt;/p&gt;
&lt;h2&gt;SXBlue Platinum Packages&lt;/h2&gt;
&lt;p&gt;As there are many different options and combination of features, the SXBlue Platinum currently comes in 3 customizable packages: Basic, RTK, and Survey. “Basic” is pretty much what you would expect, it’s a bare-bones setup with very few features enabled (GPS L1). You still have SBAS, and you’ll definitely want to use it - although this package seems to be lacking many desired features.&lt;/p&gt;
&lt;p&gt;The RTK and Survey packages are where the hardware is really leveraged. With both packages all Sat. systems are unlocked (GPS, GLONASS, BeiDou, Galileo, QZSS), multi-frequencies are unlocked as well (L1,L2,L5; G1,G2; B1,B2; E1BC,E5A,E5B; QL1,QL2), and RTK available. It even comes with a rugged carrying case to protect your fancy new gear. I do wish these higher end packages also came with 10Hz by default (like the Arrow Gold and Garmin Glo) - but I guess it saves a few bucks if you don’t need it.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 744px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a20731aefdc17a208985b6c6a49ecaaa/134e0/SXBlue-Packages.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 83.2%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABcSAAAXEgFnn9JSAAAFAUlEQVR42h1TW2/TBhjN/1jZ237CpAlpQvsFk9A0RhG0g4oxoXUaFOgKJb2koZSk62295drcmqsT27Ed24kd23GS5n6xc3Wca2mLCmJ7TzVlD5909J3v4eh85yhsZHHopMWhK1odHgZiV1ozONSYwOGOkxw6IuWhk65cHVPC0B4uXe24wsO/rMj/2Agnr7RmaGjF81d6MH71zugf7nnoKwVOIfFmR4zJg1pM6ghspZFli2IyJtazbLMjcnK/yjbaQqzZEZlskecoFuWkrshWmoUoGydHHC11RZqkIK5cS9MKnWHrreloV+1wGRYCkGPe67fNg0HXMhcnXuFh/wIZAZUuj0mTSIWf+UGHyu40qLh4aLZQ5qcB0D5fFPhpqV14DICO14Vy/HcFADp2PIBt0+u3b8CYZ91k2d+gWXSrVDnZLAiJzf5ZfaX3vrZSk3JrDI9vYwSwKdYzWqGWWiUikLbazL6Ve8IbjPCvi/XMqsLhNLog1G32AFY7hLgtvoDd4YeOvRSD2Bket7T7okbuCdpS5WQbDwdsMOq2p3PMQalyskFEIKNQS28028X1EOk3lSsnW4q9ww2tw2VaNR7tadxei5qIQDPVRvbpp3/7M6cXjZlWtzw7moIQn8cI/5oHsL5N59ilXIl/FYCPV4pi4mW9lf/TF7Cr8yX+lSLKYT6SgnwQ4gaZWMibzrHmTJ41MbGQud0XLe8/SEeD88aR1Ck5EmkKjHJYoNrMeppy0conw26pU7L13tcsXJxwN9tFu2JnT7tsth7MHei3XlrtutkD3db89t8a1aFhe/b0ojnZP6vf7wwq98V6eiqZoR+5fZaZdk+YPMlEf/UA1me5Ev+wLuUfuLxHLzJ59hcFRgAEHgZDYRpGQ2QAIykoFI1hoSDmRSgGCZA0HEikKFDulqH+WQ3un9URuSdAdSkPx1MRRGqXoO5pFWR5HG3IBUihWV958k6rerqmVc2sb64+WdMsP7PYdY8zBe4WnyTHE2lqPJmmxvkkOZHJs7eTGfp2KsvcDdPw5KF+e5rl8Ylsgbtjdxp+Y2KhSYXXbztGQr5jAHS4YNTjJCnIVBAS+svPXd35ZUs3OG/o+mc1ndQpGWpS7jCdYw7bfVFfb+X1qRyja8gFQ6cv6kdeyj3BoHD7LHsB2LkHo549X8B+wMWJlaKQeJ0tcEqhllr48KmtPL9sKRutglrulpdqzdxCs11U11t5lVBNLdaknFruCaog5tkdZXP0FLXDaVQ6PeZFs/VgcV+3qbLYDhd1xh21B7AuJVKRZYpBVLkSP8fEQnMu79FCtZl9nsmzLyLR4EyuxM+K9fRzmkP/yJfjz0dNgWDU7YNRNwCjbihE+gEU9/lGewhx+2gWBWNJEilXU5buoGKs1DMuuSfomnJRJ9bT+1K7aOgMKvpSJXnQ6pZ1CpNlf952rH85UjfCVodeSXPYI4pBHrBxfKozEB98/Kd3P1uMTaM4sISHQWWUw2aDmFdpMO++ISLgXJTD5gzmXTUS8s4rCAqKRDksDKOeKEnBETwMhkfRuPzcDV58lIOnF01kcN5AalIOg1EPHcS81Ek2io9uA7CTjiVIIpYgSRBx0RSLhhV37t66fvOH72/8+NPN6/cmx7+Zejjx9cTPd25MPZz89t7k+HdO79FXck8YS+eYL0PhwFiUw8aSGfpahEHGUBz4IpGirjF8aAwj/GNcghj7D6b0uMfEr+UKAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;SXBlue Packages&quot;
        title=&quot;&quot;
        src=&quot;/static/a20731aefdc17a208985b6c6a49ecaaa/134e0/SXBlue-Packages.png&quot;
        srcset=&quot;/static/a20731aefdc17a208985b6c6a49ecaaa/0eb09/SXBlue-Packages.png 500w,
/static/a20731aefdc17a208985b6c6a49ecaaa/134e0/SXBlue-Packages.png 744w&quot;
        sizes=&quot;(max-width: 744px) 100vw, 744px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;SXBlue Packages&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So what differentiates the RTK and Survey package? The difference is in the antenna. The Survey package comes with a “survey antenna” which is bigger, more sensitive, and has a Gain of 39dB. The regular antenna is a bit smaller with a Gain of 28dB. In short, it’s a better/upgraded antenna that allows it to track weaker signals - potentially giving it more satellites in view for a longer period of time.&lt;/p&gt;
&lt;h2&gt;Weather Watching&lt;/h2&gt;
&lt;p&gt;ArcGIS Collector and a few other apps are on the agenda for the SXBlue Platinum. Once the snow and cold temps have passed I will get outside to do some field testing. Truth be told I don’t do field work during NFL playoff games either.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Multiple Field Key to Single Field Key for Relates using ArcPy]]></title><description><![CDATA[An issue with multi-field unique keys (composite key) is that we can’t use them to setup a join or relate between objects (Feature Classes…]]></description><link>https://www.spatialtimes.com/2018/01/multiple-field-key-single-field-key-relates-using-arcpy/</link><guid isPermaLink="false">https://www.spatialtimes.com/2018/01/multiple-field-key-single-field-key-relates-using-arcpy/</guid><pubDate>Thu, 04 Jan 2018 20:52:33 GMT</pubDate><content:encoded>&lt;p&gt;An issue with multi-field unique keys (composite key) is that we can’t use them to setup a join or relate between objects (Feature Classes or Tables) in ArcMap. In this article we will use Python and the ArcPy module to update a unique Multiple Field Key to Single Field Key for Relates using ArcPy.&lt;/p&gt;
&lt;h2&gt;Multiple Field Key to Single Field Key for Relates using ArcPy?&lt;/h2&gt;
&lt;p&gt;Python scripting isn’t the only way to do this as there are some OOTB tool combinations that can give us the same result. As well, there are some ArcMap/Pro tricks and database objects that can all be potential solutions. But Python is fun, fast, and can make quick work regardless of the data format used.&lt;/p&gt;
&lt;h2&gt;The Scenario&lt;/h2&gt;
&lt;p&gt;For this scenario lets assume we have a Feature Class (FC) and a Table with a 1:M relationship. The 4 fields that make each record unique in the parent FC are: F1, F2, F3, F4. These four fields also exist in the related table, although there can be zero to many related records here. Please note, in this scenario it is assumed the 4 field combination in the parent FC is unique with only once instance of the combination. If there is a chance your data has some duplicates, you can use the Summary Analysis tool with the case fields option to do some QC before you begin. This solution works on most editable formats including File/SDE Geodatabases and Shapefiles.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 781px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/33f0b6af8af16adccf1584ba9c483675/e08f9/relate.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 39.8%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAA7DAAAOwwHHb6hkAAABwElEQVR42k2NPW/TQABA/Q8RA0hU5Q+wMiNBVWhUMTCwMLAgVQLaoFaIQmSlTaq2cRvH33eJffbZ52/HcROnJHGucYyoGHh6w9seU1XVuqroal2W6+FkMcqLbLoc39JiWS6Wq2y6TMaLdFLczu+WtJwXq+o/mFW5ns5pOinCbJblRZjNx79pPqPucHZw7hx3/R/X/nfOO+769XNy1HF/8gErho1e2JQi5u2B9uaz8uKTWPuqbu1JO1/UV3vyu0P48Zfx4CX7ZKf1aPvk8evTjdrpw63m5m57o9Z6utt+9v7y+YcrpsHZdVbdZ9XDVr/eBPus/O0ENjiMyKjV0UTgXfAGMJOzKygAT4SeANyu6giACBphomSiI2JYnuWElh1A3TZx4Lhxmk1FxcDeEOjEj3MVYuymjj/CboLsyHRiZEcMQHGnZ3AC6srWtWRxIhKAq+oBCW7aHU2EXqf393zBD0ToS/d2ZcwrNq/YDPYzCWAFOkAn2oCofaJbkW6FcZrz0gDZsQywG01kiJ3gxiQJRL6BI90K+qbP0LuS0hWl5b3/Yl1W8TA/44Dc9y97OjSHnIg0lMiDQACEV21BI3Lf+wP3kpNN8h4SgwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Multi-field relationship diagram&quot;
        title=&quot;&quot;
        src=&quot;/static/33f0b6af8af16adccf1584ba9c483675/e08f9/relate.png&quot;
        srcset=&quot;/static/33f0b6af8af16adccf1584ba9c483675/0eb09/relate.png 500w,
/static/33f0b6af8af16adccf1584ba9c483675/e08f9/relate.png 781w&quot;
        sizes=&quot;(max-width: 781px) 100vw, 781px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Multi-field relationship diagram&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There are two ways we can create the unique IDs for the objects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use the ObjectID field as the unique key on the parent FC, and add a new field to related table and populate with the same IDs.&lt;/li&gt;
&lt;li&gt;Add a new field to both tables, allowing the field names to be identical. Then use a number sequence or the ObjectID to populate the new fields. We will use this approach as it gives more flexibility if needed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And let’s try to do it in &lt;strong&gt;30 lines of code or less&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;The Approach&lt;/h2&gt;
&lt;p&gt;Since we are updating 2 objects at the same time we will need to use the ArcPy &lt;a href=&quot;http://desktop.arcgis.com/en/arcmap/latest/analyze/arcpy-data-access/editor.htm&quot;&gt;Editor class&lt;/a&gt;. If you’ve done simple ArcPy insert/update/delete statements before you may not have used this class - but it should be considered even if not required as it allows use of edit sessions and operations to manage transactions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Editor class can be used to start and stop edit sessions and edit operations for file, personal, and enterprise geodatabases and shapefiles. The Editor class can be used to start an edit session with versioned or nonversioned datasets. ~ &lt;a href=&quot;http://desktop.arcgis.com/en/arcmap/10.3/analyze/arcpy-data-access/editor.htm&quot;&gt;Esri Online Help&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Using the Editor class is pretty straight forward - pass the edit workspace, and start editing:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;edit &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;da&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Editor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;edit_ws&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
edit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startEditing&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once we are editing, we will use a cursor to update each of the parent FC’s linkID based on the ObjectID. Again, we could just use the ObjectID directly in this case, but the example also shows how to update 2 objects at the same time. As we pass over each parent record we will jump to the related table to find all matching items and update with the same linkID. The field LinkID is assumed to already exist with a Long Integer field type.&lt;/p&gt;
&lt;p&gt;To loop and update the parent FC, we start with an UpdateCursor:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;da&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;UpdateCursor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xs_fc&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xs_att&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; cursor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; row &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; cursor&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;#FYI: row[0] is LinkID field, row[5] is the ObjectID&lt;/span&gt;
    row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    cursor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;updateRow&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now that the LinkID field has been updated with the current ObjectID in the parent, we need to find all of the features with the same multi-field combination in the related table to update with the same LinkID. For this, we create a cursor on the related table passing in an optional query parameter so we only loop the records matching the parent attributes (F1,F2,F3,F4). The code has this section separated into a function for readability purposes since it looks very similar to the parent FC cursor snippet. The query parameter is the part of the code making sure we have the multi-field relationship matching between the two objects.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;xs_tbl_qry &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; xs_att&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; = &apos;{0}&apos; AND &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
  &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; xs_att&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; = &apos;{0}&apos; AND &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
  &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; xs_att&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; = &apos;{0}&apos; AND &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
  &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; xs_att&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; = {0}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;row&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pseudo query from above: &lt;code class=&quot;language-text&quot;&gt;F1 = val AND F2 = val AND F3 = val AND F4 = val&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Once we’ve looped through all parent/child relationships, we just need to save and stop our edit session to commit the changes.&lt;/p&gt;
&lt;h2&gt;The Code&lt;/h2&gt;
&lt;p&gt;If we remove all the commenting lines, this only takes 19 lines of code, so we did stay in our 30 line max.  The workspace is set to a File Geodatabase, however this also works on SDE Geodatabases and Shapefile/DBF workspaces.&lt;/p&gt;
&lt;iframe
  src=&quot;https://gist.github.com/TheBryanMac/98b15a98a309ac66dc91734a9cba235a.pibb&quot;
  style=&quot;width: 100%; height: 300px; border: 0;&quot;
&gt;&lt;/iframe&gt;
&lt;h2&gt;Other Options You Say?&lt;/h2&gt;
&lt;p&gt;Not interested in using Python? Below are some additional approaches that can also work:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a new field and concatenate the multi-fields into a big string: This solution works most of the time, but joining based on a long text based field isn’t desired nor efficient. If using a Shapefile/DBF with lots of rows, this can also bloat the size of the objects, possibly even hitting the 2GB limit. In any case, when updates are made to either table in the relationship, the fields will need to be recalculated (could automate very easily).&lt;/li&gt;
&lt;li&gt;Use database views or Query tables to create a virtual field on both tables. This is very similar to option 1 but is dynamically updated. Database views are server side while query tables are client side and not available to all users. Although query tables also work on non RDBMS formats.&lt;/li&gt;
&lt;li&gt;Use ModelBuilder. There are numerous ways this can be accomplished, for example: using option #1 above as the temporary join, then swapping out with a unique number ID. The unique number can be generated using the Frequency Tool or Summary Statistics Tool. Then create the temp concatenate field on the 1:M objects, and the output from the stats tool. Use the concate field to temporarily join, then update the final relate ID field using the OID from Stats. Delete the temp concatenate field when done. Lots of issues with this approach since you will need a schema lock on the objects, as well as permissions to add/delete fields (fine for local files, not so much for database users).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Related Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://community.esri.com/thread/7223&quot;&gt;GeoNet Thread - Joining based on Multiple Fields&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://community.esri.com/blogs/richard_fairhurst/2015/06/07/multiple-field-key-to-single-field-key-tool-relate-two-layers-based-on-more-than-one-field&quot;&gt;GeoNet Blog - Multi-Field to Single Field Tool Based on More Than One Field&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pro.arcgis.com/en/pro-app/tool-reference/data-management/add-relate.htm&quot;&gt;ArcGIS Pro Help - Add Relate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://desktop.arcgis.com/en/arcmap/latest/manage-data/relationships/relationships-and-arcgis.htm&quot;&gt;ArcMap Help - Relationships and ArcGIS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ArcMap Layers to LYR Files with Python]]></title><description><![CDATA[A tiny Python script to show how to export ArcMap Layers to LYR Files with Python. Although it’s a short script, it shows how easy it is to…]]></description><link>https://www.spatialtimes.com/2017/10/arcmap-layers-lyr-files-python/</link><guid isPermaLink="false">https://www.spatialtimes.com/2017/10/arcmap-layers-lyr-files-python/</guid><pubDate>Mon, 30 Oct 2017 22:03:10 GMT</pubDate><content:encoded>&lt;p&gt;A tiny Python script to show how to export ArcMap Layers to LYR Files with Python. Although it’s a short script, it shows how easy it is to use Python with ArcPy to jump into ArcMap layer properties. To add some variation, we will only export layers that sit at the root level of the map’s table of contents. The child layers are still exported inside their parent LYR file.&lt;/p&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;p&gt;Pretty basic requirements for this task and based on using almost any version of ArcGIS 10.x (tested on 10.3.1 and 10.5). The goal is to export LYR files by looping through the table of contents. We need the Python OS module for easy access to some path options - this isn’t required, but makes life easy. Second, the ArcPy module is required to read the Map document (MXD) contents.&lt;/p&gt;
&lt;p&gt;As mentioned earlier, we could export every layer, including all child layers. Most of the time it seems like people are looking to accomplish one of the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Export just the Layers that have data, and none of the group layers. This means we would export single layers, or the deepest children of group layers (could have a group of groups with layers, etc). Small changes to the code below would be required for this approach.&lt;/li&gt;
&lt;li&gt;Export just the layers at the root level of the table of contents. This could be a single layer of data, or a group layer. Saved group layers do include the details about the children layers. This is the requirement and approach that will be used in this code example.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;How can we determine if we are at a root level? Line 17 in the code below checks if the &lt;em&gt;layer.name&lt;/em&gt; value is equal to the &lt;em&gt;layer.longName&lt;/em&gt; value. If they are equal, it’s a root level layer (group or stand-alone).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Long Name Property: This property is valuable when trying to determine whether a layer belongs to a group layer. If a layer does not belong to a group layer, the long name will equal the layer name. If a layer does belong to a group layer, the group layer structure will be included in the long name. For example, the name of a layer nested inside a group layer within another group layer may look something like &lt;code class=&quot;language-text&quot;&gt;Group1\Group2\LayerName&lt;/code&gt;. All layer types support this property. ~ &lt;a href=&quot;http://desktop.arcgis.com/en/arcmap/10.3/analyze/arcpy-mapping/layer-class.htm&quot;&gt;Esri help on the longName property&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;The Code: ArcMap Layers to LYR Files with Python&lt;/h2&gt;
&lt;p&gt;Commenting inside the code sample will help explain most of of the details. One of the optional pieces included is to find and replace some text characters. In the Windows OS, there are a list of illegal characters that can’t be used in file or folder names. Since the LYR file name is set to be the same as the Layer Name in the Map, best to trap some of these in advance (see line 18 and 19 for some basic find/replace examples).&lt;/p&gt;
&lt;iframe
  src=&quot;https://gist.github.com/TheBryanMac/8d944f49337580866629518338461b99.pibb&quot;
  style=&quot;width: 100%; height: 300px; border: 0;&quot;
&gt;&lt;/iframe&gt;
&lt;p&gt;Happy coding.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Secure Map Service to Shapefile with Python Part 3]]></title><description><![CDATA[This post is inspired by the many emails I’ve received on the first two posts in this series. This article will address the most most…]]></description><link>https://www.spatialtimes.com/2017/08/secure-map-service-to-shapefile-with-python-part-3/</link><guid isPermaLink="false">https://www.spatialtimes.com/2017/08/secure-map-service-to-shapefile-with-python-part-3/</guid><pubDate>Wed, 23 Aug 2017 16:06:44 GMT</pubDate><content:encoded>&lt;p&gt;This post is inspired by the many emails I’ve received on the first two posts in this series. This article will address the most most popular question so far: How to work with a &lt;strong&gt;secure&lt;/strong&gt; map service to Shapefile. Short answer, tokens!&lt;/p&gt;
&lt;h2&gt;Before We Begin&lt;/h2&gt;
&lt;p&gt;We aren’t covering Part 1 or Part 2 again, but we will continue to build on those concepts. Secure services use the same approach as before with one additional parameter that passes a security token with each request. So once we have the token, the original posts can be used for the rest of the plumbing.&lt;/p&gt;
&lt;h2&gt;What Are You &lt;em&gt;Token&lt;/em&gt; About?&lt;/h2&gt;
&lt;p&gt;When ArcGIS web services are secured using ArcGIS token-based authentication, every request must be accompanied by a valid token. A token can be acquired in one of two ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Using the ArcGIS Server token request page&lt;/strong&gt;: This method is very straight forward and requires very little change to your Python script. Just visit the token request page (&lt;a href=&quot;http://gisserver.domain.com:6080/arcgis/tokens&quot;&gt;http://gisserver.domain.com:6080/arcgis/tokens&lt;/a&gt;), add your details, and generate a token. I know, not very Pythonic. Even if you decide to use the programmatic approach, this page is very useful for testing and verifying the username password is valid.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 521px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1962ab6a81de93ec93b45eda9772ed1f/db56f/AGS-GenerateToken.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.199999999999996%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABK0lEQVR42pXQ3U6DMBTAcd7/SbzwCYxZope70GRmbnyMsbJBe075LLQdUNBA1MRsTH/p7b89PdbidXn//FCpNmAJTXOCCU0LyMvp9MMc6/Flefe0oFm1CRnLyl2M3gkIpD7lPkXTz+WWGZ210kr1vRn+wwIAx3UJIadTlOdF23bNuRm1TdPeiLM0Cw6HMDwaY+q6VkppretRVVX9/NiUMUJIkRdd13HknHMEFEJM8TTD1RgR/P1eSiVreQzDIAh2nleWpfwihGivsBijMYU4igGwllJrrZQSo3IkhDhforW2EKCqZdM0xhhAAIAkSabm+wpjTH+JxSi1bZtSaozZ+z4h4c09/fw5jqLV6g0REcB13CRJZzb0O87zbLvZOrbzvl4j58Mw/PHZz/gDzCmzvrebV8YAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Server Generate Token&quot;
        title=&quot;&quot;
        src=&quot;/static/1962ab6a81de93ec93b45eda9772ed1f/db56f/AGS-GenerateToken.png&quot;
        srcset=&quot;/static/1962ab6a81de93ec93b45eda9772ed1f/0eb09/AGS-GenerateToken.png 500w,
/static/1962ab6a81de93ec93b45eda9772ed1f/db56f/AGS-GenerateToken.png 521w&quot;
        sizes=&quot;(max-width: 521px) 100vw, 521px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;Programmatically&lt;/strong&gt;: Send an HTTP(s) request to the token endpoint, and receive the token back inside your code/script (Python in our case). But there are some limitations to this method - the username and password can’t be passed as query parameters directly in the URL as we do in every example in Part 1 and Part 2 with GET requests. Instead, parameters are passed in the body of a POST request. It is also recommended to use HTTPS when sending this information whenever possible.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once the token is received using an above method, we can modify the parameters to include the token in each request.&lt;/p&gt;
&lt;h2&gt;Programmatically Request a Token From ArcGIS Server&lt;/h2&gt;
&lt;p&gt;To authenticate with ArcGIS Server we need to submit a name and password that has permissions to the service/folder. The server will return a token which must be include with all subsequent service requests we make to the server.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The token does not last forever; it is designed to time out so it cannot be stolen and used indefinitely by a malicious user. You have to request a new token each time you run your script (but not each time you make a request). ~ Esri Server Help&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This relatively simple task does unfortunately require more lines of code (and modules) than one would expect when using Python 2x. There are lots of existing resources out there if you want to use urllib with either urllib2 or httplib modules to perform this task. However for this example we are going to use the &lt;em&gt;requests&lt;/em&gt; module (manual pip install is required). Why use this external module? It only needs a few lines of code, and with a tag line of “Python HTTP for Humans”, how could you not want to use it?! To install on Windows 10, just open PowerShell and enter: &lt;code class=&quot;language-text&quot;&gt;c:\Python27\python.exe -m pip install requests&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Once installed, requesting the token is pretty straight forward…&lt;/p&gt;
&lt;iframe
  src=&quot;https://gist.github.com/TheBryanMac/5b1ce71944bfff66fa3f88a1b8929a1c.pibb&quot;
  style=&quot;width: 100%; height: 300px; border: 0;&quot;
&gt;&lt;/iframe&gt;
&lt;p&gt;With this token now saved as the variable &lt;em&gt;myToken&lt;/em&gt;, we can make service requests until the token expires. Since we didn’t specify the time in our request, it will be whatever default is set by ArcGIS Server (typical is 60 minutes). Now whenever making a queries to map services, just add an extra parameter to the service requests used in the previous articles. The order of the parameters is up to you.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Original request without token: &lt;code class=&quot;language-text&quot;&gt;https://domain/arcgis/rest/services/Public/Directory/MapServer/0/query?where=...&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;New request with token added: &lt;code class=&quot;language-text&quot;&gt;https://domain/arcgis/rest/services/Public/Directory/MapServer/0/query?token=myToken&amp;amp;where=...&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The new requests will be validated by ArcGIS Server and we can continue to download the information as we did with open services. As a side note, this example of generating a token uses the ‘Requesting IP’. This also means the generated token can’t be shared on multiple computers. As well, if there is a proxy server between the client and ArcGIS Server, tokens generated using the IP Address and IP address of this request’s origin options must be bound to the IP address of the proxy server. If there are multiple load balancing proxy servers between the client and ArcGIS Server, the HTTP Referer option should be used [ArcGIS Server Help].&lt;/p&gt;
&lt;h2&gt;Secure Map Service to Shapefile with Python&lt;/h2&gt;
&lt;p&gt;That’s really all we need to access a secure map service. A valid token was the only missing piece of the puzzle. Although if trying to access AGOL, it’s easier to sign in, and download via the GUI.&lt;/p&gt;
&lt;p&gt;Not all ArcGIS Server instances are configured the same unfortunately. There are some ArcGIS Server installs where the Generate Token request is unavailable.  This is due to security concerns (HTTP vs HTTPS), or the lack of requirement to make it available. Some may also point out that it is possible to request a token via HTTP using GET. This is technically possible, although thankfully not enabled by default - since using a GET request may seem easier but credentials are provided as part of the URL and may be stored in browser history or in network components. Best to use POST method regardless.&lt;/p&gt;
&lt;h2&gt;About This Series&lt;/h2&gt;
&lt;p&gt;This is the third post in a series of how to extract data from an ArcGIS Server map services to a local shapefile FC or Geodatabase FC. The first post “&lt;a href=&quot;https://www.spatialtimes.com/2016/03/extract-map-service-layer-shapefile-using-python/&quot;&gt;Extract a Map Service Layer to Shapefile using Python&lt;/a&gt;” focused on the basics: query, save as JSON, convert to Shapefile. The second post, ”&lt;a href=&quot;https://www.spatialtimes.com/2016/09/map-service-to-shapefile-with-python-part-2-iteration/&quot;&gt;Map Service to Shapefile with Python Part 2 – Iteration&lt;/a&gt;” dealt with larger datasets, when the results were bigger than a single query would allow.&lt;/p&gt;
&lt;h2&gt;Additional Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Python.org - &lt;a href=&quot;https://pypi.python.org/pypi/requests/2.7.0&quot;&gt;Requests module for Python 2.7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ArcGIS Server Help - &lt;a href=&quot;http://server.arcgis.com/en/server/10.3/administer/windows/scripting-with-the-arcgis-rest-api.htm&quot;&gt;Scripting with ArcGIS REST API (admin tokens)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ArcGIS Server Help - &lt;a href=&quot;https://maps.grandriver.ca/arcgis/help/en/index.html#//0154000005rp000000&quot;&gt;Acquiring Tokens (using the GUI)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Collector for ArcGIS update]]></title><description><![CDATA[Collector for ArcGIS has its first feature update in 2017. The list of new features includes a few community request items we should all be…]]></description><link>https://www.spatialtimes.com/2017/06/collector-arcgis-update/</link><guid isPermaLink="false">https://www.spatialtimes.com/2017/06/collector-arcgis-update/</guid><pubDate>Sun, 11 Jun 2017 14:21:07 GMT</pubDate><content:encoded>&lt;p&gt;Collector for ArcGIS has its first feature update in 2017. The list of new features includes a few community request items we should all be excited for.&lt;/p&gt;
&lt;h2&gt;What’s New in Collector for ArcGIS&lt;/h2&gt;
&lt;p&gt;This release is known as 17.0.1 (all platforms) and 17.0.2 (Android only added bug fixes), includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rename Attachments&lt;/strong&gt;: A very popular request and a great addition to Collector for ArcGIS. You can now add the attachment (photo, video, etc.) and then change the generic attachment name to your liking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPS Averaging&lt;/strong&gt;: Having a small issue with the name of this new feature (GNSS v GPS), but that aside, another great new feature. When you want to average the point location over time from multiple readings. This could be for high-accuracy updates, or even to help when using a mid-range GNSS. You can turn on this feature along with setting the number of points required to average. The location isn’t stored until it averages based on that many points. Works for points and vertices of lines/polygons. Note: You can’t use streaming collection and averaging at the same time (mutually exclusive).
&lt;ul&gt;
&lt;li&gt;Use the setting menu to enable Averaging. Then when you start a collection, you’ll see the header change to show “averaging x of y” and the current averaged accuracy. The dot on the map will turn red during the averaging process as another form of communication.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Basemaps from an SD card (Android only)&lt;/strong&gt;: No space on your tablet for a large basemap? For Android users, this update will drastically expand the space available for large basemaps. There is lots of potential here as you could have a small collection of various basemaps users could swap between, even when in offline mode. Since no Apple product has SD card slots these days (or any ports really), you are &lt;em&gt;slot&lt;/em&gt;-out-of-luck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Collect Improvements&lt;/strong&gt;: Copying an existing feature or continuous collection didn’t work in all scenarios. The most noticeable was when the layer participated in a relationship class. These restrictions are now removed as this is now supported on all layers without relationships &lt;em&gt;and&lt;/em&gt; on the parent layer when relationships are present. Side Note: Not sure if this is a feature or a bug fix - either way, I’ll take it!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layer Refresh Support&lt;/strong&gt;:  Another new feature/bug fix is with auto layer refresh (online only). If the feature layer has a refresh interval set, Collector will now…. You guessed it - refresh!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Bug Fixes&lt;/h2&gt;
&lt;p&gt;A few bug fixes also made it into this release. There is also a small 17.0.2 release for Android that fixes a few additional items that got through the cracks during release. Esri lists a few of the bigger ones which including some limitations with PostgreSQL databases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android (17.0.1): BUG-000093003, BUG-000103220, BUG-000101786&lt;/li&gt;
&lt;li&gt;Android (17.0.2): BUG-000105721, BUG-000105749&lt;/li&gt;
&lt;li&gt;iOS: BUG-000101784, BUG-000104278&lt;/li&gt;
&lt;li&gt;Windows: BUG-000101636&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So what are you waiting for, go download the latest 37MB (iOS) release today and get back out in the field!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Web GIS metrics and patterns with Google Analytics]]></title><description><![CDATA[Scouring through some blogs the other day I came across an article from Esri regarding the “Most frequently used Web AppBuilder for ArcGIS…]]></description><link>https://www.spatialtimes.com/2017/04/web-gis-metrics-patterns-google-analytics/</link><guid isPermaLink="false">https://www.spatialtimes.com/2017/04/web-gis-metrics-patterns-google-analytics/</guid><pubDate>Thu, 27 Apr 2017 23:02:56 GMT</pubDate><content:encoded>&lt;p&gt;Scouring through some blogs the other day I came across an article from Esri regarding the “&lt;em&gt;Most frequently used Web AppBuilder for ArcGIS widgets in publicly available apps&lt;/em&gt;”.  Web GIS metrics aren’t discussed very often, so definitely worth a read. It’s actually a review of 10,000 public apps and most popular widgets in use. I would typically read the article, make a mental note or two, and move on – but this article led me to ask myself a few questions: How do the tools we add to the apps relate to web GIS metrics/analytics? What tools are used by end-users the most?&lt;/p&gt;
&lt;p&gt;The Esri article breaks down the widgets by type (off-panel, in-panel) and also mentioning themes and default widgets that have an impact on the statistics. Beyond the defaults already built into a theme, widgets are added by AGOL administrators (or via JavaScript development) for a variety of reasons.&lt;/p&gt;
&lt;p&gt;Now that we have functionality added, how can we track usage and patterns? In this case, Google Analytics to the rescue! After a quick disclaimer of course: This is based on one web application over a sample time period that tracks some, but not all functionality. So take the rest of this article and metrics with a grain of salt.&lt;/p&gt;
&lt;h2&gt;Web GIS Metrics – The application du jour&lt;/h2&gt;
&lt;p&gt;To review metrics, we needed access to an application that collects… metrics. Thankfully, the organization I work for has developed a custom (2 guys with Notepad++) web GIS application with lots of tracking. This application was built after reviewing many existing functions provided by widgets, our existing (older) web-GIS applications, many municipal web GIS applications, and discussed functionality/usability with staff (end users). The application is also available to the public but some functionality is removed to keep it a little more streamlined.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 902px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ab52fe06ce7ba848972ebc9166f2bf34/f1ba4/Web-GIS-GRCA.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 59.8%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wgARCAAMABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAACQACB//EABYBAQEBAAAAAAAAAAAAAAAAAAUDBP/aAAwDAQACEAMQAAABYsOk9MeIfVbENt//xAAeEAABBAEFAAAAAAAAAAAAAAADAgQFBgABBxQVFv/aAAgBAQABBQLyFTK2ZOpgGBXcyiLuDO9qXRHLilnS3//EACARAAIBBAEFAAAAAAAAAAAAAAECAwAEETEFEhNBYZP/2gAIAQMBAT8BSfjWdilkitG7RE9iBTkdOSrDJ0cDWdEaoS2Hm1Hyh9V//8QAIxEBAAEDAgYDAAAAAAAAAAAAAQIDBBEUIQAFEhUxQWFxsv/aAAgBAgEBPwHmXc6xRhG/rkCdWnOOquAWLSeoBw4dwl5+HEhtr4Ubyqo4XVXW6bepR/J9cf/EACgQAAMAAQMDAgYDAAAAAAAAAAECAwQREhMABUEhIwYUFRYiMTJDYf/aAAgBAQAGPwLKr9tdkW3HReT6bjk+3IiZLmZLFPHrqunVPke6ZOEwqYZYnlVivNL+xNje9j6NuVv543IEodrTdp0hX4iyJODttNu43SmjMpKuraaaqfT9+fPV8ET7cuM2DVuNcZ10cxJ3Bxfk11OvqxGvjoZXGm+WPTNipBZJWrYodu8s5kqEKsXd5lUUUV/y3NsysqamxfZOzKgLpN20H+sxPk9f/8QAGhABAQADAQEAAAAAAAAAAAAAAREAIUExUf/aAAgBAQABPyEGBHpuHsQPSA0zPgEcLIg3iq6DEq0S4uTuS3xUkAKjqyCU2EYpAYeR9psGaJ4FfdVB8noGjtc//9oADAMBAAIAAwAAABCTP//EABoRAQEBAAMBAAAAAAAAAAAAAAERIQAxgZH/2gAIAQMBAT8QjTCOxIY7DQUGiMqcr2NK+795/8QAGBEBAQEBAQAAAAAAAAAAAAAAAREhAFH/2gAIAQIBAT8QbF9V5gxggAmMuCJJMVQJomu4Pgkf/8QAFxABAQEBAAAAAAAAAAAAAAAAAREAIf/aAAgBAQABPxBHgxOaqZUwzJpMylwwnF7KMcLhome6gOrAWRxJYbKBkAS6pVlGeviIVjRyjUWAL5cINpCtcVV3f//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;GRCA&amp;#39;s Web-GIS Interface&quot;
        title=&quot;&quot;
        src=&quot;/static/ab52fe06ce7ba848972ebc9166f2bf34/f1ba4/Web-GIS-GRCA.jpg&quot;
        srcset=&quot;/static/ab52fe06ce7ba848972ebc9166f2bf34/953fe/Web-GIS-GRCA.jpg 500w,
/static/ab52fe06ce7ba848972ebc9166f2bf34/f1ba4/Web-GIS-GRCA.jpg 902w&quot;
        sizes=&quot;(max-width: 902px) 100vw, 902px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;GRCA’s Web-GIS Interface&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a “web-GIS”, not a “focused web map”. We have both types of applications at our organization, but the main web-GIS is easier to analyze a wider range of functionality. I should also point out that since staff use the application for specific purposes (public as well), metrics will be skewed to this use. Lastly, application design can impact user interactions as the layout will help (or hinder) the ability of the end-user to navigate functionality.&lt;/p&gt;
&lt;h2&gt;Web GIS Metrics – How we track stuff&lt;/h2&gt;
&lt;p&gt;We leverage Google Analytics (GA) to collect metrics. This also means we have 3 levels of event tracking available. For example, whenever an end-user interacts with the application, we store 3 pieces of data: draw a polygon while using the Planning theme. The “Planning Theme”, “Draw Tools” category, and “Draw Polygon” tool info is stored. This allows us to review not only the functionality used, but the type of use, and context (theme).&lt;/p&gt;
&lt;p&gt;This isn’t to say we track every user interaction. Clicking on the map will automatically identify operational layers as set in the theme configuration. The general identify tracking is disabled since it happens so frequently the extra metrics (REST calls) annoyed some firewall appliance settings (for now). However the user can override the pre-set identify settings to focus on any one layer – this specific info is tracked in GA. Table of Contents (TOC) tracking is also limited to specialized events (Changing themes, viewing metadata, etc.) and doesn’t track the toggle of layers on/off.&lt;/p&gt;
&lt;h2&gt;Web GIS Metrics – Functionality&lt;/h2&gt;
&lt;p&gt;Statistics are sneaky. And like maps, they can be misused and/or misinterpreted, and not saying I’m going to get it all right here either. GA Events are updated each time users interact with related functionality. So if a user draws 3 lines, and only prints the map once – Draw technically has more usage, even if more 2 users print. With GA, we can look at events in many ways: Total events for all sessions, session where the event occurred at least once, events by category and type, etc. Let’s take a look at event totals and event occurrence within session for a small sample time period with 13,168 user sessions and 46,396 user events.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1040px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1623bf15ba5e6732ed0d74c0eda8056b/d9c1b/Web-GIS-Stats.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 32.6%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABO0lEQVR42l2O2W6CQABF+f+vMcGmTepDY1JFulDiXnEZQHQQZmWbBaax9qWex5t7c66V5vhCCq1E3dwjhMjzXAp9RjvCUynUXcGaBqeBl5S10P9p27aua8qoMWYGniD+Nsbc8htaa2u2g303sh0gpVJad7+xUqrrOoRQfIyU0nMwWEdDiLZKto34OyWEuJrtCbAd8PQWhpAJIaWUNwPGODnFi+h5Hg78nb1JXo0xSit9tbZaaWu6hb0x6I1AfxL2RuDBjZxl6iyhUrosK4Qzf2/PwKN/6K/il0P6was8yRcZO0jVWCGk7iqdrKAXXNz1dfYVZMNpsokxK5uy5Hv4DlLvAD/Dix8kozibBqcxSL04m1tlWTBKKCVFwZNjDOG54JwzmiPMGKuqilFGCeOsQAhHUUwIYYxTygjGP+jLgO5D0CeLAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Google Analytics of Event types by Count and by Percent of Sessions for a small sample time period&quot;
        title=&quot;&quot;
        src=&quot;/static/1623bf15ba5e6732ed0d74c0eda8056b/d9c1b/Web-GIS-Stats.png&quot;
        srcset=&quot;/static/1623bf15ba5e6732ed0d74c0eda8056b/0eb09/Web-GIS-Stats.png 500w,
/static/1623bf15ba5e6732ed0d74c0eda8056b/1263b/Web-GIS-Stats.png 1000w,
/static/1623bf15ba5e6732ed0d74c0eda8056b/d9c1b/Web-GIS-Stats.png 1040w&quot;
        sizes=&quot;(max-width: 1040px) 100vw, 1040px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Google Analytics of Event types by Count and by Percent of Sessions for a small sample time period&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Within this sample, Draw tools (draw lines, polys, callouts, text, points) have the highest number of total events (14,536) [left chart]. The Search tool (big search box) has the second highest number of events; however this metric alone can be misleading. 90% of all user sessions search at least once, while only half of user sessions (46%) actually draw something [right chart]. The users that do Draw, add lots of graphics/text in one session. The print tool has a similar pattern: it has half the number of total events compared to draw, but is used in more total sessions.&lt;/p&gt;
&lt;p&gt;This makes sense: We search and find area of interest (hopefully on the first try), possibly sketch graphics on the map, print the map once and close. And if you did sketch something you took your time and added lots of details (graphics). Side note: time on the app is also tracked, &gt;12 minutes on average if drawing.&lt;/p&gt;
&lt;p&gt;The assumed workflow above is confirmed with Google Analytics Event Flow report. This allows us to review the most popular &lt;em&gt;first&lt;/em&gt; event by session. For both public and staff, the most popular first event is Search (note: pan/zoom not tracked). The second event for Public users is typically to view the legend, while Internal Staff second event will vary more widely (since they see these layers every day and don’t require the legend as often).&lt;/p&gt;
&lt;h2&gt;Web GIS Metrics – A few extra details&lt;/h2&gt;
&lt;p&gt;This isn’t to say low metrics of a tool is bad. The “About” events provide information to those that need it (corporate info, training, disclaimers). Hopefully this info isn’t needed frequently, but it should still be available. So there might be some functionality you include without high usage intentions.&lt;/p&gt;
&lt;p&gt;I should mention that the Esri article statistics and the ones described above can’t really be compared. The Esri article reviewed the number of apps with functionality added, not the usage within the app. And our web-GIS is just one implementation based on certain use cases. What I can say: Search and Print are the two of the most important tools in our web-GIS relatively speaking – not by total clicks, but used by the most people.&lt;/p&gt;
&lt;p&gt;Even though the original questions have been answered, this is by no means close to describing what is possible with Google Analytics – more the tip of the iceberg.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Javascript API 3.20]]></title><description><![CDATA[Phew. The long hiatus of posting updates is over. As expected, the world continued to move on without me. This includes an update to Esri’s…]]></description><link>https://www.spatialtimes.com/2017/03/arcgis-javascript-api-3-20/</link><guid isPermaLink="false">https://www.spatialtimes.com/2017/03/arcgis-javascript-api-3-20/</guid><pubDate>Mon, 20 Mar 2017 16:42:20 GMT</pubDate><content:encoded>&lt;p&gt;Phew. The long hiatus of posting updates is over. As expected, the world continued to move on without me. This includes an update to Esri’s ArcGIS Javascript API 3.20.&lt;/p&gt;
&lt;h2&gt;ArcGIS JavaScript API 3.20 is Here&lt;/h2&gt;
&lt;p&gt;Not too much in this release, although I always appreciate bug fixes! But let’s start with the unique alien updates.&lt;/p&gt;
&lt;p&gt;Starting at ArcGIS JavaScript API 3.20 there are Planetary measurements and scale bars. You read correctly. I can’t find a reference on the ideas page to see how many up-votes this had, but I guess there must be some demand. That’s right, you can now use many “non-Earth” projections including: Moon, Mars, Venus.&lt;/p&gt;
&lt;p&gt;On to more earthly updates - the directions widget now supports barriers, the Hindi locale is now supported, along with a few API updates/enhancements. Of note, the Dojo v1.12.1 package is now included which has some nice browser support updates as well.&lt;/p&gt;
&lt;h2&gt;That’s It?&lt;/h2&gt;
&lt;p&gt;That’s all folks. To be honest, I’m a fan of the faster release schedules so I don’t take this release as a bad thing. Any time we can get a few minor updates and bug fixes, count me in! So, here’s hoping Esri keeps up with the fast release schedules and get ready for 3.21 in the coming months.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS JavaScript API 3.19]]></title><description><![CDATA[As we are all waiting in line at the mall to buy some final holiday gifts, ArcGIS JavaScript API 3.19 and 4.2 were released so we could…]]></description><link>https://www.spatialtimes.com/2016/12/arcgis-javascript-api-3-19/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/12/arcgis-javascript-api-3-19/</guid><pubDate>Thu, 22 Dec 2016 13:40:31 GMT</pubDate><content:encoded>&lt;p&gt;As we are all waiting in line at the mall to buy some final holiday gifts, ArcGIS JavaScript API 3.19 and 4.2 were released so we could start updating our code while sipping back some rum and eggnog (eggnog is optional).&lt;/p&gt;
&lt;h2&gt;What’s New in ArcGIS JavaScript API 3.19&lt;/h2&gt;
&lt;p&gt;A few of the bigger changes include more support for vector tiles and the additional of Arcade expression language.&lt;/p&gt;
&lt;p&gt;Vector Tiles are now supported in all ArcGIS-supported spatial references. This addition will help more of us get starting using the vector tile approach as it seems to be the future of basemaps. One downside - you still can’t print the vector tiles basemaps.&lt;/p&gt;
&lt;p&gt;Arcade is Esri’s new, lightweight, and secure expression language. Arcade isn’t just limited to JSAPI, and will also work with &lt;a href=&quot;http://www.esri.com/en/software/arcgis-pro&quot;&gt;ArcGIS Pro&lt;/a&gt;, &lt;a href=&quot;https://arcgis.com/&quot;&gt;ArcGIS Online&lt;/a&gt;, and the &lt;a href=&quot;https://developers.arcgis.com/arcgis-runtime/&quot;&gt;ArcGIS Runtime APIs&lt;/a&gt;. For now, the focus is on expressions for visualisation and labelling but it also allows for other expressions and geometry functions. The initial release only includes basic geometry functions (create and reference). In future releases, other geometry functions should be added to help calculate areas and lengths, and perform simple overlay operations within an expression - think Arcade as a light weight ArcPy Geometry object.&lt;/p&gt;
&lt;h2&gt;Changes to ArcGIS JavaScript API 3.19&lt;/h2&gt;
&lt;p&gt;Geo-location has been enhanced so you don’t get caught in the browser wars with HTTP. To helps developers still using HTTP, the JSAPI no longer displays the Locate Button for non-secure web apps in any web browser. Most of the recent browser updates now block the Geo-location API for HTTP, so this update will help keep us all away from making an app that isn’t all-browser friendly.&lt;/p&gt;
&lt;p&gt;While on the browser topic, the list of supported browsers was also changed to state “IE9+” instead of “IE7”. If you still need IE7 this is the least of your worries.&lt;/p&gt;
&lt;p&gt;Both JavaScript API 3.19 and 4.2 are now available from Esri’s CDN and on GitHub.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[iOS ArcGIS Collector 10.4 with the Bad Elf GNSS Surveyor]]></title><description><![CDATA[I’ve wanted to try ArcGIS Collector with the Bad Elf series of devices to see how it stacks up against some other external GPS/GNSS. I’ve…]]></description><link>https://www.spatialtimes.com/2016/11/ios-arcgis-collector-10-4-bad-elf-gnss-surveyor/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/11/ios-arcgis-collector-10-4-bad-elf-gnss-surveyor/</guid><pubDate>Sat, 05 Nov 2016 13:22:15 GMT</pubDate><content:encoded>&lt;p&gt;I’ve wanted to try ArcGIS Collector with the Bad Elf series of devices to see how it stacks up against some other external GPS/GNSS. I’ve read some great reviews, but needed to try it with Collector to see for myself. Well, send Larry from Bad Elf to the rescue.  His confidence in the Bad Elf devices is very high, so much so, he sent me a Bad Elf GNSS Surveyor to test out. And now - I understand where his confidence comes from.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update 2016-11-08:&lt;/strong&gt; GNSS/GPS hardware pricing corrections.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Setting up the Bad Elf GNSS Surveyor&lt;/h2&gt;
&lt;p&gt;The setup was straightforward on the iOS devices I tested with: iPad, iPad w/ 3G, iPhone 6. You can pretty much hook up the Bad Elf in the same way you would connect most other external GNSS with Collector:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Setup the bluetooth pairing (iOS settings &gt; Bluetooth)&lt;/li&gt;
&lt;li&gt;Open the ArcGIS Collector 10.4 App&lt;/li&gt;
&lt;li&gt;Go to the settings screen and select Providers (Action button &gt; Settings &gt; Providers)&lt;/li&gt;
&lt;li&gt;Add/Select the Bad Elf provider&lt;/li&gt;
&lt;li&gt;Collect&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 639px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/82c1eb50a6e1a079196c60946326586f/3dbb9/Collector-Providers-e1478271651520.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.6%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC0ElEQVR42n2R20/TYBjGKwgZKDHRICEEJGBESSDxdKPc+G+IMMJGPHDWCYiRmGDivY6xgWzAwkGMxHtv2BZCwiE9xB26BIkZW7d27TbW9bi2pu0gEo2/PEmf7+17+NoXaBpZqupzVg+4mseWGy3uMpMd6LACj6yX+5w333y+NbF2fXQJ6JwqMtrKzY5Gi7vR4m4aWWqf/n5v8itQ0TNTbnYUdU6Vdk2f6bAWG22Gbntp93SZyXHOPFNitJV02YD2j8DDD2eNNoPJbui2G0z2C49n1TGt46s3Rpdbxldaxleax5avDC88eP+t7d16y6uVtsn12xNrdybW7r79cn9yvcLsKDc56ocXizusra9XG54vAjUDrtpBV+3gfN3Q/LWX7qreuZoBV2XvXOWzT9X9zqsWd92Q+qrhxeLFJ7MVPY5LT2fP99jrhxeq+52AF0I9EOoBQx4wtAGGvDDqhVAfhPo0swGGPFDIoxkfHN5Ewj4Y3UTCHijkhVAgmYirwuO6IRKYfiQShYh+JPEEHsfwOEYk4ngc0zLjAE3nVOUYhuU4jmdZjmU5hmF1o6uQ84eYHEPTOUCWZUVRSJLc2dkBQRBBkL29vWAwuLW1FQgEEAQJBAIsyyqKomcqiiLJcoYRxLxUKOZ5niTJaDRKEEQymcxkMgRBUBRFagiCkNfQy1khD/0iKJo7VZxOpymKSqVS2Ww2mUxSFJVOpwmCwDAsoyFJknYFhRPykiyrxepTayFrSJJ0csMTtJgsSQXpkcLkRAKHYRhFUb//B47jBwcHGIbBMBwMBnd3d7e3t3M55riFOlnIqyMAVhAzrEBns36/PxKJxGIxHMcjkYjW4ufh4eH+/n44HOZ5/uSfnfpmWVFEUUilUhRF0TRNkiSO41kNURSVv5AkmaQ5Pi8B6nJ5jmVZmqZzxxwdHemG0TauLv00osjzPAfE/gWGYbH/EtX4Dbis+P0jJ1VGAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Collector Provider Settings&quot;
        title=&quot;&quot;
        src=&quot;/static/82c1eb50a6e1a079196c60946326586f/3dbb9/Collector-Providers-e1478271651520.png&quot;
        srcset=&quot;/static/82c1eb50a6e1a079196c60946326586f/0eb09/Collector-Providers-e1478271651520.png 500w,
/static/82c1eb50a6e1a079196c60946326586f/3dbb9/Collector-Providers-e1478271651520.png 639w&quot;
        sizes=&quot;(max-width: 639px) 100vw, 639px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;ArcGIS Collector Provider Settings&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Collector &lt;em&gt;Providers&lt;/em&gt; aren’t all the same&lt;/h2&gt;
&lt;p&gt;As you are probably aware, you also have the option to use the ‘Integrated Receiver’ provider in Collector on iOS devices. You can actually use this option with the Bad Elf as well but it isn’t recommended (not recommended for any external GPS/GNSS for that matter).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1224px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b4a161d984b6b3ecec056151cff22e9d/f91f5/Collector-Trail1.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.4%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wgARCAAbABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUJCAr/xAAXAQEBAQEAAAAAAAAAAAAAAAADBQYH/9oADAMBAAIQAxAAAAHVOnYQv2GlJNoxNfbTKTjbocPoQOd0F//EAB0QAAIDAAIDAAAAAAAAAAAAAAMEAgUGAQcIFBb/2gAIAQEAAQUC6W2bZ39Hq+SBa1PoloLtuis3N1dvnNpm3J12C6BIHx0WSdns0FIWU4xiNayskh/QaA3H/8QAJxEAAgECBQEJAAAAAAAAAAAAAQIDESIABCExQRMSFCMyM1OS0dL/2gAIAQMBAT8BgmTLuWmZemGrfRUAsAvZgov20I1HOO9ZFtVzOXodvGi/WOjDCjsFZrlqGkkkHpl9pWcDz8U7RArxQRp7cfwH1j//xAAlEQACAQMDAgcAAAAAAAAAAAABAgMEESEABRITkRYiQkNTYdH/2gAIAQIBAT8B3ekm3CmMdFySodUDOGbm/GRjKvCNCWDxWBPNMC58t014WrPdSrMnrPTbLYuc5tpjJNCzPJlJVVCqIlrqS1+AS9/s4766T/Ie7fuv/8QAKxAAAgECBgEDAgcAAAAAAAAAAQIDBBEABRITITEiBhRBMlEVFiNEcbHR/9oACAEBAAY/AoMllrt6jkQxx0zMzkSOpdJofqddsw7Uq8IqOD4Kt8V9LG23JHLLT7Dw3NhZRqUlvJr3DnShDD6bXwaeaN9acX22OqxKkjxUadSkLbx0gFSQb4o83yuqNPmFIdxBqazWuADHbSynkFSLMOMVNRUZjJLPLI877atHK011XVK3dgvA5PS9qBjdeokiawQq2v4+eGAtzx9+8RTVPraL3G1T3P5po1dZzErSQ29ueFckabal++PWO/Tx1Cx1mVxpK9LHOwW2ZaSjPG9wV2yxA8u+eLUyx0tOB+HRftogSfc1fkf0uz89fxiIKABa39f6cSR0OZZlQLKxaUUFfV0WsxcRFjSzREmO50c+Nza1zhWmz/PZmtp1S5xmUrWF7AF6liB826uS3ZJP/8QAHBABAQADAAMBAAAAAAAAAAAAAREAITFBUWFx/9oACAEBAAE/IYYgkR7QTk18DwszUHGrjaEdNgaO9qbXqDQtRbkE1jVpjWS8bwRAlVQTCrhls+StC8/2BZp2AIgIKqrm64A0hYHdmqBFxwBXGhiMQY/AwLj04EInMHC+MFyAANApZ6oSm4zgZWSYH6GMXtX2RQEJAw8LjuCVRnP/2gAMAwEAAgADAAAAEIgQzP/EABwRAQEBAAIDAQAAAAAAAAAAAAERIQBBMVHB8P/aAAgBAwEBPxAKNZhkDrokdqRGPAFvZC5SeIUwzsPeE5Y12EBCBYbSQ4QkA6Fez4fy8//EABoRAQEAAwEBAAAAAAAAAAAAAAERACFBUTH/2gAIAQIBAT8QH65ri44lnsCaDxqCiUCKTstZduKUsgrwnEIRCKfQou3dNaOh9eHeZ//EABkQAQEBAAMAAAAAAAAAAAAAAAERACExQf/aAAgBAQABPxA6GjZaNKAK5yJC/ALVrK83iTPnb2kxEdzabmvusJ+6K/LOemC7CeNNTYBz8gRjXlb0YU6og1IjwdBcSaocMfwxNgJnRIy+Mvljigc0RAYBjspGBTPSiQiTANzNIGI5+oreYOCE4aVkNuPGx//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Collector Bad Elf GNSS vs. Integrated Provider on the trail (medium canopy)&quot;
        title=&quot;&quot;
        src=&quot;/static/b4a161d984b6b3ecec056151cff22e9d/f91f5/Collector-Trail1.jpg&quot;
        srcset=&quot;/static/b4a161d984b6b3ecec056151cff22e9d/953fe/Collector-Trail1.jpg 500w,
/static/b4a161d984b6b3ecec056151cff22e9d/0a251/Collector-Trail1.jpg 1000w,
/static/b4a161d984b6b3ecec056151cff22e9d/f91f5/Collector-Trail1.jpg 1224w&quot;
        sizes=&quot;(max-width: 1224px) 100vw, 1224px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Collector Bad Elf GNSS vs. Integrated Provider on the trail (medium canopy)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Why not you ask? The Integrated Receiver is really just letting iOS Location Services manage the location profile. iOS Location Services can communicate with WIFI, Cellular, internal GPS, and external GPS devices in order to determine the best location signal to use. Sounds great - but there are two main issues when using this approach with ArcGIS Collector:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The details of Collector’s Location Accuracy window will currently max out at 5m for iOS Location Services. The actual accuracy might be better, but Collector will still show 5m in the Location Accuracy Window. Although if using a Bad Elf GNSS device you can still check the LED screen to verify the accuracy.&lt;/li&gt;
&lt;li&gt;You don’t actually know which input signal is being used (GPS? Cellular? Other?): If you purchase an external GNSS, you probably want to know if it’s being used. I had a Glo battery drain and the only way I noticed was the Collector Location Accuracy window was hovering around 8.5m to 10m under canopy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1224px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3ccdde02001d9ffcf3c63235021b5ebf/f91f5/Collector-Trail2.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.4%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wgARCAAbABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAkFBggH/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwQF/9oADAMBAAIQAxAAAAGk2bPOs2mnioGPdi1tSsu7bIN+FRDF/8QAHBAAAgMAAwEAAAAAAAAAAAAAAgQDBQYAAQcl/9oACAEBAAEFAs7tWzBmfvviIzCviqlOQu8sg4s98yepBiAfC6eos6XRZ6hicRETGj1+jzSLXo+2ak//xAAlEQACAQIFAwUAAAAAAAAAAAABAgMAERITIUFRBAUxFGGBkbH/2gAIAQMBAT8Bg7SikSOVC7Y5FA2ABF+PH1XpohoGXTiRPbiiEljwOiutgSrgMtww2a/hhcfB0NZHTrpkQi3EUdvyv//EACQRAAIBAwIGAwAAAAAAAAAAAAECAwARIQQiBRIUMVGhEzJB/9oACAECAQE/AeJcQ6tmiu3xqbmKOG6l/szghD+4Jv6oaaJgG5e9jmMg5t32UAUa8bMrsRuB5TkeRnIx6zQXUvu6h8+ZZK//xAAtEAACAQMDAwIDCQAAAAAAAAABAgMEERIFEyEAFCIxUQYVIyQyM0FCQ2GBof/aAAgBAQAGPwKCJtVmyjOKK8hZMCPw3iEe4yl7SE5eoOf6AJpZ6vckqZRKFQFbSX8sT+SAEqUe/JuPIt0ojaCJfZWxvwPPhkvkLHK3P+ddxU6jBDO5CQ90tRDTrOhG60VeI5afBCGS8uKyOyG+BHUsg15NwPJKmFbo00MkvP0/s+p7w3HKkSduFjIRCDyeu1+ZioxUHPuYltcm0dms3gBjyOf5+8cIpZLMVVoUbxkIJ/ZZbEBiW8l8ZPYrxrD6pQ6fVyx6xGkc9dRUlW8QagidkR542baMlmtkUvyeoFj0jSkHZxk7dBRRhzuzjMhIQLkAc+wA9B15AHEi39t1s6Hqkunx1E7zzJHFTOHljyiRzvQychFVeLenv0JJ/iCqkcJiDtUg8QzG1lpwPVj1/8QAGhABAQEBAQEBAAAAAAAAAAAAAREhAEExUf/aAAgBAQABPyHdwyuCCE9eOwnJ4Py6SgjL6oAIRTh8triK24sx+QOtQedYqMKYzReJVXQUQN0gZEKQjg4JfBIEkA2+RACI6IYD8AhjRwxSABopGR5M9razuMa1zUHwmHEsxZiFUpFr+rzaJ/TwpzzJAo64hQGzgxHCfnvf/9oADAMBAAIAAwAAABBUI03/xAAbEQEBAAMAAwAAAAAAAAAAAAABEQAhMXGxwf/aAAgBAwEBPxBWT2gVHo70uCEhVGmmKCgS7jo29PmGxBAohhCJRKxCgc8HBEsdE+u+XP/EABsRAQEAAwEBAQAAAAAAAAAAAAERITFBUQCB/9oACAECAQE/EJxHhGGgkKGNKdHPDtYEw2N2ez0ks0BZNVe9VnWSM/DCVI5Dwzl8m9fk/8QAGBABAQEBAQAAAAAAAAAAAAAAAREAITH/2gAIAQEAAT8QUJtVaEKjZj6hHi6tl2IeeBrQRVdtZkkTbXR6nL/K0CXpgMDjhytT589hdVLEMeHARiGy5RGgKuuP97D0+q8HNioGnmi6AqsRMt3fiu02sgwTo3QmOmwGSQCAGoRqMcJbZKsxy2RyZMMJl1iwA//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Collector Bad Elf GNSS on the trail (dense canopy)&quot;
        title=&quot;&quot;
        src=&quot;/static/3ccdde02001d9ffcf3c63235021b5ebf/f91f5/Collector-Trail2.jpg&quot;
        srcset=&quot;/static/3ccdde02001d9ffcf3c63235021b5ebf/953fe/Collector-Trail2.jpg 500w,
/static/3ccdde02001d9ffcf3c63235021b5ebf/0a251/Collector-Trail2.jpg 1000w,
/static/3ccdde02001d9ffcf3c63235021b5ebf/f91f5/Collector-Trail2.jpg 1224w&quot;
        sizes=&quot;(max-width: 1224px) 100vw, 1224px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Collector Bad Elf GNSS on the trail (dense canopy)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Bad Elf, please stand up&lt;/h2&gt;
&lt;p&gt;The Bad Elf GNSS Surveyor really does stand out from the crowd. The LED screen provides a huge amount of information on accuracy, number of satellites, Bluetooth status, and even allows for data logging on the device. I didn’t think I would use the LED screen very much since I use Collector, but it was great for quickly verifying battery life, and accuracy (and didn’t have one on my last GNSS device). That said, I will be hard pressed to go screenless again - as any questionable readings I see in Collector can easily be verified by the device itself.&lt;/p&gt;
&lt;p&gt;A subtle yet refreshing addition is the Bad Elf App for iOS (available for free in the App Store). It has a clean design with the same information you can see on the LED screen, and has the ability to easily change device settings and perform firmware updates  - checks when they are available and deploys the updates with the click of a button. This means no desktop PC is needed for changing settings, or providing upgrades.&lt;/p&gt;
&lt;h2&gt;Accuracy and Price&lt;/h2&gt;
&lt;p&gt;When it comes to using ArcGIS Collector and high(er)-accuracy GNSS, there are way too many factors to get into for one article. The 1cm to 50cm devices are for very specialized use cases and definitely not covered here. Overall the level of accuracy required will vary by required use. Price is also a factor for many, and there is definitely an Accuracy-to-Cost ratio that needs to be taken into consideration (along with RTX services and fees).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1280px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6c7fa86f919cbe9e0e2cbb0ddd93cd6f/bbbf7/BE-Device.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 88.8%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAA7DAAAOwwHHb6hkAAADuUlEQVR42mWT608cZRTG528waUxqwbAFK9AV2lSw1cgXY6JprVEaK6SmbVoj1m+txhitSQ21XhpJaKCJHxoNmohJTWuQUi5SdpeyLCzLLrCwu7Mzszs7M+/MvJe5Upa5mC0tMXryfjg5Ob/zvB+eh/L/W9525zgOAABCiDF2HEdRFJqmy+WyYRiiKKZSKWqb8Txni/Q8d6txXVdVoeO4nudtbGwUi0We5y3L9rzKjud51GO1yvbmprFZ1rYnrutBqGNsQpUgBfG8xLIlufIVrTKEOrWF2RZfZG/EZ96NRY4yuX5Dzz9Udiow0rNMaUXAqqIJJRkjcymdAwARYlWUdS2ZnH8lFqmbDQVnQ8HoVO1c+JAC7vm+r6pElRELtPF0QQPKCiOs0cVEOicBiJBBOW45uXDm0pfVp96re6f96bferOrsqPnk/M6p8dc3y5aq6ixbIlAbTLJ/JJnhVH61qDDZ/GqWRVCnbHv115/3H2qrOfx24Eh74OixwJH2Z/a1VH/bXWcZcxBu5PMcwwlxRlxiJSZDDyzkR5fZEleSVY3ScKj/WsOJs43dV/dfvBy83NP0w/UXO04HP/t4F4bDGLtAUpcz7HgkFoovqRKMrnJzPMYKxkinNBK+3lt/uqvhm77mC1/sudTT+HXvc8dO1H7+aRVUhgnxZRlJPIjT/O1FWpVUU7MBL4kSkZBNERT+bSD46muBzlO1xzsDJ98PnOzaffDlqu+v1KjyKCYOwrqiEAUgSZDz+aIgqIIoAFjIgQJlGFxs+qWPunZX79qxt+nJ+r07ntr5RMfxqtGhZkmYyeZKqYXFLM3FF1Kzc4nVDJPJsIIAMMYEY+rBAzR//3AieuD2zX39vQ3XeuoHfwnOhpon7xzEkJGRHeWRiQ2EDIuYNjERMhC2MLYxtijHdRfnzobGmqKh1vh0Szzy/P3JA38PB+/dfWNzw05L2pmYOMJhgo3ZEhktYEwsnRgImxibFZPQmR+nRp+dnnwhMt4aHmsJjbfevRVIzn/n+/7FhNgWEvvW0J8saQuJ5+bBGA0G86SsW3jLYevreizywcRQ/cRfjRNDjSO39kyOdJiG7Pv+1QT/YZT/KU4PxHPnoqUrM7m+O+EbK0ASVU6E297WMumbsUh3NPxVeul308RbqVJEBctIEtUSD7CCoYKBTBQZCaohKhr1OI/e/1Ltua7LFYTldJYrCDwP2IIoSlDTbFnGfEGE8BH8kPacf71HtwQBpFLpYlHU9PVslllbyxNicZyQSCzzPPgHb+lgipDJOuAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Bad Elf GNSS Suveyor&quot;
        title=&quot;&quot;
        src=&quot;/static/6c7fa86f919cbe9e0e2cbb0ddd93cd6f/bbbf7/BE-Device.png&quot;
        srcset=&quot;/static/6c7fa86f919cbe9e0e2cbb0ddd93cd6f/0eb09/BE-Device.png 500w,
/static/6c7fa86f919cbe9e0e2cbb0ddd93cd6f/1263b/BE-Device.png 1000w,
/static/6c7fa86f919cbe9e0e2cbb0ddd93cd6f/bbbf7/BE-Device.png 1280w&quot;
        sizes=&quot;(max-width: 1280px) 100vw, 1280px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Bad Elf GNSS Suveyor&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The Bad Elf GNSS Surveyor is in a very unique position when looking at the Accuracy-to-price ratio. A stated “1.0m Stationary Accuracy” (real-time) will cost $599.99 USD, it’s hard to compare to other devices as there aren’t many ~1m devices on the market. None of the other big players come close to this price in the meter/submeter zone (50cm - 1.5m): $1895.00 USD (iSXBlue II+ GPS), 1995.99 USD (Arrow Lite), $2495.00 USD (Trimble R1), $2895.00 (iSXBlue II+ GPS). This all said, each device has its niche and specific features that can definitely justify different price points (external mount antenna, replaceable batteries, accessories, RTX add-ons, etc). Some of the more expensive devices can also be upgraded to 10cm, or even 1cm, so please take these comparisons with a grain of salt.&lt;/p&gt;
&lt;p&gt;I realize the cost is more significant when compared to the likes of Garmin Glo’s and DUAL’s, but as mentioned earlier, these devices aren’t really in the same competitive space - there are actually a few additional Bad Elf products (GPS Pro, GPS Pro+) that are much closer in accuracy/price if doing comparisons in the 2.5m-4.0m range. The good news is you still get the iOS app, LED screen, rugged case, and water-resistant features of the higher end Surveyor on the lower end devices too.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;The Bad Elf GNSS Surveyor with ArcGIS Collector make a great team, and considering the level of accuracy and features: a good price. Collector and Bad Elf have a great thing going here and I look forward to seeing what the future may hold for this dynamic duo.&lt;/p&gt;
&lt;h3&gt;Bad Elf GNSS Suveyor - GNSS Specs:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;~1 meter stationary accuracy with SBAS+PPP&lt;/li&gt;
&lt;li&gt;2.5 meter accuracy while in motion&lt;/li&gt;
&lt;li&gt;Up to 10Hz position update rate&lt;/li&gt;
&lt;li&gt;Fast GPS lock times (45 seconds or less)&lt;/li&gt;
&lt;li&gt;56-channel GPS/GLONASS/QZSS receiver&lt;/li&gt;
&lt;li&gt;RTCM support&lt;/li&gt;
&lt;li&gt;SBAS/WAAS/EGNOS/MSAS&lt;/li&gt;
&lt;li&gt;Barometer for barometric altitude&lt;/li&gt;
&lt;li&gt;Bright yellow enclosure to find easily outdoors&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bad Elf GNSS Suveyor - Device Specs:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;IPX4 splash resistance&lt;/li&gt;
&lt;li&gt;Barometric Altimeter&lt;/li&gt;
&lt;li&gt;Access data logs directly from PC or Mac (USB)&lt;/li&gt;
&lt;li&gt;Post-processing support via RINEX conversion available in the Bad Elf app&lt;/li&gt;
&lt;li&gt;No internet connection or monthly subscription required&lt;/li&gt;
&lt;li&gt;Bluetooth 2.1 technology + EDR
&lt;ul&gt;
&lt;li&gt;Range of 33ft (10m)&lt;/li&gt;
&lt;li&gt;Support for 5 Simultaneous Connections&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Battery
&lt;ul&gt;
&lt;li&gt;Up to 28 hours bluetooth connected, streaming GPS data, while data logging&lt;/li&gt;
&lt;li&gt;Up to 32 hours while data logging&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Additional Links:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Bad Elf - &lt;a href=&quot;https://bad-elf.com/pages/compare&quot;&gt;Compare Bad Elf Devices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bad Elf - &lt;a href=&quot;https://badelf.freshdesk.com/support/solutions/articles/5000605760-pairing-a-bluetooth-bad-elf-with-ios&quot;&gt;Pairing with a Bad elf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bad Elf - &lt;a href=&quot;https://badelf.freshdesk.com/support/solutions/articles/5000712155-getting-started-collector-for-ios&quot;&gt;Setup iOS Collector&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Server 10.5 is now ArcGIS Enterprise 10.5]]></title><description><![CDATA[If you haven’t heard, Esri found out we finally understand the current naming conventions and licencing models for their server products…]]></description><link>https://www.spatialtimes.com/2016/10/arcgis-server-10-5-is-now-arcgis-enterprise-10-5/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/10/arcgis-server-10-5-is-now-arcgis-enterprise-10-5/</guid><pubDate>Wed, 26 Oct 2016 15:37:03 GMT</pubDate><content:encoded>&lt;p&gt;If you haven’t heard, Esri found out we finally understand the current naming conventions and licencing models for their server products. Naturally, this means it’s time for a name and licence change. Don’t be too hard on them, many didn’t like the existing names either: is it ‘ArcGIS &lt;strong&gt;for&lt;/strong&gt; Server’ &lt;em&gt;or&lt;/em&gt; ‘ArcGIS Server’? And sooo many different server products, all dependent on each other yet separate products at the same time. Arrgghhh. This is what Esri is hoping to fix with the new branding (assumption).&lt;/p&gt;
&lt;p&gt;So let’s not dwell on what &lt;em&gt;could&lt;/em&gt; have been and the latest &lt;em&gt;ArcMarketing&lt;/em&gt; terms du jour.  Instead let’s focus on what this change means to GIS administrators.&lt;/p&gt;
&lt;h2&gt;What is ArcGIS Enterprise?&lt;/h2&gt;
&lt;p&gt;The Enterprise is an interstellar spacecraft powered by warp-drive engines that… oh crap, sorry about that - &lt;strong&gt;ArcGIS Enterprise&lt;/strong&gt; is the entire server stack of Esri software ‘components’ for your organizations’ server environment. This includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArcGIS Server&lt;/li&gt;
&lt;li&gt;Portal for ArcGIS&lt;/li&gt;
&lt;li&gt;ArcGIS Data Store&lt;/li&gt;
&lt;li&gt;ArcGIS Web Adaptor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are lots of enhancements to many of the software components, such as Portal-to-Portal sharing, and new HTTPS defaults. The official list will be released soon but you can checkout the draft &lt;a href=&quot;http://server.arcgis.com/en/server/10.5/get-started/windows/what-is-arcgis-enterprise-.htm&quot;&gt;Esri 10.5 help pages&lt;/a&gt; to get an idea of some of the bigger changes.&lt;/p&gt;
&lt;p&gt;So overall, the change doesn’t sound too crazy so far, since ArcGIS [for] Server really came with this product list before. However ArcGIS Enterprise will require new 10.5 authorization numbers as previous authorizations (10.1-10.4x) will not migrate like they did in the past. And as for licencing, this is where it gets fun!&lt;/p&gt;
&lt;h2&gt;Licencing Roles and Extensions&lt;/h2&gt;
&lt;p&gt;System capacity and capabilities are licenced ”&lt;em&gt;by CPU cores according to one or more server roles&lt;/em&gt;” ~Esri docs. In layman’s terms, each ArcGIS Server Role has one or more licence options available. So you install the ArcGIS Server component and licence it as one of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArcGIS GIS Server: Still has editions - Basic/Standard/Advanced&lt;/li&gt;
&lt;li&gt;ArcGIS Image Server&lt;/li&gt;
&lt;li&gt;ArcGIS GeoAnalytics Server&lt;/li&gt;
&lt;li&gt;ArcGIS GeoEvent Server&lt;/li&gt;
&lt;li&gt;ArcGIS Business Analyst Server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From this list, it’s pretty clear licencing is still based on functionality/use, and we get a few new things to laugh at: “ArcGIS GIS Server” is redundantly redundant. And the words ‘ArcGIS’ and ‘Server’ are used to describe every licence which contradicts the overall name change. Sorry, I couldn’t help myself. To be honest, it doesn’t matter what the name is, the focus is the functionality/purpose ;). Shakespeare said it best [&lt;a href=&quot;https://en.wikipedia.org/wiki/A_rose_by_any_other_name_would_smell_as_sweet&quot;&gt;What’s in a name&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;So, the software is upgraded, and the software components you are familiar with from 10.1-10.4 are still there (bigger change is licence lingo), and we licence by functionality. Oh, and yes there are still extensions (Schematics, Data Reviewer, INSPIRE, Workflow, Defense, etc). Some extensions are included, some can be purchased - depending on the Standard/Advanced Edition (extensions not available for Basic).&lt;/p&gt;
&lt;h2&gt;Should I upgrade?&lt;/h2&gt;
&lt;p&gt;So nothing has changed, but everything has changed - this doesn’t mean you should be worried about upgrading as you will be given the appropriate licences based on your current maintenance/setup. I usually recommend waiting for the first service pack before moving a production environment - but we do need a few early adopters to find those bugs for the rest of us!&lt;/p&gt;
&lt;p&gt;For smaller shops with one licence of AGS Standard (and maybe Portal), it really is just a new authorization with little changing. Larger implementations will see focus on how the various ‘roles’ should be implemented in determining licence needs if you want to change where components are currently installed as part of the upgrade - Multi-server setups by Role are recommended. Either way, we need to update our server diagrams and PowerPoint slides.&lt;/p&gt;
&lt;h2&gt;Release Date&lt;/h2&gt;
&lt;p&gt;There is no public/official release date as of yet, but the pre-release is currently available from myEsri. If you are eagerly waiting the final cut, it is anticipated to be released before the end of the calendar year.&lt;/p&gt;
&lt;h2&gt;Other Names on the Shortlist&lt;/h2&gt;
&lt;p&gt;Here are a list of names on my 15-second brainstormed shortlist Esri can use for the next name change:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“ArcIMS Pro”&lt;/li&gt;
&lt;li&gt;“ArcGIS 4k Neo”&lt;/li&gt;
&lt;li&gt;“ArcInternet”&lt;/li&gt;
&lt;li&gt;“ArcGIS Online Locally”&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Supporting links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://server.arcgis.com/en/server/10.5/get-started/windows/what-is-arcgis-enterprise-.htm&quot;&gt;What is ArcGIS Enterprise&lt;/a&gt; [Esri]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.esri.com/esri/arcgis/2016/10/13/arcgis-10-5-prerelease-is-now-available/&quot;&gt;ArcGIS 10.5 Prerelease available&lt;/a&gt; [Esri]&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://server.arcgis.com/en/server/10.5/get-started/windows/what-s-new-in-arcgis-for-server.htm&quot;&gt;What’s new in ArcGIS Server 10.5&lt;/a&gt; [Esri]&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Map Service to Shapefile with Python Part 2 - Iteration]]></title><description><![CDATA[This post builds on the previous Extract a Map Service Layer to Shapefile using Python post. It seems as though many are interested in…]]></description><link>https://www.spatialtimes.com/2016/09/map-service-to-shapefile-with-python-part-2-iteration/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/09/map-service-to-shapefile-with-python-part-2-iteration/</guid><pubDate>Thu, 29 Sep 2016 20:49:15 GMT</pubDate><content:encoded>&lt;p&gt;This post builds on the previous &lt;em&gt;&lt;a href=&quot;https://www.spatialtimes.com/2016/03/extract-map-service-layer-shapefile-using-python/&quot;&gt;Extract a Map Service Layer to Shapefile using Python&lt;/a&gt;&lt;/em&gt; post. It seems as though many are interested in getting past the pesky limits ArcGIS Server has on querying/extracting data to a shapefile. The initial post does mention this limitation, which is typically 1000 or 5000 features by default depending on the version (and configurable by admins). Part 2 will focus on getting past that limitation to all the juicy goodness… errr, all the data.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note 2016-10-31:&lt;/strong&gt; Sample code updated to sort objectIDs before creating groups.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Before We Begin&lt;/h2&gt;
&lt;p&gt;It might be a good idea to refresh on the details of &lt;a href=&quot;https://www.spatialtimes.com/2016/03/extract-map-service-layer-shapefile-using-python/&quot;&gt;part 1&lt;/a&gt; as we aren’t covering the same pieces again. And before we go too far, the same disclaimers apply: Make sure you have permission/rights; use this code for good; Don’t bombard servers with your requests; Donate to SpatialTimes (worth a try).&lt;/p&gt;
&lt;h2&gt;Map Service to Shapefile with Python, No Limits&lt;/h2&gt;
&lt;p&gt;The first thing to check is the maximum query results allowed by ArcGIS Server. Since this can be configured by the Admin, it might be worth performing a manual query to see what the limits are. For this example, I’m assuming the typical Max Results = 1000 (most Admins don’t bother changing the default).&lt;/p&gt;
&lt;h2&gt;Get All ObjectIDs, Yes All of Them&lt;/h2&gt;
&lt;p&gt;Once the maximum is set, we can extract all of the ObjectIDs from the layer and begin to divide this into chunks of 1000 (or other value). Although the maximum results are set, the &lt;em&gt;&amp;#x26;returnIdsOnly=true&lt;/em&gt; parameter doesn’t have this same restriction. You can return all IDs regardless of how many there are. This result sets up the rest of our queries since you can’t assume ObjectIDs are sequential with no gaps. &lt;em&gt;&lt;strong&gt;Update 2016-10-31:&lt;/strong&gt;&lt;/em&gt; The IDsJSON variable originally assumed the IDs were in order which isn’t always the case (added the sorted function).&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;IDsRequest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; serviceURL &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; serviceMap &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;serviceLayerID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
  &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/query?where=1%3D1&amp;amp;returnIdsOnly=true&amp;amp;f=pjson&quot;&lt;/span&gt;
IDsResponse &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; urllib2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;urlopen&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;IDsRequest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
IDsJSON &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loads&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;IDsResponse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
IDsSorted &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;IDsJSON&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;objectIds&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Divide and Conquer&lt;/h2&gt;
&lt;p&gt;Now that we have all the IDs, we need to turn these results into usable chunks, then setup our extraction queries - each chunk will run another query. A list will be created for the first 1000, then the next 1000, and the next. The last list will be any remainder (probably &amp;#x3C;1000).&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;iter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;AllOIDs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; maxRequests
ListOfLists &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;e &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; e &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; e &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; itertools&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;izip_longest&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Putting it all Together&lt;/h2&gt;
&lt;p&gt;We are now ready to take the Map Service to Shapefile with Python. We have the Map Service, all IDs, and divided those IDs into &lt;em&gt;n&lt;/em&gt; lists.  To query each list, we just use a python loop and make the same request as in the original post.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; SingleList &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; GroupOfLists&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    Query the service &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; ObjectID query
    Make a shapefile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will create a unique shapefile for each chunk/iteration. If you want to merge/append into a single output, you can add a few lines of code to the end, or just use the Merge Tool or Append tool.&lt;/p&gt;
&lt;p&gt;Below is the full code with the only changes required to the URL, Service, and Layer ID variables.&lt;/p&gt;
&lt;iframe
  src=&quot;https://gist.github.com/TheBryanMac/da76aea0b736aa3da99a80408f6db42f.pibb&quot;
  style=&quot;width: 100%; height: 300px; border: 0;&quot;
&gt;&lt;/iframe&gt;</content:encoded></item><item><title><![CDATA[ArcGIS JavaScript API 3.18]]></title><description><![CDATA[ArcGIS JavaScript API 3.18 was released by Esri last week. Great news for those still using the 3 series - and FYI, ArcGIS JavaScript API…]]></description><link>https://www.spatialtimes.com/2016/09/arcgis-javascript-api-3-18/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/09/arcgis-javascript-api-3-18/</guid><pubDate>Mon, 26 Sep 2016 10:16:56 GMT</pubDate><content:encoded>&lt;p&gt;ArcGIS JavaScript API 3.18 was released by Esri last week. Great news for those still using the 3 series - and FYI, ArcGIS JavaScript API 4.1 was also release last week.&lt;/p&gt;
&lt;h2&gt;What’s New in ArcGIS JavaScript API 3.18&lt;/h2&gt;
&lt;p&gt;The biggest update in ArcGIS JavaScript API 3.18 looks to be an overhaul of the FeatureTable Widget. There are lots of new and improved features, including the long anticipated support for related records. Selection behaviour in the table has been improved, but if you have been leveraging this in the past you might want to test first, as there are some major changes here.&lt;/p&gt;
&lt;p&gt;Another big update is for VectorTileLayer support. The new implementation is more baked-in to the API instead of seeming so isolated in the past. And if you need more browser compatibility, this update now also supports IE11 and Edge (a showstopper missing feature for many in the past).&lt;/p&gt;
&lt;p&gt;With all these changes in place for VectorTileLayers, there is a small warning from Esri:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The internal implementation of vector tile layers in 3.x has changed. If you were using any of the undocumented APIs that were part of the previous implementation they will not work with the new version.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Minor changes&lt;/h2&gt;
&lt;p&gt;The usual small bug fixes, and enhancements to the Elevation Profile Widget, new Calcite theme (dark) are also included in this release. Not surprising, there are also bug fixes for the Measure Widget, which is still one of those tools that is surprising difficult to fully implement without hitting an issue. On the bright side, they keeping squishing bugs as we report them.&lt;/p&gt;
&lt;p&gt;Overall, this release is a must for those who plan on using VectorTiles moving forward. That said, this is also setting up for VectorTiles to be supported in “any ArcGIS supported spatial reference”, which is a huge step forward to this being the new publishing standard (for Esri map services).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Collector for ArcGIS Windows Edition 10.4 AND it works]]></title><description><![CDATA[Phew! Collector for ArcGIS Windows Edition 10.4 is here… and it works!! That positive energy put forward in the related Collector 10.3 post…]]></description><link>https://www.spatialtimes.com/2016/09/collector-arcgis-windows-edition-10-4-works/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/09/collector-arcgis-windows-edition-10-4-works/</guid><pubDate>Wed, 07 Sep 2016 13:18:13 GMT</pubDate><content:encoded>&lt;p&gt;Phew! Collector for ArcGIS &lt;strong&gt;Windows&lt;/strong&gt; Edition 10.4 is here… and it works!! That positive energy put forward in &lt;a href=&quot;https://www.spatialtimes.com/2016/08/collector-arcgis-windows-edition-10-3/&quot;&gt;the related Collector 10.3 post&lt;/a&gt; seems to have paid off. The 10.4 version is now available for Windows 10 on the Windows Store. After updating the software, I was successful pairing Windows 10 with external receivers (without the Location API).&lt;/p&gt;
&lt;h2&gt;Collector for ArcGIS &lt;strong&gt;Windows&lt;/strong&gt; Edition 10.4&lt;/h2&gt;
&lt;p&gt;This August, Esri released the Windows 10 and Android (new beta) versions of the popular Collector for ArcGIS application. Available from their related App stores, this update has been long awaited for allowing high accuracy GNSS devices to be connected. The real benefit of this update is allowing external receivers to use different connection types instead of relying on the default Location API (still available if you have a built-in GPS). This also removes the need for 3rd party hardware emulators when using the Windows version. The final version for Android is expected mid-September.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 502px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d874f750346d318cb86581c43cea42d2/c1d3e/Collector104w-settings1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 95.8%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAIAAAAf7rriAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACMklEQVR42o1Tu24UMRRdUtMj8QEUFHRIICFKmoiGGgQVHZRIiALxqJBSIEhDkwYhJEgDET9ATcMrmxCGbGZ2JrO7Hs/4NX7ca6OZWQLFLNqjqyvL9vHxPdceMM7jOCazWZod5tOp92ERvPeIaK1VUllntdaD1bWti483LzzavLz2/srTD5eevDv34O35h5v98Wfp7P03q2tbg1N3Xp64tXH85ovTd1+duff65O2NwbXnK9fXjy2OlRvrg6vPmp3bafF9XGyPiy8x+RyTb+NimNHdjO4e0mFW7GR02MZ8kBbDlO4clsOM/sjLQVMMIq9KMp1UlPCSOsC9Qn8ai48jNiqNMYbOppTMSkqNMbNJXtGiViqEMAD0gL7Wpta6zcY6EAYqDdyAdgiIxrouANE6p421DgB9owwASZJEUZSm6cHBQZqmwfvGXI+twRiC7zW/ISOilJJzzhhjVcUFZ5xzLqQQjLGyLK213e4ecgiBEKKUAgBrLQA456SUeZ4bYxARALTWxph+spTSOedbdEdorTtNaOFa9JABME2z/dEoy7Ioiuq6DktgTvbes5LSgswImUwmjDEhRFVVoq2Zt1Btb/qUvc+YmQrbXRsRu9zhaGaRciDSFmpuqf/P5+hpFUCaxPtRlMRxFEVJMu76d6TZe9zfmpUUUnKlpBBNbrrM5wVXVSWlXKzswz7Vv4p6VOpRqZPKOPTLXhvQb0/kcKr2SP01Fz9JrSwuSw7/vN3lzJqTfwPL1g5TkHHbCgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Collector Windows Settings&quot;
        title=&quot;&quot;
        src=&quot;/static/d874f750346d318cb86581c43cea42d2/c1d3e/Collector104w-settings1.png&quot;
        srcset=&quot;/static/d874f750346d318cb86581c43cea42d2/0eb09/Collector104w-settings1.png 500w,
/static/d874f750346d318cb86581c43cea42d2/c1d3e/Collector104w-settings1.png 502w&quot;
        sizes=&quot;(max-width: 502px) 100vw, 502px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Collector Windows Settings&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Compatible Receivers&lt;/h2&gt;
&lt;p&gt;To use a GNSS receiver with Collector, it must support NMEA 0183 sentance outputs. NMEA is the data specification Collector uses to communicate with the receivers. Most mid/high accuracy receivers already support the NMEA sentences that Collector uses, including most of the mid range receivers: SXBlue (setup NMEA sentance streams in config), Arrow, Garmin Glo, Dual XGPS, most Bad Elf devices.The NMEA sentances required/supported with Collector for ArcGIS can be found in the help guides (&lt;a href=&quot;http://doc.arcgis.com/en/collector/ios/create-maps/gps-receiver-support.htm&quot;&gt;iOS&lt;/a&gt;, &lt;a href=&quot;http://doc.arcgis.com/en/collector/windows/create-maps/gps-receiver-support.htm&quot;&gt;Windows&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1152px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/97c5a1f60a685f5dcd79df6670975021/d2d74/Collector104w-settings2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 45.2%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABd0lEQVR42n2Ry0pcQRCG5yGyMs8QEPIKvknEjUZjgmQhgm4UfAfFC2oUVJKoSy9j0KB4Q9wZM1HGUYzTl9Pd1VV903OSA0ogH/+u+PiLqsrywUXb6JfWgYVX/fMtPZMtPRMv30286Bx7PbS4tHWyunP2fn63a7ra92mnd+Zb+/hGx/jGm7H1t9PbK8e1Cvlw3mjW7+UNy65+iwbXf3ItAZrMSTm6dvhxbnv4897g0vfemeqH2Wr31ObI133vQyWleNqQtywDJdFCKqGYLGOGcfIuRZ+eA+R8iJUQ4p1Q5Lz3PsQYU4rFGAsZuGgqLaTMlAaLSM6SI3JcgQ9F81FdXt4xwZoAeXMsm5ExYFwakEIYY6jEOVKAuex8MOjSPxRrc+CCZUoKobVWJVproUy+9n9kZNwwnllEay3m2CKEWMohGirlGAnRApC14AIWzQaJ8BmEmGn426xsfjvywZKrN25+/KzVfl3eS2V5IfuAzj8NOZ8BPr7qAVmf6tJzO3KXAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Collector for ArcGIS (Windows) Receiver and Profile settings&quot;
        title=&quot;&quot;
        src=&quot;/static/97c5a1f60a685f5dcd79df6670975021/d2d74/Collector104w-settings2.png&quot;
        srcset=&quot;/static/97c5a1f60a685f5dcd79df6670975021/0eb09/Collector104w-settings2.png 500w,
/static/97c5a1f60a685f5dcd79df6670975021/1263b/Collector104w-settings2.png 1000w,
/static/97c5a1f60a685f5dcd79df6670975021/d2d74/Collector104w-settings2.png 1152w&quot;
        sizes=&quot;(max-width: 1152px) 100vw, 1152px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Collector for ArcGIS (Windows) Receiver and Profile settings&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Related links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.arcgis.com/en/collector/windows/create-maps/gps-high-accuracy-receivers.htm&quot;&gt;Configure High Accuracy Receivers - Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.arcgis.com/en/collector/ios/create-maps/gps-high-accuracy-receivers.htm&quot;&gt;Configure High Accuracy Receivers - iOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://play.google.com/apps/testing/com.esri.arcgis.collector&quot;&gt;Android Beta 10.4 (Android App Store)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Collector for ArcGIS 10.4.0 iOS]]></title><description><![CDATA[Collector for ArcGIS 10.4.0 iOS is now available in Apple’s App Store. This is a major update for those hoping to use high-accuracy GNSS…]]></description><link>https://www.spatialtimes.com/2016/08/collector-arcgis-10-4-0-ios/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/08/collector-arcgis-10-4-0-ios/</guid><pubDate>Thu, 04 Aug 2016 06:00:43 GMT</pubDate><content:encoded>&lt;p&gt;Collector for ArcGIS 10.4.0 iOS is now available in Apple’s App Store. This is a major update for those hoping to use high-accuracy GNSS with their iOS device in the field. If this isn’t enough of a reason to upgrade, or you are happy with your current Elf/Glo/Arrow/other, there are a few other enhancements which make this update a must.&lt;/p&gt;
&lt;p&gt;One of the other additions in this release is the enhancements to attachments:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Preserve EXIF data on attachments (time, date, gps/compass info, etc)&lt;/li&gt;
&lt;li&gt;Support for attaching additional file types (such as PDFs)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As for bugs, a few were fixed in this release for more niche users, along with more languages now supported in the application. Some of the bugs actually refer to the Windows version of Collector, which isn’t actually release yet but shows what can be expected in the Windows release.&lt;/p&gt;
&lt;h2&gt;Setting up Collector for ArcGIS 10.4.0 iOS with your high-accuracy GNSS&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 338px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d086cb846f3e3ce6596249bc61c89410/74935/collector104-settings.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 177.5147928994083%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAkCAIAAAAGkY33AAAACXBIWXMAAB2HAAAdhwGP5fFlAAAD/ElEQVR42o2UW28bRRTHJyUloUJQiZugIKAt8IKE4BHxwLdAhbZpnFKgQKnSywOqeAHxAYobO1HaUJeIiwTiNZHju6llN7KxsZ2s44vs2Luz673Y6/XO7npttDthMbZj8tPRanZnzszZc/5zwLEvvj/68fKzl1Zeu7764rxrem4RnLGD0/anP73z+pc/vvXVLyev/WB8OWM/cn7xxNV7L827Xrm2+p597fnLd8Ejc86HbY4pm/PI+cXDs46Hzi1MzCxMzjoOzzqmbc6pWcehs7cmzt46NLMwec4xPeecsjmnbI5HP1yanFkA4IPv9ux94zlx2g5O3Xzq4u13v/39nW9+e+PGz29//esTnyyDUzeNKXPly/P3Xr2++tznK+DoR0sD9viFpScvLp+86jo+f/f4FdebN3565rPbj11YtBa8cHnlxBXXsUt3QOSv3LDdT+WCf26HkkQoSQQS2/dTRP9sOGV8/yNFAJamGEjW+8x8pbCxNOQYyNLUfw2aRgGpLSNFNQwpCCkyQkhRZaQoqtqWkdSWxxiQZTmRSKRSqXQ6vbW1VSwWY7FYOp1OJBIcx/V6vW632xtC0zq6rgNN0+r1Ok3TnEmz2YQQ8jxfLpclSep2u/ooOiYAQsj2Ua/XOY5jWZbneYZhKIqC+wPIf6jVahRF4YEFORZQKpX8fn8gEAgGg6FQqFKpVA8MEASB53mO4wRBwM/xNJvNRqOBx0a2K5UKwzC1Wo2m6ZG5tdB1XZIkM2FG2gCS0fbWdqFQIAhiZ2dHURRcnpF0Op1Go6Gqyl62B/Yedhg+35oCrVYrHo/n8/kHmw8ghAOqUFUV54LneeNXG4JgnKwa52KR4HpWKpVGo4F/TNd1K85WqyU2xVarJctyy0TTNLwGDMRjuY2J/N+wZVnOZrPxeHxzczOXy2UymVgslkwmR6aaZVmGYRRFMaPWgaIouM48z4uiiBDCxdSGUFUVIdRutxXjymmqqgGKouomjAmEkGEYmqYhhFjYVB+WqvGr4VytVnd3d7HiLFXjcbVaJUnScsaSxgPDuVgsbmxseL3eSCQSDod9Pp/H4/H5fGtra263OxAIWPuO0LYoGmVot9uSJImiaN1HS/Di/hjZzuVyxWIxn8+zLLtf6xiJke1SqUQQRKFQxH1nZKlHAsYLez963d6etkOhUCwWJcnawWOu8RJSOwAhhCvcbDatzva/yEjVNLMBMgyDG+j4dtcPPdAA+8UwoIp9G2ChUFhfX49EIn6/3+12B4PBcDjs8Xii0ajX641Gox6PJ5lMkiQ5rBbA8zzLsoIg4L5tSQ9CSJKkpfaRzdCoczabLZfLuB90Op3egTGcM5kMvgYEQSCEDu78N754VrfZZMGuAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Collector for ArcGIS 10.4 settings page&quot;
        title=&quot;&quot;
        src=&quot;/static/d086cb846f3e3ce6596249bc61c89410/74935/collector104-settings.png&quot;
        srcset=&quot;/static/d086cb846f3e3ce6596249bc61c89410/74935/collector104-settings.png 338w&quot;
        sizes=&quot;(max-width: 338px) 100vw, 338px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Collector for ArcGIS 10.4 settings page&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You may notice the settings page for Collector for ArcGIS 10.4.0 iOS has also had some tweaks in order to accommodate more options. This is where you can configure your high-accuracy GNSS device.&lt;/p&gt;
&lt;p&gt;Thankfully, this is a pretty painless process as long as you are aware of the details of your GNSS device and your Collector Map. Just add a new “Provider” (read/AKA: GNSS Bluetooth device), and a “Location Profile” (read/AKA: configuration/transformation from device-to-map setup). The Provider setup even allows for pole mount heights to be included directly without requiring any post processing.&lt;/p&gt;
&lt;p&gt;The Location Profile’s list of Geographic and Projected coordinate systems is very extensive. Thankfully there is a search/filter function, and my favourite feature: EPSG numbers (thank you whomever put that one in)! Not exactly sure how Collector can handle so many potential transformations but looks very similar to a &lt;a href=&quot;https://github.com/OSGeo/proj.4&quot;&gt;PROJ.4&lt;/a&gt; or &lt;a href=&quot;https://github.com/OSGeo/proj.4&quot;&gt;Proj4JS&lt;/a&gt; type of setup - and we know Esri has recommended this approach for JS developers in the past.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f3b8237c92e451930a54853eb97635a1/dface/collector104-profile.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 88.2%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAA7DAAAOwwHHb6hkAAADnElEQVR42k2SW2wUVRjH580XlFgvKZaGxMQGbeklPvioJl7Coy8GkgaCS1mE7YptCQg+W23F2rW7brullmgXNdCwKFDUZCFQWURqq2Sx3cvszp6Zc+acM3NmL2xntjM7ZnbE+OXkyznJ/M7/+//PcF39gbb+8HO+YMuB8R0Dkz2Dka0Hxtv6Q50DkZePhbv8X7Qfmdzu/7Klb7xrcOrFoUirN9DmC/UcPf3K8TD37HuRJt8ZrjfYdGhm6/tfbxv85lHvNNcb5PaGmzwTLYcmN3lnuF2BTZ6pZv+Zp32zm/si3K4AtzvYtC/APemZeOzg6SfenW72zWzxz27xzzb3f/XU4ZlH3pncvGesfWC6+8Nv24/N9Zw8233ybOeJaOeJ6I4P5l44Hu0amuaiPyei8aUfbv21cOf+pdv3Lv66Eru5/H38zsJydi7+x6nYrUQGx5OFa8nC1eXMlbupa8lCPFlIZOSphd84kM+VmVJkSokpZU2165ZtmXVzw7ZtRWXX7967vpRcXFm96ay/F1dWF/9cvbF8/3Yyc2MpyaUzWYhkJMsyJlRRN0xrw7RMq163bUVRRQAolksaYwrRVKXEWJGpTKGVcglCictmsw6IMUIIAJHneYSQg9q2qrICAEiWCaEShBAhTAimVMZY04qiJHE8zxNCKKWEYEKIYRi2bdcbdLFYXFtby2aziqIghCCEhBCMsSiKlUqFMeYoYxlTQl19fV13YMuBNaYJgsAYq9VqhmHouuF2XXe+oVTh3DkJIQg5xtfX123btizLgTUtlUql02mEkCRJAIiwUQAAXddVVf3XszsPhLBarf4HM8by+TxjzDRNwzBq/yvTNCmlDgwhdAPDGAMAXHFXOZ1O8zwvNwoA0EjNMd/IiDiwKIou7I7nWnJhnucppZZlGoa+8bBqtZpt2w6cy+XcmzDG7vCGYbhpM8YEQXAvbRh2QoEQumIQIi6VzuSFgoRkIMECEHN54UG12nhmm6pqls/JhCJMRAnKGMsNhcb/pPK5PCcVhLJKK5paUpUyczYVTa2WNONBWaGKWBA0KpdUyoisyFASJQEAKIl6uahQwr01eu614fk3P55/Y/j86x+df9jnd47E9kz8uPvz2M7Ri28HLveGruwLXz2XWP1pJTt26fdXhy/sDV3mtveNPOM51er5tNXpjbXfOW7rG+vwjnQcHG3d/9nzhwPdR4IvDYVDF+Lf/ZI4OhV7vPeTDu/IPxSERbvq5uA0AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Collector for ArcGIS 10.4 Profile setup&quot;
        title=&quot;&quot;
        src=&quot;/static/f3b8237c92e451930a54853eb97635a1/dface/collector104-profile.png&quot;
        srcset=&quot;/static/f3b8237c92e451930a54853eb97635a1/0eb09/collector104-profile.png 500w,
/static/f3b8237c92e451930a54853eb97635a1/dface/collector104-profile.png 600w&quot;
        sizes=&quot;(max-width: 600px) 100vw, 600px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Collector for ArcGIS 10.4 Profile setup&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Depending on where you are working the one issue that you might come across is that some grid-based transformations are not currently supported. If you are in Canada, the options are very limited for the NAD83 CSRS to &lt;em&gt;other&lt;/em&gt; map projection. Some of the omissions aren’t because Esri doesn’t want them there - but based on what IP owners will allow to be included by commercial vendors - so let’s all work on making grid shift files more available while we are at it!&lt;/p&gt;
&lt;p&gt;I hope in the future, Esri will list the supported/planned transformations as this could limit the use and/or value of having the high-accurate GNSS connected in the first place. That said, this is a great first step.&lt;/p&gt;
&lt;p&gt;Another addition to hope for would be the listing in the online help of the grid-shift files that are used since this might help you decide which input&amp;#x3C;-&gt; output projection to use based on what’s available. As having a survey-grade GNSS in the field, you want to keep as much detail as possible, and using the wrong transformation might set false expectations with staff.&lt;/p&gt;
&lt;p&gt;As for working in the USA, this looks to be a great starting point for using with your high-end GNSS. The popular Geographic and Projected coordinate systems are all listed, much like working in ArcGIS desktop. You shouldn’t have a problem finding one that matches your GNSS or your map. Regardless of where you live, the best approach would be to have your map in the same coordinate system as your GNSS device so you don’t even need to worry about grid shift files and transformations.&lt;/p&gt;
&lt;h2&gt;Should I Update to Collector for ArcGIS 10.4.0 iOS?&lt;/h2&gt;
&lt;p&gt;Yes! If you are using a high-accuracy GNSS device, you have been waiting for this update. Even if you aren’t using a high-accuracy GNSS, it is more than worth the upgrade to keep EXIF information on your photos. The (listed) bug fixes are few, but there weren’t many big bugs to fix for the iOS version. Overall this is a great release, and the biggest drawback is that it’s currently only available for the iOS version. An update for both Android and Windows is expected to be released later in August.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Collector for ArcGIS Windows Edition 10.3]]></title><description><![CDATA[It sounds like a no-brainer: Use your Microsoft 10 deviced docked at the office, then disconnect, and your field ready with Collector for…]]></description><link>https://www.spatialtimes.com/2016/08/collector-arcgis-windows-edition-10-3/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/08/collector-arcgis-windows-edition-10-3/</guid><pubDate>Mon, 01 Aug 2016 15:52:05 GMT</pubDate><content:encoded>&lt;p&gt;It sounds like a no-brainer: Use your Microsoft 10 deviced docked at the office, then disconnect, and your field ready with Collector for ArcGIS Windows Edition 10.3. For staff that frequent the field, yet have some office time here and there, a single device sounds like a dream come true. But sometimes dreams can lead to nightmares - which can be the case for some Windows + Collector users.&lt;/p&gt;
&lt;h2&gt;Collector for ArcGIS Windows Edition 10.3 Not Ready&lt;/h2&gt;
&lt;p&gt;At the time of writing, Collector for ArcGIS Windows Edition is at release 10.3 - and frankly, this isn’t ready for production use (IMHO). I’m remaining positive that the 10.4.0 version of Collector will fix these issues [what can I say, I’m a positive person].&lt;/p&gt;
&lt;h2&gt;The Nitty-Gritty&lt;/h2&gt;
&lt;p&gt;If you want to connect a Bluetooth GPS/GNSS to your Windows 10 device for use with Collector: It doesn’t work out-of-the-box. WTF. You can connect your device to Windows, issue is that Collector can’t read the signal from COM ports as it currently uses Location Services only.&lt;/p&gt;
&lt;p&gt;The only scenarios where this actually works is if you have a built-in GPS/GNSS, or cellular based Surface tablet - forget about a vanilla Windows 10 device. HOWEVER, Esri does list a workaround that could work in some circumstances. The workaround does mean purchasing a 3rd party piece of software (free trial available) to get the job done as it can create a virtual connection from a COM port to the Sensor API (which can be leveraged by Location Services). You shouldn’t need to know this to use Collector, nor should I.&lt;/p&gt;
&lt;p&gt;During testing, I wasn’t particularly happy with this additional step, but it boils down to a current issue with Windows and the Location API. Windows 10 doesn’t have the Location Service part of the software working as well as Android and iOS. The 3rd party software tries to bridge that gap, and there are cases online where people have been successful. Not so much in my case, but this might come down to how the W10 device has been setup and configured by IT as well - or the specific GPS/GNSS device. Read: It’s more complicated than it should be.&lt;/p&gt;
&lt;h2&gt;Chicken and the Egg&lt;/h2&gt;
&lt;p&gt;I’m sure Esri looks at this situation (which they are aware of) and cringes. Not many people use Windows devices with Collector so maybe it’s a lower priority?! - but then again, we can’t use it because it doesn’t work properly, keeping the numbers now. Regardless of where the issue truly lies: Microsoft bug; or Esri releasing even though you can’t use with Bluetooth GPS/GNSS devices - it will hopefully be addressed soon. Maybe this is why Collector 10.4 hasn’t been released on Windows yet? One can only hope 10.4 bypasses this issue by talking directly to Bluetooth devices (by creating their own workaround that is hidden/transparent to the user). If the 3rd party software currently recommended was written by a single individual using the Windows SDK, I’m hoping Esri’s team of Windows developers are allowed to use their skills to do the same and incorporate directly into the product.&lt;/p&gt;
&lt;h2&gt;Where do we go from here&lt;/h2&gt;
&lt;p&gt;For those still hoping for the single windows device, only time will tell. If 10.4 can alleviate the issues I think the Windows Edition of Collector has lots of potential moving forward and a huge user base that could leverage it - especially for large Microsoft based organizations (Government, NPOs, etc).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Use Bootstrap to Customize Esri's JavaScript InfoWindow Icons]]></title><description><![CDATA[I was recently working a small web mapping application and wanted to use Bootstrap to customize Esri’s JavaScript InfoWindow icons to match…]]></description><link>https://www.spatialtimes.com/2016/07/use-bootstrap-to-customize-esris-javascript-infowindow-icons/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/07/use-bootstrap-to-customize-esris-javascript-infowindow-icons/</guid><pubDate>Sat, 02 Jul 2016 22:08:52 GMT</pubDate><content:encoded>&lt;p&gt;I was recently working a small web mapping application and wanted to use Bootstrap to customize Esri’s JavaScript InfoWindow icons to match the style of the application. If you were unaware, this usually involves finding the sprite (image) file and making modifications or creating a new sprite. In this case, I was already using Bootstrap, so I wanted to use Glyphicons instead.&lt;/p&gt;
&lt;p&gt;If you are interested in using the sprite approach, or just want to change the popup look/feel, there is a great &lt;a href=&quot;https://blogs.esri.com/esri/arcgis/2012/08/15/making-your-pop-up-pop/&quot;&gt;blog article for your reference on &lt;em&gt;Making Your Pop-up Pop&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Use Bootstrap to Customize Esri’s JavaScript InfoWindow Icons&lt;/h2&gt;
&lt;p&gt;This example assumes you are already using bootstrap in your application. If not, you can checkout the &lt;a href=&quot;http://getbootstrap.com/&quot;&gt;Bootstrap website&lt;/a&gt; for more information on how to get started. So now that we are ready to go, all we really need to do is turn off the sprite reference (image), and replace with our Glyphicon (HTML span). Of course you don’t need to use a Glyphicon for this work, the HTML &lt;code class=&quot;language-text&quot;&gt;&amp;lt;span&gt;&lt;/code&gt; element can also refer to a font character, Font Awesome icon, or similar.&lt;/p&gt;
&lt;h3&gt;JQuery/JavaScript code inside the MapLoad{} section&lt;/h3&gt;
&lt;p&gt;This one line of code inside your MapLoad{} section uses the JQuery append technique to inject a span element to the Esri Popup’s close button. Create an ID for the span element so you can setup your CSS reference. Since this example uses a glyphicon, we also set the glyphicon of choice in the class attribute:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.esriPopupWrapper .titleButton.close&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&amp;lt;span id=&apos;SpatialTimes-info-close&apos; class=&apos;glyphicon glyphicon-remove&apos; aria-hidden=&apos;true&apos;&gt;&amp;lt;/span&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;CSS Updates&lt;/h3&gt;
&lt;p&gt;The CSS updates will hide the reference to the sprite and set the related Glyhicon styles. In this example, the Glyphicon is white, turning red on hover. The &lt;code class=&quot;language-text&quot;&gt;top:-3px&lt;/code&gt; setting may need to be tweaked based on the size of the Glyphicon or font being used.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;css&quot;&gt;&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.esriPopupWrapper .content .contentPane&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #FFF&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 6px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.esriPopupWrapper .titleButton.close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #FFF&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;text-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.esriPopupWrapper .titleButton.close:hover&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ff0000&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;opacity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;text-shadow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.esriPopupWrapper .titleButton.close .glyphicon&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -3px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;#SpatialTimes-info-close&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 14px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;This technique can be used to replace all sprites in the popup heading area if desired. Some of the CSS referenced can be changed to meet your style, font colour, and mouse hover needs.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Projecting between NAD83 and NAD83 CSRS in ArcGIS]]></title><description><![CDATA[Update 2020-11-04: Fixed a small, yet important, typo in the ‘Create transformation’ steps . Special thanks to Darren M. for catching this…]]></description><link>https://www.spatialtimes.com/2016/05/projecting-nad83-csrs-original/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/05/projecting-nad83-csrs-original/</guid><pubDate>Wed, 04 May 2016 23:31:39 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;em&gt;&lt;strong&gt;Update 2020-11-04&lt;/strong&gt;: Fixed a small, yet important, typo in the ‘Create transformation’ steps . Special thanks to Darren M. for catching this.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;em&gt;&lt;strong&gt;Update 2018-09-19&lt;/strong&gt;: Please note that different Geographic systems need specific transformations. As of 2018, CSRS v6 and v7 are becoming very popular - however there is no specific transformations available at this time. If using ArcGIS 10.6x, the newer v6 and v7 Geographic systems are available - in older versions you need to create it. The Guru, Melita Kennedy’s quote: “NAD83 CSRS is a [ongoing] re-adjustment of the original NAD83 geographic coordinate system (datum). Generally, the differences between original NAD83 and the CSRS adjustment are less than a meter, so depending on your data, you may be able to forgo a conversion.” Wise words. So it’s important to think about your requirements, and to document in your metadata how you changed the data. If you are using high quality LiDAR or survey data you need to be careful about setting up the correct transformation (and still update the metadata on how you transformed!).&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you work with data in Canada, be careful when projecting data from one GCS to another (NAD83 and NAD83 CSRS). Why you ask? Even though many Canadian geographic transformations are supported in ArcGIS, the required files aren’t installed by default. Now, before we show up at Jack’s office in Redlands with pitchforks and torches, you should know one thing - it’s not their fault. Matter of fact: Esri, PCI, GeoMedia, QGIS, and other GIS software all have this exact same issue -  the grid files are proprietary so the software companies traditionally haven’t been allowed to include them. Blame the &lt;em&gt;pre-Open government&lt;/em&gt; era if we must.&lt;/p&gt;
&lt;p&gt;I’ve subtly mentioned this before when &lt;a href=&quot;https://www.spatialtimes.com/2015/01/migrating-arcgis-desktop-10-3/&quot;&gt;discussing steps to upgrade ArcGIS&lt;/a&gt;. A frequent question I get from that post is “how do I set this up?”, usually followed by “why didn’t anyone tell us?“. To answer the first question, keep reading. As for the latter, hopefully you already knew - and if not, consider this post a rude awaking that your previous NAD83 to NAD83 CSRS transformations didn’t do what you thought (as the tools still “work” without any error messages or warnings). This is the case for many scenarios: Project tool (and raster project tool), ArcMap “on-the-fly” transformations via Data frame properties, and Mosaic dataset geographic transformation options to name a few of the big ones.&lt;/p&gt;
&lt;h2&gt;Enough background, how do we transform between NAD83 and NAD83 CSRS&lt;/h2&gt;
&lt;p&gt;Fine, not interested in the background. Let’s get to it then - although I’m still going to start generic. There are two things you should consider when using geographic transformations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Is the grid installed&lt;/strong&gt;: Again, if you are in Canada, the answer is most likely no. Educated guess since the grid folder for Canada doesn’t exist on a fresh install. If someone else installed the software, it’s a good idea to check anyway. Browse to &lt;em&gt;&lt;ArcGIS Install&gt;\pedata\ntv2\canada&lt;/em&gt;. If the folder (all small case) doesn’t exist, create it (you will need it eventually). If it already exists, examine the list of NTv2 grid files (*.gsb) inside. If the one you need is there, move to step 2. If it’s not there you can search Google or just contact your Esri distributor as they know where to find the common ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is the NTv2 Geographic transformation already setup/supported&lt;/strong&gt;. Again, even if supported, if the GSB isn’t located in the directory in step 1 - you need this first. You can see the &lt;a href=&quot;http://support.esri.com/en/knowledgebase/techarticles/detail/18317&quot;&gt;supported list&lt;/a&gt; for more details. If you have the grid file and your transformation and file are listed - congratulations, you are ready to go. However, for those unsupported (Ontario CSRS for example), you will need to create a custom transformation.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Argh, NAD83 and NAD83 CSRS custom transformation already&lt;/h2&gt;
&lt;p&gt;The supported list of NTv2 Geographic transformations does include a Canada wide transformation (NAD_1983_To_NAD_1983_CSRS_1). This is based on using the NAD83-98.gsb grid file. If this meets your needs, you are good to go - place the file into the “canada” directory, then select the transformation when prompted in the Project tool, ArcMap dataframe settings, etc. If you want to use the Ontario grid file (&lt;em&gt;ON83CSv1.gsb&lt;/em&gt;) or Toronto grid file, we are almost there. Verify the grid is in the directory, and we are ready to create our custom transformation.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;em&gt;&lt;strong&gt;Update 2018-09-19&lt;/strong&gt;: Please note that different Geographic systems need specific transformations. As of 2018, CSRS v6 and v7 are becoming very popular - however there is no specific transformations available at this time. If using ArcGIS 10.6x, the newer v6 and v7 Geographic systems are available - in older versions you need to create it. The Guru, Melita Kennedy’s quote: “NAD83 CSRS is a [ongoing] re-adjustment of the original NAD83 geographic coordinate system (datum). Generally, the differences between original NAD83 and the CSRS adjustment are less than a meter, so depending on your data, you may be able to forgo a conversion.” Wise words. So it’s important to think about your requirements, and to document in your metadata how you changed the data. If you are using high quality LiDAR or survey data you need to be careful about setting up the correct transformation (and still update the metadata on how you transformed!).&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Create a custom transformation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open ArcToolbox &gt; Data Management Tools &gt; Projections and Transformations &gt; Create Custom Geographic Transformation&lt;/li&gt;
&lt;li&gt;Setup the input and output coordinate systems (this is a bi-directional process so order doesn’t matter)&lt;/li&gt;
&lt;li&gt;Provide a name. No spaces, and you should follow the recommended syntax: &lt;code class=&quot;language-text&quot;&gt;Input_GCS_To_Output_GCS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;For Method, select NTv2&lt;/li&gt;
&lt;li&gt;In the parameters section, change the value to match the folder name followed by a forward slash (/) and the GSB file name. The example below uses the Ontario grid file: canada/ON83CSv1.gsb&lt;/li&gt;
&lt;li&gt;Run the tool.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 607px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1f88f8136c0b80f670885e757144cde1/f521d/CustomTransformation-1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAA7BAAAOwQG4kWvtAAAB30lEQVR42n3RbW/TMBAH8Hz/bzJgewHbGNNEJZg0Rgt9SLMky3Mc14mdJnF8Tpy2alApKtWgO/10urP1lyxZuxz8OL8Zvrv5fnE7Ov80fHv97eJ29Obj49nVw9nlw/uBfn1vXX01Dz58MQeP1nA4vft8r0V+ZMzmlmE+6YYxm8+nOo6TRkhZwymiEkp2GGHNe/b0qT75OZmMp/pMn05mnutLIV/X1IJlTAu90Hd827R9x3dsByNc5AXU8EqSl3W2yHLKtMANbNM2DdN6skzDNA0z8AMpJNRwCi9rStKc5locxHEQe89e5EcoRIETFKxoRSu5PEVUICrYhRfxwrXdJE6AQ7WseMH3/ZS6rPM0r4t6yZYajjAjjGVspVbrbr3vm9Vmp9vsT46tuzVwEKXIWa4RRCzDGo/GOMIkIXmWu7brmE4SJihEJCEpTlnKXmjqZvfsJExymmdZlqZpWZabzYZzjjGmv6ssy9U/1XWdkmr3VbEft7Lt+77f9n/qMPx37fvtdtu13S6MQtSIppXtC0qqveP17y0omlKNLqgCJSvZ8OZAVlKUgi85VNDUjeQSKgAOUIGsdrMCFfmRVrBCgWpFewwqIIjEXrzMlihElFAUItd2F/GCEupaLkEEhegXgWcDLiyR8EYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Custom Transformation Tool&quot;
        title=&quot;&quot;
        src=&quot;/static/1f88f8136c0b80f670885e757144cde1/f521d/CustomTransformation-1.png&quot;
        srcset=&quot;/static/1f88f8136c0b80f670885e757144cde1/0eb09/CustomTransformation-1.png 500w,
/static/1f88f8136c0b80f670885e757144cde1/f521d/CustomTransformation-1.png 607w&quot;
        sizes=&quot;(max-width: 607px) 100vw, 607px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Custom Transformation Tool&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Do I need to keep reading?&lt;/h2&gt;
&lt;p&gt;Nope, that’s it! With the geographic transformation and grid file in place, you can now select it from the transformation from the list. This can be used when projecting data, and even when ArcMap transforms on the fly! You will need to specifically tell ArcMap via the dataframe properties however (yup, on-the-fly projecting in ArcMap wasn’t doing it either). You will also notice that the Projection Tool and ArcMap data refreshing takes longer (since it’s actually doing something now).&lt;/p&gt;
&lt;h2&gt;Additional Links:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Any answer on support/geonet by Melita Kennedy. If anything in this post doesn’t align with something Melita said - Melita is correct.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://support.esri.com/en/knowledgebase/techarticles/detail/21327&quot;&gt;http://support.esri.com/en/knowledgebase/techarticles/detail/21327&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://support.esri.com/en/knowledgebase/techarticles/detail/18317&quot;&gt;http://support.esri.com/en/knowledgebase/techarticles/detail/18317&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://support.esri.com/en/knowledgebase/techarticles/detail/35152&quot;&gt;http://support.esri.com/en/knowledgebase/techarticles/detail/35152&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://geonet.esri.com/thread/57508&quot;&gt;https://geonet.esri.com/thread/57508&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gis.stackexchange.com/questions/127220/proper-transformation-file-to-go-from-nad83-csrs-utm-17-to-nad83-utm-17&quot;&gt;http://gis.stackexchange.com/questions/127220/proper-transformation-file-to-go-from-nad83-csrs-utm-17-to-nad83-utm-17&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www1.toronto.ca/City%20Of%20Toronto/Engineering%20and%20Construction%20Services/Standards%20and%20Specifications/Files/pdf/NAD%2083/nad_83_csrs.pdf&quot;&gt;https://www1.toronto.ca/City%20Of%20Toronto/Engineering%20and%20Construction%20Services/Standards%20and%20Specifications/Files/pdf/NAD%2083/nad_83_csrs.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Extract a Map Service Layer to Shapefile using Python]]></title><description><![CDATA[How easy/hard is it to extract a Map Service layer to Shapefile using Python? Not as hard as you would think. Is it legal? Not as easy as…]]></description><link>https://www.spatialtimes.com/2016/03/extract-map-service-layer-shapefile-using-python/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/03/extract-map-service-layer-shapefile-using-python/</guid><pubDate>Mon, 28 Mar 2016 10:22:53 GMT</pubDate><content:encoded>&lt;p&gt;How easy/hard is it to extract a Map Service layer to Shapefile using Python? Not as hard as you would think. Is it legal? Not as easy as you would think! And before I get into this any further, there are also ways of doing this directly in ArcMap - but that wouldn’t be very &lt;em&gt;Pythonic&lt;/em&gt; now would it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: Part 2 is now available - &lt;a href=&quot;https://www.spatialtimes.com/2016/09/map-service-to-shapefile-with-python-part-2-iteration/&quot;&gt;Map Service to Shapefile with Python Part 2 – Iteration&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Legal Schmegal (and a brief disclaimer)&lt;/h2&gt;
&lt;p&gt;I’m not a lawyer - but I have watched many TV shows where someone else played one. Oh, and I’ve actually read the Canadian &lt;a href=&quot;http://laws-lois.justice.gc.ca/eng/acts/c-42/page-1.html&quot;&gt;&lt;em&gt;Copyright Act&lt;/em&gt;&lt;/a&gt; (some of it sunk in), done a few presentations on the topic, and deal with the subject at work on a daily basis. Why do I bring this up? Just because we &lt;em&gt;can&lt;/em&gt; do something, doesn’t mean we &lt;em&gt;should&lt;/em&gt;. Please make sure you have permission from the owner of the Data/Map Service, or have permission via a License (“Licence” in Canada) before running around downloading shapefiles from the internet.&lt;/p&gt;
&lt;p&gt;Oh, and if you are worried about someone downloading from your service: Best practice would be to secure the service, or at least limit the service functionality. Possibly adding a note into the service description on intended use could also help. But if you really want to keep your data secure, please refer to the helpful venn diagram below.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 240px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/fb105abed7f588e6e79c4cd09cf29e59/6e1d3/PrivacyInternet.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYEBQgJ/8QAFgEBAQEAAAAAAAAAAAAAAAAABwUG/9oADAMBAAIQAxAAAAHpMt6UhRlKzHU1Bx//xAAbEAADAAIDAAAAAAAAAAAAAAAEBQYBAgMHFf/aAAgBAQABBQKqu3gLyw7Kei6w1ATSz7mVHcHu5Pif4TA+aB//xAAiEQACAgIBAwUAAAAAAAAAAAABAwIEBhESAAUTFCElMTL/2gAIAQMBAT8Bnk+BmnjCoYrOFnt1eS+7v8FSXqnGrFZZou+S8tkGxyuhBrA8FCQOhfbWfdtOpoNaq17WV0H7SqUyYQ9iQOMdDQJEfyCQN9f/xAAhEQACAgIBBAMAAAAAAAAAAAABBAIDBQYUABESEwchMv/aAAgBAgEBPwH4tRyutb7nc5veRhs2qvSZOKw0e7RTNlkpLWlF2NCVPEpPFKtN9lTBPLsl7qK4zytybOSfYx63DRubvtUV79/QvOyUqqvokDxiQPEExj+YkgA9f//EACMQAAICAgEEAgMAAAAAAAAAAAECAwQFERIAEyEiFCMxMlL/2gAIAQEABj8CtUcc9OrXx8iRMliJZJLTdtJWd+flYjz4xiEo2hy5Hl4wiYj4mNa9iKuVsy2Y1mctZMiiGATK0YhXstuTi0jF1UFNbavkbiQraE09Wdq2/jzSV2496He+KuCOS7ISQOoOh0Lk+PxUzqFAkma8ksip+q2BXkSOZdeo574j+l9OokyWNwliOmAlEg5CtNBF68oe9VeM9rS+sQ+vYB4jz1FREFGtFW+uvDj1lSukPg/iYl+4zl2ckty3ssWLHr//xAAZEAEBAQEBAQAAAAAAAAAAAAABEQAhMUH/2gAIAQEAAT8hRyRCrqeHS9rDbJAA2y80SyQY4EHcZRW6a5aOeNvZgmnXO5cDLrI8E8x5APoMZ760MAPZF6Rdj//aAAwDAQACAAMAAAAQt+//xAAXEQEBAQEAAAAAAAAAAAAAAAABEQBB/9oACAEDAQE/EIZTmUEpIITH7SjCiFN9AnC5xf/EABcRAQEBAQAAAAAAAAAAAAAAAAERADH/2gAIAQIBAT8QmtQL91MaBp8BSCUBtg8Nh23n/8QAGRABAAMBAQAAAAAAAAAAAAAAAQARIRAx/9oACAEBAAE/EEPJ3Wuj1ONNeAP5YP8ABv5IQldbkjH0pYvyhStuS2vxwj29YS6Agumg6/D0+Mnw+tZcIlj/AP/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Venn diagram by Rob Jewitt&quot;
        title=&quot;&quot;
        src=&quot;/static/fb105abed7f588e6e79c4cd09cf29e59/6e1d3/PrivacyInternet.jpg&quot;
        srcset=&quot;/static/fb105abed7f588e6e79c4cd09cf29e59/6e1d3/PrivacyInternet.jpg 240w&quot;
        sizes=&quot;(max-width: 240px) 100vw, 240px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Venn Diagram by &lt;a href=&quot;https://www.flickr.com/photos/robjewitt/5470928230/&quot;&gt;Rob Jewitt&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Map Service to Shapefile using Python&lt;/h2&gt;
&lt;p&gt;Alright, now that the legal stuff is out of the way - let’s get down to some coding! We are essentially just going to wrap 3 small steps into a python file:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Query the web service layer for data&lt;/li&gt;
&lt;li&gt;Save the results locally&lt;/li&gt;
&lt;li&gt;Convert results to a shapefile (or other feature class type)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1 Query the web service layer&lt;/h3&gt;
&lt;p&gt;For this example we will download US States from Esri’s ArcGIS Server sample server. Once we have the service and layer, we can investigate the attributes and query options using the REST interface or just jump into Python. Either way, we are just going to call the same REST query inside Python using the &lt;em&gt;urllib2&lt;/em&gt; library. The trick here is to make sure the result format type is set to JSON.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;myRequest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;URL&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; urllib2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;urlopen&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;myRequest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
myJSON &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;2 Save the Results&lt;/h3&gt;
&lt;p&gt;Now that we have the data, we can save it locally as a text file with the JSON extension. Nothing fancy here just create a file object and save the results.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;foo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;jsonOutput.json&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
foo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;myJSON&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
foo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;close&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;3 Convert the result to a shapefile&lt;/h3&gt;
&lt;p&gt;With the data successfully downloaded in a JSON file, all we need to do now is convert it to a shapefile. This task is made pretty simple seeing as there is a tool for that, &lt;a href=&quot;http://desktop.arcgis.com/en/arcmap/10.3/tools/conversion-toolbox/json-to-features.htm&quot;&gt;JSON to features&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;arcpy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;JSONToFeatures_conversion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;jsonOutput.json&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;finalShapfile.shp&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;What could possibly go wrong?!&lt;/h2&gt;
&lt;p&gt;This approach assumes the service you are connecting to allows query operations, otherwise you will get an error message immediately. Try the query operation directly from your browser first, then copy the parameters/syntax into Python for a quick sanity check.&lt;/p&gt;
&lt;p&gt;Another thing with queries is that results are limited. There is a setting in ArcGIS Server to limit the number of features returned from a query operation (1000 by default). You may have noticed in the sample code, the _where _clause was set to &lt;code class=&quot;language-text&quot;&gt;where=1%3D1&lt;/code&gt; (the %3D is web speak for equals). This is a simple true query that will return all features to the max results limit.&lt;/p&gt;
&lt;p&gt;If more features exist or if you’re not sure how many features there are in the first place, just query it. Make a query and set the Result Option &lt;code class=&quot;language-text&quot;&gt;returnCountOnly=true&lt;/code&gt;. This returns the count so you can determine if one query will be enough. For the example with US States, there are only 51 features, so the 1=1 clause isn’t a problem. If the number was above the return limit, you would need to use an iterative loop until all features are returned. Don’t worry, guessing ObjectIDs starting at 1 isn’t required since you can send a &lt;code class=&quot;language-text&quot;&gt;returnIdsOnly=true&lt;/code&gt; query to get the actual list of ObjectIDs - and this query doesn’t have the max return limit applied. Just use the IDs to divide into chunks less than the limit, and loop away.&lt;/p&gt;
&lt;p&gt;A final issue that can occur is that the output shapefile isn’t a shapefile - just a DBF. This occurs when a layer in a map service is published but the SHAPE field is hidden from the service. In this case, you still get all the attributes but no spatial component as the SHAPE field must be visible in the service for the geometry to be returned.&lt;/p&gt;
&lt;h2&gt;Map Service layer to Shapefile - Working Code&lt;/h2&gt;
&lt;p&gt;Here is the full python script. The URL is split into 3 parts only to help show the various components - a single URL parameter could be used instead. Please note: ArcPy is required for the JSON to Feature tool.&lt;/p&gt;
&lt;iframe
  src=&quot;https://gist.github.com/TheBryanMac/f7979f9ba76ab734026f.pibb&quot;
  style=&quot;width: 100%; height: 300px; border: 0;&quot;
&gt;&lt;/iframe&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Collector 10.3.7]]></title><description><![CDATA[The new releases keep pouring out for the Esri Dev Summit. This time we get a very focused update for ArcGIS Collector 10.3.7. If you were…]]></description><link>https://www.spatialtimes.com/2016/03/arcgis-collector-10-3-7/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/03/arcgis-collector-10-3-7/</guid><pubDate>Wed, 09 Mar 2016 08:30:51 GMT</pubDate><content:encoded>&lt;p&gt;The new releases keep pouring out for the Esri Dev Summit. This time we get a very focused update for ArcGIS Collector 10.3.7. If you were hoping for GNSS receiver support, sorry to report it isn’t quite ready yet. But don’t fret, this update focuses on another major area: Offline editing.&lt;/p&gt;
&lt;h2&gt;ArcGIS Collector 10.3.7 - what’s new&lt;/h2&gt;
&lt;p&gt;“Advanced offline options” are the focus of this release. These new offline options are setup in ArcGIS Online, and improve download and sync operations in the client app. You can determine what information is retrieved from the web during editing - for both editable and read-only layers.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 379px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0e662ce671407856e7a85aa9d68631f7/0839d/Collector1037Options.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.79683377308708%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABc0lEQVR42pWSTY7bMAyFffMeodseoOcouiyQrON2FMeW5B/9WrToKHUsK0Wc6WCQBAPMt+CGfI8PBLOXlz+MMUoZpdey3W7zPJdSFkVBCGGM1XUTH5jnWUqZlYcDrSrO67Ksuq4jhJRlyXlNKd3tcrpappQuDzjnMqmUAwBwA0Bangw9cvPy3me7/Gp/KAqy31tre9v3fW+ttcY4cMYY+0qvtUFEa40Ucp5nRMyMMUopYw0AHFfGcfQrIQTv/TAMiOi9B4AQAiI652KMV/GIyDnfE6KUPp1O0zR9Ivb5fAYA0Ymu65qm8Yhv7XvNozjPf6/n5VVVCimXZZnOr8z/iTE+38w5V0pJKYQQdd1ordu2bepaKqWUVlK2bQsOnosBoKpKxjmlzBh7693FTu8zvxenlN7+ZlmWayPdc7fzVodhyD4+7LLO/eL45Qf7thFLuuhxFjiFeEHvs/Ah4/EYp7+bSn/9uf++YSGErvedHWAMWut/7lPlPr9etacAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Collector Advanced Options&quot;
        title=&quot;&quot;
        src=&quot;/static/0e662ce671407856e7a85aa9d68631f7/0839d/Collector1037Options.png&quot;
        srcset=&quot;/static/0e662ce671407856e7a85aa9d68631f7/0839d/Collector1037Options.png 379w&quot;
        sizes=&quot;(max-width: 379px) 100vw, 379px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Collector Advanced Options&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This update might not seem like a big deal, but it can have significant benefits when field staff want to sync days worth of photos and vector edits. Not only can syncing use large volumes of data (images), but watching the sync icon spin for minutes on end is time wasted in the field.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;…your organization may want to limit the size and amount of data field workers retrieve from the server during initial download as well as subsequent sync operations. This can make it faster for field workers to share changes, and minimize data transfer costs. This is especially true when your field workers are in areas with low bandwidth. You can limit the types of data field workers retrieve from the server by adjusting the Advanced Offline Options in ArcGIS Online. These settings do not affect edits made by the field worker; those are always sent to the server. ~ &lt;a href=&quot;https://blogs.esri.com/esri/arcgis/2016/03/08/optimize-offline-fieldwork-with-collector-10-3-7/&quot;&gt;Esri blog&lt;/a&gt; (accessed 03/08/2016)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I still think we should thank Starbucks and McDonalds for their free Wi-Fi since this is still a great way to take a quick coffee break and do large syncs - but maybe with these updates you can be back in the field before finishing your &lt;em&gt;Grande Chai Tea Latte, 3 Pump, Skim Milk, Lite Water, No Foam, Extra Hot&lt;/em&gt; drink of happiness.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS JavaScript API 3.16]]></title><description><![CDATA[With Palm Springs hosting the Esri Developer Summit this week - a few updates are coming out of Redlands just in time for the plenary. The…]]></description><link>https://www.spatialtimes.com/2016/03/arcgis-javascript-api-3-16/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/03/arcgis-javascript-api-3-16/</guid><pubDate>Tue, 08 Mar 2016 21:09:11 GMT</pubDate><content:encoded>&lt;p&gt;With Palm Springs hosting the Esri Developer Summit this week - a few updates are coming out of Redlands just in time for the plenary. The ArcGIS JavaScript API 3.16 was released this past Friday and it has many new features to showcase on the big screen.&lt;/p&gt;
&lt;h2&gt;ArcGIS JavaScript API 3.16 what’s new&lt;/h2&gt;
&lt;p&gt;Just a few items highlighted below, or you can checkout the &lt;a href=&quot;https://developers.arcgis.com/javascript/jshelp/whats_new.html&quot;&gt;full list here &lt;/a&gt;- but after searching, the &lt;em&gt;easy button&lt;/em&gt; is still missing from the features list (Spoiler):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new theme: Sorry Claro, there is a new theme in town. “Calcite” is currently in beta and has some advantages - it will not look identical to all other API maps out there using Claro.&lt;/li&gt;
&lt;li&gt;The feature table widget has been overhauled to allow for more visual customization, and more events available. Not only that, it now supports editing!&lt;/li&gt;
&lt;li&gt;Directions widget: Improved visualization and route editing is now available.&lt;/li&gt;
&lt;li&gt;Measurement widget: Not only a much needed update for accuracy, but also on-the-fly dynamic distance/areas as you move the mouse. Sure we all wrote our own 3 years ago to do this - but nice to see the core function making it to the prime time widget world.&lt;/li&gt;
&lt;li&gt;Vector tile basemaps available as named basemaps. The tile basemaps are still beta, but access to them is ready to go.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More tweaks, improvements, and bug fixes are included as well. The vector tile basemaps are a very exciting feature, and we should expect to see much more related to vector tiles as we move forward (read: this is the future of base maps).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS 10.4]]></title><description><![CDATA[ArcGIS 10.4 has finally arrived (most of it). Esri announced last week that their flagship product suite, ArcGIS 10.4 is here. This includes…]]></description><link>https://www.spatialtimes.com/2016/02/arcgis-10-4/</link><guid isPermaLink="false">https://www.spatialtimes.com/2016/02/arcgis-10-4/</guid><pubDate>Sun, 21 Feb 2016 16:38:58 GMT</pubDate><content:encoded>&lt;p&gt;ArcGIS 10.4 has finally arrived (most of it). Esri announced last week that their flagship product suite, ArcGIS 10.4 is here. This includes an updated release of Desktop, Server, and Portal to name a few. And also marks the [any day now] release of Pro 1.2.&lt;/p&gt;
&lt;p&gt;There are lots of new features with ArcGIS 10.4, along with a slew of patches/fixes. The usual reference to software has also changed (“ArcMap” seems to be replacing “ArcGIS for Desktop”), and 1.2 Pro is part of ArcGIS 10.4 release, and… who cares, if you can’t figure this out ask someone to draw you a map 😉&lt;/p&gt;
&lt;h2&gt;ArcGIS 10.4: ArcGIS for Desktop (AKA ArcMap?! errr ArcMap and ArcCatalog?! Arrgh, Arc32-Bit):&lt;/h2&gt;
&lt;p&gt;Some fixes, tweaks, and new features to keep up with the times. Nothing groundbreaking, but then again, we are nearing the end of the product life-cycle here. Don’t get me wrong, many of the new features are great, and will help you delay moving to Pro a tad longer if you so desire - but it’s time to make sure Pro is in your long term implementation plan. Some updates to Arc32-bit are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lots of new and updated LAS tools&lt;/li&gt;
&lt;li&gt;Tools to create SQLite databases&lt;/li&gt;
&lt;li&gt;Python: Upgraded to Python 2.7.10. New libraries included: SciPy, pandas, Sympy, and nose. Many existing libraries also updated.&lt;/li&gt;
&lt;li&gt;Lots of raster improvements, and new supported types (SPOT-7, UAS, etc).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ArcGIS 10.4: ArcGIS for Server:&lt;/h2&gt;
&lt;p&gt;Lots of updates and new features here. Since ArcGIS for Server is used in many different ways (AGOL, EC2, Azure, etc) this release not only has tonnes of fixes, but includes lots of new admin features to boot! For a full list, jump to Server’s &lt;a href=&quot;http://server.arcgis.com/en/server/latest/get-started/windows/what-s-new-in-arcgis-10-4-for-server.htm&quot;&gt;What’s New page&lt;/a&gt; - although here is a quick summary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArcGIS Server read-only mode&lt;/li&gt;
&lt;li&gt;Update passwords for registered and managed databases&lt;/li&gt;
&lt;li&gt;Changes to geoprocessing service publication and service extension deployment: Only Admins can publish these by default at ArcGIS 10.4.&lt;/li&gt;
&lt;li&gt;Default single cluster mode: Reducing load balance chatter by default.&lt;/li&gt;
&lt;li&gt;Default install setup for HTTP and HTTPS protocols&lt;/li&gt;
&lt;li&gt;Security fixes and enhancements&lt;/li&gt;
&lt;li&gt;Scan ArcGIS Server for security best practices: Comes with a Python script that scans for some common security issues.&lt;/li&gt;
&lt;li&gt;Microsoft Windows 10 support for testing and development (not recommended for production).&lt;/li&gt;
&lt;li&gt;Microsoft .NET Framework 4.5 support&lt;/li&gt;
&lt;li&gt;Chain together multiple server object interceptors (SOIs) for a service&lt;/li&gt;
&lt;li&gt;Service enhancements: Including new extract capability and GeoJSON format to name a few.&lt;/li&gt;
&lt;li&gt;Changes for ArcGIS Server on Amazon Web Services&lt;/li&gt;
&lt;li&gt;Patch notification for extensions&lt;/li&gt;
&lt;li&gt;Geodatabases and databases: Support for Damang databases, and new requirements for SQL Server&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ArcGIS 10.4: ArcGIS Pro 1.2&lt;/h2&gt;
&lt;p&gt;The release date and official list of new/updated features will be available from Esri in the next few weeks. One very important feature of Pro 1.2 will be the ability to &lt;a href=&quot;https://blogs.esri.com/esri/arcgis/2016/02/05/more-licensing-options-for-arcgis-pro/&quot;&gt;use Concurrent Licensing&lt;/a&gt; a feature that will help many organizations work with Pro in a familiar setting. Lots of enhanced 3D tools and new Vector Tile tools are anticipated as well. More on 1.2 after it’s officially released.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Collector Updates Galore]]></title><description><![CDATA[Some of the most anticipated updates for ArcGIS Collector have arrived this December! Just in time for… winter?!  (Canada Joke). That said…]]></description><link>https://www.spatialtimes.com/2015/12/arcgis-collector-updates-galore/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/12/arcgis-collector-updates-galore/</guid><pubDate>Tue, 22 Dec 2015 09:05:38 GMT</pubDate><content:encoded>&lt;p&gt;Some of the most anticipated updates for ArcGIS Collector have arrived this December! Just in time for… winter?!  (Canada Joke). That said, I’ll take these updates any day - seeing as it will be 15 degrees Celsius (59 Fahrenheit) on Christmas day here in Ontario.&lt;/p&gt;
&lt;p&gt;So what’s all this Collector fuss about you ask?&lt;/p&gt;
&lt;h2&gt;ArcGIS Collector Attachment Sizing (for iOS)&lt;/h2&gt;
&lt;p&gt;That’s right - you can now optionally set the attachment size for images within the ArcGIS Collector application (iOS users). A huge issue for many users is the significant storage size of all the images being synced at full resolution. Not only are the images huge, but the photo dimensions are likely larger than anyone will ever need. The work around until now has been to take photos with an external app, then add them to ArcGIS Collector afterwards - not ideal if you’re the one in the field. If you still want large photos you have that option too - but for those of us who feel syncing shouldn’t lead to as many &lt;em&gt;&lt;a href=&quot;https://www.spatialtimes.com/2015/11/arcgis-collector-illegal-start-of-token/&quot;&gt;Illegal Start of Token Errors&lt;/a&gt;&lt;/em&gt; , this will definitely help. There is no getting back the original photo however, so use these settings wisely.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 640px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/620f8b35e470cc129f2d0a152c4b53fd/0f09e/ArcGIS-Collector-Size.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 80.80000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABMUlEQVR42pXS246CMBAG4L7/SxlvKXLQtRUjhAhsLVmlAUoopeMGyGbXRDf1u+rFTP9pM6goCsdxMMbOLPjheZ7rur7vh2Houm6e54yxz0eIc04I+Zh5nrfb7aIo2u/3QRBsNhtCCKXU933GWFmW/BEahiFN0yzLiqK4vwbPTM2U0u12G0VR0zRt2wLA3+rl/PRGBAB93yulpJR1XUspwRpSSi3fk2XZPyHPk40xeZ4nSVKW5au3vUwGACFEO1NKWfYvZUhrvV6v8exyuVhOzoTUxkxj32636/VaVZUxxibWAHRKm2Xsr1nXdfZvXgqnZIzxarWK4/j+pqm5aZq+74UQ9h/2u2GEkPP5zDlPkoRSOo6j5RVT8uFwOB6Pp9OJEBLHsf2eoGUrq1ld11rr1to3J2WWNvfHr2AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Collector Attachment Size Options&quot;
        title=&quot;&quot;
        src=&quot;/static/620f8b35e470cc129f2d0a152c4b53fd/0f09e/ArcGIS-Collector-Size.png&quot;
        srcset=&quot;/static/620f8b35e470cc129f2d0a152c4b53fd/0eb09/ArcGIS-Collector-Size.png 500w,
/static/620f8b35e470cc129f2d0a152c4b53fd/0f09e/ArcGIS-Collector-Size.png 640w&quot;
        sizes=&quot;(max-width: 640px) 100vw, 640px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;ArcGIS Collector Attachment Size Options&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;ArcGIS Collector Sync Settings&lt;/h2&gt;
&lt;p&gt;It’s also now possible to collect new features in the field and push them up to the “Cloud” (feature service) without pulling down gobs of updates from other users at the same time. The new synchronization setting is pretty straight forward: Push Only - send your updates but don’t receive others’. A great enhancement to increase productivity when out in the field - and taking a break at Starbucks to sync your changes via WiFi.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 640px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/81af7034b742b7c4333d5c17b0ba7190/0f09e/ArcGIS-Collector-Sync.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 37%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABDUlEQVR42nXPzY6CMBQF4L7/O7mhcSkDLbUUYaqE/lA6tDSihqhMpiazceZb3Nzcm7M4oOs6CGGSJBDCzWaTJMl2u4UQpmmqlJJvtFK9Vjp+gHPOWjsMgzFmGIbfgNbavZm877ThQktjvfdgWZbT6dRHnPN5ntf/TZebCZfzbRHufF3u4PF4tG3bNE3f94yV1tp1XZ/P59/h+SqtC+eL8vNtuYPxhwshTNMUQhjH0Vr7qvCqY6O4fLlx/Dy2+/ooe+OdA0KINP3IspyQ/W6XZlmOEEYIFwVBCOc5QghjXGRZXhQE44JS2tQ151wpBaSUhOwZY2XJXrOqDpRSxipCyOFQx0vFIkpLIYTWWkXfKoB5xaYikpkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Collector Sync Settings&quot;
        title=&quot;&quot;
        src=&quot;/static/81af7034b742b7c4333d5c17b0ba7190/0f09e/ArcGIS-Collector-Sync.png&quot;
        srcset=&quot;/static/81af7034b742b7c4333d5c17b0ba7190/0eb09/ArcGIS-Collector-Sync.png 500w,
/static/81af7034b742b7c4333d5c17b0ba7190/0f09e/ArcGIS-Collector-Sync.png 640w&quot;
        sizes=&quot;(max-width: 640px) 100vw, 640px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;ArcGIS Collector Sync Settings&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;ArcGIS Collector for Windows 10&lt;/h2&gt;
&lt;p&gt;Maybe not huge demand at this point, but if you’ve been watching what Microsoft has been up to lately, ArcGIS Collector for Windows 10 might be a contender when it comes to field data collection. Sure Windows Mobile/CE was a time we would like to forget, but Windows 10 is quickly gaining ground. Not only that, Windows is the primary OS at many Government Organizations - so there is some long term potential when it comes to standards. Of course, this is all based on quality hardware being made available - and Microsoft looks like they might have some of this covered with the new &lt;a href=&quot;https://www.microsoft.com/surface/en-ca/devices/surface-pro-4&quot;&gt;Surface Pro 4&lt;/a&gt; and the &lt;a href=&quot;https://www.microsoft.com/surface/en-ca/devices/surface-book&quot;&gt;Surface Book&lt;/a&gt;. Why do field staff need a laptop, an iPad, and a smart phone - soon, windows 10 will have that all covered in one device (AKA “Continuum”).  Maybe a little hard to imagine at this point, but the laptop/desktop/tablet in one, we are already there. &lt;em&gt;Collector for ArcGIS&lt;/em&gt; is now available in the Windows App store and runs in both desktop and tablet mode depending on your needs.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 712px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6b27d1e04689bf026378395b4d7120db/fd4f1/Collector-w10.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.199999999999996%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAcIBQn/xAAVAQEBAAAAAAAAAAAAAAAAAAAEBf/aAAwDAQACEAMQAAABr/nREapdPRpugX//xAAbEAACAgMBAAAAAAAAAAAAAAACAwYHAQQFMv/aAAgBAQABBQKuonGNinsdfde0vQXLZvJ4QzqVrSCVkP8A/8QAHREAAQQDAQEAAAAAAAAAAAAAAQIDBBESEyEQMf/aAAgBAwEBPwFyGw6rMR415HYpTLZUtV/SdZJs9Nnvn//EAB8RAAECBgMAAAAAAAAAAAAAAAECAwQQERIhQRMiUf/aAAgBAgEBPwFmNdZRYXog9BxgOrCUCmABeKDWBjXkv//EACUQAAICAQMDBAMAAAAAAAAAAAECAwQFABETBhIUISIycTGx0f/aAAgBAQAGPwLprMTYOg2RfoaLIPOvkQctzwZ5zPLHWnhR5ZJlDyydvLKdy7Mx7tBiGer485trXcRpV7E3344XeWMt6ohmnPIW+JKnTfZ/eqGCx3V1+piKmMqYuvQihoCulDhmi4CpqEyBk9rPKXlcfJzryI8s8c0M6RxvHVooVR4pCy+2qAQSAfUH8DbW5X1+2/uv/8QAGhABAAMBAQEAAAAAAAAAAAAAAREhMQBhUf/aAAgBAQABPyGkIzE39+Dmuk6dwl3MlCn8SR+733W+/emrOHhHdKtC/fO47/d1xaaIpBDrplaxaDgDXv/aAAwDAQACAAMAAAAQ/B//xAAXEQEBAQEAAAAAAAAAAAAAAAABEVEA/9oACAEDAQE/EHNDcIBXow0gjaBAMJ3/xAAWEQEBAQAAAAAAAAAAAAAAAAABIRD/2gAIAQIBAT8QYAGLQgBEICQIDH//xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhMUHB/9oACAEBAAE/EOAqH1N57OVoFiHawj0eF7d+Haem76frfpfstkX1hMUbnGSPmB6otQqbfFBpDeiKDTLRwDcyf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Collector for Windows 10&quot;
        title=&quot;&quot;
        src=&quot;/static/6b27d1e04689bf026378395b4d7120db/fd4f1/Collector-w10.jpg&quot;
        srcset=&quot;/static/6b27d1e04689bf026378395b4d7120db/953fe/Collector-w10.jpg 500w,
/static/6b27d1e04689bf026378395b4d7120db/fd4f1/Collector-w10.jpg 712w&quot;
        sizes=&quot;(max-width: 712px) 100vw, 712px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;ArcGIS Collector for Windows 10&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS JavaScript API 3.15]]></title><description><![CDATA[In time to upgrade over the holidays, ArcGIS JavaScript API 3.15 is here with updates that enable us to use many of the new server features…]]></description><link>https://www.spatialtimes.com/2015/12/arcgis-javascript-api-3-15/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/12/arcgis-javascript-api-3-15/</guid><pubDate>Mon, 21 Dec 2015 15:58:13 GMT</pubDate><content:encoded>&lt;p&gt;In time to upgrade over the holidays, ArcGIS JavaScript API 3.15 is here with updates that enable us to use many of the new server features that have been announced over the past few months.&lt;/p&gt;
&lt;h2&gt;ArcGIS JavaScript API 3.15 - no more beta!&lt;/h2&gt;
&lt;p&gt;The biggest improvement to this release is the move from beta to production for both the GeometryEngine and the FeatureTable modules. Using before this release there was fear that something could change or disappear - thankfully now that they are in production, using them will not be as much of a gamble. A few new methods are also included with the GeometryEngine for Geodesic Densification (used to draw a line of the geometry along great circles).&lt;/p&gt;
&lt;h2&gt;ArcGIS JavaScript API 3.15 - New stuff&lt;/h2&gt;
&lt;p&gt;Lots of new features added to this release, mostly related to recent server side enhancements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;New layer type for Vector Tile Layers: One of the biggest updates on the server side is the addition of Vector Tiling which can now be accessed by the API. This includes client side rendering of individual layers on-the-fly.&lt;/li&gt;
&lt;li&gt;New rendering (Smart Mapping) method called “PredominanceRenderer”. Which ”&lt;em&gt;allow[s] you to generate a UniqueValueRenderer showing the predominant value in each feature among a set of two or more competing fields&lt;/em&gt;” (Esri).&lt;/li&gt;
&lt;li&gt;A new Sample of samples: A new sample has been introduced to help with symbol styles, the &lt;a href=&quot;https://developers.arcgis.com/javascript/samples/playground/index.html&quot;&gt;ArcGIS Symbol Playground&lt;/a&gt;. Make a unique symbol with this sample, and copy the rendering code to add directly to your application. That’s right, spend less time in your browser hitting F5 to refresh!&lt;/li&gt;
&lt;li&gt;Over 35 new events/methods and enhancements added&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;ArcGIS JavaScript API 3.15 - Squished Bugs&lt;/h2&gt;
&lt;p&gt;A total of 15 bugs were fixed - although expect many fixes in the next release as vector tiles are just getting warmed up. Many of the fixes are related to Geocoding, symbols and the legend. Oh, and the annoying &lt;em&gt;Measure Widget always opened by default even if you didn’t want it to&lt;/em&gt; issue is now fixed - thank you!!&lt;/p&gt;
&lt;p&gt;Side note - you can now create a custom build of the API using Bower. This is a much better alternative to the Web Optimizer which can be a little complicated to get working properly. Want to give it a try? Esri has a &lt;a href=&quot;https://developers.arcgis.com/javascript/jshelp/inside_bower_custom_builds.html&quot;&gt;great tutorial&lt;/a&gt; on this very subject!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Collector Illegal Start of Token]]></title><description><![CDATA[After minutes, hours, nay - week in the field, you decide it’s time to sync your offline ArcGIS Collector edits so others in your…]]></description><link>https://www.spatialtimes.com/2015/11/arcgis-collector-illegal-start-of-token/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/11/arcgis-collector-illegal-start-of-token/</guid><pubDate>Thu, 12 Nov 2015 20:32:04 GMT</pubDate><content:encoded>&lt;p&gt;After minutes, hours, nay - week in the field, you decide it’s time to sync your offline ArcGIS Collector edits so others in your organization can enjoy the vast quantities of field data you recently collected. Clicking the sync button, a familiar progress bar appears and we start thinking about our next Collector excursion and how easy that was. Alas, we jinxed it. Our positive, happy thoughts somehow caused a rift in the wifi continuum. It then appears: ArcGIS Collector Illegal Start of Token [&amp;#x3C;].&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/53623125e9276c7cb1b9feb7041c597d/242a6/syncError.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 32.800000000000004%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAA7DAAAOwwHHb6hkAAABJ0lEQVR42nVRy46CQBDk/3/Fo4lxL0SiBBVRIJslhIeAdA9j8Gqyl6lNj4/oZvdQaXqo1GPGYWZorY3WWiaGYcDlckEURZhMJnBdF4vFAtPpFLPZDHmeYxxHyxP++XyGUsqIDjN/O7KUZYmqqlAUhZ3H4xFJkmA+n8PzPPi+j/V6bcXTNEVd10+uGHRd9xR1xC1JErPf77HdbhHHMTabjf3e7XY4HA5WTBLLLv+CIMBqtcJyubTpsyyzDZnZOOIuIiIoCMPQ7k3T2DpSbdAa6qXi6/XcK4uYnY5ErqrKSHyp8qjfti2ICEQ9tGIwEfq+fwPdz4jI3LhkHHkQm+IXxG1QCnV7wkf4haLpoIdbkn9gbMLH8hdJCCcifJYNup7eqr3iIcbM1x+LkfYfhS2svQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Sync Error: ArcGIS Collector Illegal Start of Token&quot;
        title=&quot;&quot;
        src=&quot;/static/53623125e9276c7cb1b9feb7041c597d/242a6/syncError.png&quot;
        srcset=&quot;/static/53623125e9276c7cb1b9feb7041c597d/0eb09/syncError.png 500w,
/static/53623125e9276c7cb1b9feb7041c597d/242a6/syncError.png 720w&quot;
        sizes=&quot;(max-width: 720px) 100vw, 720px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Sync Error: ArcGIS Collector Illegal Start of Token&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You try syncing many times thinking the gremlins probably went away, but the consistency of the message makes you second guess you and your finger mashing of the sync button. You think possibly checking for an update in the App store could help - but hopefully you finish reading this before doing so, or risk losing all that glorious data.&lt;/p&gt;
&lt;h2&gt;&lt;em&gt;ArcGIS Collector Illegal Start of Token [&gt;]&lt;/em&gt;:&lt;/h2&gt;
&lt;p&gt;The illegal start of token message is very generic, and there are many different reasons you might get this message. The one described below is based on the following configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apple iPad Air 2, iOS 9.02&lt;/li&gt;
&lt;li&gt;ArcGIS Collector v10.3.4 or v10.3.5&lt;/li&gt;
&lt;li&gt;Service locally hosted on ArcGIS Server 10.3.1 (windows/IIS),
&lt;ul&gt;
&lt;li&gt;Secured service&lt;/li&gt;
&lt;li&gt;Service has 1 line FC, 1 point FC, 1 photo attachment to point FC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Service is registered with ArcGIS Online (AGOL) as Feature Service&lt;/li&gt;
&lt;li&gt;The Feature Service &lt;strong&gt;SAVES&lt;/strong&gt; service credentials&lt;/li&gt;
&lt;li&gt;Create AGOL map referencing the feature service&lt;/li&gt;
&lt;li&gt;Easy peasy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The real culprit in our situation is the credentials being stored with the feature service when added to ArcGIS Online (AGOL). For some reason, the sync will start but there is a failure after a few minutes with the token. Well, it’s actually the combination of the stored credentials, and having a large sync process - not based on feature count, but total size (photos included in that size consideration). Photos being the main focus of contention here as they drastically increase the total size.&lt;/p&gt;
&lt;h2&gt;Solutions - Part 1: Worth Trying First&lt;/h2&gt;
&lt;p&gt;Since the error is generic, it’s a good idea to start with the simple solutions that appear to have worked for a few users. Although these didn’t work in our situation, &lt;a href=&quot;https://geonet.esri.com&quot;&gt;GeoNet&lt;/a&gt; has many possible solutions that should be tested first:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Increasing the IIS uploadReadAheadSize on our ArcGIS Server web server&lt;/li&gt;
&lt;li&gt;Using a fast and strong wifi connection&lt;/li&gt;
&lt;li&gt;Wait until &lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2015/10/09/collector-for-arcgis-v10-3-4-is-out/&quot;&gt;&lt;del&gt;10.3.5&lt;/del&gt; errr, 10.3.6&lt;/a&gt; when the app will allow photo resize to deal with total sync size and hopefully fix the sync bug regardless&lt;/li&gt;
&lt;li&gt;Whatever you do - &lt;strong&gt;&lt;strong&gt;don’t&lt;/strong&gt;&lt;/strong&gt; &lt;strong&gt;upgrade the app from 10.3.4 to 10.3.5&lt;/strong&gt; thinking it will fix the issue. This introduces another bug: Upgrading from 10.3.4 to 10.3.5 will erase all offline edits (found out the hard way).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Solutions - Part 2: Deep Dive&lt;/h2&gt;
&lt;p&gt;If part 1 above doesn’t solve the sync issue, there are a few additional methods that may fix or at least save the synced edits as we wait for 10.3.6.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1: Recreate the Feature Service&lt;/strong&gt;: This time don’t save the credentials with the user/pw. Then open the existing AGOL map, remove the old Feature Service, and add the new one. This will &lt;strong&gt;NOT&lt;/strong&gt; fix the sync of existing offline edits - take care of those first or extract manually at least and try the second step below. The sync of existing offline edits will fail since the Feature Service has a new reference ID in AGOL - In a future release of AGOL, hopefully we can modify the existing service to prompt no longer storing credentials - this might allow existing edits to be saved with less effort.&lt;/p&gt;
&lt;p&gt;With the new approach users will be prompted for the user/pw when first accessing the Collector Map with the Feature Service inside. This isn’t ideal, but it does save this information in Collector, so as long as the Collector account stays logged in, the service seems to keep the feature service user/pw stored. You can also store the user/pw in the Notes app just in case (we won’t tell).&lt;/p&gt;
&lt;p&gt;This approach has allowed us to sync larger batches of data, however, we sync every night as we still don’t know if there is a cap on the effectiveness. Very large sets of attachments should still consider a different approach (online edits, or store Feature Service on AGOL) as there might still be a limit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2: Manually sync edits&lt;/strong&gt;: Yuck! If nothing else works buckle down and get ready for traditional GIS joins and calculates. Since we used an iPad, the first thing to do is get the data off the device. Yes, we need iTunes (sorry). With iTunes connected to the iPad, you can copy the sync edits by browsing Apps Data section. Just copy the user folder with edits to the desktop. The files inside have names like “3123456789.geodatabase” but don’t worry, they are legitimate GDBs.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1070px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4b05bfd64a6307953a64d8a25eaef436/ca019/iTunes-with-Collector.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.6%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7CAAAOwgEVKEqAAAABlklEQVR42m3Qwa7TMBAFUP//nhVFLPgEFoBEocCSBY8i2qalKklqp3ZiO4ljx2M7MUreA6USR3c1GmmuBiWHQ5Icd8lpv99fLpeCECGfHPZ7IWUzwxgnSZJn+a0oKKXn0+m02SBWlq3SrO7HITStAu9DCP4vYzrBq7pujDExxhCCc87POxACqoSMcfQhRA/vTsWbh+P1ck6zPJvkSsns968sTUtGGaNGd1p3tZRt03RKIYyxUkrrjgnFtq/x9/e1sg4sTKwFdzxn212y3SXftj8JE7zReVFhKrlsUZqmZkaKwrY1aGXspO+td5BguVpfVh+vLz9dV+vs2bp48bl89YU+39zePpSIEDIMQ4yRc27BjeMYFqYCzjsfYE5vXW8dgLfgte6RECLOqoprre09cM4BOPcvT+ZfGiSmh02klAAwDMPysvufxzVKKSKkGIYxxggA/T1jzNT6nvfeORdjxBgj0/fj7PHUcA8AzILWmhAihKCUMsbQh9vhx+1rJyoupFgoyzLP86qqlkPOuZSyqeta1uM4/gFbKmpFvJJ24AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;iTunes Collector Documents: Get your data back!&quot;
        title=&quot;&quot;
        src=&quot;/static/4b05bfd64a6307953a64d8a25eaef436/ca019/iTunes-with-Collector.png&quot;
        srcset=&quot;/static/4b05bfd64a6307953a64d8a25eaef436/0eb09/iTunes-with-Collector.png 500w,
/static/4b05bfd64a6307953a64d8a25eaef436/1263b/iTunes-with-Collector.png 1000w,
/static/4b05bfd64a6307953a64d8a25eaef436/ca019/iTunes-with-Collector.png 1070w&quot;
        sizes=&quot;(max-width: 1070px) 100vw, 1070px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;iTunes Collector Documents: Get your data back!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Since this is a Geodatabase in disguise, we first need to get the data into a usable format. Thankfully, there are now tools to get the data into an XML workspace. To do this, just open the Toolbox or use python to extract the data: &lt;code class=&quot;language-text&quot;&gt;arcpy.ExportXMLWorkspaceDocument_management(source, XML)&lt;/code&gt;. Once complete, you can import the XML into a new/empty File GDB using another Toolbox/python tool &lt;code class=&quot;language-text&quot;&gt;arcpy.ImportXMLWorkspaceDocument_management(XML, GDB)&lt;/code&gt;. Congratulations, you now have a File Geodatabase with Collector edits.&lt;/p&gt;
&lt;p&gt;This approach will keep the relationship and GUIDs intact. If there are no relationships or photo attachments, and only new features created - just use the Object Loader (ArcMap) or Load Data (ArcCatalog) tools to append the new data into your Enterprise Geodatabase.&lt;/p&gt;
&lt;p&gt;If there are attachments/photo and possible modifications to existing features, you still have your work cut-out for you. The best approach I found so far is to add an additional “Original_GUID” field to all Feature Classes and Tables (in source/enterprise GDB, and in newly created file GDB). Calculate the File GDB “Original_GUID” field equal to the real GUID field in Feature Classes. In related tables, create a “Original_RelGUID” and calculate based on “Related_GUID”. Once complete on all tables and feature classes, you can start the old-school grind of loading, joining, and calculating fields.&lt;/p&gt;
&lt;p&gt;For attachment tables, the “Related_GUID” field will not change when appended to a parent layer (so why did we create a copy?! You’ll see…). In the Feature Class, the “GUID” field will change when loaded, but the “Original_GUID” we populated will remain. You can now join the “Original_GUID” in FC to the “Original_RelGUID” in the related table. Next, calculate the Related_GUID in the table equal to the FC’s GUID field. Since we joined using the “Original_RelGUID”, the table will not go crazy since we aren’t changing the field the ArcMap Join is based on - otherwise, the table will lose track of the join and edits might not look like they have been made correctly. Also good for double checking your work (which is why we created it).&lt;/p&gt;
&lt;h2&gt;Notable Related Links for iPad/Android and ArcGIS Collector Sync Issues&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2015/10/09/collector-for-arcgis-v10-3-4-is-out/&quot;&gt;Collector for ArcGIS v10.3.4 errr 10.3.5 is out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://geonet.esri.com/thread/166807&quot;&gt;GeoNet: Illegal Start of Token 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://geonet.esri.com/message/425592&quot;&gt;GeoNet: Illegal Start of Token 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://geonet.esri.com/message/399586&quot;&gt;GeoNet: Sync Error with Collector and iPads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://support.esri.com/en/bugs/nimbus/TklNMTA0MDA1&quot;&gt;BUG NIM104005 (Android)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://support.esri.com/en/bugs/nimbus/QlVHLTAwMDA4NDE1Ng==&quot;&gt;Bug BUG-000084156 (Android&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Javascript API 3.14 and 4.0]]></title><description><![CDATA[Just in time for the Esri International UC in San Diego, two big updates have been announced for the ArcGIS Javascript API - the release of…]]></description><link>https://www.spatialtimes.com/2015/07/arcgis-javascript-api-3-14-and-4-0/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/07/arcgis-javascript-api-3-14-and-4-0/</guid><pubDate>Thu, 23 Jul 2015 11:56:03 GMT</pubDate><content:encoded>&lt;p&gt;Just in time for the Esri International UC in San Diego, two big updates have been announced for the ArcGIS Javascript API - the release of 3.14 and 4.0 (beta 1).&lt;/p&gt;
&lt;h2&gt;ArcGIS Javascript API 3.14&lt;/h2&gt;
&lt;p&gt;ArcGIS Javascript API 3.14 is officially released and all things considered is a pretty big enhancement to 3.13. One that users/developers have been asking for is finally here, the &lt;a href=&quot;https://developers.arcgis.com/javascript/jsapi/layerlist-amd.html&quot;&gt;LayerList dijit class widget&lt;/a&gt;. The is debate if such functionality should even be used in web applications still remains, but the popularity of the request over the years has finally pushed Esri to release an officially supported widget (officially a beta widget still). The widget provides users with the ability to toggle layer visibility, however it doesn’t include any legend components at this time. Other new classes include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ElevationProfile (beta): Allows a user to create an elevation profile based on a line&lt;/li&gt;
&lt;li&gt;ImageServiceMeasure: Allows a user to perform measurements (length, area, volume, height, absolute location) on an image service with mensuration support&lt;/li&gt;
&lt;li&gt;ObliqueViewer: To display images in their native coordinate system.&lt;/li&gt;
&lt;li&gt;WFSLayer: Not a widget, but worth mentioning this new class since it supports OGC Web Feature Services. You guessed it, beta only.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are also 13 new samples and 28 major bugs that have been fixed - including many that were causing some issues in IE10 or IE11 (FYI: Many government agencies will be on IE for a while still, so this is good news). Other notables are the significant enhancements that enable developers to integrate with the Operations Dashboard and DataReviewer. For more information on what’s new and fixed at version 3.14, check out the &lt;a href=&quot;https://developers.arcgis.com/javascript/jshelp/whats_new.html&quot;&gt;What’s New page&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;ArcGIS Javascript API 4.0 (beta 1)&lt;/h2&gt;
&lt;p&gt;As the name suggests, this is just the first of many beta releases (&lt;a href=&quot;https://developers.arcgis.com/javascript/beta/&quot;&gt;beta site&lt;/a&gt;). Esri is planning a few betas before the final release which is expected next year (UC anyone?). The biggest update to 4.0 from the user perspective is the new 3D “Scenes” view with support for 3D symbology. On the back-end, almost everything is changing - but in a way to simplify the developer experience. Migration is also very straight forward: Don’t (just rewrite).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Consider rewriting applications instead of simply trying to update them. ~ Esri help on migration&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you’ve been holding out on switching to AMD, time to get in your Delorean and join us in 2015 (&lt;a href=&quot;https://en.wikipedia.org/wiki/Back_to_the_Future&quot;&gt;80’s movie reference just in case&lt;/a&gt;).  I understand some people will be reluctant as we all have legacy apps built using non-AMD styles, but since 4.0 apps pretty much require a re-write anyway, it seems like a logical step for Esri to drop it at this point. Other notable changes from Esri include (listed in their &lt;a href=&quot;https://developers.arcgis.com/javascript/beta/guide/migrating/&quot;&gt;beta guide&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Handling properties: Getting and setting properties is much more elegant and aligns with current dev approaches. Listening for property changes is also much easier by introducing a &lt;em&gt;.watch(property,callback)&lt;/em&gt; method.&lt;/li&gt;
&lt;li&gt;Map and layer separation: Views have been introduced to separate some of the map and view/drawing logic. The “Map” will contain some base details (core properties, basemap reference), while “Views” will handle the 2D/3D and drawing logic. That’s right, ArcView 3.1 has finally been integrated into ArcGIS Pro and the web APIs!&lt;/li&gt;
&lt;li&gt;Module and package updates: Changes to the location of [some] classes and packages have been implemented, but it appears most of them are sticking around in some form. This renaming should be welcomed as the new structure uses cleaner names with consistent CaSe conventions.&lt;/li&gt;
&lt;li&gt;Deprecation: The Geocoder widget has been dropped at 4.0 as the Search Widget will take the reins. Will help alleviate the confusion as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Remember, this is just the first beta - but I’d still recommend checking out the &lt;a href=&quot;http://developers.arcgis.com/javascript/beta/sample-code/&quot;&gt;samples&lt;/a&gt; and the &lt;a href=&quot;https://developers.arcgis.com/javascript/beta/guide/discover/&quot;&gt;Discover 4.x &lt;/a&gt;documentation to start getting your ducks in a row as this is a significant overhaul for the ArcGIS Javascript API.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Print Text Elements with ArcGIS for Server]]></title><description><![CDATA[Creating your own map template, or using the generic ones, you have the ability to print text elements with ArcGIS for Server layouts. But…]]></description><link>https://www.spatialtimes.com/2015/06/print-text-elements-with-arcgis-for-server/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/06/print-text-elements-with-arcgis-for-server/</guid><pubDate>Sun, 28 Jun 2015 13:48:54 GMT</pubDate><content:encoded>&lt;p&gt;Creating your own map template, or using the generic ones, you have the ability to print text elements with ArcGIS for Server layouts. But how much text can you store and print properly without it being truncated or running off the printed page?&lt;/p&gt;
&lt;h2&gt;What’s in a name?&lt;/h2&gt;
&lt;p&gt;The generic print templates have custom “Title” and “Author” text boxes and these properties are exposed in the &lt;em&gt;layoutOption&lt;/em&gt; object so you can change the text in your application. But just because the property says “Title” and “Author” doesn’t mean you can only use them for that specific purpose. You can store any text, as long as it fits in the limited text box. If creating your own MXD template, you have much more control over this. You can make the Title/Author text boxes much larger (fixed width, multi-line, etc), or you can even add more custom text boxes to the layout as you aren’t limited to just Title/Author when building your own.&lt;/p&gt;
&lt;h2&gt;How long is a piece of string?&lt;/h2&gt;
&lt;p&gt;When we print text elements with ArcGIS for Server, you should probably determine how much text you can truly include - this will help the end users, the application, and the printouts! But how long is a piece of string (&lt;a href=&quot;https://en.wiktionary.org/wiki/how_long_is_a_piece_of_string&quot;&gt;sic&lt;/a&gt;)?! If you assume all characters of text are the same length, you will quickly find out the text boxes don’t agree with you. For example, a “W” character uses much more space than the “i” character. But how much more? Naturally, it depends.&lt;/p&gt;
&lt;p&gt;To determine length, a much better approach than counting letters or words, is to count pixels. Assuming you are trying to avoid a custom python print task and using straight forward MXDs, the pixel width of the text box is constant since all the font properties have already been set in your Map Document. Just type some text into your text box until it’s full, then calculate the pixel length from that text and you will have your maximum size. Next, add some code to your application to determine the user input length and make sure it doesn’t exceed the maximum. Easier said than done? Keep reading.&lt;/p&gt;
&lt;h2&gt;Pixel Magic&lt;/h2&gt;
&lt;p&gt;How do you calculate pixel length, is it some crazy equation showcased in the movie ‘Goodwill Hunting’, or from your favourite String Theory textbook? Not even close, and not even complicated! Here is an example when working with the ‘Title’ text, although will work with any custom text too:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open your custom MXD template (or Esri generic) and type random text into the title text box until full of text. Copy that text to  your web app and remove from text box (doesn’t need to be saved in the MXD). This text is your maximum length placeholder.&lt;/li&gt;
&lt;li&gt;In your web app, create 2 text boxes: One for the user to enter text dynamically (id=‘txtTitle’), a second one with your dummy text from step #1 included as it’s text (id=‘txtTitleLength’).&lt;/li&gt;
&lt;li&gt;Both text boxes: Set identical font, font-size, font-type (important to compare pixel length)&lt;/li&gt;
&lt;li&gt;txtTitleMaxLength: remove all width styling and make ‘inline-block’. Note: you can hide this text box later so users don’t see it. For now, just keep it while testing.&lt;/li&gt;
&lt;li&gt;Calculate the length of the txtTitleLength text box using the following code (assuming jquery in this example): &lt;em&gt;$(“txtTitleLength”).width();&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;Swap the user text from txtTitle into txtTitleLength, and get the width again.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Phew, we have the pixel length of our max dummy text, and the user text. The outputs from step #5 are the number of pixels we have to work with.  I recommend keeping the txtTitleLength textbox and dummy text as part of a JavaScript calculation so you can always determine the max length available based on user browser settings. Just hide txtTitleLength from the interface.&lt;/p&gt;
&lt;h2&gt;Help users help themselves&lt;/h2&gt;
&lt;p&gt;We now know the maximum number of pixels, and the user text pixels. As long as the width the user text less than the dummy text, you are good! Now when printing Custom Text Elements with ArcGIS for Server you can feel more confident that the text provided by the user will fit the layout. This also works with large text boxes with fixed size and multi-line text.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS 10.3.1 Released]]></title><description><![CDATA[ArcGIS 10.3.1 has been officially released by Esri. Like most build number increments, there are both fixes (service packs, quick fixes…]]></description><link>https://www.spatialtimes.com/2015/05/arcgis-10-3-1-released/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/05/arcgis-10-3-1-released/</guid><pubDate>Sun, 17 May 2015 21:03:11 GMT</pubDate><content:encoded>&lt;p&gt;ArcGIS 10.3.1 has been officially released by Esri. Like most build number increments, there are both fixes (service packs, quick fixes), and enhancements (new features and functions). If you are already using 10.1 or later, you can directly upgrade your existing installation - just remember to upgrade Desktop License Manager first, and that your ArcGIS Server services will be offline during the upgrade process. For new installations, you can directly install 10.3.1 without any previous install required.&lt;/p&gt;
&lt;h2&gt;ArcGIS 10.3.1 What’s New&lt;/h2&gt;
&lt;p&gt;The Desktop 3D Analyst extension seems to be the real winner here as LiDAR/3D data continues to expand its use: Classify LAS By Height, LAS Point Statistics By Area, and Locate LAS Points By Proximity are all new tools included at 10.3.1. There are also updates for GeoData, Spatial Analyst, and a few other minor tweaks to export CAD r2013 to round up the main Desktop features.&lt;/p&gt;
&lt;p&gt;Server 10.3.1 has many new features. 3D Scene services are one of the biggest new items, allowing you to publish 3D content from ArcGIS Pro directly to server as a 3D service. For developers, a new Server Object Interceptor (SOI) will allow you to execute custom/changed logic before returning to the client - moving us away from the Server Object Extension (SOE) approach (still exists, but SOIs seem to be the flavour of choice). Other enhancements have been made for OGC compliance, IIS tweaks, and a new extension for “Maritime”.&lt;/p&gt;
&lt;p&gt;In short, Portal 10.3.1 has been updated to the same/latest version of ArcGIS Online. It also supports the features listed for Desktop/Server above with published 3D content and a specialized imagery services tweaked for elevation data. The “Smart Mapping” feature has also been included to help with symbology/style options as updated Online a few months ago.&lt;/p&gt;
&lt;p&gt;Here are links to the full documentation on what’s new in 10.3.1 for each product:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://desktop.arcgis.com/en/desktop/latest/main/get-started/whats-new-in-arcgis-1031.htm&quot;&gt;ArcGIS 10.3.1 for Desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://server.arcgis.com/en/server/latest/get-started/windows/what-s-new-in-arcgis-10-3-1-for-server.htm&quot;&gt;ArcGIS 10.3.1 for Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://server.arcgis.com/en/portal/latest/administer/windows/what-s-new-in-portal-for-arcgis-10-3-1.htm&quot;&gt;ArcGIS 10.3.1 for Portal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ArcGIS 10.3.1 Bug Fixes&lt;/h2&gt;
&lt;p&gt;Hundreds of bugs have been fixed at this release and also includes a roll-up of all previously release 10.3 patches - so you don’t need to install them first. If you have a specific bug you want to verify is squashed, you can check out the full list at at &lt;a href=&quot;http://downloads.esri.com/support/downloads/other_/1031-IssuesAddressedList.pdf&quot;&gt;Esri’s support site&lt;/a&gt; (pdf).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS JavaScript API Printing Group Layers]]></title><description><![CDATA[You’re not hallucinating - sometimes the map you see in your ArcGIS JavaScript application doesn’t look like the one you printed via the…]]></description><link>https://www.spatialtimes.com/2015/04/arcgis-javascript-api-printing-group-layers/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/04/arcgis-javascript-api-printing-group-layers/</guid><pubDate>Tue, 28 Apr 2015 23:38:13 GMT</pubDate><content:encoded>&lt;p&gt;You’re not hallucinating - sometimes the map you see in your ArcGIS JavaScript application doesn’t look like the one you printed via the Print Service. There are many reasons why this might happen, and one is related to Group Layers.&lt;/p&gt;
&lt;h2&gt;App vs Printing Group Layers?&lt;/h2&gt;
&lt;p&gt;You may notice your group layers are working fine in your web application - automatically turning on/off the sub-layers as configured in the map service (for max/min scale dependant display).  Without specifying any additional settings in the web app this will display as it would in ArcGIS Pro/Desktop. However, the Print Service will not use the same approach for printing sub-layers. In short: It’s not &lt;em&gt;always&lt;/em&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/WYSIWYG&quot;&gt;WYSIWYG&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 411px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/915b77b930b47e5d9ec4abb65ede8aaf/4b2fe/DynServiceLayers.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.74695863746959%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACfElEQVR42mVR3U/TUBzdX6VPOj584WMDBkgCmI19yCh0g/IIbz6oMSQmEF+EFzVshHUfYWu7tiuyjd52623v7RjhI2yocdMY/wfTO4wkJie/3Jx7z/2dnOMSWz/eWa09u/0etz81v+7i9p7dTpx/28XtbXizA2+2/8OOebNVu85cfXe9BBeUhNaPG/4CjMl4TWlQorWm2LNHtYcfPz/eL7sTlb47lHsYSFYefDhmStj1tn49dKhSEqJlHJNRiDcXBWtJtGgZL4uIEhGj2F4WDB2ejqRUDws8LBhLa4MH1c1y0/Vau+xPVp7m9Pl83V+AYR4GeUhLaLWEKRGFeEiJKFq0nuWN+Xzdw4Ih8kV/srJxcubY7ktUPCwYT4PJrE5LaFlEQQ76C0aIhwscjIqIKdmLghniTV9GG0mp3vtid6Lco6aytZiEo0VrWcIxGfc8UyJyspAxo9grDtPwZbS+BBG/0S8Hk9WwYC7wMCyY0aIVEczxNJjK6t408LLAl9EmMtpkRpvK6pNZfSKj/du8pV89OahGBJOWcVxGlIQWODiSUkk8qtcBGE2po6w6TmReEthf2+qFe788TF5P52ox2TEZEcyZXI3kj2kZBzhjSUQb5SYlOqX4C3X3ftkRvyKBjaWBL6vNHtVXJKeeQMGYO6rHSFsBzogWrcWiua7Y5GD5C8ajnri32cOqY2kwk6tRokU51/XpnN7TBDkY4c0wD+MSivAwwMEgZwwfqpsnZ07PA8nqBMljPg8ZpbFWsiOCNZc3VpXGEvEZL9nPiyguY+a4ES/ZjGLTsv3i9Nx1+fO32urot11w29UIdDLB3ezcJ3WC2pfuaavT7Pz6A8tK/uTu5ic/AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Dynamic Map Service Layers Example&quot;
        title=&quot;&quot;
        src=&quot;/static/915b77b930b47e5d9ec4abb65ede8aaf/4b2fe/DynServiceLayers.png&quot;
        srcset=&quot;/static/915b77b930b47e5d9ec4abb65ede8aaf/4b2fe/DynServiceLayers.png 411w&quot;
        sizes=&quot;(max-width: 411px) 100vw, 411px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Dynamic Map Service Layers Example&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For web applications, turning on a group layer to make sub-layers visible is straight forward (if the group isn’t already visible by default). The code below would turn on the ”&lt;em&gt;Points of Interest&lt;/em&gt;” and ”&lt;em&gt;Roads&lt;/em&gt;” group layers based on the sample image:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;DynMapService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setVisibleLayers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Since sub-layer min/max scales are set in this example [as noted in square brackets], as you zoom in/out, different sub-layers will toggle automatically based on their default settings. There is no need to determine which sub-layers are meant to be on/off in your application code.&lt;/p&gt;
&lt;p&gt;However… the Print Service doesn’t &lt;em&gt;exactly&lt;/em&gt; work the same way.&lt;/p&gt;
&lt;p&gt;The Print Service will query the map service’s visible layers (DynMapService.visibleLayers) - in our case, layer 0 and 3 have been coded as the only visible layers. The result of this query will update the JSON web map parameter in the Export Web Map task. Since the sub-layers aren’t included in the JSON string, they will not be available in the export.&lt;/p&gt;
&lt;h2&gt;Not a Bug&lt;/h2&gt;
&lt;p&gt;To be clear, the ArcGIS JavaScript API Printing Group Layers issue is technically not a bug. More of a lesson learned and heads-up that you should keep this in mind when writing your application with potential printing requirements. You can completely work around this issue by specifying the sub-layers in your code as well:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;DynMapService&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setVisibleLayers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Turning on the sub-layers by code will not override the max/min settings. So specifying as visible should still give the desired results in both the application and printouts. Again, just like turning on/off a layer that is out of scale range in ArcMap will not visually show the layer if outside the min/max range.&lt;/p&gt;
&lt;p&gt;Specifying the sub-layers is great if you are controlling the visibility in code, but what about users? If you have a more complicated scenario where you’ve created a Table of Contents only showing the group layers (for users to check on/off). If this is the case, you will need to programmatically find the sub-layers so the Print Service knows to request them. Here are a few ways to accomplish this:&lt;/p&gt;
&lt;h3&gt;Method 1: All layers and sub-layers in one request&lt;/h3&gt;
&lt;p&gt;Get the structure of all layers in the map service, including group layers and sub-layers (if exist). A benefit of this approach is that you can send one request to the service as the application loads and store the settings for future use. To get the details, use the following syntax:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;domain&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;MapService&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;MapServer&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;f&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;json&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The result is a JSON object of the entire service including the layers, and sub-layers for a parent (aka group). So we could find the layer ID for Roads (layer id 3), it will have the following sub-layer property:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;subLayerIds&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Method 2: Unique Layer Request for Sub-Layers&lt;/h3&gt;
&lt;p&gt;If you just want to get the details for a specific layer you can just send the request specifying the layer. This is great if you want to see what type of layer is it (group, feature, etc) and reduce the size of the response (if you have a large/complex map service). Just specify the layer ID including the JSON parameter:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;domain&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;MapService&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;MapServer&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt;f&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;pjson&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The returned JSON data will look like the following (more info is available but not shown):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;currentVersion&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10.3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Roads&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Group Layer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;geometryType&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;copyrightText&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;parentLayer&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;subLayers&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Roads - local&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Roads - mid&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Roads - overview&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
...&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Well, that’s about it. If you still think you are hallucinating, maybe ask your roommate what’s in those brownies sitting on the table!?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Printing with ArcGIS for Server 10.3]]></title><description><![CDATA[My relationship with the ArcGIS Server Print Service and the REST API was a little more turbulent than expected. Here’s how it all started…]]></description><link>https://www.spatialtimes.com/2015/04/printing-with-arcgis-for-server-10-3/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/04/printing-with-arcgis-for-server-10-3/</guid><pubDate>Sun, 19 Apr 2015 21:17:08 GMT</pubDate><content:encoded>&lt;p&gt;My relationship with the ArcGIS Server Print Service and the REST API was a little more turbulent than expected. Here’s how it all started…&lt;/p&gt;
&lt;p&gt;Like many relationships these days, we met online. If you are like me, the &lt;a href=&quot;https://developers.arcgis.com/javascript/&quot;&gt;Esri JS site&lt;/a&gt; is a great place to browse, and hopefully find what you are looking for. And I will admit, this wasn’t my first time. Maybe we moved too fast in the beginning - dinner and some sample code, brunch and a PDF export. It was so easy and comfortable. And that’s when it all started to go sideways.&lt;/p&gt;
&lt;p&gt;After a short while, I wanted our relationship to be more secure. We could both print with other people, but I wanted it to be somewhat safe, and dare I say, protected. I looked into some &lt;a href=&quot;http://server.arcgis.com/en/server/&quot;&gt;self help books&lt;/a&gt; on how to address this and thought I had found a way to take us to the next level. It was a &lt;em&gt;token&lt;/em&gt; at this point, short or long, only time and more experience could tell.&lt;/p&gt;
&lt;p&gt;This isn’t a new story, we’ve all been down this path before, my Ex, which we can refer to as “ADF”, didn’t print with me for years, but we eventually made a secure connection - but it was already too late as I had stopped using SOAP. But now, things were looking up. A mature [software] package and many RESTful nights had me thinking this was it! Communication was strong, and flexible - but as in all relationships, you really need to work at it. Here are some lessons learned, and where I drop the corny relationship analogies…&lt;/p&gt;
&lt;h2&gt;Environment Configuration&lt;/h2&gt;
&lt;p&gt;The workarounds and issues described below are all based on the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArcGIS for Server 10.3 - all patches as of April 10, 2015&lt;/li&gt;
&lt;li&gt;ArcGIS JS API 13.3 (latest release as of tests)&lt;/li&gt;
&lt;li&gt;Esri DotNet Proxy v1.1 beta&lt;/li&gt;
&lt;li&gt;Custom PrintingTools service (to support different layout)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Method 1: Secure Map and Print Service with Long Tokens&lt;/h3&gt;
&lt;p&gt;If you specify a long token for your app, remember that this will not work with the OTB Print Service directly. The documentation is pretty clear on this, and does explain how to setup a custom print service with credentials.&lt;/p&gt;
&lt;p&gt;If you follow the documentation setup for a &lt;a href=&quot;http://server.arcgis.com/en/server/latest/create-web-apps/windows/printing-maps-that-contain-secured-services.htm#ESRI_SECTION1_36E5531BFB8B45F88EA1E03DF2D3557B&quot;&gt;custom Print service with credentials&lt;/a&gt;, you should be up and printing in no time. However, it will only work for 60 minutes on a default AGS installation. More specifically, every thread request will fail after 60 minutes from first request or starting the service. The issue is that the custom service will not request a new token with the stored credentials unless the service is restarted or recycled. After working with support, it is an official bug (BUG-000086183) that will be fixed in 10.3.1. [someone may have already found the bug, but first I heard of it]&lt;/p&gt;
&lt;p&gt;If you can’t wait for the 10.3.1 bug fix (which will be release in May), here are two workarounds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Change the Print Service recycle time to 1 hour to match the default short token time (short tokens are 60 minutes by default). If your recycle time is different, you will need match it to your current setting. If recycle time is &amp;#x3C;= 60 minutes already, it should already be working without issue.&lt;/li&gt;
&lt;li&gt;[or] Modify the maximum length of short-lived tokens in AGS Manager (Security &gt; Token Settings) to match your recycle time. The issue with this approach is that it impacts all short tokens in ArcGIS server, not just this service.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Method 2: Secure Map and Print Service with Short Tokens and Proxy&lt;/h3&gt;
&lt;p&gt;As I worked with Esri support on the issue above, I decided to play with the short token approach. The documentation for &lt;a href=&quot;http://server.arcgis.com/en/server/latest/create-web-apps/windows/printing-maps-that-contain-secured-services.htm#ESRI_SECTION1_93EEF432A049404A8E29B4D24934CAB3&quot;&gt;printing with short term tokens&lt;/a&gt; appeared to be much easier. No need to embed credentials in a customized print service. However, it didn’t work either?!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you secure your services using short-term tokens (the default), the user will be challenged to provide the name and password upon opening the web app. The token is then passed to the PrintingTools service when the user requests a map to be printed. There is no need to create a custom print service (as described below) if you are using short-term tokens. ~ &lt;a href=&quot;http://server.arcgis.com/en/server/latest/create-web-apps/windows/printing-maps-that-contain-secured-services.htm&quot;&gt;Esri help&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Confused, since the help says “there is no need to create a custom print service…”, I thought I found a second bug in as many days. But reading it again, the kicker is that a “user will be challenged to provide the name and password”. If a user provides the credentials, yes, it will work. My setup using the proxy with short tokens was the culprit. I don’t want users to provide passwords - Now what?&lt;/p&gt;
&lt;p&gt;The current version of the proxy (1.1b) will request a token to access the secure map and print services which works great for the JavaScript application. However, since the proxy sends referer information, the token is tied to that referer (even if your proxy and AGS are on the same server). Although not an issue for application, it is a big issue for the Print Service since it will send its own request for a map without a referer - so the request is rejected by the map service.  [If my spelling of “referer” appears wrong, &lt;a href=&quot;http://en.wikipedia.org/wiki/HTTP_referer&quot;&gt;here is a short history&lt;/a&gt; on the typo.]&lt;/p&gt;
&lt;p&gt;So how do I use short tokens in the application yet still use the ArcGIS Server Print Service without users typing in passwords - here are a few workarounds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use the custom print service with credentials stored for printing from Method 1, and a short token for the application via the proxy. It’s a hybrid, but it works (must also implement one of the workarounds previously mentioned).&lt;/li&gt;
&lt;li&gt;[or] Modify the proxy. Some C# Kung Fu and you can remove the referer as short tokens don’t require one be provided. Although the downside is you will be out of the loop for any fixes/updates to the Esri version.&lt;/li&gt;
&lt;li&gt;[or] Surrender the approach and have users authenticate in the app. The downside is that your users are required to have a user/pw. Pro is that you can control access and use the short token approach.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Just wait until users have 3D printers!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Collector 10.3 for iOS]]></title><description><![CDATA[It’s finally here. With little fanfare (relative to Apple Watch and the all-new MacBook earlier this week), the iOS release of ArcGIS…]]></description><link>https://www.spatialtimes.com/2015/03/arcgis-collector-10-3-for-ios/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/03/arcgis-collector-10-3-for-ios/</guid><pubDate>Thu, 12 Mar 2015 21:49:40 GMT</pubDate><content:encoded>&lt;p&gt;It’s finally here. With little fanfare (relative to Apple Watch and the all-new MacBook earlier this week), the iOS release of ArcGIS Collector 10.3 has finally arrived. A little surprised there was no mention on Esri’s blog - although to be fair, there might be some Dev-Summit hangovers. Regardless, the update finally appeared in the App Store (in Canada).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 748px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/277fe0b8a2479c2ab1be5b63b804ceab/be2a9/Collector103ios.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.00000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABqElEQVR42n2SSY7UMBSGcy64BoI+AnuuxQGQaNjAigViAR07nocMrqSKJpWUHNuxWxVXlRgkvsXTk6Xf739DMa+x9/G0xpRiuhJjvCX/objD9k05vsSR/5xarXRdG2OGYei6TmttjEm/EWNa10sSYyqef+pfvdd33+wHeagpIpTVdd11nZQSALDb7S71N/FpSbhJnx8SrJMPqXh2371+J198dV/MNO37x3EchsE5F0Lw3q+50BUX0q857cf0OKewpuJjM72l4/3gnXPW2hz9hnPOXwkhpH8o9l0jEdgp0batEIIxliNCqKoqQgjnHCEkhAghnE6neZ6tXS5i3bQ/HkpMiBBCSokx5pyDDaUUxphtlGWplOKcM8YAAH3fn8WUUgghYwxv1HVNCAEA8A1Kaf6uLEvOOSGEMaaUMsacVyWlFEJkDWOMcw4hJITcXGitMcZVVVFKtdaHw8Fae7GNEKIbQojcoVKKENI0DUKIMSalpJR+3zgej7fLOYubpoEQZs/ZfJ5ZHhjnPMdpmuZ59t7/Me0QwnLFWrssS95QfnHO5SSX+us8nwA6DpTVKwlksAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;ArcGIS Collector 10.3 for iOS&quot;
        title=&quot;&quot;
        src=&quot;/static/277fe0b8a2479c2ab1be5b63b804ceab/be2a9/Collector103ios.png&quot;
        srcset=&quot;/static/277fe0b8a2479c2ab1be5b63b804ceab/0eb09/Collector103ios.png 500w,
/static/277fe0b8a2479c2ab1be5b63b804ceab/be2a9/Collector103ios.png 748w&quot;
        sizes=&quot;(max-width: 748px) 100vw, 748px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;ArcGIS Collector 10.3 for iOS&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As &lt;a href=&quot;https://www.spatialtimes.com/2015/01/arcgis-collector-10-3-released/&quot; title=&quot;ArcGIS Collector 10.3 Released&quot;&gt;previously mentioned&lt;/a&gt;, ArcGIS Collector 10.3 includes the much requested ability to view and edit related records, as well as the ability to edit version data, and some enhanced settings for “Add-only [new]” or “update only [existing]” editing options.&lt;/p&gt;
&lt;p&gt;iOS 7 or later is required for this latest version, and some of the new features will require the data be published using ArcGIS for Server 10.3 or ArcGIS Online. Even if you don’t use these new features, there is a long list of bug fixes included and well worth the upgrade (&amp;#x3C; 50 MB).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcSDE 10.3 Administration]]></title><description><![CDATA[ArcSDE 10.3 administration has significantly changed. More specifically, ArcSDE no longer exists. Starting at 10.3, there is no more ArcSDE…]]></description><link>https://www.spatialtimes.com/2015/02/arcsde-10-3-administration/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/02/arcsde-10-3-administration/</guid><pubDate>Mon, 23 Feb 2015 23:22:00 GMT</pubDate><content:encoded>&lt;p&gt;ArcSDE 10.3 administration has significantly changed. More specifically, ArcSDE no longer exists. Starting at 10.3, there is no more ArcSDE installer, SDK, or command line tools made available. Fear not, we still get to administer our Enterprise Geodatabase(s), just a new set of tools/scripts to do so. The new admin tools are located in toolbox and/or python commands. But it isn’t all unicorns and rainbows…&lt;/p&gt;
&lt;h2&gt;No support for 9.3 ArcSDE Geodatabases with 10.3 clients (ArcGIS for Desktop, ArcGIS for Server, etc).&lt;/h2&gt;
&lt;p&gt;If your organization is fairly nimble at upgrading ArcGIS Clients (Desktop/Server), but has been keeping the RDBMS/ArcSDE running as a 9.x Enterprise Geodatabase, this environment is not supported with 10.3 clients. There has always been backwards compatibility with the Enterprise Geodatabase, but it doesn’t last forever. 10.2.x was the last version to support ArcSDE 9.x. A note on Esri’s compatibility page states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can connect from an ArcGIS 10.3 client to a 9.3.1 geodatabase to upgrade it; however, the geodatabase must be in a supported database management system release. ~ &lt;a href=&quot;http://desktop.arcgis.com/en/desktop/latest/manage-data/gdbs-in-sql-server/client-sqlserver-compatibility.htm&quot;&gt;Esri&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That all said, if your 9.3 enterprise Geodatabase is still using a supported RDBMS version, it still works! Just because it isn’t officially supported, doesn’t mean it stops working. Although don’t expect any bug fixes, or 10.x new features to work (edit tracking, ArcGIS collector editing, photo attachments…). I’d keep a 9.3 Desktop hanging around just in case - actually, just upgrade your Geodatabase to 10x already.&lt;/p&gt;
&lt;h2&gt;ArcSDE 10.3 Spatial Views with SDEBINARY&lt;/h2&gt;
&lt;p&gt;Sorry, keep forgetting, no ArcSDE 10.3. But on the topic of spatial views, they are still around. In most cases you can create Spatial Views in 10.3 using the new &lt;strong&gt;&lt;a href=&quot;http://desktop.arcgis.com/en/desktop/latest/tools/data-management-toolbox/create-database-view.htm&quot;&gt;Create Database View&lt;/a&gt;&lt;/strong&gt; tool. This tool is available with ArcGIS for Desktop Standard and Advanced (ArcEditor and ArcInfo for us dinosaurs). But be forewarned, &lt;strong&gt;this will &lt;em&gt;not&lt;/em&gt; work with older binary storage types&lt;/strong&gt; (SDEBINARY).&lt;/p&gt;
&lt;p&gt;You can either blame Esri for this limitation, or blame your Geodatabase for it still allowing you to store SDEBINARY (after all those years of being the default spatial type). Either way, it is what it is. Our office was using SDEBINARY but switched to SQL Spatial Types when we upgraded - for many reasons including this one. Just think how happy your DBA will be when there are no more F-tables cluttering the RDBMS Enterprise admin console! Probably not as funny as when you tell them they will need ArcGIS Desktop if they want to fully administer the Geodatabase (or give you more permissions). [If you work in a small office, it’s all you regardless.]&lt;/p&gt;
&lt;h2&gt;ArcSDE 10.3 Service, almost extinct&lt;/h2&gt;
&lt;p&gt;I thought it was finally behind us, the 3-tier Enterprise Geodatabase connection. You can’t create them as easily as a 2-tier connections (aka “direct connect”), but there is still the &lt;strong&gt;&lt;a href=&quot;http://desktop.arcgis.com/en/desktop/latest/tools/data-management-toolbox/create-arcsde-connection-file.htm&quot;&gt;Create ArcSDE Connection File&lt;/a&gt;&lt;/strong&gt; tool that will allow you to connect using a 3-tier connection. Even if you can’t upgrade your Geodatabase, it’s a good time to switch to the 2-tier method - you have little choice if you upgrade to 10.3.&lt;/p&gt;
&lt;h2&gt;Other ArcSDE Admin Commands&lt;/h2&gt;
&lt;p&gt;Here is a list of some additional ArcSDE administration commands and their replacements: &lt;strong&gt;&lt;a href=&quot;http://desktop.arcgis.com/en/desktop/latest/manage-data/administer-gdb-intro/migrate-from-admin-commands.htm&quot;&gt;Migrate from Admin Commands&lt;/a&gt;&lt;/strong&gt;. While you read, grab a coffee - and feel free to use your old ArcSDE install CD as a coaster to get a bit more use out of it.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SpatialTimes 2014 Year in Review]]></title><description><![CDATA[The numbers are finally in, and 2014 was a great year for SpatialTimes.com. Sure it wasn’t a full year, as the first post wasn’t even posted…]]></description><link>https://www.spatialtimes.com/2015/02/spatialtimes-2014-year-review/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/02/spatialtimes-2014-year-review/</guid><pubDate>Mon, 09 Feb 2015 13:50:02 GMT</pubDate><content:encoded>&lt;p&gt;The numbers are finally in, and 2014 was a great year for SpatialTimes.com. Sure it wasn’t a full year, as the first post wasn’t even posted until April, but the year still ended right on time. There were many draft posts at the beginning but it was hard to hit the &lt;em&gt;publish&lt;/em&gt; button as a rookie blogger. Eventually I tossed many of those draft articles as they became stale before they were finished, or I just wasn’t happy with the final product. Overall, the posts continue to be related to what I’m working on or discussing with other Geo-Geeks at the time. So let’s take a look at the SpatialTimes year-ish in review…&lt;/p&gt;
&lt;h1&gt;SpatialTimes: The numbers&lt;/h1&gt;
&lt;p&gt;These numbers are summarized from Google Analytics. They don’t necessarily align with the JetPack stats, but there is already lots of articles on that topic. That said, my learning curve with WordPress has also changed over the year, so some results can be a little misleading at times (which will hopefully be explained).&lt;/p&gt;
&lt;h2&gt;Who are We/You/Us&lt;/h2&gt;
&lt;p&gt;Being the first year, it’s no surprise the user base was mostly New Users (78.5%) compared to returning (21.5%). Total sessions/pageviews has been trending positive every week/month so far - even the Christmas season didn’t stop the trend! As a new blogger, this is very exciting and I hope you keep coming back for more. That said, this blog doesn’t generate revenue, just nice to know we aren’t alone when it comes to GIS.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 751px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/60cce0b92520afc64f36e309231fddf1/9ae5c/ST2014-SessionsPageViews.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 29.599999999999998%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA4ElEQVR42o2Ny07DMBBF/f8fhVgBgaICRWLVSDRpnDhO4okfGU88DiqIBYtKHN3FXdyH8N4ZAEQEAGMMIm5XQFzGcdRal8ej6nsiEnp2quuQSA+DUoqZr5WZmYgiEeKyEq2JReKcUsp5S4kv5juXc+a/urBt+Xdo1/nKRrH9j7CywVUHGgI9SltI99x58bMXVl5WTjnHdPnRgaSLe+Wli6XBao5FY28+4baa7xv7roN08TSjmDAd1PzR27cWns7wUJsXCbvG3FXTawtFPe0lFLUpR3cyvjL+DKGF0Bjf2+ULNxtYCnbBwGYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;2014 Sessions and Views&quot;
        title=&quot;&quot;
        src=&quot;/static/60cce0b92520afc64f36e309231fddf1/9ae5c/ST2014-SessionsPageViews.png&quot;
        srcset=&quot;/static/60cce0b92520afc64f36e309231fddf1/0eb09/ST2014-SessionsPageViews.png 500w,
/static/60cce0b92520afc64f36e309231fddf1/9ae5c/ST2014-SessionsPageViews.png 751w&quot;
        sizes=&quot;(max-width: 751px) 100vw, 751px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;2014 Sessions and Views - Yippee, the dots are headed in the right direction!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The top 10 Countries (by total sessions) held a little more interesting. The US and Canada accounted for over 50% of all visitors, with Brazil coming in 3rd with 12.01% (the only other Country with double digits).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 331px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d366b4f6e3f10d29e8f74e7af1e57cc5/2ba93/ST2014-Country.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 36.5558912386707%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABc0lEQVR42h3BjW6iMAAAYN7/QXabtz812xFnskRXRTihFKFAtUApCoWWKcNLbia73L5P41Vc1DEXkXina3c2fh6Mnq6B9apPH/SXu+GvwfPk9nU2Huu3o6fB3JiwMsxL3JyyhTXVtjsShJuIRBDajutUosw5yxh1HNtYLV0Efd8LsE+TXfdxqkR5qA6NFDTZjsYjLfA3pmmtbcg5T7NMKZVz3qo2SZL5/C2KYoTcpbGqqqrv+6Zp9vt9edh7nncz+KltPLRe23FMzudz3/dd1+V5rpRK09T8bYVR5Psb6LqMMVELKWVRFLWoCNne3T9oOAg8z5NKdV13+q8TQojqgBCyHUgIiaMIh6HrwpgQKWXTNO+tjAl5HA415KHFAqxMC4DZ9GUCFoaPw7oWGGMAQBBg0zRmb2BpLA3DAABkGSs4cyC8uvqhZWlKaYIxFqL++ta27efnX5al0EWU0h0haZLFIa5le7lcjsfjn/6DF4Wu6/8AGEtjmSHvh3wAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;2014 Top 10 Countries&quot;
        title=&quot;&quot;
        src=&quot;/static/d366b4f6e3f10d29e8f74e7af1e57cc5/2ba93/ST2014-Country.png&quot;
        srcset=&quot;/static/d366b4f6e3f10d29e8f74e7af1e57cc5/2ba93/ST2014-Country.png 331w&quot;
        sizes=&quot;(max-width: 331px) 100vw, 331px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;2014 Top 10 Countries&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;These numbers, along with a few others, have changed dramatically since I started blocking more spam site referals over the winter holidays, but they are the only numbers I have at this point. Spam sites also inflated the bounce rate [def: Percent of single-page visits] for the first year, up as high as 53%. The bounce rate is now 17% since updating the htaccess file - thank you Internet machine and Google Search! Below is a chart showing the 2014 to 2015 change in bounce rate after the WordPress updates were complete. The Bounce Rate bounces lower while Sessions continue to flourish. Phew! If you notice sites like “semalt-semalt” clogging your referrals, I’d recommend reading a few articles and forums on the WordPress site on the many ways you can start blocking them from your site and stats. Not only will it help you better understand your visitors and what is really happening on your site, but also helps you dive a deeper into the world of WordPress and the never-ending battle with spam (if so inclined).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 746px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/870e15fa13be3c3b999eb6f73563d228/7e81d/ST2014-BounceRate.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 31.8%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABFElEQVR42lWPyVLDMBBE/f9/xYXFGKqAECobcezEkrzI8khjeSxZohKKA69eH/rWnQBoKSWiMca0ncRxXEKIMV7zH+ec4Px0KpRSlxuJ6KERAkDT7AYpvXOTD0B+CRHnZQmhs878VfIhxhBCiDcTonmmKcZ46G1awXtt0kq/cJMx/VTBV4cZ069cPzN9Vwz73sYYlxBdiNaHxNK8ErBqMGVwBlo1+HiBGum7t1uJH7VpkZieisEWg910o7++uk4jH5Ja24eLumemBCp+1XM+0AnobFyF/gi0V9NhoKOeM4Ec3VZRyrG1LqlHV/bmKNpSGa6nQuoda849MrC7qlkXLG+HWtu8ljkTn6zftPhWNpuSr7n6AXf+UQleBUqCAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;2014 Bounce Rate Fixed in December&quot;
        title=&quot;&quot;
        src=&quot;/static/870e15fa13be3c3b999eb6f73563d228/7e81d/ST2014-BounceRate.png&quot;
        srcset=&quot;/static/870e15fa13be3c3b999eb6f73563d228/0eb09/ST2014-BounceRate.png 500w,
/static/870e15fa13be3c3b999eb6f73563d228/7e81d/ST2014-BounceRate.png 746w&quot;
        sizes=&quot;(max-width: 746px) 100vw, 746px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;2014 Bounce Rate Fixed in December (Bounce rate bounces lower while Sessions continue to flourish)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Top posts&lt;/h2&gt;
&lt;p&gt;Here are the top 3 posts of 2014. Why 3? It’s more than 2, and less than 4 - for more details on my logic, I recommend watching &lt;em&gt;Monty Python and the Holy Grail&lt;/em&gt; - repeatedly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;#1&lt;/span&gt;&lt;/strong&gt; - &lt;a href=&quot;https://www.spatialtimes.com/2014/11/arcgis-collector-external-gps-options/&quot; title=&quot;ArcGIS Collector External GPS Options&quot;&gt;ArcGIS Collector External GPS Options&lt;/a&gt;: Although posted in late November, this quickly jumped up to be the most popular post in 2014. An odd time of year (in Canada) to start posting on field collection, but I had a great time researching and writing on the topic. At work we still use the iPad + Collector + External GPS combination and are very happy with the results so far. More posts on this topic once the snow has melted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;#2&lt;/span&gt;&lt;/strong&gt;- &lt;a href=&quot;https://www.spatialtimes.com/2014/06/shapefile-vs-feature-class/&quot; title=&quot;Shapefile vs Feature Class&quot;&gt; Shapefile vs. Feature Class&lt;/a&gt;: The second most popular post, and for good reason - it can be confusing! I’ve been talking/teaching about this one for years and always makes for good trivia. With the resilience of the shapefile, this might be popular for while yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;#3&lt;/span&gt;&lt;/strong&gt; - &lt;a href=&quot;https://www.spatialtimes.com/2014/04/feature-class-export-into-native-sql-server-table/&quot; title=&quot;Feature Class export into native SQL Server table&quot;&gt;Feature class export into native sql server table&lt;/a&gt;: ArcPy, SQL Server, and ST_Geometry - yes please. I was a little surprised with this one since it is more code/dev focused. But I do enjoy writing code (html, js, python, sql), and it seems you do too! So more to come in 2015.&lt;/p&gt;
&lt;h2&gt;The Browser Wars&lt;/h2&gt;
&lt;p&gt;An overwhelming 60% of visitors are using Google’s Chrome browser to visit SpatialTimes.com. I use all 4 of the top browsers, and my usage breakdown is very similar. It’s troubling, but if one was to breakdown the IE usage, you don’t want to know how many people are still using IE 6-8.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 322px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8baca39d865efaf1c9d83bf597d3efe7/cb861/ST2014-BrowserMix.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.422360248447205%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACHUlEQVR42nWS609ScRjH+dd64drKcmQUazm37J3rTZfVVlubTUA9cDjg3AzngsNtnAO4IWalIhdR8FxEajoNZ54LZx5xLBPkcn6/BhHgsuft8/t+n+/zez4q+LcAABDC4pkYX6QIW3RhLZfeleRiqd36t1RtJYAgcxiyR4deP3v5RGM1ujcRH23xs8mvYrMJrhb/Mab2CMTTZ1t6MOV8OjLstvqoybkMRjJ6VyqW4VrPLluoAFAghMe/craVQcR7f3p+wBYe0L2aQl0MFmAxkjYTNOLdFOQzBcIjqZDnOY7jKtVaR7ydcNtn7zrDQzOfB9+vapHptyacxYIMStAYSeudqcgWB2tVmePzebFwegpasZtJvhnGordvLT+6Fx7WBN+oHcbHZh+FkSxKUChBGVwpf2wfls6LPMeLvHxy0o7dEGdNE4EbPV80/RG1erm31z6Oo3NZM0GjBG0m6TF3OhjdV2BZkHO1GujauV6HEOZ8Xm/PtY/a/pU7Nx0TM6b5XaylZEZnl54b/YksDwHIC3lJki4qlUuTz0Uh9lAb7bvueWdBQzsYQZnJxsIoQSHeFOJZL/wsKVUgHIkHhwfl8kXXqZTGn+UCPseLEevC3mSAtfgZzM9gJNOY7FhLbv+4EpUOJFCpx9nv43jc4NrQu1I6fGMUX9d9WI2kd5Sme4ulrmurOngqCgRAkORPiYwzlMRDycX4liDJ/6cT/gaDDU8e9dARrwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;2014 Browser Usage&quot;
        title=&quot;&quot;
        src=&quot;/static/8baca39d865efaf1c9d83bf597d3efe7/cb861/ST2014-BrowserMix.png&quot;
        srcset=&quot;/static/8baca39d865efaf1c9d83bf597d3efe7/cb861/ST2014-BrowserMix.png 322w&quot;
        sizes=&quot;(max-width: 322px) 100vw, 322px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;2014 Browser Usage&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is one reason why we are still developing websites that require so much backwards compatibility I guess. The total browser numbers do combined both mobile and desktop usage- however at this point mobile only accounts for 9.23% of total traffic. Take these results, along with time of day numbers, and it seems like most are reviewing on their work desktop. Makes sense, as I’d imaging there are more GIS industry people than weekend tinkerers. [Full Disclosure: I’m both]&lt;/p&gt;
&lt;h2&gt;Now What?&lt;/h2&gt;
&lt;p&gt;Back to the grind all 72.14% of you reading this at work. Or maybe add this site to your &lt;em&gt;Feedly&lt;/em&gt; list, or your bookmarks if you haven’t already - or read a few more posts while you are here. A special thanks to all the SpatialTimes readers/followers for a great 2014, and looking forward to more in 2015!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Unexpected Google Announcements]]></title><description><![CDATA[A few big announcements from Google over the past few weeks. First, Google announced that support for the Google Maps Engine product will…]]></description><link>https://www.spatialtimes.com/2015/02/unexpected-google-announcements/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/02/unexpected-google-announcements/</guid><pubDate>Tue, 03 Feb 2015 08:00:46 GMT</pubDate><content:encoded>&lt;p&gt;A few big announcements from Google over the past few weeks. First, Google announced that support for the Google Maps Engine product will end on January 29th, 2016. And this past Friday, Google also announced an update to the Google Earth Pro software… it’s now free. That’s right, free as in beer! In a somewhat unexpected move Stafford Marquardt, Product Manager, Google Earth Pro announced the change on [Google’s Lat Long blog](Stafford%20Marquardt, Product Manager, Google Earth Pro). Over the weekend, Esri sent their users an email to let them know Google &amp;#x26; Esri have a plan to deal with these recent changes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In coordination with Google, Esri has prepared a special offer for Google Earth Enterprise and Google Maps Engine customers and partners looking to transition to Esri software. ~ &lt;a href=&quot;http://www.esri.com/landing-pages/products/google-lp&quot;&gt;Esri&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The “coordination” is based on a no-cost replacement for Google Earth Enterprise and Google Maps Engine with Esri products and/or services for one year. You can find more details on the software/fees on &lt;a href=&quot;http://www.esri.com/landing-pages/products/google-lp/common-questions&quot;&gt;Esri’s FAQ page&lt;/a&gt;. To start using Google Earth Pro for free, head over to &lt;a href=&quot;https://geoauth.google.com/gev0/free_trial.html&quot;&gt;Google’s Key Request page&lt;/a&gt; to sign up.&lt;/p&gt;
&lt;p&gt;The end of Google Map Engine is a sad one. I’ve only used it on a few projects, but it has always been a very powerful way to make custom web applications (along with Google basemap styling options too).  I only hope the lack of a major competitor doesn’t slow innovation in this vertical - so keeping pushing forward Esri, CartoDB, Mapbox, and  iSpatial (to name a few)!&lt;/p&gt;
&lt;p&gt;Wait, while we’re at it, will someone replace Google Reader too?!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Collector 10.3 Released]]></title><description><![CDATA[ArcGIS Collector 10.3 has just been released for Android OS, and will soon be available for iOS users as well. ArcGIS Collector 10.3 is more…]]></description><link>https://www.spatialtimes.com/2015/01/arcgis-collector-10-3-released/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/01/arcgis-collector-10-3-released/</guid><pubDate>Fri, 30 Jan 2015 16:15:38 GMT</pubDate><content:encoded>&lt;p&gt;ArcGIS Collector 10.3 has just been released for Android OS, and will soon be available for iOS users as well. ArcGIS Collector 10.3 is more than just bug fixes - it has many of the features we’ve been waiting for. Probably one of the biggest enhancements is the ability to work with related records. Don’t jump in too quick however, there is a known bug involving archive enabled related records that Esri is aware of, and has stated that a patch is on its way shortly. ArcGIS Collector fans will also be able to edit versioned data starting at this release. Side note: Using versioned data is technically an enhancement, but it was more of a bug that it wasn’t incorporated until now - my humble opinion of course. Water under the bridge, as it’s finally here and can now be part of the same enterprise workflows (AKA ArcSDE) many have been using over the past 15 years.&lt;/p&gt;
&lt;p&gt;If you are using ArcGIS Collector on Android: Time to update the app! For Apple users, myself included, be patient as Apple traditionally gets apps first, so it’s our turn to wait a few days. Patiently.&lt;/p&gt;
&lt;p&gt;The list of what’s new from the &lt;a href=&quot;http://doc.arcgis.com/en/collector/&quot;&gt;Collector for ArcGIS site&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ability to view and edit related records
&lt;ul&gt;
&lt;li&gt;Finally! Let’s pause here for a second… Doesn’t that feel better?!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Support for taking additional data offline, including:
&lt;ul&gt;
&lt;li&gt;Hosted tile layers (Tiled web layers hosted on AGOL account)&lt;/li&gt;
&lt;li&gt;Editable versioned data (from ArcGIS for Server 10.3 or later)&lt;/li&gt;
&lt;li&gt;Layers with editor tracking&lt;/li&gt;
&lt;li&gt;Layers with limited feature service capabilities, including add-only and update-only editing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Various bug fixes and improvements, including NIM101011, NIM101989, NIM102096, NIM103498, NIM103525, NIM103549, NIM103836, NIM104130, and BUG-000083110&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Migrating to ArcGIS for Desktop 10.3]]></title><description><![CDATA[If you are migrating to ArcGIS for Desktop 10.3, there are a few additional steps not covered in the install guide. That said, if you are…]]></description><link>https://www.spatialtimes.com/2015/01/migrating-arcgis-desktop-10-3/</link><guid isPermaLink="false">https://www.spatialtimes.com/2015/01/migrating-arcgis-desktop-10-3/</guid><pubDate>Wed, 14 Jan 2015 16:52:02 GMT</pubDate><content:encoded>&lt;p&gt;If you are migrating to ArcGIS for Desktop 10.3, there are a few additional steps not covered in the install guide. That said, if you are looking for those step by step instructions on installing or migrating to ArcGIS for Desktop 10.3, you can check them out &lt;a href=&quot;http://desktop.arcgis.com/en/desktop/latest/get-started/installation-guide/introduction.htm&quot;&gt;here&lt;/a&gt; - they are straight forward and will help you get up and running.&lt;/p&gt;
&lt;p&gt;Err… now what? Are we done already? That part is up to you…&lt;/p&gt;
&lt;p&gt;Here are 6 additional steps to consider before calling it a day. Disclaimer: Some of these are done automatically if “upgrading” an existing 10.1 or 10.2 installation, some aren’t. If you use Citrix or other terminal server approach, the regular upgrade only does the user account that performed the upgrade and not the other users’ individual settings. Either way, worth checking out the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Install additional grid shift files&lt;/strong&gt; (AKA: transformation files) for your country. If you work in Canada and never done this before, I hope you haven’t reprojected from NAD27 to NAD83 (it still runs, but it probably didn’t reproject they way you hoped). Here are instructions for Canadian users (check with your local distributor if your country is also affected):
&lt;ul&gt;
&lt;li&gt;What you need: NTv2 grid files (*.gsb), you can download directly from &lt;a href=&quot;http://esri.ca/en/content/ntv2-request&quot;&gt;Esri Canada&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Where to put the files: Place the files in &lt;em&gt;&amp;#x3C;ArcGIS Install&gt;\pedata\ntv2\canada&lt;/em&gt;. You will need to create the “canada” folder. Make sure you use all small case letters. Copy the *.gsb files directly into this folder and the new transformation(s) will be available next time you need them if the transformation is already setup in the software.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom map templates&lt;/strong&gt;: Wish your company map templates with logo, disclaimer, and north arrow were available to all users when ArcMap launched?  Me either - but corporately it’s still a good idea.
&lt;ul&gt;
&lt;li&gt;What you need: Create a template MXD with your logo and other flair including auto-update text. Possibly create 3: landscape, portrait, and large plotter templates.&lt;/li&gt;
&lt;li&gt;Where to put the files: Place the files in &lt;em&gt;&amp;#x3C;ArcGIS Install&gt;\MapTemplates&lt;/em&gt;. The templates will now be available when loading ArcMap on the start-up screen and also available on the layout toolbar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom transformation files&lt;/strong&gt;? If you want to transform to/from NAD83 original and CSRS (as one example), you can create a custom transformation since this one isn’t covered OOTB.
&lt;ul&gt;
&lt;li&gt;What you need: To make a custom transformation file you can use a tool in the ArcToolbox: Create Custom Geographic Transformation (Data Management).&lt;/li&gt;
&lt;li&gt;Where to put the files: Place the final file (.gtf) inside &lt;em&gt;&amp;#x3C;WindowsUser&gt;\AppData[Roaming|Local]\ESRI\Desktop10.3\ArcToolbox\CustomTransformations&lt;/em&gt;. If the ArcToolbox folder doesn’t exist, you can open Toolbox inside ArcCatalog or ArcMap once and the structure will be created.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ArcCatalog mapped folders and database connections&lt;/strong&gt;: Your database connection files can be copied from your old installation to the new one. Only downside here is that these need to be done on a user by user basis (every user on terminal/Citrix servers). Good news - you can do both database connections and mapped folders for ever user.
&lt;ul&gt;
&lt;li&gt;What you need: Find your old connection files from your Windows user directory. The &lt;em&gt;ArcCatalog.gx&lt;/em&gt; file stores all mapped folders; *.sde, *.ims, *.ags, *.odc files store database and web connections (one file for each connection):
&lt;ul&gt;
&lt;li&gt;9.3: &lt;em&gt;&lt;WindowsUser&gt;\AppData[Roaming|Local]\ArcCatalog&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;10.1-10.2 (10.x): &lt;em&gt;&lt;WindowsUser&gt;\AppData[Roaming|Local]\ESRI\Desktop10.x\ArcCatalog&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Where to put the files: Place the files into the newly created 10.3 user directory. Note: Open ArcCatalog once in advance to create the directory structure for you. Paste the files to: &lt;em&gt;&amp;#x3C;WindowsUser&gt;\AppData[Roaming|Local]\ESRI\Desktop10.3\ArcCatalog&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Note: If using SDE Application connections (3 tier SDE Service connections) it’s recommended to switch to using the Direct Connection method. In this case, don’t copy the *.sde files, just recreate them using the Direct Connect method from ArcCatalog.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Home Directory&lt;/strong&gt;: Setup/verify your “home” location for the ArcMap Catalog window, then reinstall add-ins, custom toolboxes/tools, python scripts to name a few.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for patches and service packs&lt;/strong&gt;: Last but not least, check to see if there are any &lt;a href=&quot;http://support.esri.com/en/downloads/patches-servicepacks/list/productid/160&quot;&gt;patches or services packs available&lt;/a&gt;. Yes, there are already two available at time of writing (Jan 14, 2015):
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://support.esri.com/en/downloads/patches-servicepacks/view/productid/160/metaid/2152&quot; title=&quot;ArcGIS 10.3 (Desktop, Engine, Server) Geodesic Buffer Method Patch&quot;&gt;Geodesic Buffer Method Patch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://support.esri.com/en/downloads/patches-servicepacks/view/productid/160/metaid/2166&quot; title=&quot;ArcGIS 10.3 for (Desktop, Engine, Server) Spatial Statistics and Space Time Pattern Mining Patch&quot;&gt;Spatial Statistics and Space Time Pattern Mining Patch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Happy upgrading!&lt;/p&gt;
&lt;h2&gt;More information:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://desktop.arcgis.com/en/desktop/latest/get-started/installation-guide/introduction.htm&quot;&gt;Esri: Install ArcGIS 10.3 page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://esri.ca/en/content/ntv2-request&quot;&gt;Esri Canada NTv2 grid files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://desktop.arcgis.com/en/desktop/latest/get-started/installation-guide/minimum-system-requirements-.htm&quot;&gt;Esri: System requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://support.esri.com/en/downloads/patches-servicepacks/list/productid/160&quot;&gt;Esri: Patches and Service Packs for 10.3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Javascript API 3.12 Released]]></title><description><![CDATA[It’s only been a few months, but Esri has already released ArcGIS Javascript API 3.12. Phew! Normally, this isn’t a big deal - but if you…]]></description><link>https://www.spatialtimes.com/2014/12/arcgis-javascript-api-3-12-released/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/12/arcgis-javascript-api-3-12-released/</guid><pubDate>Mon, 29 Dec 2014 13:52:13 GMT</pubDate><content:encoded>&lt;p&gt;It’s only been a few months, but Esri has already released ArcGIS Javascript API 3.12. Phew! Normally, this isn’t a big deal - but if you were trying to use the Measure Tools in 3.11, this change couldn’t come sooner (it didn’t work in 3.11). There are also many exciting and notable updates in this release, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Two new basemaps options: Terrain (updated) and Dark Gray (new)&lt;/li&gt;
&lt;li&gt;The HeatmapRenderer is now released (no longer beta)&lt;/li&gt;
&lt;li&gt;10 new analysis widgets&lt;/li&gt;
&lt;li&gt;Improvements to labelling for non-web mercator (and GCS) spatial references&lt;/li&gt;
&lt;li&gt;New &lt;a href=&quot;https://developers.arcgis.com/javascript/jsapi/dataadapterfeaturelayer-amd.html&quot;&gt;DataAdapterFeatureLayer &lt;/a&gt;and &lt;a href=&quot;https://developers.arcgis.com/javascript/jsapi/locatorlocationprovider-amd.html&quot;&gt;Location Provider&lt;/a&gt; (beta): A great addition that enables visually displaying a tabular dataset that doesn’t contain spatial information.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.arcgis.com/javascript/jsapi/featuretable-amd.html&quot;&gt;FeatureTable widget&lt;/a&gt;&lt;/strong&gt; (beta): A great new beta feature that we’ve all been waiting for - a new widget that displays your features in a table format, and can be used both with and without a map!&lt;/li&gt;
&lt;li&gt;Bug fixes: If you were exited for the 3.11 updates/enhancements to the measurement widget mentioned in my &lt;a href=&quot;https://www.spatialtimes.com/2014/10/arcgis-javascript-api-3-11-released/&quot; title=&quot;ArcGIS Javascript API 3.11 Released&quot;&gt;ArcGIS Javascript API 3.11 release post&lt;/a&gt; (among other fixes), but were saddened to find out the measurement widget actually broke at 3.11, these fixes are for you!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are many more new and enhanced features in the ArcGIS Javascript API 3.12 release. For the full list of updates, jump to Esri’s &lt;a href=&quot;https://developers.arcgis.com/javascript/jshelp/whats_new.html&quot;&gt;What’s new in Version 3.12&lt;/a&gt; page (links to most recent what’s new page).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS 10.3 and ArcGIS Pro are released]]></title><description><![CDATA[That’s right, ArcGIS 10.3 (ArcGIS for Desktop, ArcGIS for Server, etc), and ArcGIS Pro are now officially released. In a post from Esri…]]></description><link>https://www.spatialtimes.com/2014/12/arcgis-10-3-arcgis-pro-released/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/12/arcgis-10-3-arcgis-pro-released/</guid><pubDate>Fri, 12 Dec 2014 10:01:22 GMT</pubDate><content:encoded>&lt;p&gt;That’s right, ArcGIS 10.3 (ArcGIS for Desktop, ArcGIS for Server, etc), and ArcGIS Pro are now officially released. In a &lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2014/12/10/arcgis-10-3-the-next-generation-of-gis-is-here/&quot;&gt;post from Esri&lt;/a&gt;, they announced it is (finally) here. Although this is primarily a large service pack for Desktop 10x users, there is also many new features. On the Server side, there have been some significant improvements as well, including ArcGIS Portal now being included with ArcGIS for Server! That’s right, you can make your own AGOL! And I almost forgot, Pro comes in this release 😉&lt;/p&gt;
&lt;p&gt;Here are some of the new enhancements to look forward to as you watch your download progress bar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new Space time pattern mining toolbox&lt;/li&gt;
&lt;li&gt;Buffer and Spatial join tools have planar and geodesic distance options&lt;/li&gt;
&lt;li&gt;New &lt;a href=&quot;http://desktop.arcgis.com/en/desktop/latest/tools/data-management-toolbox/an-overview-of-the-geodatabase-administration-toolset.htm&quot;&gt;Geodatabase Administration tools&lt;/a&gt; added (9 tools)&lt;/li&gt;
&lt;li&gt;Many tools have new parameters and enhancements&lt;/li&gt;
&lt;li&gt;ArcGIS for Server (Std/Adv) comes with Portal for ArcGIS, including &lt;a href=&quot;http://doc.arcgis.com/en/web-appbuilder/&quot;&gt;Web AppBuilder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Many GeoEvent Extension updates&lt;/li&gt;
&lt;li&gt;10.3 includes Python 2.7.8 (Not ArcGIS Pro, it uses v3.x)&lt;/li&gt;
&lt;li&gt;Support added for 1.0 OGC GeoPackage format&lt;/li&gt;
&lt;li&gt;Many new raster functions&lt;/li&gt;
&lt;li&gt;LAS version 1.4 files now supported&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some changes for Enterprise Geodatabases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ArcSDE administration command line utilities are no longer available with ArcGIS for Server&lt;/li&gt;
&lt;li&gt;Connections to 10.3 enterprise databases are Direct Connect only as the ArcSDE application server will not be available for 10.3 GDBs&lt;/li&gt;
&lt;li&gt;Default connection limitations (64 connections) have been removed - now has no limits set&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy downloading!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Collector External GPS Options]]></title><description><![CDATA[I’ve seen enough demos and presentations of ArcGIS Collector over the past year that I think it’s time to take a more in-depth look into…]]></description><link>https://www.spatialtimes.com/2014/11/arcgis-collector-external-gps-options/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/11/arcgis-collector-external-gps-options/</guid><pubDate>Mon, 24 Nov 2014 08:51:53 GMT</pubDate><content:encoded>&lt;p&gt;I’ve seen enough demos and presentations of ArcGIS Collector over the past year that I think it’s time to take a more in-depth look into what it has to offer. This may have something to do with our old GeoExplorer finally retiring after 8 years of great service. Do I replace the Geo with a new one running ArcPad or TerraSync? Or do I switch to an ArcGIS Collector based option? Either way, it was time to review some of the more recent GPS options available in the market.&lt;/p&gt;
&lt;p&gt;For us, it’s a pretty easy decision based on the user requirements: ArcGIS Collector. However, this isn’t the solution for everyone, and our requirements aren’t exactly typical. We have the infrastructure, Esri licenses, basic field data collection needs, with accuracy requirements ranging from 30cm to 5m. This accuracy range will be discussed in more detail - since it’s the one variable that has lots of options and configurations. So let’s get started with some of our ArcGIS Collector External GPS Options…&lt;/p&gt;
&lt;h2&gt;The Requirements&lt;/h2&gt;
&lt;p&gt;When reviewing our ArcGIS Collector External GPS Options, I quickly realized there is an abundance of… options! Too many really. So first things first - back to the requirements and possible use cases. Since we still have other hardware and software that is field worthy (ArcPad, ArcMap, Laptops, Toughbooks), selecting an external GPS that can be leveraged by multiple devices also seems like a good idea. In summary, here are the GPS requirements we ended up with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Must have Bluetooth connectivity
&lt;ul&gt;
&lt;li&gt;Note: Some GPS device compatibility differs by connection method, the compatibility requirements below are based on Bluetooth only. USB connectivity is a bonus but not required.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mobile OS connectivity: iOS and Android&lt;/li&gt;
&lt;li&gt;Desktop OS connectivity: Windows 7/8 for laptop/toughbook use&lt;/li&gt;
&lt;li&gt;Compatible Software: ArcGIS Collector, ArcPad, ArcMap&lt;/li&gt;
&lt;li&gt;Satellite Systems: GPS and GLONASS. We require both systems due to better response under canopy cover (better chance of seeing more satellites).&lt;/li&gt;
&lt;li&gt;Location Protocols: NMEA and Apple protocols (to support software requirements).&lt;/li&gt;
&lt;li&gt;Accuracy (CEP): 30cm to 5m - varies depending on activity.
&lt;ul&gt;
&lt;li&gt;Must be attainable in the field without using post-processing afterwards.&lt;/li&gt;
&lt;li&gt;No subscription service. It would definitely help (on-the-fly correction), but due to the vary in seasonal use, and budget constraints, we had to forgo at this point. Not many options either - although I hear Trimble will be releasing something in the near future.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Hardware&lt;/h2&gt;
&lt;p&gt;The Apple/Android tablet debate isn’t something I want to get into. Talk to your resident [OS] fanboy for more information. If you have a mobile OS preference - go for it. If you have a company standard - stick with it. Since Apple controls its hardware and a similar Android tablet was more expensive, we ended up selecting Apple’s iPad Air (Cellular + Wi-Fi model). There are many similar Android tablets, but if you want to use the internal GPS, different Android devices have different specs so select with caution. With Apple, you get &lt;em&gt;the&lt;/em&gt; GPS chip they provide.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 407px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/035226a95c007ffe50100ec8a8fdf69b/fc7bc/gps-ipads.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 14.98771498771499%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAIAAAAcOLh5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAArUlEQVR42h3B2wqCMAAAUP//K3ooqAhJKoSsxMlutXC1KUwXgggKa0PEJ5+CzvFukEUJ2fiH5dqPEpwVH/h4M1EyUZ5jtAvC4zkOLwDeX4VuZdU8Rbk/RUF4Xay2XlVV1lrnnDFmHMd5nqWUdV1zzrXWeZ73fW+t/RrTdd0wDNM0tW3rnGOMeRBCKaUQQimVZdmLc4xxmgJKCUIIY0wpBQAQQpRS9Z/WumkahNAPIt2T73Y/0CIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;iPad Air GPS comparison&quot;
        title=&quot;&quot;
        src=&quot;/static/035226a95c007ffe50100ec8a8fdf69b/fc7bc/gps-ipads.png&quot;
        srcset=&quot;/static/035226a95c007ffe50100ec8a8fdf69b/fc7bc/gps-ipads.png 407w&quot;
        sizes=&quot;(max-width: 407px) 100vw, 407px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;iPad Air Location Services Comparison. Source: &lt;a href=&quot;https://www.apple.com/ca/ipad-air/specs/&quot;&gt;Apple&lt;/a&gt; (Location Services section). 5m accuracy assumed to be CEP based.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Even the iPad Air has some variation: The cellular version includes a GPS chip, while the Wi-Fi only doesn’t. The cellular version doesn’t require a cell plan for the GPS to work - although the benefit of a cellular plan is that Collector can perform real-time edit updates to your database! The Wi-Fi only model still has “location services”, but this is Wi-Fi/compass based only, and really isn’t a great option for field collection unless you always have an external GPS connected or plan to manually select locations - so it’s not bad; just not as good. With an embedded GPS, the cellular iPad does give us some flexibility to collect data without any additional/external GPS device when location and accuracy permit.&lt;/p&gt;
&lt;p&gt;You may have noticed I listed other hardware devices in the requirements section, mainly Windows 7/8. Since we have some field laptops and toughbooks, we require the same external GPS be compatible with these units and software (ArcPad/ArcMap). If someone requires to use their toughbook in the field, we want to be able to provide the same external GPS device (via Bluetooth) - providing consistent accuracy, training, and GPS support regardless of hardware.&lt;/p&gt;
&lt;h2&gt;ArcGIS Collector External GPS Options&lt;/h2&gt;
&lt;p&gt;Finally, the part you probably skipped down to read - the ArcGIS Collector External GPS Options. Below are the devices I could get my hands on to review which related to the requirements. No sponsorship, freebies, or web ads determined the device list. Just a helping hand from friends who have the GPS, or if I already had one at work/home. That said, the device list contains most of the popular options available at this point (most are also discussed in GPS/esri forums as well).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 589px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a00467e6c5b7b981f3466233fa22f27f/49bab/gps-comparison.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 23.400000000000002%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJklEQVR42h3B706CQAAAcF6nDxrYequ+tVpbc2RbrTdpQ9YIYXoHwqH8UTqUA8Q4TMUCc9OWb9DW78fMeTblG9XT+erhLG6y+KZG77hZ8/TzsZHybM7XaYub3rJxkxtc1tzrun1V+7hvdC9OaItj7G57k45/VuSbThIPos5zgBQXvMSm/G73Iru3jpwlcTbJKPP1RYBmLpgYr263Tf0+44zecBgX5a7a7Ukyh4bl+YHrBxhPQxzaI58ui2yxWhblhCRRmjnjoG85aOhO4zljmoamQctCx+MvpdlwOCAkjAhJkiQkoWkaZfm13VaHwz7P86JYR4R4nhtgXJUl0/4nCIKmaaqqCoIgSZKiKK+SpHQ6oigCABBCuq6rqgoAgBCKoijLMoTwD0VC2YWTbLheAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Listing of some popular ArcGIS Collector External GPS Options. Source: Product websites.&quot;
        title=&quot;&quot;
        src=&quot;/static/a00467e6c5b7b981f3466233fa22f27f/49bab/gps-comparison.png&quot;
        srcset=&quot;/static/a00467e6c5b7b981f3466233fa22f27f/0eb09/gps-comparison.png 500w,
/static/a00467e6c5b7b981f3466233fa22f27f/49bab/gps-comparison.png 589w&quot;
        sizes=&quot;(max-width: 589px) 100vw, 589px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt; &lt;em&gt;Listing of some popular ArcGIS Collector External GPS Options. Source: Product websites.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*Notes on Accuracy&lt;/strong&gt;: Most of the GPS devices didn’t specify the &lt;a href=&quot;http://www.navipedia.net/index.php/Accuracy&quot;&gt;measurement accuracy&lt;/a&gt; they’re reporting even though they supply an accuracy value. This should be one of the most important statements, but it’s omitted way too often by manufactures and resellers (IMHO).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Since accuracy is a statistical measure of performance, a statement of navigation system accuracy is meaningless unless it includes a statement of the uncertainty in position that applies.” ~ &lt;a href=&quot;http://www.navipedia.net/index.php/Accuracy&quot;&gt;Navipedia.net&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So where the accuracy measurement isn’t stated with the value, I think it’s best to assume &lt;a href=&quot;http://en.wikipedia.org/wiki/Circular_error_probable&quot;&gt;Circular Error Probability&lt;/a&gt; (CEP) is being reported (50% of the locations have an error lower or equal to the accuracy value). Garmin has a history of reporting with CEP, even though it &lt;a href=&quot;http://www.gpsreview.net/gps-position-accuracy/&quot;&gt;isn’t mentioned on their website anymore&lt;/a&gt;. Similar with Bad Elf products - no mention can be found, so assuming CEP.  The DUAL XGPSS160 does communicate their device accuracy as 2.5m CEP. On the high end, Geneq states the accuracy in many variations, including RMS, R95, 2DRMS, and CEP. Thank you DUAL and Geneq for helping and understanding not all accuracy statements are the same!&lt;/p&gt;
&lt;p&gt;** Although all 3 Bad Elf products appear nearly identical (except $$), there are some major differences and justifications for the variation in price that just aren’t as apparent from the chart. The BE-GPS-3300 does have the ability to get 10-50cm post processed (“Coming soon via SDK and external apps” ~ Bad Elf website), something that many other devices don’t offer. The accuracy listed in this table is based on how we would use the device based on requirements (real-time with Collector, etc).  The BE-GPS3300 1.0m to 2.5m range is based on the &lt;a href=&quot;http://bad-elf.com/pages/be-gps-3300-detail&quot;&gt;website description&lt;/a&gt;: ”&amp;#x3C; 1 meter stationary accuracy with SBAS+PPP” and “2.5 meter accuracy while in motion”. I’m not sure if Collector can take advantage of the 1m listing or not, but 2.5m should be a breeze.&lt;/p&gt;
&lt;p&gt;The BE-GPS-2200 (GPS only) modal didn’t meet our GPS+GLONASS requirements but was included in the table since it may help others. My previous tests of GPS vs GPS+GLONASS make me feel confident that the addition of GLONASS is worth the cost.&lt;/p&gt;
&lt;p&gt;Although the Garmin Glo has the lowest accuracy of the bunch at 3m, it’s meets all other requirements. We’ve paired this unit with a laptop and toughbook but running ArcPad, and with Collector on an Apple device. Works with all units without issue. There seems to be two different bundles available for the Glo: Includes car charger; or includes belt/hat clip. The clip is also very light and clips to a baseball cap or shoulder strap for maximum visibility.&lt;/p&gt;
&lt;p&gt;The Geneq iSXBlue II is the stand-out winner for both price ($3300) and accuracy. It is highly configurable and includes the ability to select which NMEA strings (GPGGA, GPGLL, GPGSA, etc) to enable/disable and at what update rate (1-10Hz). It comes with an external antenna that can clip to an extension rod, baseball hat, etc. The main receiver can be placed in a backpack, or strapped to your belt. The best setup I’ve seen is to have a small backpack with the receiver inside, with a telescopic mounting pole attached with the antenna. Also allows the iPad to be stored in the backpack when not needed. The price is relatively expensive to the other devices listed, but overall this is still a much more cost effective solution compared to the old GeoExplorer at the same specs. However, today’s Geo’s can get down to 1-10cm with real-time correction services. If you need this level of accuracy in your handheld device, check out the latest Trimble (AKA: Cansel in Canada) devices.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;This article touches on External GPS options based on a specific set of requirements. If 5m accuracy (CEP) is all you require, you might not need to purchase an external device. If you want 2.5 - 3.0m accuracy (CEP) the Garmin Glo, Bad Elf GPS Pro+, and DUAL XGPS160 are all great choices. For 30cm, the best device will set you back a little more - but it can still be leveraged by all your Bluetooth devices and software. If you need  better than 30cm, you shouldn’t be clipping an external GPS to a baseball cap or backpack anyway. Many high-end devices do have Bluetooth capabilities, but not all use the Apple protocol (yet).  Overall, there is no perfect device for all situations.&lt;/p&gt;
&lt;p&gt;The Bad Elf series has a LCD screen, Datalogger with Barometric Sensor, storage and config options, while the Garmin and DUAL devices are both super light and can clip to a baseball hat with ease (no config also means, it just works).&lt;/p&gt;
&lt;p&gt;When working with other laptops/toughbooks, the Bad Elf still requires an iOS device for configuration. If you don’t have access to an iOS device… seriously, who doesn’t know at least one person with an iOS device?! As for Bad Elf and the NMEA protocol: The Bad Elf 2300 does have NMEA GPS Output, but it does state ”&lt;a href=&quot;http://bad-elf.com/pages/be-gps-2300-detail&quot;&gt;USB connectivity to PC or Mac provides streaming NMEA GPS data&lt;/a&gt;”. Again, not a show stopper, but I’m assuming this means NMEA isn’t available via Bluetooth to PC/Mac directly. Also means it wouldn’t pass our specific requirements. If you don’t need Bluetooth connectivity to a toughbook/laptop with NMEA, this shouldn’t be a concern.&lt;/p&gt;
&lt;p&gt;Higher accuracy will cost you - but a real benefit is that external GPS devices can be paired with many different OS/software depending on the need. If 30-100cm is your goal, the Geneq iSXBlue is a great all-around option. But remember, the Bad Elf might also meet your needs at the 1m level (again, unconfirmed if Collector can leverage this spec).&lt;/p&gt;
&lt;p&gt;On the lower end, I still recommend an external GPS to pair with your iPad. It seems like you are only getting a little additional accuracy, but remember the location of the GPS. If you are holding the iPad close to your body, you are blocking more satellites. Having a tiny GPS on a hat or backpack increases your chances to see more satellites - and if canopy cover is an issue for you as it is me, we need all the help we can get.&lt;/p&gt;
&lt;h2&gt;More Information on Devices:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://sxbluegps.com/product/isxblue-ii-gnss/&quot;&gt;Geneq iSX Blue II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://buy.garmin.com/en-US/US/oem/sensors-and-boards/glo-/prod109827.html&quot;&gt;Garmin Glo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bad-elf.com/pages/products&quot;&gt;Bad Elf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gps.dualav.com/explore-by-product/xgps160/&quot;&gt;DUAL XGPS160&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Related Articles:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2013/07/15/smartphones-tablets-and-gps-accuracy/&quot;&gt;ESRI - Smartphones, tablets, and GPS Accuracy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cloudpointgeo.com/blog/blog/2013/4/26/so-whats-my-accuracy-mobile-device-gps-with-ipad-iphone-android&quot;&gt;CloudPointGeo - So what’s my accuracy?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.navipedia.net/index.php/Accuracy&quot;&gt;Navipedia - GPS Accuracy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.igage.com/mp/GPSAccuracy.htm&quot;&gt;iGauge - GPS Accuracy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://piaw.blogspot.ca/2012/11/product-review-garmin-glo-bluetooth-gps.html&quot;&gt;Piaw - Garmin Glo Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.notaboutthenumbers.com/2011/09/03/field-testing-the-bad-elf/&quot;&gt;NotAboutTheNumbers - Field testing the Bad Elf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[W3C HTML5 Recommendation Complete!]]></title><description><![CDATA[It’s time to rejoice - the W3C HTML5 guessing game is over! After 17 years of HTML4 we have reached a new milestone as The World Wide Web…]]></description><link>https://www.spatialtimes.com/2014/10/w3c-html5-recommendation-complete/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/10/w3c-html5-recommendation-complete/</guid><pubDate>Wed, 29 Oct 2014 09:11:31 GMT</pubDate><content:encoded>&lt;p&gt;It’s time to rejoice - the W3C HTML5 guessing game is over! After 17 years of HTML4 we have reached a new milestone as The &lt;a href=&quot;http://www.w3.org/&quot;&gt;World Wide Web Consortium (W3C)&lt;/a&gt; published their official &lt;a href=&quot;http://www.w3.org/TR/2014/REC-html5-20141028/&quot;&gt;Recommendation of HTML5&lt;/a&gt;.  For those who have been developing on HTML5 for years already, we finally have some official standards to base our development on. Better yet - the web browser industry can finish implementing the standard.&lt;/p&gt;
&lt;p&gt;HTML5 has brought us new elements such as &amp;#x3C;video&gt; and &amp;#x3C;canvas&gt; which are changing the way users interact with the web. User Experience (UX) is so important to web development these days - this announcement couldn’t come sooner.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We expect to be able to share photos, shop, read the news, and look up information anywhere, on any device. Though they remain invisible to most users, HTML5 and the Open Web Platform are driving these growing user expectations. ~&lt;strong&gt;Tim Berners-Lee&lt;/strong&gt;, W3C Director (excerpt from W3C news release).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here is a link to a video from W3C on Vimeo to celebrate this special occasion.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.166666666666664%; position: relative; height: 0; overflow: hidden; margin-bottom: 1rem&quot; &gt; &lt;iframe src=&quot;//player.vimeo.com/video/110256895&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;Now everyone go visit their parents and upgrade their Windows XP computer. Better yet, just recycle it and get them a tablet with a decent browser App (Chrome/FireFox).&lt;/p&gt;
&lt;h2&gt;More information:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;W3C: &lt;a href=&quot;http://www.w3.org/TR/2014/REC-html5-20141028/&quot;&gt;HTML5 Recommendation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TechCrunch: &lt;a href=&quot;http://techcrunch.com/2014/10/28/w3c-declares-html5-standard-done/&quot;&gt;W3C Declares HTML5 Standard Complete&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Microsoft Opentech: &lt;a href=&quot;http://msopentech.com/blog/2014/10/28/w3c-charts-a-course-for-the-future-of-the-open-web-by-finalizing-html5-standard/&quot;&gt;W3C Charts a Course for the Future of the Open Web by Finalizing HTML5 Standard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ArcGIS for Server Long Tokens]]></title><description><![CDATA[I recently wanted to use a secure ArcGIS for Server map service with a new proof-of-concept (POC) web application. The service was secure…]]></description><link>https://www.spatialtimes.com/2014/10/arcgis-for-server-long-tokens/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/10/arcgis-for-server-long-tokens/</guid><pubDate>Mon, 27 Oct 2014 09:30:36 GMT</pubDate><content:encoded>&lt;p&gt;I recently wanted to use a secure &lt;em&gt;ArcGIS for Server&lt;/em&gt; map service with a new proof-of-concept (POC) web application. The service was secure, but I want to allow public access to the application without any credentials required by the user. I could take care of this with a username/password in the &lt;a href=&quot;https://github.com/Esri/resource-proxy&quot;&gt;Esri Resource Proxy;&lt;/a&gt; or have the application request a token with a user/pw saved in JavaScript (bad idea), but I was hoping to keep it simple with a “HTTP Referer” token. However, when visiting the token request page (http://&lt;em&gt;domain&lt;/em&gt;/arcgis/tokens/) the longest request I could make was for 1 year. Not that I needed a longer token for this POC, but now I was intrigued. How &lt;em&gt;do&lt;/em&gt; I create an ArcGIS for Server long token?&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 526px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3c3460533cd42cf2aab4be0393783243/55e98/AGS_TokenRequest.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.199999999999996%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABRklEQVR42o2RXUvDMBSG+/9/gwhe641eCII3ioLuThgr29qta77aJG2TJv1M2konKm7Y7bnKIXnIec9xLu/vbp4fqCjdkAQxXyG6jdg24kHMSSqHSZyX+cf70hVFgxOZ5jrKJBWK55pJlarihNzUlc6VzIRI067rDq77vp+SKaW+51PKpJQIABACmStjTLvHGHNCBgBQyqy1SimVq6qum6apv5mSCYlIRIZhMMbEMUEIwzDUurB2/Lwsy6Iovvo/YJQhQhhjBCHnCYTQ8zeLuRtsA4Kx1rraY45o29Za6ySc70tb11XKoOQwpSCOEaWIMcIYEWIc5DF93zsE491uJzKRV93tLLqe0aeVHoY/j/7NjCBYLNwsSzCXV6/xxVv+uBkzDmcwTnu9XPm+t/Y2EQQs9I3tptf7K/+cbNeHIEIortv+TPkTvX+x4ncg8f0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;token request page&quot;
        title=&quot;&quot;
        src=&quot;/static/3c3460533cd42cf2aab4be0393783243/55e98/AGS_TokenRequest.png&quot;
        srcset=&quot;/static/3c3460533cd42cf2aab4be0393783243/0eb09/AGS_TokenRequest.png 500w,
/static/3c3460533cd42cf2aab4be0393783243/55e98/AGS_TokenRequest.png 526w&quot;
        sizes=&quot;(max-width: 526px) 100vw, 526px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I’m sure we all hope our sites will survive longer than one Super Bowl - but can we create a token for more than a year? Since the &lt;em&gt;ArcGIS for Server&lt;/em&gt; Long Token request GUI really just helps the user populate and submit a REST request, why not just submit our own in its place with a longer Expiration setting?!&lt;/p&gt;
&lt;p&gt;Yes, we need to be careful of HTTP &lt;a href=&quot;http://en.wikipedia.org/wiki/Referer_spoofing&quot;&gt;Referer Spoofing&lt;/a&gt; and other questionable external attempts to our services, so putting the resulting token directly in a JavaScript file isn’t the most secure method. For more rigorous security you can put this long token in the &lt;a href=&quot;https://github.com/Esri/resource-proxy&quot;&gt;Esri Resource Proxy&lt;/a&gt; configuration file for a great approach to both security and longevity. The proxy can even be configured with it’s own HTTP referer settings, rate limits, and additional authentication options if you so choose.&lt;/p&gt;
&lt;h2&gt;Check your configuration:&lt;/h2&gt;
&lt;p&gt;The ArcGIS for Server long token request is straight forward, but there is one catch (there always is): ArcGIS for Server has a maximum lifespan of long-lived tokens (this is a good thing). Even better - this is configurable! To set the maximum length for all long tokens, just log into ArcGIS for Server: Manager &gt; Security &gt; Settings, and you can set the length of time both the short and long tokens.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 482px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/50a3c7beabcc0e6d7c3a79ce4750eccd/b58a3/AGS_TokenSettings.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.46887966804979%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA7CAAAOwgEVKEqAAAABgElEQVR42m2RTW/bMAyG/f//RU9db7ts2K1A28uA1g2WJkPjxF5s147bJbH1SYqSPEjugmDrgxc6iCL5kkpm6/XyVznLX2Z5na6r2abO6m7Sqtot8mpV7Z6r3apq77Pq60P2Lc3mRfNU1D/LNnnd9+3bYdPsN82+fB3m27d00z3mXRr1eKY071bNofw9FF1fdH3WHBITcWScJefc9bz4/P35y312dbf8dLu4vH26vAm6ultcXP9YbrtxHL33YyRBRACAeCqlplpkkAwaRGft9M55r9ACotZgKGCdSwBARwDAIBpDPMKGgTGmwj0qpZzzhjyRtdZNeO8TKSXnHCKxIvXHoxBSa620RoM6hqb+1tqT52BbSMmGQWtNRIhIRMYYG9065xjjQgjOuVbqg2Rj8L2ttRRtnWJEVG7Luq7bpmWMfZCslJIymowQ0SkWn/kj1y972fWhs/snGQCklABgI3TChPUFK85N6532NJ4RFsYY42E2GT7pL4gohDif4n/+AKBKcVRPQAs0AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Token settings&quot;
        title=&quot;&quot;
        src=&quot;/static/50a3c7beabcc0e6d7c3a79ce4750eccd/b58a3/AGS_TokenSettings.png&quot;
        srcset=&quot;/static/50a3c7beabcc0e6d7c3a79ce4750eccd/b58a3/AGS_TokenSettings.png 482w&quot;
        sizes=&quot;(max-width: 482px) 100vw, 482px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The long token lifespan is set in number of days, so for this example, we will set the number to 3654 to cover 10 years (to account for leap years and some rounding). Once the setting is updated, we can start making our longer token requests.&lt;/p&gt;
&lt;h2&gt;Generate the Token:&lt;/h2&gt;
&lt;p&gt;With the username, password, and HTTP referer site information ready to go, you can now make the token request by opening your web browser and typing a URL:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;http://domain/arcgis/tokens/request=gettoken&amp;amp;username=USER&amp;amp;password=PW&amp;amp;clientid=ref.https://www.spatialtimes.com&amp;amp;expiration=5261750&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You might notice the expiration date doesn’t look the same as the config setting. While the config setting is in days, the token expiration parameter is in minutes. Once complete, a successful request will return a new token in your browser window. Copy this token to your Proxy configuration or JS file and you are off to the races. Might be a good idea to put a reminder in your 2024 calendar to update the token just in case, hopefully you aren’t already busy that day.&lt;/p&gt;
&lt;h2&gt;Additional Information on ArcGIS for Server Long Tokens:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ArcGIS Server Help: &lt;a href=&quot;http://resources.arcgis.com/en/help/main/10.2/index.html#/About_ArcGIS_tokens/0154000005r6000000/&quot;&gt;About ArcGIS Tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ArcGIS Server Help: &lt;a href=&quot;http://resources.arcgis.com/en/help/main/10.2/index.html#/Acquiring_ArcGIS_tokens/0154000005rp000000/&quot;&gt;Acquiring ArcGIS Tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Esri JavaScript API: &lt;a href=&quot;https://developers.arcgis.com/javascript/jshelp/ags_secureservices.html#Token&quot;&gt;Working with Secure Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Github: &lt;a href=&quot;https://github.com/Esri/resource-proxy&quot;&gt;Esri’s Resource-Proxy page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Javascript API 3.11 Released]]></title><description><![CDATA[Today Esri announced their latest release of ArcGIS Javascript API 3.11. Notable changes/updates include: New Heatmap Renderer for feature…]]></description><link>https://www.spatialtimes.com/2014/10/arcgis-javascript-api-3-11-released/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/10/arcgis-javascript-api-3-11-released/</guid><pubDate>Mon, 06 Oct 2014 17:00:05 GMT</pubDate><content:encoded>&lt;p&gt;Today Esri announced their latest release of ArcGIS Javascript API 3.11. Notable changes/updates include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New &lt;a href=&quot;https://developers.arcgis.com/javascript/jsapi/heatmaprenderer-amd.html&quot;&gt;Heatmap Renderer&lt;/a&gt; for feature layers (as a beta item).&lt;/li&gt;
&lt;li&gt;Measurement widget enhancements including updated &lt;a href=&quot;https://developers.arcgis.com/javascript/jsapi/measurement-amd.html&quot;&gt;events and methods&lt;/a&gt;. This sounds like a minor thing, but has lots of potential.&lt;/li&gt;
&lt;li&gt;Lots of performance enhancements to &lt;a href=&quot;https://developers.arcgis.com/javascript/jsapi/esri.geometry.webmercatorutils-amd.html#canproject&quot;&gt;projecting features&lt;/a&gt;, &lt;a href=&quot;https://developers.arcgis.com/javascript/jsapi/infotemplate-amd.html&quot;&gt;InfoTemplates&lt;/a&gt;, &lt;a href=&quot;https://developers.arcgis.com/javascript/jshelp/inside_web_optimizer.html#use&quot;&gt;Web Optimizer&lt;/a&gt;, API enhancements, and bug fixes.&lt;/li&gt;
&lt;li&gt;And most notably, the “what’s new” screen shots are all taken from a Mac. And they thought we wouldn’t notice 😉&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are many more new and enhanced features in the ArcGIS Javascript API 3.11 release. For the full list of updates, jump to the &lt;a href=&quot;https://developers.arcgis.com/javascript/jshelp/whats_new.html&quot;&gt;What’s new in Version 3.11 &lt;/a&gt; page. FYI - some of the new samples aren’t listed in the Table of Contents yet, but you can still find them from the API Reference Section, use the ”&lt;em&gt;Search for samples that use this class&lt;/em&gt;” button.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS for Server, Security, and Bash Vulnerability]]></title><description><![CDATA[In light of the recent announcements on the bash (AKA: Shellshock) vulnerability, a quick update on how your ArcGIS for Server might be…]]></description><link>https://www.spatialtimes.com/2014/10/arcgis-server-security-bash-vulnerability/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/10/arcgis-server-security-bash-vulnerability/</guid><pubDate>Wed, 01 Oct 2014 12:36:42 GMT</pubDate><content:encoded>&lt;p&gt;In light of the recent announcements on the bash (AKA: Shellshock) vulnerability, a quick update on how your ArcGIS for Server might be affected.&lt;/p&gt;
&lt;h2&gt;Bash/Shellshock&lt;/h2&gt;
&lt;p&gt;First, some good news if you if you are running your Esri installation on Windows: you are not affected. This vulnerability only affects the Linux/Unix operating systems, and at this point it means relatively few installations will be impacted. However, don’t stop reading yet, more security vulnerabilities for ArcGIS Server installations are discussed below.&lt;/p&gt;
&lt;p&gt;Now if you are one of the few (but growing group) using Linux/Unix, you are probably impacted in some way by this vulnerability. If your distro is hosted on Amazon’s EC2 environment, rest easy - you have a team of EC2 employees who have been working on, and patching the environment. In fact, it’s already patched for any new instances you create. If you customized an AMI a while ago, or you aren’t sure if the patch is applied, check with &lt;a href=&quot;http://aws.amazon.com/security/security-bulletins/CVE_2014_6271_advisory/&quot;&gt;Amazon here&lt;/a&gt; to see how to fix it.&lt;/p&gt;
&lt;p&gt;If you have a locally hosted Linux/Unix install, I’m going to assume you already know how to patch it since, well, you already installed the OS and configured ArcGIS for Server in the first place (you already know what you are doing)! OK, just in case: update Bash and you are good.&lt;/p&gt;
&lt;p&gt;Lastly, if you are using ArcGIS Online, hosted services, or Portal for ArcGIS - No worries, &lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2014/09/25/does-the-bash-shellshock-vulnerability-affect-you/&quot;&gt;Esri has already released a communication&lt;/a&gt; mentioning how these services are not affected.&lt;/p&gt;
&lt;h2&gt;FYI, other recent vulnerabilities&lt;/h2&gt;
&lt;p&gt;Just in case you took the summer off, a few additional security issues have been identified in the past few months - not getting the same fan-fair as Bash (since limited to Esri, not Operating Systems):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; A vulnerability that could allow unauthorized access to secured resources, as well as some cross-site scripting (XSS) vulnerabilities were identified in ArcGIS for Server (and patched) by Esri this August. This impacts all OS versions and releases since 10.1 (including the current 10.2.2 release at the time of writing). &lt;a href=&quot;http://support.esri.com/en/downloads/patches-servicepacks/view/productid/66/metaid/2112&quot;&gt;More info and download from Esri&lt;/a&gt;. Review: Easy and fast to install, no reboot required (&amp;#x3C;1 minute outage).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Another issue, this time limited to Windows and Web Adaptor for IIS (10.1 to 10.2.2) has related patches specifically for the Web Adaptor/IIS config to fix some additional authorization bypass and XSS vulnerabilities. &lt;a href=&quot;http://support.esri.com/en/downloads/patches-servicepacks/view/productid/66/metaid/2110&quot;&gt;More info and download from Esri&lt;/a&gt;. Review: Easy and fast to install, no reboot required although IIS and the Web Adaptor are restarted causing a short outage (&amp;#x3C;1 minute).&lt;/p&gt;
&lt;p&gt;Happy Patching!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SQL Server spatial query, part 2]]></title><description><![CDATA[This post is an extension of ”SQL Server spatial query, part 1”. The first post primarily focused on how the basic query and geometries are…]]></description><link>https://www.spatialtimes.com/2014/09/sql-server-spatial-query-part-2/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/09/sql-server-spatial-query-part-2/</guid><pubDate>Sat, 13 Sep 2014 12:56:03 GMT</pubDate><content:encoded>&lt;p&gt;This post is an extension of ”&lt;a href=&quot;https://www.spatialtimes.com/2014/08/sql-server-spatial-query-part-1/&quot;&gt;SQL Server spatial query, part 1&lt;/a&gt;”. The first post primarily focused on how the basic query and geometries are put together and the types of results you should expect to see. In part 2, the goal is to wrap some of these techniques into a SQL procedure to evaluate if an input feature intersects a reference layer.&lt;/p&gt;
&lt;h2&gt;Scenario&lt;/h2&gt;
&lt;p&gt;Suppose we wanted downloaded some weather data from NOAA and store in our SQL Server database. In many cases this data is available in a vector format (point or polygon), or it’s available in grid/raster format. An efficient way to store this weather information is to store vector geometry only once (with a unique ID), and every time we download the data we store the weather value and the related geometry ID instead of storing the geometry every time we download. This way we can also store all historical data without the bloat of storing the redundant geometry and still be able to perform quick statistical analysis at any location(s) directly in query builder or with a SQL View. Since the ID of each feature from NOAA is unknown (in most cases), or can change, we can use a spatial overlay to determine an ID from our own lookup table (spatial reference layer).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Side note: This also works great with raster/grid data even thought it isn’t directly supported in SQL Server 2008 - I just convert the raster cells to points or polys before running the analysis using a Python script (something for another post).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For this scenario, let’s assume we downloaded a set of polygons in a gridded polygon format and we want to determine if each polygon intersects our reference point layer. If it does - we will store the new value and related reference point ID.&lt;/p&gt;
&lt;h2&gt;The SQL Server spatial query&lt;/h2&gt;
&lt;p&gt;Skipping over the many ways you can download data from NOAA and processing into many different formats (Shapefile, WKT, etc), let’s just jump forward to the part where we have thousands of WKT polygons with attributes: a date attribute and current weather parameters. If you need some help getting to this stage, you might want to checkout NOAA’s ”&lt;a href=&quot;https://catalog.data.gov/dataset/noaas-weather-and-climate-toolkit/resource/628869ca-1814-4eb3-ad63-69af6b1fd537&quot;&gt;Weather and Climate Toolkit&lt;/a&gt;” and use a little &lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt; magic.&lt;/p&gt;
&lt;p&gt;Similar to part one we want to compare an input geometry, a WKT polygon, with our reference point layer.  As we loop through each polygon record we will send the data to the following SQL procedure:&lt;/p&gt;
&lt;iframe
  src=&quot;https://gist.github.com/TheBryanMac/6c4de4888f0a0c438958.pibb&quot;
  style=&quot;width: 100%; height: 300px; border: 0;&quot;
&gt;&lt;/iframe&gt;
&lt;p&gt;The procedure includes a “@wType” parameter just in case we want to download multiple types of NOAA data and still be able to use the same proc. Since I pre-process the NOAA download using python, I ca send data directly to the SQL procedure in Python (w/ PYODBC):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;MyStatement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;exec prc_NoaaDataLoad &apos;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&apos;, &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;val&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;, &apos;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Temperature&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&apos;, &apos;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; wktGeom &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&apos;&quot;&lt;/span&gt;
cursor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;execute&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;MyStatement&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This code is executed for each row in the NOAA layer, and stores the data for each record (in tbl_NoaaData) when the polygon from NOAA intersects the reference point table. The WHERE clause determines if there is an intersect (=1) versus no intersect (=0). So if the result of the overlap = 0, the row isn’t loaded and we move on to the next. Seems so… simple - and it is.&lt;/p&gt;
&lt;p&gt;Even though I’m using Python for this process, I should mention that I’m not using any ArcPy or other GIS module. Just straight python calling a sql server spatial query. This also has the added benefit of running extremely fast (&amp;#x3C; 6 seconds), and not requiring an ArcPy/ArcGIS license.&lt;/p&gt;
&lt;h2&gt;More Information&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.spatialtimes.com/2014/08/sql-server-spatial-query-part-1/&quot;&gt;SQL Server spatial query, part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb933901.aspx&quot;&gt;MSDN Help for STIntersection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://devjef.wordpress.com/2012/11/03/querying-spatial-data-the-basics/&quot;&gt;SQL From the Trenches: Query spatial data, the basics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Pro licensing Update]]></title><description><![CDATA[Thought you could delay and/or ignore signing up for an ArcGIS Online (AGOL) Organizational account? Well, it’s going to get a little more…]]></description><link>https://www.spatialtimes.com/2014/08/arcgis-pro-licensing-update/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/08/arcgis-pro-licensing-update/</guid><pubDate>Wed, 27 Aug 2014 16:25:17 GMT</pubDate><content:encoded>&lt;p&gt;Thought you could delay and/or ignore signing up for an ArcGIS Online (AGOL) Organizational account? Well, it’s going to get a little more difficult to stay away based on a recent ”&lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2014/08/26/arcgis-pro-licensing/&quot;&gt;ArcGIS Pro licensing Update&lt;/a&gt;” blog post from Esri. Starting with ArcGIS Pro beta 5 and continuing through the final release, licensing of Pro will be managed through AGOL Organization admin accounts.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ArcGIS Pro follows a named user licensing model, where each user account is assigned permissions to access the software. Starting with beta 5, licenses for ArcGIS Pro are administered through your ArcGIS Online organizational account. This will be the software authorization method used for the remainder of the beta program, as well as in the final release.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We aren’t sure how traditional 9x/10x desktop Concurrent Use licenses will be counted/ported to the new Organizational account licenses, but since it is based on named users (not concurrent connections), there will be some changes.&lt;/p&gt;
&lt;p&gt;This will not impact your current 9x/10x ArcGIS Desktop licensing or license manager - just ArcGIS Pro moving forward. Might be a good time re-evaluate signing up for that account now.&lt;/p&gt;
&lt;p&gt;More Information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://pro.arcgis.com/en/pro-app&quot;&gt;ArcGIS Pro website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2014/08/26/arcgis-pro-licensing/&quot;&gt;Esri Blog article on ArcGIS Pro licensing update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[SQL Server spatial query, part 1]]></title><description><![CDATA[A traditional GIS analysis question - Does the polygon contain the point, is the point inside the polygon? There are lots of ways to use a…]]></description><link>https://www.spatialtimes.com/2014/08/sql-server-spatial-query-part-1/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/08/sql-server-spatial-query-part-1/</guid><pubDate>Thu, 14 Aug 2014 17:37:21 GMT</pubDate><content:encoded>&lt;p&gt;A traditional GIS analysis question - Does the polygon contain the point, is the point inside the polygon? There are lots of ways to use a GIS application to find the answer to this question, but let’s take a look at a few ways SQL Server Spatial can help us with this traditional exercise using a SQL Server spatial query.&lt;/p&gt;
&lt;h2&gt;The Setup&lt;/h2&gt;
&lt;p&gt;The first step is to have some polygons/points to test with. In the query example, we will create a polygon (&lt;em&gt;@thePolygon&lt;/em&gt;), a point located inside the poly (&lt;em&gt;@pointIN&lt;/em&gt;), and a point located outside the poly (&lt;em&gt;@pointOUT&lt;/em&gt;). Although this article doesn’t get into detail on the GEOGRAPHY/GEOMETRY types or spatial references - it should be noted that in the first example I changed the standard WGS84 Geographic spatial reference (4326), to use NAD83 Geographic (4269) instead. No real reason, just wanted to mention in case you compare with other samples.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;DECLARE&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@thePolygon&lt;/span&gt; GEOGRAPHY&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@pointIN&lt;/span&gt; GEOGRAPHY&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@pointOUT&lt;/span&gt; GEOGRAPHY&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@thePolygon&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GEOGRAPHY::STGeomFromText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;POLYGON((-78.50932668617881 45.024933647425115, -78.53403351361905 44.9898648154388, -78.48446979547693 44.97239241709962, -78.45973073293072 45.007441690111115, -78.50932668617881 45.024933647425115))&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4269&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@pointIN&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GEOGRAPHY::STGeomFromText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;POINT(-78.51 45.00)&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4269&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SET&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;@pointOUT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GEOGRAPHY::STGeomFromText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;POINT(-65.00 35.00)&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4269&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;The SQL Server Spatial Query&lt;/h2&gt;
&lt;p&gt;Now that the features are created, we just need to use SQL Server’s intersect function (STIntersection) to perform the analysis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 1 - where the point falls inside the polygon:&lt;/strong&gt;&lt;br&gt;
Query: &lt;code class=&quot;language-text&quot;&gt;SELECT @pointIN.STIntersection(@thePolygon).ToString();&lt;/code&gt;&lt;br&gt;
Returns: POINT (-78.51 45)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 2 - where the point falls outside the polygon:&lt;/strong&gt;&lt;br&gt;
Query: &lt;code class=&quot;language-text&quot;&gt;SELECT @pointOUT.STIntersection(@thePolygon).ToString();&lt;/code&gt;&lt;br&gt;
Returns: GEOMETRYCOLLECTION EMPTY&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example 3 - Reversing the order of the Base and parameter in the analysis:&lt;/strong&gt;&lt;br&gt;
Query: &lt;code class=&quot;language-text&quot;&gt;SELECT @thePolygon.STIntersection(@pointIN).ToString();&lt;/code&gt;&lt;br&gt;
Returns: POINT (-78.51 45)&lt;/p&gt;
&lt;p&gt;When the point is inside the polygon, it is returned by the query, otherwise, an empty geometry is returned. Notice how the result in example 3 returns the same result as Example 1, regardless of which feature calls STIntersection. This is because the STIntersection function only returns the points that are common between the two shapes. In this case, only the one point is common. If we intersected two partially overlapping polygons, the output would return a new polygon of the overlap area.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Aside: Some SQL Server spatial functions can even return a collection of geometries. For example, a union of a line feature and a partially overlapping polygon feature will return a collection containing both lines and polygons.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here is a full SQL Server spatial script for Enterprise Manager:&lt;/p&gt;
&lt;iframe
  src=&quot;https://gist.github.com/TheBryanMac/a10f7063f2eed8c4ec75.pibb&quot;
  style=&quot;width: 100%; height: 300px; border: 0;&quot;
&gt;&lt;/iframe&gt;
&lt;p&gt;Coming soon: Part 2 - Create a SQL procedure to evaluate if an input feature intersects a reference layer. Gives me time to think of a shorter title. &lt;strong&gt;Update 2014-09-13: &lt;a href=&quot;https://www.spatialtimes.com/2014/09/sql-server-spatial-query-part-2/&quot;&gt;SQL Server spatial query, part 2&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;More Information&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb933901.aspx&quot;&gt;MSDN Help for STIntersection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://devjef.wordpress.com/2012/11/03/querying-spatial-data-the-basics/&quot;&gt;SQL From the Trenches: Query spatial data, the basics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Python Relative Directory]]></title><description><![CDATA[When using sub-directories to store temp files, analysis outputs, or logs - a nice way to deal with the parent directory when moving the…]]></description><link>https://www.spatialtimes.com/2014/08/python-relative-directory/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/08/python-relative-directory/</guid><pubDate>Wed, 06 Aug 2014 10:00:59 GMT</pubDate><content:encoded>&lt;p&gt;When using sub-directories to store temp files, analysis outputs, or logs - a nice way to deal with the parent directory when moving the code and subfolders is to leverage the OS module’s current working directory function.&lt;/p&gt;
&lt;p&gt;I tend to start developing scripts on my local machine, then move them to their testing/production resting place later in the process. An issue with this is the last minute code modifications to python relative directory variables. Here is a way to setup the parent directory so the relative sub-directories can find their way without any changes if you move the code.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.python.org/2/library/os.html#os.getcwd&quot;&gt;OS.getcwd()&lt;/a&gt; returns the full path of the current working directory, which you can then append other directories to.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getcwd&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#returns C:\\Program Files\\Python&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For example, you have a script that you want to store all logs in a “log” sub-directory, you could setup the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; os
DirMain &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getcwd&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sep &lt;span class=&quot;token comment&quot;&gt;#sets the absolute parent directory&lt;/span&gt;
DirLogs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DirMain &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;log\\&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can move the script and sub-directories without the need to further modify the code.&lt;/p&gt;
&lt;p&gt;The OS module also has another function for a python relative directory, &lt;a href=&quot;https://docs.python.org/2/library/os.html#os.curdir&quot;&gt;os.curdir()&lt;/a&gt;. This returns a simple OS-specific string used to identify the current directory.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;curdir&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#returns &apos;.&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is also handy but doesn’t set an absolute parent directory, so you can’t &lt;em&gt;chdir()&lt;/em&gt; to it later and expect to land at the original directory. However there are lots of samples online that also use this alternative approach and might work depending on your situation.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Binary flags with Python]]></title><description><![CDATA[Sometimes you just want to run a few specific sections of your python code for testing. Then a few more. Next, all sections. Now run just…]]></description><link>https://www.spatialtimes.com/2014/07/binary-flags-with-python/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/07/binary-flags-with-python/</guid><pubDate>Thu, 31 Jul 2014 16:27:14 GMT</pubDate><content:encoded>&lt;p&gt;Sometimes you just want to run a few specific sections of your python code for testing. Then a few more. Next, all sections. Now run just one. Or possibly need to run different parts of your code based on the time of day or week.&lt;/p&gt;
&lt;p&gt;There are many ways you can accomplish this directly in your python script(s) or by using the python window. But what about passing a runtime argument with a little binary?! This technique is a great way to run different/multiple sections (functions) of your code without the need to modify the python script - binary flags with python. I even use this technique to keep some test functions to call them when needed - and also to run minor variations based on time of day.&lt;/p&gt;
&lt;p&gt;The method behind this approach is to use binary (base 2 numbers), but not using a long string of 0’s and 1’s. Rather, converting regular long integers (base 10) into binary in order to determine what sections of code to run.&lt;/p&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;You have 7 sections of code broken down into functions. Each section is assigned a value - these values are set to the power of 2 (assign the number on the far right side), examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Section 0 = 2^0 = 1&lt;/li&gt;
&lt;li&gt;Section 1 = 2^1 = 2&lt;/li&gt;
&lt;li&gt;Section 2 = 2^2 = 4&lt;/li&gt;
&lt;li&gt;Section 3 = 2^3 = 8&lt;/li&gt;
&lt;li&gt;Section 4 = 2^4 = 18&lt;/li&gt;
&lt;li&gt;Section 5 = 2^5 = 32&lt;/li&gt;
&lt;li&gt;Section 6 = 2^6 = 64&lt;/li&gt;
&lt;li&gt;and so on…&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;Whenever you want to call multiple sections, just add up the values of each section and pass as a runtime argument.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run section 3 only: MyScript.py 8&lt;/li&gt;
&lt;li&gt;Run section 4 only: MyScript.py 18&lt;/li&gt;
&lt;li&gt;Run section 1, 3, and 5 (2+8+32): MyScript.py 42&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since you are passing the integer (base 10) number as the argument, we need add a small function to the python script to determine the sections to run. The functions/sections will always be run from lowest to highest (highest to lowest is possible with a small modification to the script).&lt;/p&gt;
&lt;h2&gt;The code&lt;/h2&gt;
&lt;p&gt;Using this small function, we can determine which section(s) to run.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fn_bits&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;~&lt;/span&gt;n&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;yield&lt;/span&gt; b
        n &lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; b&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Putting it all together&lt;/h2&gt;
&lt;p&gt;Now that we can pass the commands we want to run as a single argument, we need to put it all together. Here is a working sample of binary flags with python.&lt;/p&gt;
&lt;iframe
  src=&quot;https://gist.github.com/TheBryanMac/45836c10acad5662c7a1.pibb&quot;
  style=&quot;width: 100%; height: 300px; border: 0;&quot;
&gt;&lt;/iframe&gt;
&lt;p&gt;Based on the full code sample above, here is how we would call different code combinations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Section 0 only: &lt;code class=&quot;language-text&quot;&gt;BitFlagFunctions.py 1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Section 2 and 3 (4+8): &lt;code class=&quot;language-text&quot;&gt;BitFlagFunctions.py 12&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Section 0, 2, and 3 (1+4+8): &lt;code class=&quot;language-text&quot;&gt;BitFlagFunctions.py 13&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Section 1 and 3 (2+8): &lt;code class=&quot;language-text&quot;&gt;BitFlagFunctions.py 10&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;This is just one of many ways you can setup binary flags with python. I’ve seen other examples where people use “0100101” to run various sections which also works well. The method described in the above &lt;a href=&quot;https://gist.github.com/TheBryanMac/45836c10acad5662c7a1&quot;&gt;gist&lt;/a&gt; is just a way that works well for me, giving me the ability to number each section and run them in ascending order as needed.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Mosaic Large Images to a Single Raster in ArcGIS]]></title><description><![CDATA[I’ve had some question regarding large sets of ortho imagery tiles and how you can turn this into one seamless raster (and maintain…]]></description><link>https://www.spatialtimes.com/2014/07/mosaic-large-images-to-a-single-raster-in-arcgis/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/07/mosaic-large-images-to-a-single-raster-in-arcgis/</guid><pubDate>Tue, 22 Jul 2014 23:07:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve had some question regarding large sets of ortho imagery tiles and how you can turn this into one seamless raster (and maintain performance). While the new Mosaic Datasets are great, what if you only have 9.3 - here is one way to merge them together using the Raster Mosaic tools available in both 9x and 10x. “Mosaic Large Images to a Single Raster in ArcGIS” is a case study based on ArcGIS Desktop 9.3 with decent, yet older, hardware - then comparing some different compression options and visual results. Please note, if you have 10x, many newer options exist and I would recommend taking a good look before jumping into this approach (although still a viable option).&lt;/p&gt;
&lt;h2&gt;The Scenario&lt;/h2&gt;
&lt;p&gt;Using 7,600 uncompressed 4-band TIFF orthos, each 1km in size and 120MB (approx. 1TB total). You can store the output to a file Geodatabase (can handle huge rasters, lots of viewers) or SDE (adds enterprise access and security). Before you start it’s recommended to try your approach with a subset of data to see how long it will take and if the quality of the results meet your needs.&lt;/p&gt;
&lt;h2&gt;The Steps [processing time]&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Create a file Geodatabase [&amp;#x3C; 1 min.]
&lt;ul&gt;
&lt;li&gt;Even if you are planning to save your raster in SDE, you might want to consider processing the mosaic into a file Geodatabase first. This way you can limit the processing required and run locally for faster results. Copying afterwards does add to the total processing time - but also makes sure there aren’t any issues with an input raster and you don’t need to worry about indexes or logs getting bloated if you make any mistakes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Create a Raster Catalog: Make it “unmanaged” to refer to images without loading/copying [&amp;#x3C; 1 min.]&lt;/li&gt;
&lt;li&gt;Run ‘workspace to raster catalog’ tool (all TIFFs in one directory) [10 min for all 7k files]&lt;/li&gt;
&lt;li&gt;Set the spatial reference properties of the catalog to same as data source [&amp;#x3C; 1 min.]&lt;/li&gt;
&lt;li&gt;Run ‘Raster Catalog to Raster Dataset’ tool: This varies depending on the approach. Two different approaches we tested. Note: Create pyramids afterwards, not as part of the process. [3 days (old hardware)]
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Option 1&lt;/strong&gt; - LZ77 compression: Before running the tool, open the environment settings and select not to create pyramids, also set compression option to LZ77. We also unchecked “raster statistics” since we didn’t want the default colour stretching. Raster stats are on by default but leads to the usual question “why does the colour look different now?” after processing imagery (although yes, you can force this off in ArcMap in the layer properties but it resets each time).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Option 2&lt;/strong&gt; - JPEG compression. We decided on 80% compression, no specific reason why but the results were almost as good as LZ77. The quality and pixel size will impact the visual quality - again, best to play with a small sample area to get a better idea of what works for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If your final destination is SDE, copy your raster at this point using best practices for loading large data to your enterprise database. When loading to SDE set the environment setting to create pyramids. If keeping in the file Geodatabase, you will need to create the pyramids still - We used the default options and number of levels. You can also try setting Bilinear vs Nearest neighbour to see which you like better.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Results&lt;/h2&gt;
&lt;p&gt;Using the method above, both LZ77 and JPG compression options generated outstanding results. The LZ77 (lossless) compression has a slightly better visual output at the cost of extra hard drive space. If your tests show little visual difference, I would recommend JPG compression to save space and network load - however, the clarity of LZ77 is hard to beat, especially if you have a decent network.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;File Size: When using LZ77, we found the output size was the same as the total input size (1TB). The compression helped, but adding pyramids added back the savings. JPG with 80% compression was 350GB (including pyramids). &lt;em&gt;Advantage JPEG&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Load times: Load times were comparable for LZ77 and JPG, but if your network is slow or constantly under heavy load it might make a difference since LZ77 using more bandwidth based on file size. &lt;em&gt;Small advantage JPG&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Visual output: Most people don’t have an issue with JPG quality - just don’t show them LZ77 and they won’t know what they are missing. Depending on the landscape, there can be some differences that are hard to overlook. Overall, there is a difference when using lossless compression - your intended use of the data will help you determine which is more important. &lt;em&gt;Advantage LZ77&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, a small advantage to JPG compression - but depending on the raster, LZ77 definitely has its place.&lt;/p&gt;
&lt;h2&gt;A few lessons learned&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Test, test test. Pick a small representative area and run many different tests until you find the right settings that give you results that meet your specific needs.&lt;/li&gt;
&lt;li&gt;Overall, a good rule of thumb is that pyramids will add 33% more storage space.&lt;/li&gt;
&lt;li&gt;Ensure that you don’t build pyramids until the very end of processing (i.e. when uploading the last tile or in a new process after the entire load process is complete).   By default ArcGIS will rebuild pyramids for the entire raster dataset with each new tile.  This adds an excessive amount of processing time.&lt;/li&gt;
&lt;li&gt;Use JPG (75-80) compression unless you determine a requirement for LZ77.  To me this is the best tradeoff for image quality vs file size/performance.  SIDs and JPEG2000 need to be decompressed on load which adds to draw time.  LZ77 is perfectly good but it might be a bit slower than JPG because of the larger network load with most users not seeing any difference.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;The goal of this case study was to try various methods of creating raster mosaics as well as reviewing compression and visual outputs on a large scale. Both of the compression types listed worked great. Other approaches and settings were also tested but they didn’t meet our final requirements or the compression options forced applications to decompress which can create some additional client load.&lt;/p&gt;
&lt;p&gt;There are many other approaches including Mosaic datasets or using ArcGIS server and creating a tiled service. This is one approach that works very well if you are using 9.x and can be leveraged by both server and desktop applications - and yes, even 10x. This approach also gives you the option to store the data inside an Enterprise or file Geodatabase.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Esri User Conference Q&A]]></title><description><![CDATA[It’s that time of year again… when 12,000 people (approximately) head to San Diego to refill their Esri Kool-Aid and see what’s coming down…]]></description><link>https://www.spatialtimes.com/2014/07/esri-user-conference-qa/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/07/esri-user-conference-qa/</guid><pubDate>Mon, 14 Jul 2014 20:16:40 GMT</pubDate><content:encoded>&lt;p&gt;It’s that time of year again… when 12,000 people (approximately) head to San Diego to refill their Esri Kool-Aid and see what’s coming down the pipe from the Redlands, California GIS software giant. It also means it’s time for the the annual &lt;a href=&quot;http://www.esri.com/events/user-conference/q-and-a&quot;&gt;Esri User Conference Q&amp;#x26;A&lt;/a&gt; that goes over some tidbits and direction that Esri is moving towards over the coming year. Basically, it highlights some of the products, and new features we should be ready for.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Esri has written questions and answers to keep our customers informed on our efforts in software development, products, education, and support; future plans in these areas; and our thoughts on GIS and the industry as a whole. Our purpose for sharing this information is to help our users be successful in their use of GIS. Please feel free to share with your colleagues.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Some interesting things to note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yes, there is a 10.3 and it will focus on “improving the science of ArcGIS”. This includes some space-time tools and ability to work with new datasets (netCDF4, HDF, GRIB)&lt;/li&gt;
&lt;li&gt;Q4 2014 is when ArcGIS 10.3 and ArcGIS Pro be released (together).&lt;/li&gt;
&lt;li&gt;A big change in ArcGIS Pro will be the upgrade from Python 2 (2.7) to Python 3 (3.4.0).&lt;/li&gt;
&lt;li&gt;There is an attempt to describe the new licensing model for Pro, but hard to interpret from the limited Q&amp;#x26;A page to know what this really means (how concurrent licenses are handled, etc).&lt;/li&gt;
&lt;li&gt;Lots of Geodatabase updates. From support for SQL Server 2014 (at 10.3) to the future of SDE command line access.&lt;/li&gt;
&lt;li&gt;And many, many more - worth taking a look, then returning to the Esri site to watch some of the videos posted from the conference.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check out the full Esri User Conference Q&amp;#x26;A for more details: &lt;a href=&quot;http://www.esri.com/events/user-conference/q-and-a&quot;&gt;http://www.esri.com/events/user-conference/q-and-a&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Useful GIS Developer Tools]]></title><description><![CDATA[Looking for additional tools for your coding toolbox? Here are 4 useful GIS developer tools you may or may not know about. Oh, they are also…]]></description><link>https://www.spatialtimes.com/2014/06/useful-gis-developer-tools/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/06/useful-gis-developer-tools/</guid><pubDate>Sun, 29 Jun 2014 19:47:42 GMT</pubDate><content:encoded>&lt;p&gt;Looking for additional tools for your coding toolbox? Here are 4 useful GIS developer tools you may or may not know about. Oh, they are also FREE!&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;http://notepad-plus-plus.org/&quot;&gt;Notepad++&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My go-to for Javascript/HTML and Python coding, and completely replaces any need for Windows Notepad (and can handle much larger files). Notepad++ isn’t a full IDE by any means, but it does the job in most cases. It has great/customizable syntax highlighting, some auto-complete abilities, app/browser launching features, and lots of plugins for various other tasks. A default install is enough for some, but by taking the time to review additional settings (default encoding, auto-backup, auto-complete, interface style customization - to name a few) you will see why this is a popular choice for many.&lt;/p&gt;
&lt;p&gt;Some of the little things Notepad++ has will make it hard to use other notepad programs: highlight the corresponding open/close tag when you click on either tag, and also allows the collapsing of sections based on tags or indentation (python). Line commenting (CTRL+K) and uncommenting (CTRL+SHIFT+K) lines of code is also very handy and it understands the current language commenting syntax. On the topic of languages, there are tonnes supported by default, but you can also add custom styles, and add additional languages if yours is missing - such as &lt;a href=&quot;https://github.com/Edditoria/markdown_npp_zenburn&quot;&gt;Github markdown&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A few great plugins include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compare: Side-by-side file comparison with every line highlighting for new/deleted/changed content.&lt;/li&gt;
&lt;li&gt;DSpellCheck: Simple spell checking options.&lt;/li&gt;
&lt;li&gt;Tidy2: A plugin to add easy HTML tidying to Notepad++ with various config and pre-set options.&lt;/li&gt;
&lt;li&gt;JSLint: A plugin that allows users to run JSLint (The JavaScript Code Quality Tool) against their open JavaScript files.&lt;/li&gt;
&lt;li&gt;More great plugins are listed at &lt;a href=&quot;http://www.backslash.gr/content/blog/misc/11-notepad-plusplus-plugins&quot;&gt;Backslash.gr&lt;/a&gt; and &lt;a href=&quot;http://lifehacker.com/5789781/step-up-your-notepad%252B%252B-game-with-powerful-plugins&quot;&gt;Lifehacker.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href=&quot;http://www.7-zip.org/&quot;&gt;7-Zip&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you’ve never heard of this application, be warned: You might be upset you haven’t heard about it sooner. 7-zip works with many formats you use every day: ZIP, DMG, ISO - and it also works with 32 other formats you may deal with from time to time: RAR, TAR, GZIP to name a few. 7-Zip also includes an open architecture, a “7z” format with LZMA/2 compression, AES-256 encryption, and Petabyte size support.&lt;/p&gt;
&lt;p&gt;So why mention 7-zip when discussing developer tools? Well, beyond being a great compression/extraction tool, it also includes full access via command line! With two different ways to access: A limited functionality EXE; or full featured EXE+DLL, you have all the same features as the desktop GUI. These command line options are well document and work great with Python and .NET projects. You can create a copy of the EXE+DLL into any python directory to have a portable copy of python code with no installation steps required of the 7-zip tools. PS. It’s only a 1 mb download.&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Already mentioned a few times, Python is a great development environment for any size project. It’s included with many popular GIS software applications and can be extended way more than the custom scripting languages from the days of old (looking at you AML and Avenue). Python is available in both 32/64-bit, and runs on over 21 different operating systems and environments.&lt;/p&gt;
&lt;p&gt;Python’s strengths start with an amazing support community and extend to the number of supported environments, easy to read/write/understand the language and syntax, and the module design. For the Esri community, Python has become an integral part of the ArcGIS architecture (both desktop and server thanks to a growing number of ArcPy functions).&lt;/p&gt;
&lt;p&gt;As for notable modules, two always jump to the front of the for me:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;PYODBC: Allows you to use ODBC to connect to almost any database from Windows, Linux, OS/X. It also simplifies database connections while built on the Python Database API specs. Define a connection string or ODBC connection to your favorite database and you are off to the races.&lt;/li&gt;
&lt;li&gt;rPython: Adds the powerful R statistical computing and graphics programming objects into the Python environment. There are some great demos using Esri’s Spatial Analyst extension, and passing the output to R for additional analysis.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;a href=&quot;https://github.com/&quot;&gt;github&lt;/a&gt; and &lt;a href=&quot;https://windows.github.com/&quot;&gt;github for Windows&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Are you currently using a revision control / source code management system? If not, Git is a great option. No longer will you need to make copies of your code with cryptic names and track each one by yourself.&lt;/p&gt;
&lt;p&gt;Git is a very powerful revision and source code management system (command line focused), with GitHub and GitHub for Windows making it super easy to get started with a great GUI and little or no command line required. You can work on local repositories with GitHub for Windows as well as complete synchronization with your online GitHub account. GitHub also puts you into a community where other developers can add/enhance/fork your code to help move ideas and code forward. Many companies are also posting code snippets and applications online with open licensing to build their communities and development environments.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Shapefile vs Feature Class]]></title><description><![CDATA[Walking down the hallways of a GIS conference you hear lots of great debate and geek-talk on a variety of topics. A Shapefile vs Feature…]]></description><link>https://www.spatialtimes.com/2014/06/shapefile-vs-feature-class/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/06/shapefile-vs-feature-class/</guid><pubDate>Tue, 10 Jun 2014 08:44:26 GMT</pubDate><content:encoded>&lt;p&gt;Walking down the hallways of a GIS conference you hear lots of great debate and geek-talk on a variety of topics. A Shapefile vs Feature Class discussion caught my attention the other day at such an event. This can be a simple or difficult question to answer depending on the way you interpret it. This isn’t really a comparison on Shapefile vs Feature Class because as we will discuss, this isn’t an apples to oranges comparison.&lt;/p&gt;
&lt;p&gt;Let’s start with the Shapefile: A Shapefile &lt;strong&gt;&lt;em&gt;is&lt;/em&gt;&lt;/strong&gt; a Feature Class. Although the intended question probably wasn’t answered here. But let’s go a little deeper into this before moving on, so what is a Feature Class then (from: &lt;a href=&quot;http://wiki.gis.com/wiki/index.php/Feature_class&quot;&gt;http://wiki.gis.com/wiki/index.php/Feature_class&lt;/a&gt;?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Feature classes are homogeneous collections of common features, each having the same spatial representation, such as points, lines, or polygons, and a common set of attribute columns, for example, a line feature class for representing road centerlines.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;By this definition, a Shapefile is a Feature Class. Back in the 1990’s, the Shapefile was referred to by it’s full name - the Shapefile Feature Class. Think of “Shapefile” as it’s Given Name, and Feature Class as the Surname. If we always referred to it’s full name, Shapefile Feature Class, the comparison (or lack of) would not need to be discussed. This also helps explain a Geodatabase Feature Class. The Given name for both, really describes the Workspace type. Hopefully a Workspace in ArcGIS python or ModelBuilder makes more sense now too.&lt;/p&gt;
&lt;p&gt;This brings up another discussion on the Shapefile vs Feature Class topic. What is there to compare with a Shapefile Feature Class and a Geodatabase Feature Class? There are many similarities, since they are both collections of common features having the same spatial representation (Point, Line, Polygon, etc). The differences are mostly in the additional types and behaviours available to a Geodatabase FC. Not going to list them all, but domains, topologic relationships (geometric networks, terrains), and the ability to store high precision geometry are a few differences. And there are many Geodatabase storage options: Access (AKA Personal), File, and Enterprise (AKA RDBMS) which can have subtle differences as well. Whereas a Shapefile is always stored in a file folder and is more of a universal format support by many [more] GIS and CAD systems.&lt;/p&gt;
&lt;p&gt;Both shapefile FC and GDB FC have their place. Your requirements and constraints will most likely have you working with both at some point. Here are some additional links on the topic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://gis.stackexchange.com/questions/13245/what-is-the-hierarchy-of-features-in-arcgis-is-it-different-in-other-software&quot;&gt;Hierarchy of Features in ArcGIS (StackExchange)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.gis.com/wiki/index.php/Feature_class&quot;&gt;Feature Class (GIS Wiki)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.facebook.com/GisParty/posts/140879532704669&quot;&gt;Feature Class and Shapefile (FaceBook Group)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[ArcGIS JavaScript API Web Optimizer beta released]]></title><description><![CDATA[The ArcGIS JavaScript API Web Optimizer is a web application that will generate custom or lightweight builds of the ArcGIS JavaScript API…]]></description><link>https://www.spatialtimes.com/2014/05/arcgis-javascript-api-web-optimizer-beta-released/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/05/arcgis-javascript-api-web-optimizer-beta-released/</guid><pubDate>Fri, 23 May 2014 11:31:27 GMT</pubDate><content:encoded>&lt;p&gt;The ArcGIS JavaScript API Web Optimizer is a web application that will generate custom or lightweight builds of the ArcGIS JavaScript API. You can pick and choose the component you want, then generate your custom/slim version of the API. You may have heard about this at the Esri Dev Summit this past year, but things went silent for a while after that. However, &lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2014/05/16/arcgis-api-for-javascript-web-optimizer-in-public-beta/&quot;&gt;a recent blog post&lt;/a&gt; by Esri has surfaced with a link to the &lt;a href=&quot;http://jso.arcgis.com/&quot;&gt;open beta site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once a custom build is created, you can download a copy or have it hosted on js.arcgis.com (with an Organization or Developer account). The Esri CDN is still available for both the regular and compact builds of the API and this new offering expands the options available to support growing variability of Dev requirements (based on developer requests I’d imagine).&lt;/p&gt;
&lt;p&gt;Why might you want to use this approach? Esri’s documentation explains some benefits:&lt;/p&gt;
&lt;p&gt;The Web Optimizer offers an alternative to the “one-size fits all” builds that Esri offers via the CDN (js.arcgis.com/3.9/ and js.arcgis.com/3.9compact/) or as a download. This works well for development of smaller web applications. But as applications grow in size and functionality, this approach breaks down. When an application uses a large number of modules not included in the available builds, applications generate more http requests, download more JavaScript and take longer to load. A custom build combines the required modules which reduces the number of http requests and application load time.&lt;/p&gt;
&lt;p&gt;I wish this was around in the ArcGIS JavaScript API version 2 days! Back when smart phones and tablets had limited memory and bandwidth. Moving forward I would think new devices are able to handle the standard/compact CDNs while leveraging the benefits of pre-caching, distributed servers, and bypassing old browser single-domain download concurrency limits (default is 5).&lt;/p&gt;
&lt;p&gt;On the other hand, &lt;em&gt;long&lt;/em&gt; wait times (and progress bars) for [down]loading applications is a UX no-no. The Adobe Flash loading bar, and Silverlight’s Blue Circle-of-Wait rank up there with the Windows XP 99% complete progress bar - why does the last 1% take forever?! I can’t get a coffee every time I see these - I drink enough java as it is! The ArcGIS JavaScript API Web Optimizer is one way to combat such issues. Wouldn’t you choose the shorter line at the grocery store?! Log in and try the beta for yourself.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS License Manager Settings]]></title><description><![CDATA[This post will cover 3 aspects of ArcGIS License Manager: Using ArcGIS Desktop 9.3x and 10.x with License Manager 10.x ArcGIS License…]]></description><link>https://www.spatialtimes.com/2014/05/arcgis-license-manager-settings/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/05/arcgis-license-manager-settings/</guid><pubDate>Thu, 15 May 2014 11:45:01 GMT</pubDate><content:encoded>&lt;p&gt;This post will cover 3 aspects of ArcGIS License Manager:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Using ArcGIS Desktop 9.3x and 10.x with License Manager 10.x&lt;/li&gt;
&lt;li&gt;ArcGIS License Manager common firewall issues&lt;/li&gt;
&lt;li&gt;ArcGIS License Manager options for reserving licenses/extensions for specific users/groups&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;1. Using ArcGIS Desktop 9.3 with License Manager 10.x&lt;/h2&gt;
&lt;p&gt;If you use the default setup of ArcGIS License Manager 10.x you might notice that 9.x ArcGIS Desktop clients can’t connect by default. This is due to a minor change in how ArcGIS Desktop uses ports when connecting. At 9.x, Desktop will try to contact LM using port 27004, however, LM 10.x is setup to use a port range of 27000-27009 instead.&lt;/p&gt;
&lt;p&gt;To fix this issue, open the &lt;em&gt;service.txt&lt;/em&gt; file located in the LM install directory (&lt;em&gt;C:\Program Files (x86)\ArcGIS\License10.2\bin&lt;/em&gt;). I recommend making a backup first. The first line will typically read &lt;code class=&quot;language-text&quot;&gt;SERVER this\_host ANY&lt;/code&gt;. Change this line to read &lt;code class=&quot;language-text&quot;&gt;SERVER this\_host ANY 27004&lt;/code&gt;. This will force LM to use port 27004. Both 9.x and 10.x will be able to connect. Don’t forget to restart LM for the changes to take effect. Test.&lt;/p&gt;
&lt;h2&gt;2. ArcGIS License Manager common firewall issues&lt;/h2&gt;
&lt;p&gt;Firewalls are typically your friend. However, they also can’t read minds to understand what ports to keep open or closed. Once your License Manager is setup, the firewall configuration is fairly straight forward if you are having issues connecting from a different machine. ESRI provides &lt;a href=&quot;http://resources.arcgis.com/en/help/install-guides/license-manager/10.1/index.html#//00790000000w000000&quot;&gt;these steps&lt;/a&gt; to work through the firewall. Below is a quick summary:&lt;/p&gt;
&lt;p&gt;Before configuring the firewall, you will want to update the same &lt;em&gt;service.txt&lt;/em&gt; file mentioned in part 1. This time, update the line &lt;code class=&quot;language-text&quot;&gt;VENDOR ARCGIS&lt;/code&gt; to use a specific port, such as &lt;code class=&quot;language-text&quot;&gt;VENDOR ARCGIS PORT=1235&lt;/code&gt;. This specifies that the vendor daemon (ARCGIS) is to use the port 1235. Don’t use any of the ports in the 27000-27009 range since this is the default range for FlexNet lmgrd. Again, don’t forget to restart LM - or stop LM before updating and start afterwards.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 227px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c97752b9585dea312e87a62b83ada2c3/b0b98/licenseManager.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 132.15859030837004%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAaCAIAAAA44esqAAAACXBIWXMAAA7DAAAOwwHHb6hkAAADl0lEQVR42o2UWW/cVBTH53vzAjzxCXiowhMSSksiHkCCViVNKY0IqMxkMjPerrfxeq+Xu2+eKkGOwySdFgnppyNZ1v+c/1ns2bOfL74+fnV0+uabH94enf5+dPrmyclv3z2/Onntf//KOTl3T87d45fr45frp79unp05J+fe0zP3x9fr5y/OZ3GUNw0DIPe8FCFWVX1dYwDyICzipA6CDIC8aThCrGnENmtcN8myBvfSc4JZUyMj9Hq5Wl+tEhClYay5RGXtb1xntSm3RZ1XWbwFXtDBtkddHIT+xjVCh344gxXkmFdZ1cGuyipUIkmlpJITrjC5UepGK0uJ7rv3nL5XUnFNWmKECdxgBktIOxr6UZbkaZRmSSaIUFxLKjYp/cMnlz79M2CXPr3wyBx0HWwllVZa3/FHMeups/aqHPob3127wAWaa4nZtxfN57/Qz35qv3jBv3plvjyzT97SMs0klUZa3/VndVErpg3XrGd5mpfbMvIj0hJJpabs1hhS17RBt8Nwa/SNNkYYQYSVdrR9J1YTggiOuZXWSiupxB25gwqmGBEUc9Iz3OBDsREGNxh4IAGJIGJKv7xaLhaL5XKZ5RnGWAoJaxj6oWLKin/FmulJv9O7nd4ZYcaemYyjOATh6nq1WW2SKMEdFkxYbSd3D5U11xzztm571LOeaa41197Gu15cp3FabIvADZyVk2/zHvWfsN2jPvKjNExb2Fo5pg/8IIkSTrlgQnJpte2aLgbxaFt+ZHsa1VRWEIFK1FQNKsZYZVW5LXvUT3M9FGuud3o3qGFQgxFmUEOWZMAFaZjmSR56IXBBBzsjzGHPRpgOdpcXl8u/l/O/5sADwAUxiNMwtdLu9E5S2cGuhS0q0UPlqqj0eCSG9SwJkyIt0jCVVN4vn45Rs/GEcINJS2hHP7AtqGSYCyqNMOquYU4EJ0I8Yp9uPCSyt13Wg7SaSc3VGMc6yvCR/eV9zL24qWAO1SqibspWMV3HdJ2wdcychDGijNDT8A+4F8OyVtySXlKsKFbkLk4o9mnlg3i0razmY5ED/kv5gdhKO+35/7O3DQc1aK6NMAccCB6/GtQw/gzKvJRUsp5xzB8zbUgxJancr2r64KdHb+PNqrzimE/bf0wLW1jCJEyqvEIVqou62BZN3ZCOtLClPQUemMUg7lCHKtTUzZ4Wtnmau2t38W7hrJzQD52VM383D/1wG299x0/CZDlf/gP7u5GkwOV5UgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;firewall settings for ArcGIS License Manager&quot;
        title=&quot;&quot;
        src=&quot;/static/c97752b9585dea312e87a62b83ada2c3/b0b98/licenseManager.png&quot;
        srcset=&quot;/static/c97752b9585dea312e87a62b83ada2c3/b0b98/licenseManager.png 227w&quot;
        sizes=&quot;(max-width: 227px) 100vw, 227px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;To set the firewall options in Windows Server 2008, open the Windows Firewall with Advanced Security application. On the left panel/tree, click the Inbound Rules. In the Actions area click the &lt;em&gt;New Rule…&lt;/em&gt; button. On the General Tab, provide a rule name such as ArcGIS10LMPorts. On the Protocols and Ports Tab set the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protocol type: &lt;strong&gt;TCP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Local Port: &lt;strong&gt;Specific Ports; 1235, 27000-27009&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Remote port: &lt;strong&gt;All Ports&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The local port settings in this example are set to the full range of lmgrd. If you are also implementing Step 1 (using with Desktop 9.x) you can just set the ports to include 27004. The image here uses a third example, setting the range to 27000-27004. After your ports have been set, save the firewall rule and make sure it is enabled. Test.&lt;/p&gt;
&lt;h2&gt;3. ArcGIS License Manager options for reserving licenses&lt;/h2&gt;
&lt;p&gt;There are a few cases where you might want to reserve an ArcInfo (AKA Advanced) license for admin purposes, or possibly an extension license for a small group of users. To accomplish this, another edit is required to the &lt;em&gt;service.txt&lt;/em&gt; file to point to an Options file with additional configurations set. In the options file we will create a User Group to contain a list of staff, and specify what license can be reserved by the group. Once complete, this license will not be available to users outside the group. If one user in the group is already using the reserved license, other group users can still grab a general license from the pool. The example steps through reserving 1 ArcInfo license for an admin group):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a new file called &lt;em&gt;ARCGIS.opt&lt;/em&gt; (or whatever name you wish to use) in the same directory as the LM &lt;em&gt;service.txt&lt;/em&gt; file and open in your favorite text editor.&lt;/li&gt;
&lt;li&gt;In the ARCGIS.opt file, create a group called AdminGroup and specify users:
&lt;ul&gt;
&lt;li&gt;Create the group: GROUP AdminGroup&lt;/li&gt;
&lt;li&gt;Add users by OS login (no commas, just spaces to list users): BryanMac AlGore BarnyRubble&lt;/li&gt;
&lt;li&gt;The full line will read: &lt;strong&gt;GROUP AdminGroup BryanMac AlGore BarnyRubble&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;On a new line, specify the license to reserve one (1) ArcInfo for the AdminGroup
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RESERVE 1 ARC/INFO GROUP AdminGroup&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Save and close the option file. Note: you can also add comment lines to the file using the hash/pound (#) symbol&lt;/li&gt;
&lt;li&gt;Setup LM to use the newly created option file:
&lt;ul&gt;
&lt;li&gt;Open/edit the service.txt file&lt;/li&gt;
&lt;li&gt;Update the line reading &lt;strong&gt;VENDOR ARCGIS PORT=1235&lt;/strong&gt; to point to a options file, in this case called ARCGIS.opt: **VENDOR ARCGIS PORT=1235 options=“C:\Program Files (x86)\ArcGIS\License10.2\bin\ARCGIS.opt” **(don’t forget the quotes)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Save the service.txt file and restart License manager&lt;/li&gt;
&lt;li&gt;Test&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;The final results&lt;/h2&gt;
&lt;p&gt;Here is an example service.txt file if using all of the steps above:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;basic&quot;&gt;&lt;pre class=&quot;language-basic&quot;&gt;&lt;code class=&quot;language-basic&quot;&gt;SERVER this_host ANY &lt;span class=&quot;token number&quot;&gt;27004&lt;/span&gt;
VENDOR ARCGIS PORT&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1235&lt;/span&gt; options&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&quot;C&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;\&lt;span class=&quot;token function&quot;&gt;Program&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;Files&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x86&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;\ArcGIS\License10.&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;\bin\ARCGIS.opt&quot;
INCREMENT ACT ARCGIS &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; permanent &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; qweryqweryqweryqwery\
vendor_info&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;qweryqweryqweryqwery&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And the final ARCGIS.opt file:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;basic&quot;&gt;&lt;pre class=&quot;language-basic&quot;&gt;&lt;code class=&quot;language-basic&quot;&gt;\# Reserve one Info&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;Advanced license &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; administration &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;also added &lt;span class=&quot;token function&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
\# &lt;span class=&quot;token keyword&quot;&gt;To&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; any hung license after &lt;span class=&quot;token number&quot;&gt;1200&lt;/span&gt; seconds
TIMEOUTALL &lt;span class=&quot;token number&quot;&gt;1200&lt;/span&gt;
\# Setup the User Group
GROUP AdminGroup BryanMac AlGore BarnyRubble
\# Reserve an ArcInfo license &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; the group
RESERVE &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; ARC&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;INFO GROUP AdminGroup&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Links for additional information&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://resources.arcgis.com/en/help/install-guides/license-manager/10.1/index.html#//00790000000z000000&quot;&gt;Using the options file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://resources.arcgis.com/en/help/install-guides/license-manager/10.1/index.html#/Configure_the_ArcGIS_License_Manager_to_work_through_a_firewall/00790000000w000000/&quot;&gt;Configure the ArcGIS License Manager through a Firewall&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Map of the Day - The New York Times]]></title><description><![CDATA[A great web mapping example. The New York Times Crime map has been around for a while now (June 18, 2009), but it’s still worth discussing…]]></description><link>https://www.spatialtimes.com/2014/05/map-of-the-day-the-new-york-times/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/05/map-of-the-day-the-new-york-times/</guid><pubDate>Wed, 07 May 2014 09:22:58 GMT</pubDate><content:encoded>&lt;p&gt;A great web mapping example. The &lt;a href=&quot;http://projects.nytimes.com/crime/homicides/map&quot;&gt;New York Times Crime map&lt;/a&gt; has been around for a while now (June 18, 2009), but it’s still worth discussing. I sometimes dive into my browser bookmarks just to find it when I need some inspiration. Why? It gets so many things right! The topic is a little sensitive (homicides in New York) but the way the information is communicated on a map is very well done.&lt;/p&gt;
&lt;p&gt;With 10 ways of categorizing the data and the ability to filter the results by year, a visitor to this page can drill down into the details and interact with the map without requiring a GIS diploma. As well, the map fits into the existing page design, becoming an interactive newspaper article, not a GIS map. From a GIS point of view, the 10 categories are just layers that could be in a table of contents (TOC) - but the map isn’t made for GIS people. The TOC has been transformed into an interactive gallery that communicates information to the user: Number of homicides by year; Stats on previous year variation (using a variety of fonts/sizes to guide the user); Change the type of information being visualized. Even the Legend control doubles as a chart, showing statistical breakdowns and colour coding.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 285px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7ce10c7244f34f918769f90e9bfa9fa4/115c9/NYTimes-CrimeMap-285x300.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 105.26315789473684%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAIAAADJt1n/AAAACXBIWXMAAA7DAAAOwwHHb6hkAAADm0lEQVR42jWUaXPbNhCG+f9/S9sPzTR2YtntJLZoy9SNiPdNkMRJXCRlyXFbys4z7wwWC2ABzM6uFaWZ60deGCHCVT9I07eY1ogiTJRSr68///3F29vbMNH3/dAPx34YrSzLwjAIAh9CqJTSWrmuG0fRo/34OH9sEe54xznvuo4x1iJcwKaADWxQ1SBLa2X63hjTddOmvu9f3/k5cT6dTx9Mxvl8NsOxk1oo00llNXWdZhlCCEJYlAVlTGstpVRKCSkuxmRro5XWUkmtFGNUazWOo9W0pIIt5Zy9q+sIZYgQRAihFFOC6fT/9iJMKWEMEyKVNv1g/Qii++f1g7O2V7uH5/W3R+f7YjV3NvZy8/1peZHzj724+Ta3nQ3wwu3Bc8Nksd6tgWsRyoIkxbzb7AGTinNOCBFKq2FMs9RZOovnxXYP0rwIwzBJ0uVqPZvdXN/c7rzYQpSmRdlS6kcx5p0UfByG8Xh8fXuLouhp8TS35wfX3wFvs9sfXHd2e/fb7398+fqFEGIJrcsGE8bNMA7HF0Loy/HYEja+nOM42oPdZrdLsiJJszQvvCD46+rzp09/Xt/MgB9bVEg3KcIcYi7G04kQenp5qVrS6QGhdrPdzm3b9QNwONiPT8/O8vv9/dX11e3d3Xq7tahQbt4UiLVcdNoQTM+nlwYzJntKiOM4c9vO8qKsoOv5eZ7FcbR4fr5/ePgBgMWlDoqmplxoLUxPGXs9n1vCzfEEIdzv90EUYYSaps7y3PU9z/e2u+1msy6rcjocQ9Qy0SktTc95V5VlHCdN0+wBAAcvTbMp4Rh7vr9ar8MwAABEcVQUhcWVrjDvlOZSyX7AGC8WT3uwX66Wd3/fuX6QZxmsirwoXc8r8izP0iRJgjAsitzS/SAvEqY347EoS8dx4jie3c6+3szKCq62wPf9ME6rChJCICzjJI7iuCwLS5qeCsmUpkL2p/NuDxzH2e7B56ur1WoNa+j7PqyqIs+fFou5bZdlmSSJ4zhJklhCyhYThAnlnTamKGsAwCXDoGkaJWXbtgTjNE2Xy+VqvQEHv24RxgghZCGEqglYleU0lhWEdVVVbdPWkwEhrGFd13Uzbce0QZebKBvG0RLio9Y7IZRSnHeMcymk1vq9GJVWF/TEZSLlVKvGGMsY82tFX5wfTBHfNYUVl+jdpZ/QS9uYnNbxeHxfFkJwzqeoQigpp4bUMcPxVLqm//UELcTHBf83g/8A3qpmlJ5ak5YAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;New York Times Crime Map Sample&quot;
        title=&quot;&quot;
        src=&quot;/static/7ce10c7244f34f918769f90e9bfa9fa4/115c9/NYTimes-CrimeMap-285x300.png&quot;
        srcset=&quot;/static/7ce10c7244f34f918769f90e9bfa9fa4/115c9/NYTimes-CrimeMap-285x300.png 285w&quot;
        sizes=&quot;(max-width: 285px) 100vw, 285px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This map could be used as an image in a traditional newspaper that landed on your driveway. It would still communicate a subset of the information to the reader (albeit no additional interaction). A subset of the news article and the header/footer of &lt;em&gt;The New York Times&lt;/em&gt; is still present, and a link to the full article is also included.&lt;/p&gt;
&lt;h2&gt;GIS on the Web&lt;/h2&gt;
&lt;p&gt;Some in the industry, including myself, are trying to change how we use GIS on the web: Create for the end user, and design to incorporate into your site based on the subject matter. Why are we still making “map portals”? People don’t make “Chart portals” to show off the entire organizations’ list of bar-charts and spline graphs. These are usually embedded into the subject matter pages directly (ROI graph on an investment page) – providing a way to communicate data/information that might add to the subject. Maps (apps) should be viewed in a similar way when there is a focus/purpose to map. The world of GIS, might not be completely ready for the transformation away from map portals, but something we should keep in the back of our minds when we have our next request for map website.&lt;/p&gt;
&lt;h2&gt;The Details&lt;/h2&gt;
&lt;p&gt;Rant complete, back to the Crime Map that has many subtle features as well: The grey-scale basemap as to not grab your attention, and the additional sentence to let you know how much data isn’t shown (example: “Map does not show 1 location that the police have not released”). The address and ZIP search box is still there for those want to find out if they are living in a hotspot , but it’s not the focus of the application or the news article. The time slider is also very useful and changes the views and statistics as you interact - long before this functionality was &lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2011/07/20/visualizing-time-aware-data-in-a-web-map/&quot;&gt;easy to implement&lt;/a&gt; with traditional tools.&lt;/p&gt;
&lt;p&gt;The New York Times has produced many great maps like this one. They find ways to communicate the information based on users, the subject, and data. Well done NYT.&lt;/p&gt;
&lt;p&gt;Update (May 07, 2014 @5:10pm est): For those interested in a New York Times map that doesn’t use flash, checkout the JavaScript &lt;a href=&quot;http://www.nytimes.com/interactive/dining/new-york-health-department-restaurant-ratings-map.html?ref=dining&quot;&gt;Health Department Restaurant Ratings Map&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS 10.2.2 is here]]></title><description><![CDATA[With very little fanfare, ArcGIS 10.2.2 was released last week. Don’t be fooled by the lack of attention, this is an important update to…]]></description><link>https://www.spatialtimes.com/2014/04/arcgis-10-2-2-is-here/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/04/arcgis-10-2-2-is-here/</guid><pubDate>Wed, 30 Apr 2014 23:09:44 GMT</pubDate><content:encoded>&lt;p&gt;With very little fanfare, ArcGIS 10.2.2 was released last week. Don’t be fooled by the lack of attention, this is an important update to your ArcGIS 10.2x install (or 10.1 if you were able to deal with some hiccups until now). This release is more of a Service Pack with lots of &lt;a href=&quot;http://support.esri.com/en/downloads/patches-servicepacks/view/productid/67/metaid/2069&quot;&gt;bug fixes&lt;/a&gt; and can be installed on top of an existing 10.2 install and is highly recommended. There are a few new features, including &lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2014/04/14/support-for-ogc-geopackages-in-arcgis/&quot;&gt;support for the OGC GeoPackage&lt;/a&gt; which will be further developed through 10.3. That’s right, there will be a 10.3 release.&lt;/p&gt;
&lt;p&gt;This is an “easy” update, but always remember to read the upgrade/migration documentation for your current configuration. Things get more complicated when the entire Esri stack of software is being upgraded on a single machine, or when moving from older versions (9x or 10.0).&lt;/p&gt;
&lt;p&gt;So will 10.3 (or 10.3.x) be the final nail in the ArcGIS Desktop 32-bit coffin? It would make sense that it would be the end for this cycle since ArcGIS Professional will be hitting the scene later this year in overlap. Esri probably doesn’t want to maintain two desktop streams for very long (makes sense). Anyone else having a flashback to the ArcView 3.3 /ArcGIS 8.0 overlap days?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Feature Class export into native SQL Server table]]></title><description><![CDATA[Not too long ago, the only way to store spatial data inside a database was to have a custom/binary format managed in code or by software…]]></description><link>https://www.spatialtimes.com/2014/04/feature-class-export-into-native-sql-server-table/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/04/feature-class-export-into-native-sql-server-table/</guid><pubDate>Fri, 25 Apr 2014 17:23:54 GMT</pubDate><content:encoded>&lt;p&gt;Not too long ago, the only way to store spatial data inside a database was to have a custom/binary format managed in code or by software (such as ArcSDE). There have been huge strides forward in the database world - with many platforms now incorporating native spatial types. Oracle Spatial, SQL Server’s Geometry/Geography, to name just a few. These spatial types might still have some limitations when using in combination with GIS software, but it is now much easier to ETL this data into native formats for other use.&lt;/p&gt;
&lt;p&gt;You can have the best of both worlds as well: Using native spatial types and still leveraging Geodatabase objects - however this post deals with extracting data and loading into a native table/spatial type only. You can use ArcCatalog for the Geodatabase stuff.&lt;/p&gt;
&lt;h2&gt;Scenario&lt;/h2&gt;
&lt;p&gt;Have a [&lt;em&gt;File&lt;/em&gt;|&lt;em&gt;ArcSDE&lt;/em&gt;|&lt;em&gt;Access&lt;/em&gt;] Geodatabase Feature Class and want to load into a new SQL Server table with the Geography spatial type using Python. In this scenario it will be a polygon layer, but the example can be expanded to allow other feature types as well.&lt;/p&gt;
&lt;h2&gt;Steps&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Create the SQL Server table. In this example I used SQL’s Enterprise Manager to create a table named &lt;em&gt;SpatialTable&lt;/em&gt; with 2 fields, one for a unique ID and one to store the Geography:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; SpatialTable &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; id &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;IDENTITY&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; GeogCol1 geography &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
GO&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Read the features and load into SQL Server using python. A python script leveraging ArcPy’s data access module is used to cursor through the features while exposing the shape/geometry in the well-known text (WKT) representation for OGC geometry (usable by SQL Server). This is one line of code using ArcPy! Next, to load into SQL Server, a Python module called &lt;a href=&quot;https://code.google.com/p/pyodbc/&quot;&gt;pyodbc&lt;/a&gt; is used to connect to the corresponding database.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note: SHAPE@WKT tokens were made available at ArcGIS 10.1 Service Pack 1&lt;/p&gt;
&lt;iframe
  src=&quot;https://gist.github.com/TheBryanMac/11303076.pibb&quot;
  style=&quot;width: 100%; height: 300px; border: 0;&quot;
&gt;&lt;/iframe&gt;
&lt;p&gt;You now have your data stored in a native table using the Geography format.&lt;/p&gt;
&lt;h2&gt;More information&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/cc280766.aspx&quot;&gt;SQL Server Geography type&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://technet.microsoft.com/en-us/library/bb933816%28v=sql.105%29.aspx&quot;&gt;SQL Server WKT to spatial (STMPolyFromText)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://resources.arcgis.com/en/help/main/10.2/index.html#//018w00000011000000&quot;&gt;ESRI ArcPy.da (search cursor)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Open Data Institute Coming to Waterloo]]></title><description><![CDATA[The Federal Government of Canada’s Economic Action Plan 2014 recently announced it will be providing $3 million to Canadian Digital Media…]]></description><link>https://www.spatialtimes.com/2014/04/open-data-institute-coming-to-waterloo/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/04/open-data-institute-coming-to-waterloo/</guid><pubDate>Tue, 15 Apr 2014 22:28:06 GMT</pubDate><content:encoded>&lt;p&gt;The Federal Government of Canada’s &lt;em&gt;Economic Action Plan 2014&lt;/em&gt; recently &lt;a href=&quot;http://actionplan.gc.ca/en/initiative/open-data-institute&quot;&gt;announced&lt;/a&gt; it will be providing $3 million to Canadian Digital Media Network (CDMN) for the creation of an Open Data Institute in Waterloo.&lt;/p&gt;
&lt;p&gt;To help ensure that Canada captures the commercial opportunities presented by Open Data, Economic Action Plan 2014 proposes to provide $3 million over three years, from the existing resources of the Federal Economic Development Agency for Southern Ontario, for the creation of the Open Data Institute, to be based in Waterloo, Ontario.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 521px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/42d47e3a4c7693ab2c6fe0a68c58630d/8ba14/Canada-Action-Plan.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.60000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAcIAwb/xAAWAQEBAQAAAAAAAAAAAAAAAAAHAQT/2gAMAwEAAhADEAAAAVTyUn7JZ+ySfzRf/8QAGhAAAgMBAQAAAAAAAAAAAAAAAwQBAgUGEf/aAAgBAQABBQJHmlnUOqwlMvfOm0vYbkqn0XaFmT29/8QAJBEAAgEBBgcAAAAAAAAAAAAAAQIDEgAEERNDYQUVIzNBY4H/2gAIAQMBAT8BHCrv1QlSRNkUJXXIjRmcSNmmNe6ssIZaaAYAQgJxtye6+/xrLtjpbfLf/8QAIBEBAAEDBAMBAAAAAAAAAAAAAQIDBBMAEhRjERVhk//aAAgBAgEBPwGd9e57ebVJQC5Kg0oxKmXjcc2klCjjuJbhJuYj5Yia9lddX5Pzt1//xAAmEAACAQIGAgEFAAAAAAAAAAABAgMEEgAFERMiMSFBJDNRU2Hh/9oACAEBAAY/AosyjzePb+GZEjp5bkeeaCKSO78lO04HNAshU7e6mpxW5XlZnzGFYaeoijSYtNAKpddp3tVaiQFS10KWANaw1RjgLNT1MTOt6pLEGezUr349q3YB/WFkAfg3nblMMh9cZQGsPnu0/bGqpVbrdy1FaaklI9Iwn0I26A05EKBaBpj+4//EABsQAQEBAAIDAAAAAAAAAAAAAAERIQAxYbHR/9oACAEBAAE/IWrHaArSIpfQ7BwotY0g57FXD4usk8jrT60PRsRc5rUdN3bzrLG3ml2y2d6ILZMMgXvp98//2gAMAwEAAgADAAAAEDzv/8QAGBEBAQEBAQAAAAAAAAAAAAAAARExAEH/2gAIAQMBAT8QzFFokhUJgZ78rGUicFlAiCpDwgrK/wD/xAAaEQEBAQADAQAAAAAAAAAAAAABESEAMUFh/9oACAECAQE/EBzs7KOiDUcxr+3fIAFg1OBF9aww5//EABoQAQEAAwEBAAAAAAAAAAAAAAERACExQWH/2gAIAQEAAT8QnQFl+u18KmEpozqTauRM8DhJwd8q5Zp6hwHF94vQIghmboSTWLviJVueaf39516rru077361q//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Canada Action Plan&quot;
        title=&quot;&quot;
        src=&quot;/static/42d47e3a4c7693ab2c6fe0a68c58630d/8ba14/Canada-Action-Plan.jpg&quot;
        srcset=&quot;/static/42d47e3a4c7693ab2c6fe0a68c58630d/953fe/Canada-Action-Plan.jpg 500w,
/static/42d47e3a4c7693ab2c6fe0a68c58630d/8ba14/Canada-Action-Plan.jpg 521w&quot;
        sizes=&quot;(max-width: 521px) 100vw, 521px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Many organizations have also stepped up to contribute to the institute - OpenText, University of Waterloo, Communitech, and Desire2Learn, already coming forward to provide support.&lt;/p&gt;
&lt;p&gt;This announcement comes just days after the Fed’s completed the largest and most successful Canadian open data hackathon, the &lt;em&gt;Canadian Open Data Experience&lt;/em&gt; (&lt;em&gt;CODE&lt;/em&gt;). It was a great way to help showcase a variety of ideas and business opportunities with open data (new datasets were also released for the event). It’s a great start for the Government, and hoping it leads to more data, formats, and web services in the future.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Side note:&lt;/strong&gt; Someone should inform Canada Post what the rest of the Federal Government is up to - as they are still pursuing legal action against &lt;a href=&quot;http://geocoder.ca/?sued=1&quot;&gt;Geocoder.ca&lt;/a&gt; for creating their own PC file. Maybe we just found the next candidate for an open dataset?!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ArcGIS Javascript API 3.9 Released]]></title><description><![CDATA[Esri just announced the latest release of ArcGIS Javascript API 3.9. Notable updates in this release are the new CSV Layer and a new symbol…]]></description><link>https://www.spatialtimes.com/2014/04/arcgis-javascript-api-3-9-released/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/04/arcgis-javascript-api-3-9-released/</guid><pubDate>Thu, 10 Apr 2014 12:26:10 GMT</pubDate><content:encoded>&lt;p&gt;Esri just &lt;a href=&quot;http://blogs.esri.com/esri/arcgis/2014/04/07/arcgis-api-for-javascript-version-3-9-released&quot;&gt;announced&lt;/a&gt; the latest release of ArcGIS Javascript API 3.9. Notable updates in this release are the new CSV Layer and a new symbol style for continues color (colour) ramps.&lt;/p&gt;
&lt;p&gt;A full list of new features for the ArcGIS Javascript API 3.9 release can be found in the on-line &lt;a href=&quot;https://developers.arcgis.com/javascript/jshelp/whats_new.html&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It hasn’t been that long since 3.8 hit the scene back in January - I think this shows how important the JavaScript is to Esri these days.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Another GIS Blog?]]></title><description><![CDATA[Why create another GIS related blog? We sometimes ask ourselves the same question. This blog is just as much for us as it is our [potential…]]></description><link>https://www.spatialtimes.com/2014/04/another-gis-blog/</link><guid isPermaLink="false">https://www.spatialtimes.com/2014/04/another-gis-blog/</guid><pubDate>Wed, 02 Apr 2014 22:30:09 GMT</pubDate><content:encoded>&lt;p&gt;Why create another GIS related blog? We sometimes ask ourselves the same question. This blog is just as much for us as it is our [potential] readers. The goal is to share interesting news, ideas, and solutions related to the world of GIS. We get a place to store our information &lt;em&gt;and&lt;/em&gt; share it with you at the same time.&lt;/p&gt;
&lt;p&gt;As primary author, Bryan gets together with a small team of professionals to discuss various spatial topics over a pint or coffee. Some of these discussions end up making it here to this site. The team consists of a few GIS consultants/DBAs/Devs/Architects who like to share what they’ve learned over the years – and so they don’t forget what they’ve learned either. Sure there are 5 ways to accomplish any GIS task – we just provide some detail into which method(s) worked for us. That said, our methods and approaches will change as technology does. The right answer today might not be the best tomorrow or perfect for every situation – I guess that means there is always something to share.&lt;/p&gt;
&lt;p&gt;There are lots of great resources out there – and when we discover or create a great workflow, development technique, or cool map, this will be our place to share and discover with you.&lt;/p&gt;</content:encoded></item></channel></rss>