IDgis / geo-publisher-test

0 stars 0 forks source link

Ondersteuning van LRS geometrie #33

Open HermanAssink opened 9 years ago

HermanAssink commented 9 years ago

Het blijkt dat het wenselijk/noodzakelijk is om datasets met LRS geometrieën over te zetten naar de GIS Publicatieomgeving. Op dit moment is dat niet mogelijk omdat tijdens de conversie de geometrie wordt omgezet naar WKB format. Het WKB format ondersteunt geen LRS geometrie. Daarom de vraag: Is het akkoord om de LRS geometrie tijdens de conversie om te zetten naar een normale lijn geometrie? Van belang daarbij is natuurlijk of er in de GIS Publicatieomgeving gebruik gemaakt moet worden van de LRS functionaliteit, bijv. weergave van lichtmasten langs de weg.

Overigens, tijdens de PoC fase heeft Edwin Kuijer op navraag van Reijer Copier mondeling gemeld dat datasets met LRS geometrieën niet naar de GIS Publicatieomgeving geconverteerd hoeven te worden.

copierrj commented 9 years ago

Het opzoeken van geometrie met meer dan twee dimensies obv de sdo metadata:

SELECT OWNER, TABLE_NAME, COLUMN_NAME, COUNT(*) FROM ALL_SDO_GEOM_METADATA M, TABLE(M.DIMINFO) DIM
GROUP BY OWNER, TABLE_NAME, COLUMN_NAME
HAVING COUNT(*) > 2;

Tellen van aantal records met LRS in een specifieke kolom (SHAPE) voor een bepaalde tabel (B2.DUURZAME_OV_ARC):

SELECT COUNT(*) FROM B2.DUURZAME_OV_ARC D
WHERE FLOOR(MOD(D.SHAPE.SDO_GTYPE / 100, 10)) > 0;

Opvragen van alle geometrie kolommen (werkt ook bij ontbrekende metadata):

SELECT OWNER, TABLE_NAME, COLUMN_NAME FROM ALL_TAB_COLUMNS
WHERE DATA_TYPE =  'SDO_GEOMETRY' AND OWNER != 'MDSYS';

Deze twee queries kunnen op de volgende wijze worden gecombineerd om alle tabellen af te lopen:

DECLARE
  LRS_COUNT NUMBER;
  C_OWNER ALL_TAB_COLUMNS.OWNER%TYPE;
  C_TABLE_NAME ALL_TAB_COLUMNS.TABLE_NAME%TYPE;
  C_COLUMN_NAME ALL_TAB_COLUMNS.COLUMN_NAME%TYPE;
  CURSOR C IS
  SELECT OWNER, TABLE_NAME, COLUMN_NAME FROM ALL_TAB_COLUMNS
  WHERE DATA_TYPE =  'SDO_GEOMETRY' AND OWNER != 'MDSYS';
BEGIN
  OPEN C;
  LOOP
        FETCH C INTO C_OWNER, C_TABLE_NAME, C_COLUMN_NAME;

        EXECUTE IMMEDIATE 'SELECT COUNT(*) LRS_COUNT'
                || ' FROM ' || C_OWNER || '.' || C_TABLE_NAME || ' T'
                || ' WHERE FLOOR(MOD(T.' || C_COLUMN_NAME || '.SDO_GTYPE / 100, 10)) > 0'
        INTO LRS_COUNT;

        IF LRS_COUNT > 0 THEN
           DBMS_OUTPUT.PUT_LINE(C_OWNER || '.' || C_TABLE_NAME || '.' || C_COLUMN_NAME || ' ' || LRS_COUNT);
        END IF;
  END LOOP;
END;
copierrj commented 9 years ago

Verbeterde versie:

DECLARE
  DUMMY CHAR(1);
  C_OWNER ALL_TAB_COLUMNS.OWNER%TYPE;
  C_TABLE_NAME ALL_TAB_COLUMNS.TABLE_NAME%TYPE;
  C_COLUMN_NAME ALL_TAB_COLUMNS.COLUMN_NAME%TYPE;
  CURSOR C IS
  SELECT OWNER, TABLE_NAME, COLUMN_NAME FROM ALL_TAB_COLUMNS
  WHERE DATA_TYPE = 'SDO_GEOMETRY' AND OWNER != 'MDSYS';
BEGIN
  OPEN C;
  LOOP
        FETCH C INTO C_OWNER, C_TABLE_NAME, C_COLUMN_NAME;
        EXIT WHEN C%NOTFOUND;
        BEGIN
                EXECUTE IMMEDIATE 'SELECT * FROM DUAL WHERE NOT EXISTS ('
                        || ' SELECT 1 FROM ' || C_OWNER || '.' || C_TABLE_NAME || ' T'
                        || ' WHERE FLOOR(MOD(T.' || C_COLUMN_NAME || '.SDO_GTYPE / 100, 10)) > 0)'
                INTO DUMMY;
        EXCEPTION
                WHEN NO_DATA_FOUND
                THEN DBMS_OUTPUT.PUT_LINE(C_OWNER || '.' || C_TABLE_NAME || '.' || C_COLUMN_NAME);
        END;
  END LOOP; 
  DBMS_OUTPUT.PUT_LINE('done');
END;

Beperken scope tot specifieke schema's:

DECLARE
  ...
  WHERE DATA_TYPE = 'SDO_GEOMETRY' AND OWNER IN ('B0', 'B1');
  ...
BEGIN
  ...
END;
copierrj commented 9 years ago

PoC: IDgis/geo-publisher@3df14c8d8a751935d243c7a3ea03860311b148c9