2011-03-08 88 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來定義座標系,使你沒有不愉快的結果