我有一个家庭作业,向我提供了一个大约10,000行的文件。每行包含3个元素,即物种名称,纬度和经度。我需要编写一个函数,该函数返回给定位置在特定距离内发现的动物数量,并考虑到4个性能参数:文件名,距离以及该位置的经度和纬度。
在理想的世界中,我可以进入外壳,并使用文件名,任意距离,任意经度和纬度调用该函数,并计算该距离内的动物数量。
我已经成功地导入了文件,并且获得了一些代码示例,以帮助计算距离并将文件转换为列表。这是我到目前为止编写的代码:
def LocationCount(filename, distance, Lat1, Lon1):
FIn = open(filename, "r")
for Line in FIn:
def LineToList(Line):
Line = Line.rstrip()
FIn.close()
return Line.split("\t")
def CalculateDistance(Lat1, Lon1, Lat2, Lon2):
Lat1 = float(Lat1)
Lon1 = float(Lon1)
Lat2 = float(Lat2)
Lon2 = float(Lon2)
nDLat = (Lat1 - Lat2) * 0.017453293
nDLon = (Lon1 - Lon2) * 0.017453293
Lat1 = Lat1 * 0.017453293
Lat2 = Lat2 * 0.017453293
nA = (math.sin(nDLat/2) ** 2) + math.cos(Lat1) * math.cos(Lat2) * (math.sin(nDLon/2) ** 2 )
nC = 2 * math.atan2(math.sqrt(nA),math.sqrt( 1 - nA ))
nD = 6372.797 * nC
return nD
答案 0 :(得分:0)
要将行分成几部分,可以使用str.split()
。例如,要将空白行分成3部分,可以使用_, lat, lon = line.strip().split(' ')
(下划线只是表示您不想使用第一部分的对流)。
这是一个更完整的示例。我按照Python的样式约定(Google Python的PEP-8样式指南)对代码进行了格式化。
import math
def count_locations(filename, max_distance, source_lat, source_lon):
counter = 0
with open(filename) as f:
for line in f:
try:
# try to split into 3 parts
_, lat, lon = line.strip().split(' ')
except ValueError:
# cannot be split into 3 parts, so we skip this line
continue
try:
# try to convert
lat = float(lat)
lon = float(lon)
except ValueError:
# cannot be converted to float, so we skip this line
continue
d = calculate_distance(source_lat, source_lon, lat, lon)
if d <= max_distance:
counter += 1
return counter
def calculate_distance(lat_1, lon_1, lat_2, lon_2):
n_d_lat = (lat_1 - lat_2) * 0.017453293
n_d_lon = (lon_1 - lon_2) * 0.017453293
lat_1 = lat_1 * 0.017453293
lat_2 = lat_2 * 0.017453293
n_A = (
math.sin(n_d_lat / 2) ** 2
+ math.cos(lat_1) * math.cos(lat_2) * math.sin(n_d_lon / 2) ** 2
)
n_C = 2 * math.atan2(math.sqrt(n_A), math.sqrt(1 - n_A))
n_D = 6372.797 * n_C
return n_D
这对您有用吗?