Client Documentation

Jan 31, 2012

Other Documentation

Read about Bulk Geocoding - you send a file, you get results

City/State or Zip code geocoding for incomplete addresses

Calculating distances

Code Samples!

Slowly code samples are being gathered like wayward kindergartners from a field trip to the candy factory. Do you want your name in lights? Or at least a blink tag :-) Send in your code and it shall be added

Special Note - 10/6/2005

Microsoft has changed IE to disable passing login credentials in a URL. This sort of complicates things. See:

http://support.microsoft.com/kb/887606" and http://support.microsoft.com/kb/832414

Other browsers still support the standard. Geocoder.us user Jeremy Walker has sent in a C# .NET sample of a work around for this issue that would probably also work for other strongly typed languages. Thank you Jeremy! (update: Apr 21, fixed apparent typo in the sample. the lat was the long and the long was the lat :-)

Overview

Geocoder.us offers four different ways to access our web services: an XML-RPC interface, a SOAP interface, a REST interface that returns an RDF/XML document, and a REST interface that returns a plain text comma separated values result. The methods and return values are equivalent across all three interfaces.

Methods

GeocoderResult[] geocode ( string location )
Takes a US address or intersection and returns a list of results. All results from a single lookup will be either of type GeocoderAddressResult or of type GeocoderInterectionResult. If the address can be parsed but not found, a single result is returned with lat and long left undefined. If the address cannot be parsed, an empty list is returned. If the address cannot be found exactly, the closest result is returned. If a city and state, or a ZIP code, is not provided, the lookup will fail.
GeocoderAddressResult[] geocode_address ( string address )
Works exactly like geocode(), but only accepts street addresses.
GeocoderIntersectionResult[] geocode_intersection ( string intersection )
Works exactly like geocode(), but only accepts street intersections.

The functioning of these methods is described in further detail by the Geo::Coder::US documentation.

Return Values

The following objects might be returned by an address lookup:

class GeocoderResult:
string city
string state
string zip
float lat
float long
class GeocoderAddressResult: inherits from GeocoderResult
string number
string prefix
string street
string type
string suffix
class GeocoderInteresectionResult: inherits from GeocoderResult
string prefix1
string street1
string type1
string suffix1
string prefix2
string street2
string type2
string suffix2

In implementation languages that implement hashes or dicts (e.g. Perl, Python, PHP), results are returned using the native dict-type structures, rather than as typed objects.

Integration

Geocoder.us supports the XML-RPC and SOAP web services protocols, and also supports a REST-ful interface that returns RDF/XML documents. Although our code examples are in Perl, we believe that our services should be accessible from any language or platform that speaks one of our supported protocols. If you are a Premium User, you must supply your username and password via HTTP Basic Authentication for each request. As the examples will show, this should not be difficult to do.

XML-RPC

    use XMLRPC::Lite;
    use strict;

    my $result = XMLRPC::Lite
	-> proxy( 'http://username:password@geocoder.us/member/service/xmlrpc')
	-> geocode( '1600 Pennsylvania Av, Washington, DC' )
	-> result;

If a valid username and password are provided, then the following data structure is stored in $result:

    $result = [
          {
            'number' => '1600',
            'prefix' => ''
            'street' => 'Pennsylvania',
            'type' => 'Ave',
            'suffix' => 'NW',
            'city' => 'Washington',
            'state' => 'DC',
            'zip' => '20502',
            'lat' => '38.898748',
            'long' => '-77.037684',
          }
    ];

Addresses that can be parsed but not found will return the following structure:

    $result = [
          {
            'number' => '1600',
            'prefix' => ''
            'street' => 'Pennsyltoonia',
            'type' => 'Ave',
            'suffix' => '',
            'city' => 'Washington',
            'state' => 'DC',
            'zip' => '',
          }
    ];

Addresses that cannot even be parsed will return an empty list.

If you have trouble with XMLRPC::Lite, try the following incantation:

    use XMLRPC::Lite +trace;

Multiple matching addresses may be found. You can obtain XMLRPC::Lite from the CPAN.

SOAP

    use SOAP::Lite;
    use strict;

    my $result = SOAP::Lite
	-> uri( 'http://rpc.geocoder.us/Geo/Coder/US' )
	-> proxy( 'http://username:password@geocoder.us/member/service/soap')
	-> geocode( '1600 Pennsylvania Av, Washington, DC' )
	-> result;

The returned data structures are identical to those returned from the XML-RPC interface. Users of strongly typed languages like Java, C++, C# may wish to make use of the WSDL description file written by Scott Gunn. You may need to alter this file in order to add your HTTP Basic Auth credentials, depending on your SOAP client libraries. Douglass Davis emailed to say we there were non-printable characters in that WSDL file that PHP5 won't process. He sent us this WSDL description that apparantly works with PHP5. Many thanks to Scott and Douglass!

REST-RDF

The REST interface allows you to make queries directly via an HTTP GET request.

http://username:password@geocoder.us/member/service/rest/geocode?address=1600+Pennsylvania+Ave,+Washington+DC

Fetching the above URL yields the following RDF/XML:

<rdf:RDF
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" >

<geo:Point rdf:nodeID="aid80564110">
    <dc:description>1600 Pennsylvania Ave NW, Washington DC 20502</dc:description>
    <geo:long>-77.037684</geo:long>
    <geo:lat>38.898748</geo:lat>
</geo:Point>
</rdf:RDF>

You can use RDF::Simple::Parser or XML::Simple to parse this into a data structure, e.g.:

    use RDF::Simple::Parser;
    use URI::Escape;
    use Data::Dumper;

    my $addr = uri_escape( "1600 Pennsylvania Ave, Washington, DC" );

    my @result = RDF::Simple::Parser
	->new
	->parse_uri( "http://username:password\@geocoder.us/member/service/rest/geocode"
	    . "?address=$addr" );

    print Dumper \@result;

The resulting graph structure looks like this:

@result = (
          [
            '_:id4280ab4aa61e',
            'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
            'http://www.w3.org/2003/01/geo/wgs84_pos#Point'
          ],
          [
            '_:id4280ab4aa61e',
            'http://purl.org/dc/elements/1.1/description',
            '1600 Pennsylvania Ave NW, Washington DC 20502'
          ],
          [
            '_:id4280ab4aa61e',
            'http://www.w3.org/2003/01/geo/wgs84_pos#long',
            '-77.037684'
          ],
          [
            '_:id4280ab4aa61e',
            'http://www.w3.org/2003/01/geo/wgs84_pos#lat',
            '38.898748'
          ]
        );

The Redland project provides an RDF parser with bindings for many languages.

REST-CSV

The CSV interface allows you to make queries directly via an HTTP GET request and get a plain text result.

http://username:password@geocoder.us/member/service/csv/geocode?address=1600+Pennsylvania+Ave,+Washington+DC

Fetching the above URL yields the following CSV:

38.898748,-77.037684,1600 Pennsylvania Ave NW,Washington,DC,20502
A geocoder user, Shaun W. Taylor, says that encoding the username and password on the URL did not work for him using Java. He offered this sample: writes:
String authorization = Base64Coder.encodeString(“myusername:mypassword”);
httpUrlConnection.addRequestProperty("Authorization", "Basic " + authorization);
httpUrlConnection.addRequestProperty("WWW-Authenticate", "geocoder.us");      
can be found here Perhaps it will save someone some time." Thanks Shaun!

Using the Free Service

The free service is available for non-commercial uses only. The service URLs are as follows:

    http://geocoder.us/service/xmlrpc
    http://geocoder.us/service/soap
    http://geocoder.us/service/rest/...
    http://geocoder.us/service/csv/...
The absolute simplest way to get a geocode from the free service is to use the csv interface. Entering this in your browser:

 http://rpc.geocoder.us/service/csv?address=1600+Pennsylvania+Ave,+Washington+DC
Returns this result:

38.898748,-77.037684,1600 Pennsylvania Ave NW,Washington,DC,20502
In Perl you can use the LWP::Simple module. See csv.pl for an example.

It is not necessary to use a username and password with the free service, but we encourage you to sign up for an account, so that we can keep you informed of changes and improvements to the service.

If you are acting on behalf of a for-profit business entity, or planning to use the information as part of a profit making activity, you must purchase a commercial license. If you have a commercial license, you may not use the free service under any circumstances. You should be aware that the free service is actively throttled, and so the commercial service will be faster. Please see our Terms and Conditions of Service for more information.

Using Geocoder.us for Address Parsing

You can use Geocoder.us for simple address parsing (but not standardization - this is not a USPS CASS product).

 http://rpc.geocoder.us/service/namedcsv?address=1600+Pennsylvania+Ave,+Washington+DC&parse_address=1
Returns this result:

number=1600,prefix=,street=Pennsylvania,type=Ave,suffix=,city=Washington,state=DC,zip=,original address
lat=38.898748,long=-77.037684,number=1600,prefix=,street=Pennsylvania,type=Ave,suffix=NW,city=Washington,state=DC,zip=20502,geocoder modified
The first line ending with'original address' is the original address you passed in, broken into parts by geocoder.us. The second line ending 'geocoder modified' adds the lat, long, as well as any fields which the geocoder was able to identify-in this case the zip code.

In this example we pass an incomplete address, '2101 Carr Lakewood, CO'

http://rpc.geocoder.us/service/namedcsv?address=2101+Carr+Lakewood+CO&parse_address=1
Returns this result:

number=2101,prefix=,street=Carr,type=,suffix=,city=Lakewood,state=CO,zip=,original address
lat=39.748719,long=-105.090900,number=2101,prefix=,street=Carr,type=St,suffix=,city=Lakewood,state=CO,zip=80214,geocoder modified
lat=39.678687,long=-105.090740,number=2101,prefix=S,street=Carr,type=St,suffix=,city=Lakewood,state=CO,zip=80227,geocoder modified
The first line is the original address, split into fields. the second line is for '2101 Carr Street, Lakewood, CO 80214,' while the second is for South Carr Street, 80227. So both the zip code and street prefix were added. Because this case is ambiguous - both addresses are equally valid, you are forced to make a judgment call on which one you really meant.