Geocoding
I've done work before on geocoding and geocoders but somehow never wrote a separate page for it. Recapturing what I've done now...
Geocoding Services
Esri
Two options:
- Build your own and host it in ArcGIS Enterprise.
- Use their service [1]
Nominatim
Nominatim is the OpenStreetMap geocoder. If I put the right data into OSM, it works great for me. For example, I currently live in the Anderson Ungerman duplex. I added it to OSM so now I can find my way home! Updates are near instantaneous, if you add an address you can immediately start searching for it in Nominatim. I have been adding historic houses around Astoria, as a hobby.
Usage: https://operations.osmfoundation.org/policies/nominatim/ No fees but limit your requests to one per second. Most likely not a problem.
API: https://nominatim.org/release-docs/develop/api/Overview/
See also https://locationiq.com/ (10,000 requests/day, 2 per second) and OpenCage (2500 requests/day, 1 per second).
I am just not a Google fan. I cannot update their database, so if anything fails, I cannot fix it in a timely or controllable fashion. It's hard to see what limits are and what rates are. I know I could find it but I don't care right now. I've tried it out in the past, in fact I have a page with a demo in Wiki Maps. Go forth and research it yourself: https://developers.google.com/maps/documentation/geocoding/intro
OpenCage
I set up an account using Github 6a9af53028354dbfbf92b0dde5dc2c4a
OpenCage is a fusion of many services. You can use up to 2500 geocodes per day for free, not a problem AT ALL for my use cases!
Because it's a fusion, you can search for many things, not just OpenStreetMap addresses.
My extensive test results
A mix of addresses and descriptions, biased for Clatsop County, Oregon.
data | situs | OpenCage | Esri | Nominatim | LocationIQ | notes | ||||||||
32534 River Point Dr, OR | yes | yes | Wrong | Wrong | yes | yes | wrong house # | |||||||
36534 Riverpoint Dr, OR | no | yes | Wrong | Wrong | yes | yes | wrong spelling | |||||||
Anderson Ungerman | * | yes | Wrong | 0 | yes | yes | ||||||||
97103 | * | yes | yes | yes | yes | yes | ||||||||
Sutton Mountain | * | yes | Wrong | yes | yes | yes | ||||||||
Soapstone Lake | * | yes | Wrong | yes | yes | yes | ||||||||
Knappa | * | yes | yes | yes | yes | yes | ||||||||
Hammond, OR | * | yes | yes | yes | yes | yes | Battery Russell | * | yes | yes | yes | yes | yes |
\* situs address search is not designed to handle anything like this
"yes" means the result showed up correctly either on a map or as a list item if there were multiple results.
"Wrong" means it gave me only one result that was clearly incorrect (for example, Sutton Mountain but in the wrong state)
Thoughts on these results:
- I know I could make some of the results better by tuning queries, but that means more work for me!
- I know that I can improve any service based on OSM by improving the data myself.
- Conversely I have no way of improving the purely services.
This echoes what I have found throughout my explorations of closed/proprietary services versus open data / open source; they might be free or inexpensive but the open services give me more control over quality and final results. I also find the amount of work is commensurate. Phone support is available from expensive services but I generally don't find that it helps me to struggle along with mediocre commercial services then finally fall back on phone support when I can just work everything out for myself with free/open source solutions.