【问题标题】:Most effective pathway to compare geographic locations? solutions pls比较地理位置的最有效途径?解决方案请
【发布时间】:2021-03-14 07:44:42
【问题描述】:

假设我有一个带有 IP 地址的位置 A,以及一个带有纬度和经度的地理定位器 API。现在我想查找位置 A 25 英里半径范围内的所有实例。如何以最少的步数计算?

解决方案 A:我可以计算位置 A 与数据库中所有实例之间的所有距离,并显示 25 半径内的实例。 (太慢了,特别是如果我想要一个动态的位置,有一个大型的位置数据库)

解决方案 B:除了 IP 和(纬度,经度)之外,我还可以根据邮政编码对所有实例进行分组。因此需要计算位置 A 和实例之间的距离更少。 (更好,但是如果 IP 地址在另一个邮政编码的边界,这将增加所需的计算量)

解决方案 C:我可以使用三角函数。使用位置 A 的纬度和经度。我可以找到 25 英里半径内的每个实例。

有人可以描述比较距离的更好方法吗?非常感谢您的想法和建议(如果需要进一步解释,请询问)谢谢。

【问题讨论】:

标签: python algorithm geolocation logic


【解决方案1】:

我会结合使用您提出的解决方案 a 和 c。您可以使用仅选择半径 25 英里(或任何其他半径)内的位置的过滤器直接查询数据库。计算以英里为单位的经度差有点棘手,因为经度 1 度的里程随纬度而异。感谢这个解释:https://gis.stackexchange.com/questions/142326/calculating-longitude-length-in-miles#142327

假设您有以下数据库架构和现有位置(仅以纬度和经度作为列):

CREATE TABLE location (
    lat REAL,
    lon REAL
);

您可以使用此查询仅过滤 25 英里半径内的位置:

query = """
    SELECT (lat - ?) AS difflat, 
           (lon - ?) AS difflon
    FROM location
    WHERE POWER(POWER(difflat * 69.172, 2) + POWER(difflon * COS(lat*3.14/180.) * 69.172, 2), 0.5) < ?;
    """

然后像这样使用查询:

radius = 25 #miles
cursor.execute(query, (querylocation['lat'], querylocation['lat'], radius))

遗憾的是,SQLite3 不支持 COS 和 POWER 等基本数学函数,但可以轻松创建它们:

import math
con = sqlite3.connect(db_path)
con.create_function('POWER', 2, math.pow)
con.create_function('COS', 1, math.cos)

【讨论】:

  • 感谢 Marten 提供的额外反馈。这很有帮助!
猜你喜欢
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多