Postgresql + PostGIS:按几何列查找记录

时间:2016-09-02 10:43:23

标签: postgresql postgis

我有一张桌子:

CREATE TABLE main.address_list
(
  id serial NOT NULL,
  address_string text NOT NULL,
  address_position geometry(Point,4326)
  CONSTRAINT pk_address_list PRIMARY KEY (id)
)

我想使用address_position列在此表中找到一些记录:

select *
       , public.ST_Y(al.address_position) latitude
       , public.ST_X(al.address_position) longitude
from address_list al
where al.address_position = public.ST_SetSRID(public.ST_MakePoint(56.187339 --longitude$n
                                                                  , 57.964295 --latitude$n
                                                                  ), 4326)

但是我收到了以下错误:

ERROR:  operator is not unique: public.geometry = public.geometry
LINE 5: where al.address_position = public.ST_SetSRID(public.ST_Make...
                                  ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.

如何获得显式类型转换?

2 个答案:

答案 0 :(得分:2)

您正尝试将两个geometries与等于=运算符进行比较。那是不支持的;相反,你应该使用一些空间关系函数。可能最好的方法是使用最小距离:

select *
       , public.ST_Y(al.address_position) latitude
       , public.ST_X(al.address_position) longitude
from address_list al
where public.ST_DWithin(al.address_position::geography
                      , public.ST_SetSRID(public.ST_MakePoint(56.187339 --longitude$n
                                                            , 57.964295 --latitude$n
                                         ), 4326)::geography
                      , 1.); -- maximum separation of 1m

或者,您可以比较纬度和经度值是否相等:

select *
       , public.ST_Y(al.address_position) latitude
       , public.ST_X(al.address_position) longitude
from address_list al
where public.ST_X(al.address_position) = 56.187339  --longitude$n
  and public.ST_Y(al.address_position) = 57.964295; --latitude$n

但是你应该记住,由于以二进制形式表示,比较浮点值是否相等通常不是一个安全的选择。

答案 1 :(得分:0)

我已将几何列转换为WKT(知名文本)并比较这些值。

select *
       , public.ST_Y(al.address_position) latitude
       , public.ST_X(al.address_position) longitude
       , public.ST_AsText(al.address_position)
from address_list al
where public.ST_AsText(al.address_position) = public.ST_AsText(public.ST_SetSRID(public.ST_MakePoint(56.187339 --longitude$n
                                                                                                     , 57.964295 --latitude$n
                                                                                                     ), 4326)
                                                               )

并在列address_position

上添加了函数索引
CREATE INDEX i_address_position_as_text
  ON address_list
  USING btree
  (public.ST_AsText(address_position));