【问题标题】:ST_MakeEnvelope with Google Maps Coordinates problemST_MakeEnvelope 与谷歌地图坐标问题
【发布时间】:2020-11-04 23:35:07
【问题描述】:

在 postgress 中,我有以下函数,它使用基于 Google 地图视口坐标的 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 $

以下是我如何获取创建信封的坐标:

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 方法没有根据地图视口创建正确的矩形。

我上面的代码正确吗?

【问题讨论】:

    标签: postgresql google-maps google-maps-api-3 maps postgis


    【解决方案1】:

    通过转换为geography,边界框边缘是使用大圆弧而不是直线创建的。因此,看起来在视口内的点(在 3857 中投影)可能在框外。

    因此,要么您确实想使用大圆弧,但这是一个显示问题,或者您想坚持显示的内容,您需要将演员表移除到 geography

    【讨论】:

    • 您的意思是我应该只从ST_MakeEnvelope(lngw, lats, lnge, latn, 4326) :: geography 这一行中删除:: georgaphy 部分吗?我也应该从A.location :: geography 中删除它吗?
    • @ConstantinosN 两个
    • 我还使用lat 代替lng 使其工作,反之亦然。谷歌地图正在考虑将lat 视为x,将lng 视为y,这就是它保存在我的数据库中的方式。我还将A.location 转换为几何,因为它最初是数据库中的地理。来源:gis.stackexchange.com/questions/78816/…
    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多