【问题标题】:Postgres check if coordinates are within a rangePostgres检查坐标是否在范围内
【发布时间】:2023-03-16 12:50:02
【问题描述】:

我有一个包含匹配信息的表格。一列称为坐标,包含一个带有 lat lng 坐标的 jsonb,如下所示:

{"lat": 70.852104, "lng": 7.937035}

客户端应用程序可以过滤匹配项,向我发送一个像这样的 json:

{"lat": 65.852104, "lng": 6.937035, "distance": 300}

我需要查询客户端发送的坐标和距离之间的所有匹配项。我可以在不更改坐标列类型的情况下创建正确的查询吗?怎么做? Postgres 版本是 9.6.2。

【问题讨论】:

  • 恐怕你不会喜欢它:处理地理数据的唯一合理方法是使用postgis 扩展名。相信我,您会惊讶于它的帮助!安装非常简单,您只需将现有的 jsonb 坐标存储为 geometry 在新列中,然后使用类似 ST_Distance 的内容。如果您已经安装了postgis 并且没有创建新列的奢侈,您可以动态地进行...让我们知道。
  • 这只是与 Elixir 无关。这更像是一个postgresql问题。我的意思是即使没有 ecto 或 elixir,您也可以(并且可能应该进行测试)直接针对 postgresql 运行查询。首先修复 postgresql 部分,然后如果您仍然对 Elixir 有疑问,请为此发布一个单独的问题。
  • 我还要说这是一个研究不足的问题,因为您没有分享您尝试过的任何查询或您实际完成的任何研究。 idownvotedbecau.se/noattempt

标签: postgresql geometry elixir postgis


【解决方案1】:

使用扩展 PostGIS 可以通过解析 jsonb 列中的 xy 轴并将它们转换为单个 @987654329 来实现@

基于这个表结构...

CREATE TABLE t (foo jsonb);

...包含这些记录...

INSERT INTO t VALUES ('{"lat": 70.852104,"lng": 7.937035}');
INSERT INTO t VALUES ('{"lat": 6.9647297,"lng": 50.93706}');
INSERT INTO t VALUES ('{"lat": 65.852104,"lng": 6.937035}');
INSERT INTO t VALUES ('{"lat": 51.964800,"lng": 7.625200}');

...您可以使用以下查询计算与给定点7.6252, 51.9648 的距离:

WITH j AS (
SELECT ST_GeomFromText('POINT(' ||
            CAST(foo#>'{lng}' AS TEXT) || ' ' || 
            CAST(foo#>'{lat}' AS TEXT) || ')',4326) AS geom FROM t
) SELECT ST_Distance(j.geom ,ST_SetSRID(ST_MakePoint(7.6252,51.9648),4326)) FROM j;

以度为单位。

   st_distance    
------------------
   18.88987806884
 62.4573738133821
 13.9043440498155
                0
(4 Zeilen)

ST_SetSRIDST_GeomFromText 处的4326 代表WGS84,可以根据您的SRS 进行更改。函数 ST_MakePoint 需要至少两个双精度值(xy)来创建 geometryST_Distance,顾名思义,计算两个几何图形之间的距离。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2012-02-16
    • 2012-07-15
    • 2023-04-03
    • 2017-07-13
    • 2011-04-10
    • 2021-03-30
    相关资源
    最近更新 更多