Сервер переехал на новый сайт http://www.oraclegis.com/blog. Здесь идет ретрансляция

понедельник, 20 октября 2008 г.

Проверка корректности геометрии SDO_GEOM.VALIDATE_LAYER

Oracle Spatial позволяет контролировать корректность геометрий, сохраняемых в базу данных. Необходимость в таком контроле возникает при загрузке данных из внешних источников - например, shp-файлов. 
Контролировать можно до и после загрузки. 
1. Контроль данных после загрузки с помощью SDO_GEOM.VALIDATE_LAYER
Для контроля корректности Oracle Spatial требует наличия специальной таблицы. Создать таблицу можно следующим образом
CREATE TABLE val_results (mkt_id number, result varchar2(10));
После создания таблицы можно запускать проверку 
EXECUTE SDO_GEOM.VALIDATE_LAYER('COLA_MARKETS','SHAPE','MKT_ID','VAL_RESULTS');
Далее смотрим результаты проверки
SELECT * from val_results;
Если не выведено ни одной строки, то данные полностью корректны и их можно использовать для анализа, иначе необходимо интерпретировать результаты анализа. В этом нам поможет столбец result. В этом столбце будет номер ошибки Oracle. По номеру ошибки можно найти ее расшифровку в списке ошибок Oracle http://download.oracle.com/docs/cd/B28359_01/server.111/b28278/toc.htm
2. Контроль данных во время загрузки с помощью SDO_GEOM.VALIDATE_GEOMETRY.
Кроме проверки суже существующих данных можно организовать проверку данных "на лету". Делается это с помощью триггера следующим образом
declare
 l_valid_geom_result      varchar2(200);
 l_error_code             number;
BEGIN
 select SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(:new.shape,
     mdsys.SDO_DIM_ARRAY(mdsys.SDO_DIM_ELEMENT(NULL, -180, 180, .0005), 
                      mdsys.SDO_DIM_ELEMENT(NULL, -90, 90, .0005))) into l_valid_geom_result from dual;
 -- Examine the return value from this select and raise an exception if necessary.
 if l_valid_geom_result != 'TRUE' then
   select -1 * to_number(substr(l_valid_geom_result,1,instr(l_valid_geom_result,' '))) into l_error_code from dual;
   raise_application_error(-20000, 'Invalid geometry: ' || sqlerrm(l_error_code));
 end if;
END; 

Комментариев нет: