查找坐标不属于投影的几何

时间:2017-02-09 07:56:19

标签: postgis

我最近在形状文件投影EPSG:4326中提供了数据。我将它导入我的PostGIS数据库,然后尝试转换为3857.我收到了错误

ERROR: transform: couldn't project point (-99762.4 -2.87277e+006 0): latitude or longitude exceeded limits (-14)

即使在应用了st_force2dst_makevalid之后,我仍然无法进行转换,直到我设法追踪删除了一个超出界限的几何图形"对于Lat / Lng。

我的问题是:如何轻松找到不适合当前投影信封的几何图形?

3 个答案:

答案 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

基本上:

  1. PostGIS不了解投影的界限,您需要制作一个新表来收集它。

  2. 即使该值包含在投影的限制中,也不意味着它适合此投影。此方法只能确保转换过程继续进行,并且无法确保数据正确。

答案 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;
相关问题