2013-05-30 4 views
0

Вот формула для радиусаКоличество в радиусе известково неприятности питона

import math 

def calculateDistance(latOne, lonOne, latTwo, lonTwo): 
DISTANCE_CONSTANT = 111120.0 
coLat = math.fabs(lonOne - lonTwo) 
alpha = 90 - latTwo 
beta = 90 - latOne 

cosAlpha = math.cos(math.radians(alpha)) 
cosBeta = math.cos(math.radians(beta)) 
sinAlpha = math.sin(math.radians(alpha)) 
sinBeta = math.sin(math.radians(beta)) 
cosC  = math.cos(math.radians(coLat)) 

cos_of_angle_a = (cosAlpha * cosBeta) 
cos_of_angle_b = (sinAlpha * sinBeta * cosC) 
cos_of_angle_c = cos_of_angle_a + cos_of_angle_b 
angle   = math.degrees(math.acos(cos_of_angle_c)) 
distance  = angle * DISTANCE_CONSTANT 
return distance 

print calculateDistance(latOne, lonOne, latTwo, lonTwo), "metres" 

Теперь, если я поставил значения в уравнения, как так

print calculateDistance(-20.73, 116.75, -21.06, 117.44), "metres" 
The answer is 80470.8270982 metres 

Теперь вот беда. У меня есть переменные, вычисленные из папки CSV таким образом, что lat1 = -20 , lon1 = 100 and lat2 = -30 and lon2 = 120 когда я запускаю следующий код

print calculateDistance(lat1, lon1, lat2, lon2), "metres" 

Это появляется TraceBack (самый последний вызов последнего):

File "C:\Documents and Settings\Guest\My Documents\SC\Actual work\distance.py", line 104, in <module> 
    print calculateDistance(lat0, long0, lat1, long1), "metres" 
    File "C:\Documents and Settings\Guest\My Documents\SC\Actual work\distance.py", line 5, in calculateDistance 
    coLat = math.fabs(lonOne - lonTwo) 
TypeError: unsupported operand type(s) for -: 'str' and 'str' 

там так или иначе разрешить его таким образом, что, когда Я использую мои переменные, которые я вычислил, даст числовое значение?

+0

Что переменная сфера? –

+0

Что вы подразумеваете под переменной областью? – user2430623

+0

Область переменной - это переменная, определенная в функции, неизвестна вне функции. Иногда это может вызвать проблемы, если значение изменяется в одном месте, но не в другом. –

ответ

2

Значения, получаемые вами из CSV, относятся к типу str. Вам необходимо преобразовать их в float или Decimal, чтобы они работали правильно, например, если вы конвертируете их в float, вы можете сделать это для своей функции.

def calculateDistance(latOne, lonOne, latTwo, lonTwo): 
    latOne, lonOne, latTwo, lonTwo = [float(x) for x in (latOne, lonOne, latTwo, lonTwo)] 
    DISTANCE_CONSTANT = 111120.0 
    coLat = math.fabs(lonOne - lonTwo) 
    alpha = 90 - latTwo 
    beta = 90 - latOne 

    cosAlpha = math.cos(math.radians(alpha)) 
    cosBeta = math.cos(math.radians(beta)) 
    sinAlpha = math.sin(math.radians(alpha)) 
    sinBeta = math.sin(math.radians(beta)) 
    cosC  = math.cos(math.radians(coLat)) 

    cos_of_angle_a = (cosAlpha * cosBeta) 
    cos_of_angle_b = (sinAlpha * sinBeta * cosC) 
    cos_of_angle_c = cos_of_angle_a + cos_of_angle_b 
    angle   = math.degrees(math.acos(cos_of_angle_c)) 
    distance  = angle * DISTANCE_CONSTANT 
    return distance 

Выход теста:

>>> calculateDistance('-20', '100', '-30', '120') 
2295032.2183717163 

Или конвертировать в Decimal, который предлагает точное представление поплавков.

def calculateDistance(latOne, lonOne, latTwo, lonTwo): 
    from decimal import Decimal 
    latOne, lonOne, latTwo, lonTwo = [Decimal(x) for x in (latOne, lonOne, latTwo, lonTwo)] 
    DISTANCE_CONSTANT = 111120.0 
    coLat = math.fabs(lonOne - lonTwo) 
    alpha = 90 - latTwo 
    beta = 90 - latOne 

    cosAlpha = math.cos(math.radians(alpha)) 
    cosBeta = math.cos(math.radians(beta)) 
    sinAlpha = math.sin(math.radians(alpha)) 
    sinBeta = math.sin(math.radians(beta)) 
    cosC  = math.cos(math.radians(coLat)) 

    cos_of_angle_a = (cosAlpha * cosBeta) 
    cos_of_angle_b = (sinAlpha * sinBeta * cosC) 
    cos_of_angle_c = cos_of_angle_a + cos_of_angle_b 
    angle   = math.degrees(math.acos(cos_of_angle_c)) 
    distance  = angle * DISTANCE_CONSTANT 
    return distance 

Output Test -

>>> calculateDistance('-20', '100', '-30', '120') 
2295032.2183717163