2011-03-08 89 views
3

我试图从我的postgis数据库中选择位于特定边界框内的位置。我想这个查询来实现:获取边界框内的点

//latlong - latitude, longitude of a place 

SELECT * FROM places WHERE St_Contains(St_GeomFromText('Polygon((:top_left_long :top_left_lat, :bottom_right_long :bottom_right_lat))'), latlong); 

首先的 - 我得到以下错误:

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: :top_left_lat 

是什么意思?第二个问题 - 我是否正确地输入这些参数?我的意思是 - 第一个经度,然后是纬度?

回答

6

下面是一个查询我在一个旧的项目中使用:

SELECT param1, param2, ... 
FROM messages 
WHERE ST_Contains( 
    ST_SetSRID(
     ST_MakeBox2D(
      ST_Point(0, 50), ST_Point(50,0) 
     ), 
     4326 
    ), 
    the_geom 
) 

the_geom是我的几何列 注:MakeBox2D取左上角和右下角

+0

让我感到困惑的是压痕。我在想为什么'ST_SetSRID'把'the_geom'作为第二个参数!? – 2013-09-24 19:16:24

+0

根据[doc](http://postgis.net/docs/ST_MakeBox2D.html),'ST_MakeBox2D(geometry pointLowLeft,geometry pointUpRight);'Low-left,right-right。 – 2013-09-24 19:30:42

0

我认为这是因为:top_left_long和其他参数不会被您的值取代。

您可以在执行前打印SQL查询吗?

+0

其实这些参数正在被替换...但是,也许你可以建议另一个查询来完成这个? – marek 2011-03-08 10:06:41

1

有了你不能将那些参数建立一个多边形

A 多边形是由1个外部边界和0个或更多内部边界定义的平面表面。每个内部边界在多边形中定义一个孔。三角形是一个具有3个不同的非共线顶点并且没有内部边界的多边形。

外部边界LinearRing定义表面的“顶部”,该表面的顶部是外部边界以逆时针方向穿过边界的表面的边。内部LinearRings将具有相反的方向,从“顶部”看时顺时针显示。是

为多边形的断言(定义有效的多边形的规则),如下所示:

一个)多边形是拓扑关闭; b)多边形的边界由一组构成其外部和内部边界的线性环组成; c)在边界交叉处没有两个环,并且多边形的边界中的环可以在一个点处相交,但仅在 处作为正切(例如,

(从OpenGIS Implementation Specification for Geographic information - Simple feature access - Part 1: Common architecture截取)

有了这些参数鸥可以创建一个或box2d创建多边形供给所有indidual点。

两个快速笔记:

  1. 确保您的参数都是字符串或St_GeomFromText将无法​​正常工作
  2. 使用ST_SetSRID来定义坐标系,使你没有不愉快的结果