Postgresql ST_Makeevelope与谷歌地图坐标问题

Postgresql ST_Makeevelope与谷歌地图坐标问题,postgresql,google-maps,google-maps-api-3,maps,postgis,Postgresql,Google Maps,Google Maps Api 3,Maps,Postgis,在postgress中,我有以下函数,它使用基于Google Maps视口坐标的ST_Makeevelope返回该视口中的所有项目 CREATE OR REPLACE FUNCTION public.search_projects_area( lngw double precision, lats double precision, lnge double precision, latn double precision ) RETURNS SETOF project_locat

在postgress中,我有以下函数,它使用基于Google Maps视口坐标的
ST_Makeevelope
返回该视口中的所有项目

CREATE OR REPLACE FUNCTION public.search_projects_area(
  lngw double precision,
  lats double precision,
  lnge double precision,
  latn double precision
) RETURNS SETOF project_locations LANGUAGE sql STABLE AS $ function $
SELECT
  A.*
FROM
  project_locations A
WHERE
  st_intersects(
    A.location :: geography,
    ST_MakeEnvelope(lngw, lats, lnge, latn, 4326) :: geography
  ) $ function $
下面是如何获得创建封套的坐标:

const bounds = this.map.getBounds();
const sw = this.map.getBounds().getSouthWest();
const ne = this.map.getBounds().getNorthEast();
const lngw = sw.lng();
const lats = sw.lat();
const lnge = ne.lng();
const latn = ne.lat();
问题是,根据地图缩放或定位的位置,有时无法获取特定区域中的项目。尽管在所有情况下,项目都位于视口内部

这就好像
ST_MakeEnvelope
方法没有基于地图视口创建正确的矩形一样

CREATE OR REPLACE FUNCTION public.search_projects_area(
  lngw double precision,
  lats double precision,
  lnge double precision,
  latn double precision
) RETURNS SETOF project_locations LANGUAGE sql STABLE AS $ function $
SELECT
  A.*
FROM
  project_locations A
WHERE
  st_intersects(
    A.location :: geography,
    ST_MakeEnvelope(lngw, lats, lnge, latn, 4326) :: geography
  ) $ function $

上面的代码正确吗?

通过强制转换到
地理位置
,使用大圆弧而不是直线创建边界框边。因此,看起来在视口内部的点(在3857中投影)可能在长方体外部


因此,要么你想处理大圆弧,这是一个显示问题,要么你想坚持显示的内容,你需要删除对
地理位置的强制转换

你的意思是我应该删除这行
中的
::georgaphy
部分
ST_MakeEnvelope(lngw,lats,lnge,latn,4326)::georography
?我应该把它从
A.location::geography
中删除吗?@ConstantinosN bothI也用
lat
代替
lng
,反之亦然。谷歌地图正在考虑将
lat
作为
x
lng
作为
y
保存在我的数据库中。我还将
A.location
转换为geometry,因为它最初是数据库中的地理位置。资料来源: