The cl-geocode Reference Manual

Next: , Previous: , Up: (dir)   [Contents][Index]

The cl-geocode Reference Manual

This is the cl-geocode Reference Manual, generated automatically by Declt version 4.0 beta 2 "William Riker" on Mon Aug 15 03:41:07 2022 GMT+0.

Table of Contents


1 Introduction

cl-geocode: a geocoding API for Common Lisp

Geocoding is the process of finding associated geographic coordinates (expressed as latitude and longitude) from other geographic data, such as street addresses, or zip codes (postal codes).

Reverse geocoding is the opposite: finding an associated textual location such as a street address, from geographic coordinates.

This API does both.

cl-geocode is loaded via ASDF and the file cl-geocode.asd.

Examples

cl-user(12): (asdf:load-system :cl-geocode)
...
cl-user(13): (use-package :cl-geocode)
t
cl-user(14): (setq cl-geocode:*default-key* "...")
"..."
cl-user(15): (place-to-location "Berkeley, CA")
#<location 37.871593,-122.27274>
cl-user(16): (location-to-place *)
"Berkeley, California"
cl-user(17): (location-to-place
	    (place-to-location
	     "2629 College Ave, Berkeley, CA"))
"Berkeley, California"
cl-user(18): (place-to-location "2629 College Ave, Berkeley, CA")
#<location 37.862926,-122.25329>
cl-user(19): (distance-between
	    (place-to-location "Boulder, CO")
	    (place-to-location "Piedmont, CA"))
923.7708985128291d0
cl-user(20): (distance-between
	    (place-to-location "Lake Wylie, SC")
	    (place-to-location "Piedmont, CA"))
2280.312157508608d0
cl-user(21): 

Examples of the lower-level parts of the API:

cl-user(4): (setq location1
	  (make-location :latitude 38.005 :longitude -121.804726))
#<location 38.005,-121.804726>
cl-user(5): (setq location2
	  (make-location :latitude 37.824444 :longitude -122.23055))
#<location 37.824444,-122.23055>
cl-user(6): (distance-between location1 location2)
26.379927592149343d0
cl-user(7): (distance-between location1 location2 :unit :kilometers)
42.46016888326334d0
cl-user(8): 

;; The following examples inspired by
;;   http://nationalatlas.gov/articles/mapping/a_latlong.html#four

;; A degree of latitude should be approximately 69 miles:
cl-user(8): (distance-between
	 (make-location :latitude 38.0 :longitude -121.0)
	 (make-location :latitude 37.0 :longitude -121.0))
69.16739825655358d0
cl-user(9): 

;; A degree of longitude (at the equator) is also approximately 69
;; miles:
cl-user(9): (distance-between
	 (make-location :latitude 0.0 :longitude -121.0)
	 (make-location :latitude 0.0 :longitude -122.0))
69.16739825652837d0
cl-user(10): 

;; But as you move north or south the size gradually decreases to zero as
;; the meridians converge at the poles:

cl-user(10): (distance-between
	  (make-location :latitude 37.0 :longitude -121.0)
	  (make-location :latitude 37.0 :longitude -122.0))
55.23928644738535d0
cl-user(11): (distance-between
	  (make-location :latitude 50.0 :longitude -121.0)
	  (make-location :latitude 50.0 :longitude -122.0))
44.459615443471485d0
cl-user(12): (distance-between
	  (make-location :latitude 80.0 :longitude -121.0)
	  (make-location :latitude 80.0 :longitude -122.0))
12.010644812832272d0
cl-user(13): (distance-between
	  (make-location :latitude 90.0 :longitude -121.0)
	  (make-location :latitude 90.0 :longitude -122.0))
0.0d0
cl-user(14): 

Sometimes it is nice to see if a location is near another:

cl-user(15): (location-near-p
	  (make-location :latitude 37.824444 :longitude -122.23055)
	  (make-location :latitude 38.005 :longitude -121.804726)
	  1.0)
t
cl-user(16): (location-near-p
	  (make-location :latitude 37.824444 :longitude -122.23055)
	  (make-location :latitude 38.005 :longitude -121.804726)
	  0.5)
t
cl-user(17): (location-near-p
	  (make-location :latitude 37.824444 :longitude -122.23055)
	  (make-location :latitude 38.005 :longitude -121.804726)
	  0.1)
nil
cl-user(18): 

The complete API

Types

A location is a structure containing a latitude and longitude. The accessors are:

location-latitude
location-longitude

and the constructor is

make-location

Variables

*default-key*

The value of this is a string representing your Google Maps API key. Obtain your own Google Maps API key from here.

Functions

Functions which operate on locations are:

distance-between location1 location2 &key (unit :miles)

This calculates the straight line distance on the surface of the earth between LOCATION1 and LOCATION2 using the "Great Circle Distance Formula". The values of the keyword UNIT can be :miles (the default), :nautical-miles or :kilometers.

location-near-p location reference within

Return true if LOCATION is near REFERENCE (a location) to WITHIN decimal degrees in both latitude and longitude.

place-to-location place &key (key *default-key*)

Return the location corresponding to PLACE.

location-to-place location

Return the place corresponding to LOCATION.

Implementation Details

place-to-location is pretty straightforward. The Google Maps API converts the place to a location.

location-to-place, however, is a little trickier. There is no readily available web resource that will do this (like Google Maps). I did find The Zip Code Database Project which contains location coordinates for each zip code, and the data includes the names of the cities for each zip code. It's a fairly simple matter to find the nearest match for a set of coordinates.

So, imbedded in cl-geocode is the function location-to-zipcode:

cl-user(24): (location-to-zipcode (place-to-location "Oakland, CA"))
#<zipcode 94612 (Oakland, California): 37.809425,-122.27172>
cl-user(25): 

and

cl-user(31): (location-to-zipcode (place-to-location "1 Infinite Loop"))
#<zipcode 94087 (Sunnyvale, California): 37.35009,-122.03602>
cl-user(32): 

2 Systems

The main system appears first, followed by any subsystem dependency.


Previous: , Up: Systems   [Contents][Index]

2.1 cl-geocode

Maintainer

<cl-geocode@lumi.net>

Dependencies
  • aserve (system).
  • acl-compat (system).
  • cl-ppcre (system).
Source

cl-geocode.asd.

Child Components

3 Files

Files are sorted by type and then listed depth-first from the systems components trees.


Previous: , Up: Files   [Contents][Index]

3.1 Lisp


Next: , Previous: , Up: Lisp   [Contents][Index]

3.1.1 cl-geocode/cl-geocode.asd

Source

cl-geocode.asd.

Parent Component

cl-geocode (system).

ASDF Systems

cl-geocode.


3.1.2 cl-geocode/package.lisp

Source

cl-geocode.asd.

Parent Component

cl-geocode (system).

Packages

cl-geocode.

Public Interface
Internals

3.1.3 cl-geocode/zip-util.lisp

Source

cl-geocode.asd.

Parent Component

cl-geocode (system).

Internals

3.1.4 cl-geocode/geocode.lisp

Dependencies
Source

cl-geocode.asd.

Parent Component

cl-geocode (system).

Public Interface
Internals

*place-to-location-re* (special variable).


4 Packages

Packages are listed by definition order.


Previous: , Up: Packages   [Contents][Index]

4.1 cl-geocode

Source

package.lisp.

Use List
  • acl-compat.excl.
  • common-lisp.
  • net.aserve.
  • net.aserve.client.
Public Interface
Internals

5 Definitions

Definitions are sorted by export status, category, package, and then by lexicographic order.


Next: , Previous: , Up: Definitions   [Contents][Index]

5.1 Public Interface


5.1.1 Special variables

Special Variable: *default-key*

A default Google Maps API key for calls to geocode. You can obtain a key by visiting http://www.google.com/apis/maps/signup.html.

Package

cl-geocode.

Source

geocode.lisp.

Special Variable: *zipcodes*
Package

cl-geocode.

Source

geocode.lisp.


5.1.2 Ordinary functions

Function: distance-between (location1 location2 &key unit)

Calculate the straight line distance on the surface of the earth between LOCATION1 and LOCATION2 using the "Great Circle Distance Formula". The values of the keyword UNIT can be :miles (the default), :nautical-miles or :kilometers.

Package

cl-geocode.

Source

geocode.lisp.

Function: geocode (&key q key output)

Geocoding is the process of converting addresses (like "1600 Amphitheatre Parkway, Mountain View, CA") into geographic coodinates (like latitude 37.423021 and longitude -122.083739), which you can use to place markers or position the map based on street addresses in your database or addresses supplied by users. The Google Maps API includes a geocoder that can be accessed via HTTP request.

Package

cl-geocode.

Source

geocode.lisp.

Reader: location-latitude (instance)
Writer: (setf location-latitude) (instance)
Package

cl-geocode.

Source

package.lisp.

Target Slot

latitude.

Reader: location-longitude (instance)
Writer: (setf location-longitude) (instance)
Package

cl-geocode.

Source

package.lisp.

Target Slot

longitude.

Function: location-near-p (location reference within)

Is LOCATION near REFERENCE location to WITHIN decimal degrees in both latitude and longitude?

Package

cl-geocode.

Source

geocode.lisp.

Function: location-to-place (location)
Package

cl-geocode.

Source

geocode.lisp.

Function: location-to-zipcode (location)
Package

cl-geocode.

Source

geocode.lisp.

Function: make-location (&key latitude longitude)
Package

cl-geocode.

Source

package.lisp.

Function: place-to-location (place &key key)
Package

cl-geocode.

Source

geocode.lisp.

Reader: zipcode-city (instance)
Writer: (setf zipcode-city) (instance)
Package

cl-geocode.

Source

package.lisp.

Target Slot

city.

Reader: zipcode-code (instance)
Writer: (setf zipcode-code) (instance)
Package

cl-geocode.

Source

package.lisp.

Target Slot

code.

Function: zipcode-p (object)
Package

cl-geocode.

Source

package.lisp.

Reader: zipcode-state (instance)
Writer: (setf zipcode-state) (instance)
Package

cl-geocode.

Source

package.lisp.

Target Slot

state.

Reader: zipcode-state-abbrev (instance)
Writer: (setf zipcode-state-abbrev) (instance)
Package

cl-geocode.

Source

package.lisp.

Target Slot

state-abbrev.


5.1.3 Standalone methods

Method: make-load-form ((self location) &optional environment)
Source

package.lisp.

Method: print-object ((location location) stream)
Source

package.lisp.

Method: print-object ((zipcode zipcode) stream)
Source

package.lisp.


5.1.4 Structures

Structure: location
Package

cl-geocode.

Source

package.lisp.

Direct superclasses

structure-object.

Direct methods
Direct slots
Slot: latitude
Readers

location-latitude.

Writers

(setf location-latitude).

Slot: longitude
Readers

location-longitude.

Writers

(setf location-longitude).


5.2 Internals


Next: , Previous: , Up: Internals   [Contents][Index]

5.2.1 Special variables

Special Variable: *place-to-location-re*
Package

cl-geocode.

Source

geocode.lisp.


Next: , Previous: , Up: Internals   [Contents][Index]

5.2.2 Ordinary functions

Function: copy-location (instance)
Package

cl-geocode.

Source

package.lisp.

Function: copy-zipcode (instance)
Package

cl-geocode.

Source

package.lisp.

Function: location-p (object)
Package

cl-geocode.

Source

package.lisp.

Function: make-zipcode (&key code state-abbrev location city state)
Package

cl-geocode.

Source

package.lisp.

Function: read-zipcodes-csv (csv-file)
Package

cl-geocode.

Source

zip-util.lisp.

Function: vector-of (vector function)
Package

cl-geocode.

Source

zip-util.lisp.

Reader: zipcode-location (instance)
Writer: (setf zipcode-location) (instance)
Package

cl-geocode.

Source

package.lisp.

Target Slot

location.


5.2.3 Structures

Structure: zipcode
Package

cl-geocode.

Source

package.lisp.

Direct superclasses

structure-object.

Direct methods

print-object.

Direct slots
Slot: code
Readers

zipcode-code.

Writers

(setf zipcode-code).

Slot: state-abbrev
Readers

zipcode-state-abbrev.

Writers

(setf zipcode-state-abbrev).

Slot: location
Readers

zipcode-location.

Writers

(setf zipcode-location).

Slot: city
Readers

zipcode-city.

Writers

(setf zipcode-city).

Slot: state
Readers

zipcode-state.

Writers

(setf zipcode-state).


Appendix A Indexes


Next: , Previous: , Up: Indexes   [Contents][Index]

A.1 Concepts


Next: , Previous: , Up: Indexes   [Contents][Index]

A.2 Functions

Jump to:   (  
C   D   F   G   L   M   P   R   V   Z  
Index Entry  Section

(
(setf location-latitude): Public ordinary functions
(setf location-longitude): Public ordinary functions
(setf zipcode-city): Public ordinary functions
(setf zipcode-code): Public ordinary functions
(setf zipcode-location): Private ordinary functions
(setf zipcode-state): Public ordinary functions
(setf zipcode-state-abbrev): Public ordinary functions

C
copy-location: Private ordinary functions
copy-zipcode: Private ordinary functions

D
distance-between: Public ordinary functions

F
Function, (setf location-latitude): Public ordinary functions
Function, (setf location-longitude): Public ordinary functions
Function, (setf zipcode-city): Public ordinary functions
Function, (setf zipcode-code): Public ordinary functions
Function, (setf zipcode-location): Private ordinary functions
Function, (setf zipcode-state): Public ordinary functions
Function, (setf zipcode-state-abbrev): Public ordinary functions
Function, copy-location: Private ordinary functions
Function, copy-zipcode: Private ordinary functions
Function, distance-between: Public ordinary functions
Function, geocode: Public ordinary functions
Function, location-latitude: Public ordinary functions
Function, location-longitude: Public ordinary functions
Function, location-near-p: Public ordinary functions
Function, location-p: Private ordinary functions
Function, location-to-place: Public ordinary functions
Function, location-to-zipcode: Public ordinary functions
Function, make-location: Public ordinary functions
Function, make-zipcode: Private ordinary functions
Function, place-to-location: Public ordinary functions
Function, read-zipcodes-csv: Private ordinary functions
Function, vector-of: Private ordinary functions
Function, zipcode-city: Public ordinary functions
Function, zipcode-code: Public ordinary functions
Function, zipcode-location: Private ordinary functions
Function, zipcode-p: Public ordinary functions
Function, zipcode-state: Public ordinary functions
Function, zipcode-state-abbrev: Public ordinary functions

G
geocode: Public ordinary functions

L
location-latitude: Public ordinary functions
location-longitude: Public ordinary functions
location-near-p: Public ordinary functions
location-p: Private ordinary functions
location-to-place: Public ordinary functions
location-to-zipcode: Public ordinary functions

M
make-load-form: Public standalone methods
make-location: Public ordinary functions
make-zipcode: Private ordinary functions
Method, make-load-form: Public standalone methods
Method, print-object: Public standalone methods
Method, print-object: Public standalone methods

P
place-to-location: Public ordinary functions
print-object: Public standalone methods
print-object: Public standalone methods

R
read-zipcodes-csv: Private ordinary functions

V
vector-of: Private ordinary functions

Z
zipcode-city: Public ordinary functions
zipcode-code: Public ordinary functions
zipcode-location: Private ordinary functions
zipcode-p: Public ordinary functions
zipcode-state: Public ordinary functions
zipcode-state-abbrev: Public ordinary functions

Jump to:   (  
C   D   F   G   L   M   P   R   V   Z