Author Archives: BrightRain

naip wms | mapbox satellite

On Tuesday MapBox announced the release of its new Satellite layer based, partially, on NAIP imagery in the US. So I said I’d like to test it for speed against the NAIP Web Map Service (WMS) hosted by USGS National Map I’m currently using.

I was initially planning to do some benchmarking on tile load speed etc but really, it just isn’t necessary. One zoom or pan of each will tell you that MapBox is faster, hands down. So since what I do is highly visual, and because it’s a helluvah lot more fun, I simply dropped the two maps side by side and wired up some events such that, as one side is panned or zoomed, the other is set to the same resulting extent. Some flying around in either map will indeed confirm the hypothesis that MapBox is faster. But this didn’t turn out to be the most interesting part really. You can see that the quality is higher with higher contrast and crispy colors on the MapBox side. I did not alter saturation, hues etc of the imagery but simply left the default. Lots of interesting experimentation to be done there too.

Take a look for yourself and you’ll see which is faster. You will likely also discover more interesting comparisons.

Pro tip: go full screen (F11 in Firefox and Chrome)

Hat tip: And it’s centered on DC by default, for @cageyjames  – I get it, I used to be west coast.

So if you’re looking for hard data on tile loading speeds, sorry, I’ve got no numbers. I’m sure I could rig some JavaScript to test the loading speeds and gather number of tiles loaded etc., but this setup doesn’t lend itself to rigorous, fair testing for a few reasons anyway.

  1. There isn’t a map event in Leaflet that fires when all tiles are loaded (didn’t consider using anything else)
  2. Map events are wired such that a slight advantage is given to the target map
  3. MapBox Satellite also has roads and labels so a bit more load (handicap, like bowling)

arcgis fulcrum add in

In researching the fulcrum API for potential use in a project I thought I’d push it a bit further and ended up building a tool to import fulcrum data into ArcGIS. This happens, sometimes for the good and sometimes for an exercise in clicking. This time for the good as I ultimately created a couple of useful things:

1. a c# wrapper that turns fulcrum apps and records into usable .net objects

2. an ArcGIS add-in that imports all records from a selected app into a new feature class

The wrapper turns fulcrum api json responses into c# dictionaries and lists via the JavaScriptSerializer class and creates instances of custom fulcrumrecord and fulcrumform objects. This went pretty smoothly because the fulcrum api is both documented and well thought out.

I then used this wrapper to build an ArcGIS (ArcMap) add-in that imports all records from a selected app into a new file geodatabase feature class and adds it as a layer to the current map document. This is implemented via a separate class that digs into the depths of the ArcObjects model to create the feature class and populate it. If you’re familiar with ArcObjects this should look pretty familiar, if you are not, you might want to shield your eyes.

The code is available on github and you can find it here:

You can also just grab the .esriAddIn file from here and install it:

(BSD license disclaimer applies, truly alpha at this point)

Use is pretty straight forward, first you need to get your fulcrum api key from your profile, then sign in. Then you’ll want to either create a new file geodatabase or determine which one you’d like to use. Both of these go in the Settings (gears on fulcrum add-in toolbar)


The import is a read-only snapshot of the current records in the selected app. This can obviously be extended any way you like but, as-is, the feature class created is static.

Initially I added a setting to define the folder where photos were to be located and  the (first) photo for each record was downloaded to that location. The feature class then contained the full file path to the photo. I quickly realized that this could take a very long time depending on how many recordsphotos there are. So I altered it to populate a field with the link to the photo on the fulcrum site. However, there is also a branch of the git source that contains the original functionality to define a location and download the photo to disk.

Currently only the first photo is linked todownloaded. This could be handled by creating a separate, related stand alone table to hold links to multiple photos linked via the record id.

Recursion needs to be implemented in a couple of places to fully support the fulcrum data model. Most notably in the Section element type; the application currently ignores sections. But there can be an infinite number of nested sections that contain child elements.

It’s worth a mention that, if you’re looking for a COTS solution, Arc2EarthSync (beta)  now includes fulcrum as a provider that acts to keep fulcrum data up to date. I understand there are also plans to make it bi-directional.

4 Elements of a Fair and Viable RecruiterFreelancer Business Model

After a recent spate of contacts by recruiters via LinkedIn and exchanges on twitter (which included Bill Dollins referring to recruiters on LinkedIn as the new travel agents), I started thinking about my past experience with recruiters as a freelancer and how it might actually work, fairly, for both parties. I rely heavily on network and reputation for most of my business but, I’ll be honest, that makes for a hell of a roller coaster ride — one month, all nighters, next month, crickets. Sales and business development are not my favorite parts of freelancing so it would be great to have an on-demand sales team.

So, based on my experience, here are four key elements of a fair and profitable recruiting arrangement between recruiters and freelancers:

1. Do Not Limit Future Options
Allow for a market arrangement in which, if you provide good service, I will continue to do business with you. Do not attempt to limit future opportunities by limiting who I can work with in the future, otherwise known as a non-compete clause.

From the recruiters perspective, they want to ensure that you don’t get access to their client and then bypass them and contract with them directly, I get it. But from a freelancers perspective, you simply cannot afford to put those limits in place. An example, I have an established relationship with a City, the City had a contract with a recruiting agency and asked that I go through them for a particular project. The recruiting agency contract included a non-compete by which I couldn’t contract with the City directly, now or ever. Absolutely not, my relationship with them is completely outside of that agency. We ended up diluting it to agree that I wouldn’t work through another recruiting agency with the City for a limited period of time, fair enough, but the negotiations were painful and I wouldn’t do it again. The recruiting agency needs to understand that, as a very small business (of one), competition is tough enough without these limitations. Simply provide a good service that I will continue to use.

2. Fair Markup
Pay a fair rate for services based on market value and take a fair cut for finding the work. Recognize that, as a small business, I also have overhead and pay a fair rate for my services accordingly. In return, understanding that I am not spending timeeffortresources on securing work, I will lower my rate accordingly. Further, if a significant amount of work is available, there is room for negotiation. However, offering me forty while you take one fifty is egregious. I’m not kidding you when I say that some of my best friends are recruiters, okay, one, and his mantra is ‘if you’re getting the rate that you want then why care how much the agency is billing for you’, fair, mostly… but forty ain’t that number. And that example is typical.

3. Let 1099 Shine
Provide a 1099 tax arrangement. In the recruiting biz there is a key distinction regarding your relationship with them; 1099 or W2. Simply put 1099 means you’re responsible for your own taxes etc, W2 means you are an employee. Freelancers want 1099, otherwise, well, you’re not a freelancer. I don’t think I need to go into why you wouldn’t want to be an employee as a freelancer, after all, it’s why we’re freelancers in the first place right?

4. No Branding
Allow me to maintain my identity as a business. Do not try to take credit for my skillsreputationexperience. This may seem innocuous but it can bite you before you realize it. A simple example, a recruiting agency takes your resumecvstatement of qualifications and pastes it into their letterhead and submits it to their clients. They have branded you and the more it circulates the more your own identity is diluted.

I really believe that a business model for recruiting that includes these elements is viable. If you advertise as fair to freelancers, freelancers just might *want* to work with you and spread the word. While you won’t make the killer markups, you may very well win some loyal and very talented customers.

Somebody, do this, please!

Automate Updating an ArcGIS Online Feature Service

For many of my clients purchasing and managing ArcGIS Server has been out of the question based on limited IT and GIS resources. So for years I’ve been testing hosted services that would allow them to get maps out to their customers via the web. None of them allowed for timely data updates to ever changing data however. So naturally when ArcGIS Online rolled out I had to take it for a spin to see how it might work.

My goal is to publish a map service to ArcGIS Online once and be able to update it through a simple console application that could be launched at some interval (hourly, daily, weekly).

Here’s what I did:
Publish the feature service via ArcGIS Desktop 10.1
Once you have an ArcGIS Online account and ArcGIS Desktop 10.1 installed it’s easy peasy to publish a feature service.  (how to)

Create an ArcGIS JavaScript web application for testing
In order to mimic a real world scenario as best I could (for a geo dev anyway) I created a fairly simple web map that shows recreation sites on top of a topo base map. Clicking on the map then displays that general area in a floating box with an aerial base and info about a rec site as the title if one is within clicked range. Simple (yet I have spent far too much time just browsing it).  I’ll be honest, that was the fun part. The feature service is obviously also available directly in an ArcGIS Online map.

Develop the .Net console application to update the feature service data from a local source
My console app is using the ArcObjects .Net SDK to access a feature class within a file geodatabase to mimic my clients’ typical GIS infrastructure. This requires an ArcGIS license of any flavor to be available from the running server. This could just as easily be any format you like however since all we’re really doing is building JSON objects to pass directly to the ArcGIS Spatial Data Server REST API.

I used brute force in deleting all features and then adding them all back but I could imagine something a bit more elegant. I also noticed in Fiddler that ArcGIS Online uses the applyEdits method for any edit operation (delete, add, update). applyEdits also allows you to cancel the entire request if anything fails. But I’m going for simplicity here.

Here’s the C# code that works to make these updates:

You can also find the source project on github

There’s lots of room for improvement here such as serializing the json and handling the updates more elegantly but this is a working example of how you might keep a hosted map service on ArcGIS Online updated.

I’m guessing there are use cases I hadn’t thought of and would love to hear them.