我最近在形状文件投影EPSG:4326中提供了数据。我将它导入我的PostGIS数据库,然后尝试转换为3857.我收到了错误
ERROR: transform: couldn't project point (-99762.4 -2.87277e+006 0): latitude or longitude exceeded limits (-14)
即使在应用了st_force2d
和st_makevalid
之后,我仍然无法进行转换,直到我设法追踪删除了一个超出界限的几何图形"对于Lat / Lng。
我的问题是:如何轻松找到不适合当前投影信封的几何图形?
答案 0 :(得分:1)
如果是4326,这应该有效:
SELECT * FROM your_table WHERE
(st_x(geom) NOT BETWEEN -180 AND 180)
OR
(st_y(geom) NOT BETWEEN -90 AND 90) ;
答案 1 :(得分:1)
(我会留下这个作为评论,但由于我不能,这里是。)
这个答案可能会有所帮助: Get projection limits from Postgis
基本上:
PostGIS不了解投影的界限,您需要制作一个新表来收集它。
即使该值包含在投影的限制中,也不意味着它适合此投影。此方法只能确保转换过程继续进行,并且无法确保数据正确。
答案 2 :(得分:0)
对于更通用的解决方案,您可以使用捕获错误的自定义转换函数:
CREATE OR REPLACE FUNCTION transform_safe(geom geometry, srid int) RETURNS geometry AS $$
BEGIN
IF ST_Srid(geom) = 0 THEN
RAISE Exception 'Input geometry has unknown (0) SRID';
END IF;
BEGIN
RETURN ST_Transform(geom, srid);
EXCEPTION WHEN internal_error THEN
RAISE WARNING '%: %',SQLSTATE,SQLERRM;
END;
RETURN NULL;
END;
$$
language plpgsql;
此行为与ST_Transform相同,但如果坐标超出范围,则返回NULL。
在示例中,您也可以识别带有无效坐标的记录:
SELECT id FROM polygon_table WHERE transform_safe(geom) IS NULL AND geom IS NOT NULL;