纬度/经度数学问题(两个坐标之间的距离)

本文关键字:两个 坐标 之间 距离 经度 问题 纬度 | 更新日期: 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_ContainsST_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);