Php 获取框中包含的最左侧|右侧|顶部|底部点

Php 获取框中包含的最左侧|右侧|顶部|底部点,php,sql,postgresql,geometry,Php,Sql,Postgresql,Geometry,我将兴趣点(POI)存储在PostgreSQL数据库中,并通过PHP脚本将其检索到Android应用程序。为了减少互联网使用,我想让我的移动应用程序知道当前显示区域附近是否有任何点 我的想法是存储包含所有已检索点的矩形边界(换句话说:已检索最西边左侧(西边)的最近点,已检索最北边上方(北边)的最近点等),当屏幕的任何边缘超出此边界时,我将进行下一次查询 目前,我可以使用以下方法检索“单屏幕”(当前显示地图覆盖的区域)中的点: SELECT*FROM ch WHERE loc您可以使用距离运算符(

我将兴趣点(POI)存储在PostgreSQL数据库中,并通过PHP脚本将其检索到Android应用程序。为了减少互联网使用,我想让我的移动应用程序知道当前显示区域附近是否有任何点

我的想法是存储包含所有已检索点的矩形边界(换句话说:已检索最西边左侧(西边)的最近点,已检索最北边上方(北边)的最近点等),当屏幕的任何边缘超出此边界时,我将进行下一次查询

目前,我可以使用以下方法检索“单屏幕”(当前显示地图覆盖的区域)中的点:


SELECT*FROM ch WHERE loc您可以使用距离运算符(
)结合
MIN
聚合函数来查找最近的距离,从而减少了查找具有某些属性的行的其他列的问题。严格意义上的左/右/上/下运算符(
|>
您确定框中值的顺序吗?看起来您在X(水平)坐标中存储纬度极值(N/S),在Y(垂直)坐标中存储经度。我希望框是
框(-longSpan,latSpan),(longSpan,-latSpan))
。我需要一些时间来“编译”你的答案……但是,从ch WHERE loc@skyman阅读我的最后一条评论,
SELECT*有什么好处吗?我怀疑你提到的两个选项中的后一个会表现得更好,但请运行查询分析以确定。
SELECT * FROM ch WHERE loc <@ (box '((".-$latSpan.", ".$lonSpan."),(".$latSpan.", ".-$lonSpan."))' + point '".$loc."')
-- Above, or North
SELECT * FROM ch WHERE loc <<| screen AND (loc <-> screen) = (
  SELECT MIN(loc <-> screen) AS mindist FROM ch
    WHERE loc <<| screen
) LIMIT 1

-- Right, or East
SELECT * FROM ch WHERE loc >> screen AND (loc <-> screen) = (
  SELECT MIN(loc <-> screen) AS mindist FROM ch 
    WHERE loc >> screen
) LIMIT 1

-- Below, or South
SELECT * FROM ch WHERE loc |>> screen AND (loc <-> screen) = (
  SELECT MIN(loc <-> screen) AS mindist FROM ch
    WHERE loc |>> screen
) LIMIT 1

-- Left, or West
SELECT * FROM ch WHERE loc << screen AND (loc <-> screen) = (
  SELECT MIN(loc <-> screen) AS mindist FROM ch 
    WHERE loc << screen
) LIMIT 1
SELECT *, (loc <-> screen) AS distance FROM ch 
  WHERE NOT loc <@ screen
  ORDER BY distance
  LIMIT 4
SELECT *, (loc <-> screen) AS distance FROM ch 
  WHERE distance = (
      SELECT MIN(loc <-> screen) AS mindist FROM ch
  )
  LIMIT 1
SELECT *, (loc <-> screen) AS distance FROM ch 
  WHERE NOT loc <@ screen
  ORDER BY distance
  LIMIT 1