【问题标题】:Latitude/Longitude Math Question (Distance Between Two Coordinates)纬度/经度数学问题(两个坐标之间的距离)
【发布时间】:2011-09-05 15:07:54
【问题描述】:

我目前有一个数据库查询,用于计算数据库中每个商店从那里到“家”位置的距离。我正在使用这个公式计算飞行距离。

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

【问题讨论】:

  • 你的问题是什么?
  • 我不确定你在问什么,但我会注意到减去角度测量值并不能告诉你任何关于距离的信息。
  • 有什么问题?我认为它是“这是一个有效或好的实现吗?”另外,你用的是什么数据库?一些数据库支持纬度/经度计算(例如 Oracle Locator),但这并不是必要免费的(Oracle Spatial 不是免费的,而且很难判断行以 Locator 结尾和开头空间)。其他数据库也提供基本支持,包括 MySQL。

标签: c# database math optimization


【解决方案1】:

此方法可行,但根据您的商店分布的广泛程度,您可能需要稍微细化您的界限,因为当您在 latitute 中上升时,您在给定距离内越过更多的经度。对于所有纬度,仅按 0.05 度过滤,您可能会得到太多或太少的点。

【讨论】:

    【解决方案2】:

    根据您对 gc_dist 的使用,我假设您正在使用 PostgreSQL。只要您安装了 PostGIS,就可以使用内置功能执行所需的逻辑。

    您必须为此准备好您的餐桌:

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

    完成此操作后,您可以使用 ST_ContainsST_Buffer 查询距所需位置任意给定距离内的所有点,其中 ST_Buffer 包含您要为其查找邻居的中心点 (-79.746639 , 43.758152) 按经/纬顺序排列。

    我从未为此使用过 PostgreSQL,但我使用 Oracle 完成了此操作。 PostgreSQL 的设置似乎与 Oracle 的设置相同:

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

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

    在上面,4326 是一个常量“SRID”,表示 WGS-84。

    B.向列添加索引。 Found syntax here(这个页面似乎非常有用)。

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多