我有一个包含匹配信息的表格。一列称为坐标,包含一个带有lat lng坐标的jsonb,如下所示:
{"lat": 70.852104, "lng": 7.937035}
客户端应用可以过滤匹配,向我发送像这样的json:
{"lat": 65.852104, "lng": 6.937035, "distance": 300}
我需要查询客户端发送的坐标和距离之间包含的所有匹配项。我可以在不更改坐标列类型的情况下创建正确的查询吗?怎么做? Postgres版本是9.6.2。
答案 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_SetSRID和ST_GeomFromText的 4326 代表WGS84,可以根据您的SRS进行更改。函数ST_MakePoint需要至少两个双精度值( x 和 y )来创建geometry
。 ST_Distance,顾名思义,计算两个几何之间的距离。