2012-03-03 16 views
0

私はcsvファイルを辞書に読み込んで、指定されたいくつかの郵便番号に基づいて座標値を辞書に照会するという割り当てを持っています。郵便番号が「センター」郵便番号の50マイル以内にある場合は戻ってください。私はラジアンで座標を変換するのに苦労しています。また、50マイル以内にいるかどうかを誰かが正しい方向に向けることができれば。ここに私のコードは、これまでのところです:Pythonを使用した地理的位置

import sys 
import csv 
import math 

dicts = {} 
origin =[] 
ziplist = ['12481', '10001', '12203', '10303', '12561'] 
center ='12401' 
def getLatRad(latitude): 
    return float(latitude) * (math.pi/180.0) 
def getLongRad(longitude): 
    return float(longitude) * (math.pi/180.0) 
def getnearbylist(): 
    try: 
     f = open("zips.csv") 
     csvParser = csv.reader(f) 
     for row in csvParser: 
      zipcode= row[0].strip() 
      latitude= row[2].replace('"', '').strip() 
      longitude=row[3].replace('"', '').strip() 
      dicts[zipcode] = {'latitude': latitude, 'longitude':longitude} 

     matched = {match: dicts[match] for match in ziplist if match in dicts} 

     for k in matched: 
      latRad2 = getLatRad(k[1]) 
      longRad2 = getLongRad(k[2]) 
      print latRad2 
      print longRad2 

     if center in dicts: 
      origin ={} 
      origin = dicts[center] 
      latRad1 = getLatRad(origin[1]) 
      longRad1 = getLongRad(origin[2]) 
      print latRad1 
    except ValueError: 
     pass 





getnearbylist() 

起源[x]のように誰かが私がこれらの座標を変換する方法を考え出す助けることができるだろう取り組んでイマイチと私は、Pythonの非常に広大な理解を持っていけません。

サンプルデータ:

"zipcode", "state abbreviation", "latitude", "longitude", "city", "state" 
"35004", "AL", " 33.606379", " -86.50249", "Moody", "Alabama" 
"35005", "AL", " 33.592585", " -86.95969", "Adamsville", "Alabama" 
"35006", "AL", " 33.451714", " -87.23957", "Adger", "Alabama" 
"35007", "AL", " 33.232422", " -86.80871", "Alabaster", "Alabama" 
"35010", "AL", " 32.903432", " -85.92669", "Alexander City", "Alabama" 
"35014", "AL", " 33.355960", " -86.27720", "Alpine", "Alabama" 
"35016", "AL", " 34.323715", " -86.49278", "Arab", "Alabama" 
"35019", "AL", " 34.292540", " -86.63505", "Baileyton", "Alabama" 
+1

あなたはCSVの数行を投稿することができますか? – kaveman

+0

私たちはあなたが持っている情報とあなたが持っていない情報がわからないと、私たちがあなたを助けることを期待できません。 –

+0

http://pastebin.com/nXA0uFG1 – matture

答えて

0
import sys 
import csv 
from math import radians,sin,cos,asin,sqrt 

def haversine(lat1,lon1,lat2,lon2,radius=3959): 
    lat1,lon1,lat2,lon2 = map(radians, [lat1,lon1,lat2,lon2]) 
    dlat = lat2 - lat1 
    dlon = lon2 - lon1 
    return 2*radius*asin(sqrt(sin(dlat/2)**2 + cos(lat1)*cos(lat2)*sin(dlon/2)**2)) 

class Zipcodes(): 
    def __init__(self, fname="zips.csv"): 
     self.zips = {} 
     with open(fname) as inf: 
      r = csv.reader(inf) 
      header = r.next() # discard header row 
      for row in r: 
       zip = row[0].strip() 
       lat = float(row[2].replace('"','').strip()) 
       lon = float(row[3].replace('"','').strip()) 
       self.zips[zip] = (lat,lon) 
    def dist(self, zip1, zip2): 
     try: 
      lat1, lon1 = self.zips[zip1] 
      lat2, lon2 = self.zips[zip2] 
      return haversine(lat1,lon1,lat2,lon2) 
     except KeyError: 
      return 15000.0 

def main(): 
    z = Zipcodes() 

    # you figure out what goes here! 
    print z.dist('35004','35007') 

if __name__=="__main__": 
    main() 
関連する問題