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

时间:2011-05-31 16:04:18

标签: c# database math optimization

我目前有一个数据库查询,用于计算数据库中每个商店与“主页”位置之间的距离。我正在使用这个公式计算飞行距离。

http://www.movable-type.co.uk/scripts/latlong.html

然后我订购并展示它们。我发现一个更好的方法是只搜索纬度/经度在一定范围内的商店。

例如,不是计算数据库中每个商店之间的距离(超过30000),而是只计算在一定范围内具有纬度/经度的组,并计算它们之间的距离。

现在我正试图找出如何计算实际界限。距离必须低于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

2 个答案:

答案 0 :(得分:1)

这种方法可以起作用,但是根据你的商店分布的广泛程度,你可能需要稍微改进你的界限,因为当你上学时,你会在给定的距离上越过更多的经度。对于所有纬度,你可能会得到太多或太少的点,仅过滤0.05度。

答案 1 :(得分:0)

我假设你使用的是基于你使用gc_dist的PostgreSQL。只要安装了PostGIS,就可以使用内置功能执行所需的逻辑。

你必须为此准备你的桌子:

首先,将您的位置存储为PostGIS点。我建议使用WGS-84进行地理计算。

执行此操作后,您可以使用ST_ContainsST_Buffer查询距离所需位置的任意给定距离内的所有点,其中ST_Buffer包含您想要的中心点以长/纬度顺序找到(-79.746639,43.758152)的邻居。

我从未使用过PostgreSQL,但我已经用Oracle完成了这项工作。对于PostgreSQL,它似乎采用与Oracle相同的设置:

一个。告诉数据库您将创建基于几何的列。 Found syntax here

SELECT AddGeometryColumn('db_name', 'table_name', 'desired_column_name', 4326,
'POINT', 2);

以上,4326是表示WGS-84的常数“SRID”。

B中。向列添加索引。 Found syntax here(此页似乎非常有用)。

CREATE INDEX desired_index_name
ON table_name
USING gist(desired_column_name);

℃。添加您的数据。

INSERT INTO table_name (desired_column_name)
VALUES('SRID=4326;POINT(-79.746639 43.758152)');

(我很好奇上述字符串是否需要ST_GeomFromText根据其他示例包含)

或(I found here

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);