比较地理位置的最有效途径?解决方案请

Most effective pathway to compare geographic locations? solutions pls

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

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

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

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

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

我会结合使用您提出的解决方案 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)