Postgres检查坐标是否在一个范围内

时间:2018-04-04 14:33:05

标签: postgresql geometry elixir postgis

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

使用扩展名PostGIS可以通过解析jsonb列中的 x y 轴并将它们转换为一个geometry

基于此表结构...

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需要至少两个双精度值( x y )来创建geometryST_Distance,顾名思义,计算两个几何之间的距离。