比较地理位置的最有效途径?解决方案请
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)
假设我有一个带有 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)