我在PostgreSQL中有一个纬度和经度列。我希望在一定范围内获得所有积分。我知道他们是库和扩展,可以实现这一点,但我想手动完成。 这就是我从数据库中获取经度和经度所做的工作:
lat1 = Places.query.with_entities(Places.latitude).all()
lon1 = Places.query.with_entities(Places.longitude).all()
接下来我编写了一个函数来将lat和long转换成以千米为单位的距离:
result = []
for i in range(len(lat1)):
x = Decimal(111.12) * (Decimal(28.616700) - lat1[i]['latitude'])
y = Decimal(111.12) * (Decimal(77.216700) - lon1[i]['longitude']) * Decimal(
cos(lat1[i]['latitude'])) / Decimal(92.215)
result.append(sqrt(x * x + y * y))
print result
如何在此函数中包含我想要点的半径。另外,因为lat1和lon1的输出看起来像这样:
{u'latitude': Decimal('28.633300')}
我发现很难转换并不断收到错误:
TypeError: unsupported operand type(s) for -: 'float' and 'list'
答案 0 :(得分:1)
您的lat1和lon1是词典列表。因此,当您访问其实际值时,请在循环中执行以下操作,
result = []
for i in range(len(lat1)):
x = Decimal(111.12) * (Decimal(28.616700) - lat1[i]['latitude']);
y = Decimal(111.12) * (Decimal(77.216700) - lon1[i]['longitude']) * Decimal(math.cos(lat1[i]['latitude'])) / Decimal(92.215);
result.append(math.sqrt(x * x + y * y));
以下是示例案例的控制台输出
>>> lat1=[{u'latitude': Decimal('28.633300')}]
>>> lon1=[{u'longitude': Decimal('28.633300')}]
>>> x = Decimal(111.12) * (Decimal(28.616700) - lat1[0]['latitude']);
>>> y = Decimal(111.12) * (Decimal(77.216700) - lon1[0]['longitude']) * Decimal(math.cos(lat1[0]['latitude'])) / Decimal(92.215);
>>> result = math.sqrt(x * x + y * y);
>>> result
54.84298321157983