From the blog
Currently displaying: Developer
The Geocoding Toolbox is being deprecated (2 min)
First, the historyBack in 2014, we released a custom python toolbox for ArcGIS Desktop called the Geocoding Toolbox. It allowed users to geocode Utah addresses using the UGRC API. It was a great tool
SGID breaking changes from SITLA (3 min)
If you depend on any of the geospatial services from The School and Institutional Trust Lands Administration (SITLA), you might have noticed that the services started having issues on the 5th of Octob
Introducing palletjack: Updating AGOL feature services from external sources (6 min)
Do you hate writing the same bits of code over and over again? Do you hate fixing the same thing again and again? Do you think "there's got to be a way to do that, but I don't have time to figure it o
Python Shorts: Loading an Open SGID Layer into pandas (3 min)
There are a myriad of ways you can access data from the Open SGID. However, these all require some form of desktop client application. What if you want programmatic access to our spatial data? Because
Aggregating and Analyzing Point Data with H3 Hexes and Pandas (10 min)
I recently discovered Uber's open-source H3 geospatial indexing system while working on a project with a lot of point data. This is a great tool for aggregating points into regularly-sized polygon geo
Python Shorts: The Benefits of Unit Testing (6 min)
In the realm of programming, "unit testing" is an automated way of testing small, individual "units" of your code to ensure that when given a specific set of inputs they return a specific set of outpu
Python Shorts: Flattening Arrow Code (5 min)
"Arrow Code" refers to a series of nested statements that increase your indentation level at each statement, creating an arrow of whitespace when the s are mirrored by accompanying blocks.While arro
Introducing the Official UGRC API Client (2 min)
Assigning a geographic coordinate to an address, otherwise known as geocoding, is one of the simplest ways to enable data to be visualized on a map. This makes geocoding a gateway to a Geographic Info
A Brief Tutorial on Exploring the Open SGID with Open Source Python Tools (7 min)
The accompanying Python Notebook for this blog post can be found here on Google Colab.The Open SGIDThe introduction of the Open SGID has opened the door for new ways to explore Utah's GIS data. Before
Automating Next-Generation 911 Law Enforcement Boundaries (3 min)
UGRC has created a Python script for law enforcement boundaries that automatically builds jurisdiction polygons based on existing boundaries (primarily county and municipal boundaries) in the State Ge
Using Jupyter Notebook for UGRC Collaboration (4 min)
At UGRC we greatly value collaboration and sharing ideas. A terrific technology to support these values is the Jupyter Notebook project.Jupyter Notebook consists of a web application tied to an interp
Thoughts from Teaching Google and Amazon New Skills (9 min)
Developing software for digital assistants is fun and a refreshing change from typical GIS projects. Over the past few months, UGRC was lucky enough to spend some time developing equivalent skills for
Leveraging Git and GitHub to Manage the Lifecycle of Custom ArcGIS Tools (13 min)
As GIS developers, we are often expected to provide the same custom tool for multiple versions of ArcGIS Desktop (or ArcGIS Pro). For example, some users are on Desktop 10.4, while others are on 10.6
Don't Make Users Think about Updating Software (6 min)
As software developers, we want the people who are using our software to ~~enjoy~~ the experience. Developers strive to create a positive user experience to increase the popularity and usage of their
Cache-Breaking for Faster Web Application Updates (4 min)
When Production Is Broken, It Needs to Be Fixed Now!Recently, the URL changed for one of the map services we use in several of our applications. This came as a bit of a surprise to us, so we quickly u
Dumbing Down Terrain with Contour Polygons (4 min)
While technology advances towards products with greater resolution and accuracy, sometimes more data isn’t always better data. Sometimes, being able to see general trends and relative differences pain
The Evolution of a Python Script (7 min)
Python is a very approachable programming language and scripting in python is quick and powerful - Create a file, type some code, and a repeatable script is produced. Python is installed on most compu
UGRC System Status Page (2 min)
Over the years, GIS is trending more and more towards being web-based. UGRC has tried to keep step with this trend with the addition of the discover, the Turn GPS RTK GPS service, and the Web API hand
Rethinking Geocoders: Adding Local Vernacular into the Build Process (5 min)
UGRC has been working on a project to enhance our approach to geocoding. This grew from the basic idea that humans often view addressing differently than a GIS system. For instance, as GIS professiona
Removing and Replacing the Esri Web Adaptor (3 min)
The Esri web adaptor is a small load balancer/reverse proxy bundled into the ArcGIS Server install but do you know if you need it?ArcGIS Server runs an http server exposed over the private port 6080.
Printing Web Maps with Discover Services (3 min)
Export Web Map ToolThe Export Web Map tool is a geoprocessing tool that comes published as a service () out of the box with ArcGIS Server. From ESRI's docs:This is most commonly used as a print servic
Forced GitHub; A reflection on a new website using GitHub and Jekyll (7 min)
The first commit to our version 6 website was one year and eight months ago on May 26, 2015. We went live with the v6.0 on March 25, . Between that first commit and launch, we started an internal camp
Why I Speak at Conferences and You Should Too (2 min)
Recently, I tried to gather all of the presentations that I have participated in during my career up to this point (~10 years). I was able to find materials for almost 20 different presentations or wo
Mock your Dojo AMD modules with StubModule.js (2 min)
When testing AMD modules it is sometimes necessary to verify how it interacts with it's dependencies. For example, you might be writing a module that makes XHR requests using dojo/request and you want
Boost Your Productivity With Vim (3 min)
I was surprised to realize today that I have never written about one of my favorite tools that I use to write code. It's something that absolutely transformed my day-to-day coding. If it was suddenly taken away from me I would feel like I had gone back to the dark ages. That's right, I'm talk about Vim. Or more specifically Vim key bindings. Vim (Vi IMproved) [https://en.wikipedia.org/wiki/Vim_(text_editor)] is an old text editor that was first released in the 90's and is an improvement to an even older editor called Vi. The intriguing part of Vim for me was not the 20 year old piece of software but the system that it used to edit and navigate text. It's very efficient, requiring the coder to reach for his or her mouse almost never. Lest you think that I've abandoned my favorite text editor [https://atom.io/], the real power of Vim for me is not the actual software. In fact, I've only opened it up a few times out of curiosity. The power of Vim is the standard that it's set. There are Vim emulator plugins for every major text editor out there including Sublime [https://github.com/guillermooo/Vintageous], Atom [https://github.com/atom/vim-mode] and even online editors such as CodePen [https://blog.codepen.io/2014/02/21/vim-key-bindings/]. This means that if you invest the time into learning Vim commands they will be almost universally applicable across your development tools. Want to quickly go to the end or beginning of the current line? Change everything within the quotes? Delete everything from your cursor to the end of the line? Quickly go to a line number? Change the casing of the selected text? This and much, much, much [https://www.catswhocode.com/blog/130-essential-vim-commands] more can be done with just a few Vim commands. Here are a few of the commands that convinced me that I should learn Vim: * "A" Go to the end of the line and start inserting new text. * "I" Same as "A" but go to the start of the line * "ci"" Delete everything within the quotes and start inserting new text * "C" Delete everything from the cursor to the end of the line and start inserting * "545 gg" Go to line number 545 * "ct," Delete everything until the "," and start inserting new text These are just a few of the commands that I use every day. While it's significant learning curve, the time investment is worth it to me. After all... > Every year, the average Vim user saves over 4 seconds in accumulated time not > having to reach for their mouse… > > — I Am Devloper (@iamdevloper) April 3, 2014 > [https://twitter.com/iamdevloper/status/451792390865833984] There are endless tutorials available for you to learn Vim. After learning just a few of the basics I made it my practice to add one or two new commands to my personal reference [https://www.evernote.com/l/ABdguLm6UtRExY8VU_EZWbfJvRKE6rpjTCM] on a regular basis. After a few weeks you'll wonder how you ever lived without it. There are a few drawbacks that come to mind. Firstly, after a few months of using Vim, your fingers will start automatically typing commands into non-Vim interfaces. This can get annoying. Also, you've probably already realized that the learning curve is pretty steep. If you are not in a code editor on a daily basis then it's probably not worth the investment. But if you're in the mood to boost your productivity and give your poor mouse a break you may want to play some vim golf [https://www.vimgolf.com/] and see how it goes. :)
How To Use UGRC Base Maps in QGIS (1 min)
Most people know about UGRC's awesome base maps. They are very popular and provide high quality cartography using the latest and greatest data from the Utah SGID. But did you know that they provide a
Using UGRC's Geocoding and Map-based Web Services (1 min)
The Department of Technology Services hosts a monthly scheduled [https://docs.google.com/a/utah.gov/document/d/1XOEXOIGdl2LHSXVDr3q5szpqVcAw6VgFTSVoXq15ZDM/edit] Enterprise Developer Group (EDG) brown bag presentation series. The previous session recordings can be found on the DTS youtube [https://www.youtube.com/channel/UCUuw5SFmgapGToUfRd5xGVw] channel. Steve Gourley from UGRC participated in the EDG last month and presented on UGRC's GIS/map technology-based web service offerings -- Unlock your API key. Making UGRC data available through http [https://eoh.github.io/Presentations/2014/UGIC/#0] -- contains the slides for the presentation. Give the video a watch if you are interested in finding out more about UGRC web services or picking up some new information from the developer of the API. Hope to see you at the next EDG brown bag!
Quick JavaScript Tip: The Arguments Object (2 min)
Recently, as I was slowly working my way through Rebecca Murphy's [https://rmurphey.com/] excellent js-assessment test suite [https://github.com/rmurphey/js-assessment], I ran into a problem that was quite vexing. I was creating a function that was to take an arbitrary number of arguments and combine them with an existing array [https://github.com/rmurphey/js-assessment/blob/master/tests/app/functions.js#L109-119]. I thought that this would be as trivial as using the concat method on the existing array and passing in the arguments object. However, as you can see below, it didn't work. See the Pen Arguments Concat Method [https://codepen.io/stdavis/pen/BPVWdQ/] by Scott Davis (@stdavis [https://codepen.io/stdavis]) on CodePen [https://codepen.io]. For a while I thought that I must be using the concat method incorrectly. I tested it using the terminal again and again with no problems. Finally I recalled a recent issue [https://us6.campaign-archive1.com/?u=2cc20705b76fa66ab84a6634f&id=c8f1074cb2] from A Drip of JavaScript that talked about the arguments object. I remembered that Joshua said that the arguments object "isn't exactly an array, [but rather an] object that acts like an array." This means that you can't use it exactly like an array. An easy fix for the situation was to bind a call to the slice method on an empty array to the arguments object which converts it to a true array object like so: See the Pen Arguments Slice [https://codepen.io/stdavis/pen/xJzqPB/] by Scott Davis (@stdavis [https://codepen.io/stdavis]) on CodePen [https://codepen.io]. Hopefully this will save you some time in the future. Scott [https://twitter.com/SThomasDavis]
Using Base Maps with Non-standard Coordinate Systems in LeafletJS (2 min)
Since LeafletJS [https://leafletjs.com/] seems to be what all of the cool kids are using these days and it shows no signs of slowing down [https://www.mapbox.com/blog/vladimir-agafonkin-joins-mapbox/], I thought that it would be fun to figure out how to use Leaflet to view UGRC's awesome base map services [/products/sgid/base-maps/]. This presented a unique challenge since they are not in a projection that is supported out-of-the-box by Leaflet (UTM Zone 12 NAD83). However, I found that it is possible with the help of a few additional JavaScript libraries. So, here's the solution: See the Pen Esri Leaflet (OLD) [https://codepen.io/stdavis/pen/zLaZoJ/] by Scott Davis (@stdavis [https://codepen.io/stdavis]) on CodePen [https://codepen.io]. You'll notice that I've loaded these libraries in addition to the latest version of Leaflet: * Esri-Leaflet Plugin [https://esri.github.io/esri-leaflet/] * Proj4js [https://github.com/proj4js/proj4js] * Proj4Leaflet Plugin [https://github.com/kartena/Proj4Leaflet] The implementation was not that complex once I got all of the numbers right. First I create a new Proj4Leaflet coordinate reference system which I pass into the map constructor. Then I use the Esri-Leaflet Plugin to set up a new TiledMapLayer and add it to the map. Now you can be one of the cool kids too!