Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Introduction

In collaboration with the Treasurer/Tax Collector we are making a restful street address geocoding service available.
This  This page describes the service.
We  We mostly follow the OGC geocoding standard which is described here.

The Request

Here is the DEV URL with an example address of "100 Main St":

...

The the URL is case sensitive.
The service uses the street segment network only.
These data are carefully maintained by Department of Public Works, and brought into EAS on a nightly basis.
We return a single best candidate and have not implemented a scoring system.
Instead of scoring we return exceptions to help you correct the input data.
The location is based on the linear interpolation of the matching street segment.
We offset by 4 meters (about 12 feet) to the even or odd side.
For example, here is "217 4th St":

The Response

We strongly prefer JSON (available now) but we can produce XML if you buy us a beer.
The JSON is formatted for readability but your browser may obscure that.
The way to see the nicely formated JSON is to right click on the web page and select "view source".
If you use chrome or firefox you can type "ctrl-u".
If you use Internet Explore you can type "alt-v-c".
In any case, the JSON should look something like this:

Code Block
{
    "inputAddressString": "100 Main St", 
    "inputZipCodeString": "94105", 
    "spatialReference": {
        "wkid": 4326
    }, 
    "foundMatch": true, 
    "foundEasMatch": false, 
    "candidates": [
        {
            "address": "100 MAIN ST", 
            "location": "POINT (-122.3948959209805700 37.7917552676099080)", 
            "score": null, 
            "attributes": {
                "StreetName": "MAIN", 
                "StreetType": "ST"
            }, 
            "addressNumber": "100", 
            "street": {
                "streetNamePrimary": {
                    "base_street_name": "MAIN", 
                    "street_type": "ST"
                }, 
                "streetNameAliases": [], 
                "l_f_add": 101, 
                "l_t_add": 199, 
                "r_f_add": 100, 
                "r_t_add": 198, 
                "seg_cnn": 8628000, 
                "geometry": "MULTILINESTRING ((-122.3949402377882200 37.7918420903234780, -122.3934079394635700 37.7906126704266400))"
            }, 
            "zipCode": "94105", 
            "jurisdiction": "SF MAIN"
        }
    ], 
    "validations": [], 
    "didYouMean": []
}
Results and Performance

We have tested the DEV implementation against all of the Treasurer/Tax Collector addresses.
The canonical source of the data are here:
https://data.sfgov.org/Business-and-Economic-Development/Active-Businesses/funx-qxxn
I have also attached the data to this page.

results pending...

...

The service processes about 500 addresses per minute which should be fine for our purposes.
We have done no performance optimization so we can probably make it faster if you have a compelling reason.

Technical Details

If you are interested in technical details you can find the code mostly in 2 places.
More or less...

...

And in an effort to set a good example we have written real unit tests which you can see here!

Example URLs

The nominal example:

http://10.250.60.189/geocode/streetNetwork/findAddressCandidates?f=json&Address=100 Main St&Zip=94105

...

http://10.250.60.189/geocode/streetNetwork/findAddressCandidates?f=json&Address=100000%20SACRAMENTO%20ST&Zip=94118

 

Example Client

Here is an example client written in python.

...