我有两个带有SRID 4326定义的几何列的PostGIS表。我可以使用以下INSERT
语句(其中lng
和lat
以编程方式传递的值)毫无问题地插入表中:
INSERT INTO pad_meta (
uuid, created, updated, name, origin, radius, area, expiry, creator
) VALUES (
$1, now(), now(), $2, ST_GeomFromText('POINT(lng, lat)', 4326), $3,
ST_Buffer(ST_GeomFromText('POINT(lng, lat)', 4326), $4), $5, $6
)
但是当我使用ST_Intersects查询交点时,取决于得到的点的值ERROR: Operation on mixed SRID geometries
。
例如,此查询有效:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
而这个错误出来了:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 47.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
请注意,除了经度值,它们是相同的查询。我尝试了不同的值,但没有确定在有效和无效查询之间的明确过渡点。
我认为我从根本上误会了一些东西。目前,我已经通过重新格式化要使用的查询ST_GeomFromText
并明确指定SRID 来解决/纠正/解决了该问题:
SELECT * FROM pad_meta where ST_Intersects(
ST_GeomFromText('POINT(-122.334172173172 47.602634395263560)', 4326), area
) ORDER BY created DESC;
但老实说,我真的不了解区别是什么,或者这是否是真正的“解决方案”。
我的问题是:为什么我仅对特定值会出现错误,格式化此查询的正确方法是什么?
这是我的表定义供参考:
CREATE TABLE IF NOT EXISTS pad_meta (
uuid CHAR(32),
created TIMESTAMP,
updated TIMESTAMP,
name VARCHAR(128),
origin GEOMETRY(Point, 4326),
radius INTEGER,
area GEOMETRY(Polygon, 4326),
expiry TIMESTAMP,
creator CHAR(32),
PRIMARY KEY (uuid)
);
我还验证了geometry_columns中只有一种类型的SRID:
SELECT f_table_name, f_geometry_column, srid FROM geometry_columns;
f_table_name | f_geometry_column | srid
--------------+-------------------+------
pad_meta | origin | 4326
pad_meta | area | 4326
帮助/建议表示赞赏。谢谢!(注意:我也看到了这个问题,但是由于我已经在插入表中时明确定义了我的几何SRID,所以看来这不是正在发生的事情。)
SRID=4326
(如您在上面所做的一样)为其余语句设置SRID的正确方法?(而不是ST_GeomFromText
仅仅因为我不知道如何指定SRID而使用...?)是否可以为查询设置默认的SRID?每次明确设置它似乎很冗长。再次感谢!