纬度/经度数学问题(两个坐标之间的距离)
本文关键字:两个 坐标 之间 距离 经度 问题 纬度 | 更新日期: 2023-09-27 17:58:08
我目前有一个数据库查询,用于计算数据库中每个商店从那里到"家"位置的距离。我用这个公式计算飞行距离。
http://www.movable-type.co.uk/scripts/latlong.html
然后我订购并展示它们。我发现一个更好的方法是只搜索纬度/经度在一个范围内的商店。
例如,与其计算数据库中每个商店之间的距离(超过30000),不如只将lat/long在一定范围内的商店分组,并计算它们之间的距离。
现在我正试图找出如何计算实际边界。距离必须在5公里以下。所以我用5除以100,把纬度和经度加上这些值。
SELECT storeid, storedescription, address, city, storebannerdescription, lat, lon,
ROUND (gc_dist (lat, lon, 43.758152, -79.746639), 1) AS distance
FROM storelatlon
WHERE ((lat-43.758152) < 0.05 AND (lat -43.758152) > -0.05) AND ( (lon-(-79.746639)) < 0.05 AND (lon-(-79.746639)) > -0.05)
ORDER BY Distance
这种方法可以工作,但根据您的商店分布的范围,您可能需要稍微完善您的边界,因为随着纬度的升高,您在给定距离上会跨越更多的经度。对于所有纬度,仅过滤0.05度可能会得到太多或太少的点。
我假设您使用PostgreSQL是基于您对gc_dist的使用。只要安装了PostGIS,就可以使用内置功能执行所需的逻辑。
你必须为此做好准备:
首先,将您的位置存储为PostGIS点。我建议使用WGS-84进行地理计算。
完成此操作后,可以使用ST_Contains
和ST_Buffer
查询距离所需位置任意给定距离内的所有点,其中ST_Buffer
将要查找邻居的中心点(-79.746639,43.758152)按长/宽顺序封装。
我从来没有用过PostgreSQL,但我用过Oracle。PostgreSQL的设置似乎与Oracle的设置相同:
A。告诉数据库您将创建一个基于几何图形的列。在此处找到语法。
SELECT AddGeometryColumn('db_name', 'table_name', 'desired_column_name', 4326,
'POINT', 2);
上面,4326是一个常数"SRID",表示WGS-84。
B。向列添加索引。在此处找到语法(此页面看起来非常有用)。
CREATE INDEX desired_index_name
ON table_name
USING gist(desired_column_name);
C。添加您的数据。
INSERT INTO table_name (desired_column_name)
VALUES('SRID=4326;POINT(-79.746639 43.758152)');
(基于其他示例,我很好奇ST_GeomFromText
是否需要包含上述字符串)
或者(我在这里找到的)
INSERT INTO table_name (desired_column_name)
VALUES (ST_Transform(ST_MakePoint(-79.746639, 43.758152), 4326));
注意:我假设它是(X,Y),这意味着经度和纬度排序。
D。查询您的数据。
SELECT * FROM table_name
WHERE
ST_Contains(
ST_Buffer(
ST_Transform(ST_MakePoint(-79.746639, 43.758152), 4326),
distance_probably_in_meters),
desired_column_name);