2017-02-09 6 views
0

Я недавно предоставил данные в проекции файла формы. 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.

Мой вопрос: как мне легко найти геометрию, которая не подходит для текущего конверта проекций?

ответ

1

В случае 4326 это должно работать:

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

Данные состоят из полигонов, даже если ошибка сообщает первый пункт, что он застрял на. С небольшой модификацией это будет обрабатывать полигоны. В идеале я ищу общий способ обработки любой проекции. Возможно, сначала получив конверт прогнозов? – Derek

+0

@Derek, см. Мой другой ответ ниже –

1

(я бы оставил это как комментарий, но так как я не могу, вот оно.)

Этот ответ может быть полезным : Get projection limits from Postgis

В основном:

  1. 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; 
Смежные вопросы