我有一张桌子:
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.
如何获得显式类型转换?
答案 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));