[Edu-sig] Rich Data Structures (cont.)
Kirby Urner
urnerk at qwest.net
Sun Oct 30 00:34:26 CEST 2005
"""
A rich data structure:
lists of lat/long tuples in a city indexed dictionary. Distance function
provided. Could be used to introduce data structures in Python.
Although spherical trig gets used, lessons needn't focus on that.
Typical exercise: write getkms(citya, cityb) to return distance in
kilometers.
Typical usage:
>>> from uscan import cities, getmiles
>>> pdx = cities['Portland, Ore.']
>>> miami = cities['Miami, Fla.']
>>> sea = cities['Seattle, Wash.']
>>> getmiles(pdx, sea)
146.20520973103621
>>> getmiles(pdx, miami)
2707.8603168909253
"""
from math import acos, cos, sin, radians
cities = {
'Albany, N.Y.': [(42, 40, 'W'), (73, 45, 'N')],
'Albuquerque, N.M.': [(35, 5, 'W'), (106, 39, 'N')],
'Amarillo, Tex.': [(35, 11, 'W'), (101, 50, 'N')],
'Anchorage, Alaska': [(61, 13, 'W'), (149, 54, 'N')],
'Atlanta, Ga.': [(33, 45, 'W'), (84, 23, 'N')],
'Austin, Tex.': [(30, 16, 'W'), (97, 44, 'N')],
'Baker, Ore.': [(44, 47, 'W'), (117, 50, 'N')],
'Baltimore, Md.': [(39, 18, 'W'), (76, 38, 'N')],
'Bangor, Maine': [(44, 48, 'W'), (68, 47, 'N')],
'Birmingham, Ala.': [(33, 30, 'W'), (86, 50, 'N')],
'Bismarck, N.D.': [(46, 48, 'W'), (100, 47, 'N')],
'Boise, Idaho': [(43, 36, 'W'), (116, 13, 'N')],
'Boston, Mass.': [(42, 21, 'W'), (71, 5, 'N')],
'Buffalo, N.Y.': [(42, 55, 'W'), (78, 50, 'N')],
'Calgary, Alba., Can.': [(51, 1, 'W'), (114, 1, 'N')],
'Carlsbad, N.M.': [(32, 26, 'W'), (104, 15, 'N')],
'Charleston, S.C.': [(32, 47, 'W'), (79, 56, 'N')],
'Charleston, W. Va.': [(38, 21, 'W'), (81, 38, 'N')],
'Charlotte, N.C.': [(35, 14, 'W'), (80, 50, 'N')],
'Cheyenne, Wyo.': [(41, 9, 'W'), (104, 52, 'N')],
'Chicago, Ill.': [(41, 50, 'W'), (87, 37, 'N')],
'Cincinnati, Ohio': [(39, 8, 'W'), (84, 30, 'N')],
'Cleveland, Ohio': [(41, 28, 'W'), (81, 37, 'N')],
'Columbia, S.C.': [(34, 0, 'W'), (81, 2, 'N')],
'Columbus, Ohio': [(40, 0, 'W'), (83, 1, 'N')],
'Dallas, Tex.': [(32, 46, 'W'), (96, 46, 'N')],
'Denver, Colo.': [(39, 45, 'W'), (105, 0, 'N')],
'Des Moines, Iowa': [(41, 35, 'W'), (93, 37, 'N')],
'Detroit, Mich.': [(42, 20, 'W'), (83, 3, 'N')],
'Dubuque, Iowa': [(42, 31, 'W'), (90, 40, 'N')],
'Duluth, Minn.': [(46, 49, 'W'), (92, 5, 'N')],
'Eastport, Maine': [(44, 54, 'W'), (67, 0, 'N')],
'Edmonton, Alb., Can.': [(53, 34, 'W'), (113, 28, 'N')],
'El Centro, Calif.': [(32, 38, 'W'), (115, 33, 'N')],
'El Paso, Tex.': [(31, 46, 'W'), (106, 29, 'N')],
'Eugene, Ore.': [(44, 3, 'W'), (123, 5, 'N')],
'Fargo, N.D.': [(46, 52, 'W'), (96, 48, 'N')],
'Flagstaff, Ariz.': [(35, 13, 'W'), (111, 41, 'N')],
'Fort Worth, Tex.': [(32, 43, 'W'), (97, 19, 'N')],
'Fresno, Calif.': [(36, 44, 'W'), (119, 48, 'N')],
'Grand Junction, Colo.': [(39, 5, 'W'), (108, 33, 'N')],
'Grand Rapids, Mich.': [(42, 58, 'W'), (85, 40, 'N')],
'Havre, Mont.': [(48, 33, 'W'), (109, 43, 'N')],
'Helena, Mont.': [(46, 35, 'W'), (112, 2, 'N')],
'Honolulu, Hawaii': [(21, 18, 'W'), (157, 50, 'N')],
'Hot Springs, Ark.': [(34, 31, 'W'), (93, 3, 'N')],
'Houston, Tex.': [(29, 45, 'W'), (95, 21, 'N')],
'Idaho Falls, Idaho': [(43, 30, 'W'), (112, 1, 'N')],
'Indianapolis, Ind.': [(39, 46, 'W'), (86, 10, 'N')],
'Jackson, Miss.': [(32, 20, 'W'), (90, 12, 'N')],
'Jacksonville, Fla.': [(30, 22, 'W'), (81, 40, 'N')],
'Juneau, Alaska': [(58, 18, 'W'), (134, 24, 'N')],
'Kansas City, Mo.': [(39, 6, 'W'), (94, 35, 'N')],
'Key West, Fla.': [(24, 33, 'W'), (81, 48, 'N')],
'Kingston, Ont., Can.': [(44, 15, 'W'), (76, 30, 'N')],
'Klamath Falls, Ore.': [(42, 10, 'W'), (121, 44, 'N')],
'Knoxville, Tenn.': [(35, 57, 'W'), (83, 56, 'N')],
'Las Vegas, Nev.': [(36, 10, 'W'), (115, 12, 'N')],
'Lewiston, Idaho': [(46, 24, 'W'), (117, 2, 'N')],
'Lincoln, Neb.': [(40, 50, 'W'), (96, 40, 'N')],
'London, Ont., Can.': [(43, 2, 'W'), (81, 34, 'N')],
'Long Beach, Calif.': [(33, 46, 'W'), (118, 11, 'N')],
'Los Angeles, Calif.': [(34, 3, 'W'), (118, 15, 'N')],
'Louisville, Ky.': [(38, 15, 'W'), (85, 46, 'N')],
'Manchester, N.H.': [(43, 0, 'W'), (71, 30, 'N')],
'Memphis, Tenn.': [(35, 9, 'W'), (90, 3, 'N')],
'Miami, Fla.': [(25, 46, 'W'), (80, 12, 'N')],
'Milwaukee, Wis.': [(43, 2, 'W'), (87, 55, 'N')],
'Minneapolis, Minn.': [(44, 59, 'W'), (93, 14, 'N')],
'Mobile, Ala.': [(30, 42, 'W'), (88, 3, 'N')],
'Montgomery, Ala.': [(32, 21, 'W'), (86, 18, 'N')],
'Montpelier, Vt.': [(44, 15, 'W'), (72, 32, 'N')],
'Montreal, Que., Can.': [(45, 30, 'W'), (73, 35, 'N')],
'Moose Jaw, Sask., Can.': [(50, 37, 'W'), (105, 31, 'N')],
'Nashville, Tenn.': [(36, 10, 'W'), (86, 47, 'N')],
'Nelson, B.C., Can.': [(49, 30, 'W'), (117, 17, 'N')],
'New Haven, Conn.': [(41, 19, 'W'), (72, 55, 'N')],
'New Orleans, La.': [(29, 57, 'W'), (90, 4, 'N')],
'New York, N.Y.': [(40, 47, 'W'), (73, 58, 'N')],
'Newark, N.J.': [(40, 44, 'W'), (74, 10, 'N')],
'Nome, Alaska': [(64, 25, 'W'), (165, 30, 'N')],
'Oakland, Calif.': [(37, 48, 'W'), (122, 16, 'N')],
'Oklahoma City, Okla.': [(35, 26, 'W'), (97, 28, 'N')],
'Omaha, Neb.': [(41, 15, 'W'), (95, 56, 'N')],
'Ottawa, Ont., Can.': [(45, 24, 'W'), (75, 43, 'N')],
'Philadelphia, Pa.': [(39, 57, 'W'), (75, 10, 'N')],
'Phoenix, Ariz.': [(33, 29, 'W'), (112, 4, 'N')],
'Pierre, S.D.': [(44, 22, 'W'), (100, 21, 'N')],
'Pittsburgh, Pa.': [(40, 27, 'W'), (79, 57, 'N')],
'Portland, Maine': [(43, 40, 'W'), (70, 15, 'N')],
'Portland, Ore.': [(45, 31, 'W'), (122, 41, 'N')],
'Providence, R.I.': [(41, 50, 'W'), (71, 24, 'N')],
'Quebec, Que., Can.': [(46, 49, 'W'), (71, 11, 'N')],
'Raleigh, N.C.': [(35, 46, 'W'), (78, 39, 'N')],
'Reno, Nev.': [(39, 30, 'W'), (119, 49, 'N')],
'Richfield, Utah': [(38, 46, 'W'), (112, 5, 'N')],
'Richmond, Va.': [(37, 33, 'W'), (77, 29, 'N')],
'Roanoke, Va.': [(37, 17, 'W'), (79, 57, 'N')],
'Sacramento, Calif.': [(38, 35, 'W'), (121, 30, 'N')],
'Salt Lake City, Utah': [(40, 46, 'W'), (111, 54, 'N')],
'San Antonio, Tex.': [(29, 23, 'W'), (98, 33, 'N')],
'San Diego, Calif.': [(32, 42, 'W'), (117, 10, 'N')],
'San Francisco, Calif.': [(37, 47, 'W'), (122, 26, 'N')],
'San Jose, Calif.': [(37, 20, 'W'), (121, 53, 'N')],
'San Juan, P.R.': [(18, 30, 'W'), (66, 10, 'N')],
'Santa Fe, N.M.': [(35, 41, 'W'), (105, 57, 'N')],
'Savannah, Ga.': [(32, 5, 'W'), (81, 5, 'N')],
'Seattle, Wash.': [(47, 37, 'W'), (122, 20, 'N')],
'Shreveport, La.': [(32, 28, 'W'), (93, 42, 'N')],
'Sioux Falls, S.D.': [(43, 33, 'W'), (96, 44, 'N')],
'Sitka, Alaska': [(57, 10, 'W'), (135, 15, 'N')],
'Spokane, Wash.': [(47, 40, 'W'), (117, 26, 'N')],
'Springfield, Ill.': [(39, 48, 'W'), (89, 38, 'N')],
'Springfield, Mass.': [(42, 6, 'W'), (72, 34, 'N')],
'Springfield, Mo.': [(37, 13, 'W'), (93, 17, 'N')],
'St. John, N.B., Can.': [(45, 18, 'W'), (66, 10, 'N')],
'St. Louis, Mo.': [(38, 35, 'W'), (90, 12, 'N')],
'Syracuse, N.Y.': [(43, 2, 'W'), (76, 8, 'N')],
'Tampa, Fla.': [(27, 57, 'W'), (82, 27, 'N')],
'Toledo, Ohio': [(41, 39, 'W'), (83, 33, 'N')],
'Toronto, Ont., Can.': [(43, 40, 'W'), (79, 24, 'N')],
'Tulsa, Okla.': [(36, 9, 'W'), (95, 59, 'N')],
'Vancouver, B.C., Can.': [(49, 13, 'W'), (123, 6, 'N')],
'Victoria, B.C., Can.': [(48, 25, 'W'), (123, 21, 'N')],
'Virginia Beach, Va.': [(36, 51, 'W'), (75, 58, 'N')],
'Washington, D.C.': [(38, 53, 'W'), (77, 2, 'N')],
'Wichita, Kan.': [(37, 43, 'W'), (97, 17, 'N')],
'Wilmington, N.C.': [(34, 14, 'W'), (77, 57, 'N')],
'Winnipeg, Man., Can.': [(49, 54, 'W'), (97, 7, 'N')]}
def rads(degs, mins, compass):
r = radians(degs + (mins/60.0))
if compass in ['S','W']:
r = -r
return r
def distance(lat1, lon1, lat2, lon2, r):
return acos( cos(lat1)*cos(lon1) * cos(lat2)*cos(lon2) + \
cos(lat1)*sin(lon1) * cos(lat2)*sin(lon2) + \
sin(lat1)*sin(lat2) ) * r
def getmiles(citya, cityb):
lat1, lon1 = rads(*citya[0]), rads(*citya[1])
lat2, lon2 = rads(*cityb[0]), rads(*cityb[1])
return distance(lat1, lon1, lat2, lon2, 3963.1)
More information about the Edu-sig
mailing list