【问题标题】:Find geometries with coordinates that do not belong in projection查找坐标不属于投影的几何图形
【发布时间】:2017-02-09 07:56:18
【问题描述】:

我最近获得了形状文件投影 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 之后,我仍然无法转换,直到我设法找到一个删除经纬度“越界”的几何图形。

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

【问题讨论】:

    标签: postgis


    【解决方案1】:

    如果是4326,这应该可以:

    SELECT * FROM your_table WHERE 
      (st_x(geom) NOT BETWEEN -180 AND 180) 
      OR  
      (st_y(geom) NOT BETWEEN -90 AND 90) ;
    

    【讨论】:

    • 数据由多边形组成,即使错误报告了它卡在的第一个点。稍作修改,这将处理多边形。理想情况下,我正在寻找一种处理任何投影的通用方法。可能是先得到预测信封?
    • @Derek,在下面查看我的其他答案
    【解决方案2】:

    (我会留下这个作为评论,但因为我不能,所以在这里。)

    这个答案可能会有所帮助: Get projection limits from Postgis

    基本上:

    1. PostGIS 不知道投影的边界,您需要创建一个新表来收集它。

    2. 即使该值包含在投影的限制中,也并不意味着它适合该投影。这种方法只能保证转换过程进行并得到结果,不能保证数据正确。

    【讨论】:

      【解决方案3】:

      对于更通用的解决方案,您可以使用捕获错误的自定义转换函数:

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-12
        • 2014-12-20
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多