获得一定范围内的点数

时间:2018-02-10 13:48:59

标签: python postgresql python-2.7 flask-sqlalchemy

我在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'

我为lat1 lat1和lon1 lon1创建了一个pastebin,以显示lat1和lon1的确切输出。

1 个答案:

答案 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