Skip to content

Kwaliteits controle kadastrale kaart (Oracle)

Mark Prins edited this page Sep 19, 2016 · 6 revisions

kadastrale percelen

Een aantal ruimtelijke controles die uitgevoerd kunnen worden op de kadastrale percelen in de RSGB database. NB in deze voorbeelden gaan we uit van een Oracle versie van het RSGB schema.

Resultaten lijstjes uit onderstaande queries kunnen in bijvoorbeeld QGIS worden gevisualiseerd met een filter op de attribuutlijst:

Bijvoorbeeld:

     "sc_kad_identif" in (
         16250196370000,
         16250196470000,
         16250198170000,
         16250219470000,
         16250285670000,
         16250295870000,
         16250295970000,
         16250316670000,
         16250348070000,
         16250354770000,
         16250383670000,
         16250383770000 )

percelen geselecteerd, rakend aan ontbrekend perceel

geometrie check

-- ongeldige percelen opzoeken mbv. VALIDATE_GEOMETRY_WITH_CONTEXT
-- zie: https://docs.oracle.com/cd/A97630_01/appdev.920/a96630/sdo_objgeom.htm#BGHFDDBF
-- de lijst bevat de perceel identifyer en de oracle error code, bijvoorbeeld '13028' welke een ongeldige GTYPE aangeeft
-- en '13349' een self intersect (binnen de gehanteerde tolerantie)
SELECT 
    p.sc_kad_identif, 
    -- NB '0.0005' is de nauwkeurigheid tolerantie in meter
    SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(p.begrenzing_perceel,0.0005) AS "reden / Oracle error" 
FROM kad_perceel p
WHERE 
    SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(p.begrenzing_perceel,0.0005) != 'TRUE';

consistentie check

-- test of de punt geometrie van een perceel binnen de vlak geometrie valt
SELECT
    sc_kad_identif
FROM
    kad_perceel 
WHERE 
    -- NB '0.0005' is de nauwkeurigheid tolerantie in meter
    SDO_GEOM.RELATE(plaatscoordinaten_perceel,'CONTAINS', begrenzing_perceel, 0.0005) = 'FALSE';

overlap controle

In de kadastrale kaart mogen geen overlappen voorkomen; de meest interessante resultaten zijn de significante overlappen.

-- zoek overlappende percelen
--
SELECT
    a.sc_kad_identif ,
    b.sc_kad_identif AS "overlapt met",
    -- NB '0.0005' is de nauwkeurigheid tolerantie in meter
    SDO_GEOM.SDO_AREA( 
        SDO_GEOM.SDO_INTERSECTION( 
                a.begrenzing_perceel, b.begrenzing_perceel,
                0.0005 
        ), 0.0005, 'unit=SQ_M' 
    ) AS "opp"
FROM
    kad_perceel a
INNER JOIN
    kad_perceel b
ON
    a.sc_kad_identif < b.sc_kad_identif
AND a.begrenzing_perceel IS NOT NULL
AND b.begrenzing_perceel IS NOT NULL
-- ongeldige geometrie uitsluiten
AND a.begrenzing_perceel.SDO_GTYPE IS NOT NULL
AND b.begrenzing_perceel.SDO_GTYPE IS NOT NULL
AND SDO_GEOM.SDO_INTERSECTION( 
        a.begrenzing_perceel, b.begrenzing_perceel,0.0005 
) IS NOT NULL
AND SDO_GEOM.SDO_AREA( 
        SDO_GEOM.SDO_INTERSECTION( 
                a.begrenzing_perceel, b.begrenzing_perceel, 0.0005 ), 
        0.0005, 'unit=SQ_M' 
) > 0;

gaten controle

Binnen het leveringsgebied mogen geen gaten in de kadastrale kaart voorkomen.

-- zoek percelen die raken aan een gat in de kaart
-- TODO

<!--
https://docs.oracle.com/cd/E11882_01/appdev.112/e11830/sdo_objgeom.htm#SPATL1419
https://docs.oracle.com/cd/B19306_01/appdev.102/b14255/sdo_aggr.htm#i867161
http://www.spatialdbadvisor.com/oracle_spatial_tips_tricks/172/concave-hull-geometries-in-oracle-11gr2
-->



SELECT sc_kad_identif
FROM kad_perceel k,
  ((SDO_GEOM.SDO_DIFFERENCE(
  (),
  ()
  ,0.0005)) AS geom ) AS "raakt_aan_gat"
WHERE ST_Touches("raakt_aan_gat".geom, k.begrenzing_perceel);




SELECT sc_kad_identif
FROM kad_perceel k,
  ((SDO_GEOM.SDO_DIFFERENCE( (), (
  (SELECT SDO_AGGR_UNION(SDOAGGRTYPE(c.begrenzing_perceel, 0.0005))
  FROM kad_perceel c
  WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(c.begrenzing_perceel,0.0005) = 'TRUE'
  )) ,0.0005)) AS geom ) AS "raakt_aan_gat"
WHERE SDO_GEOM.RELATE("raakt_aan_gat".geom, k.begrenzing_perceel,0.0005);

INSERT
INTO TESTRESULTAAT VALUES
  (
    'omhullende',
    (SELECT SDO_GEOM.SDO_CONCAVEHULL(SDO_AGGR_UNION(SDOAGGRTYPE(c.begrenzing_perceel, 0.0005)),0.0005)
    FROM kad_perceel c
    WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(c.begrenzing_perceel,0.0005) = 'TRUE'
    )
  );
)



INSERT
INTO TESTRESULTAAT VALUES
  (
    'omhullende',
    (SELECT SDO_GEOM.SDO_CONCAVEHULL
      (
        SDO_AGGR_UNION(SDOAGGRTYPE(c.begrenzing_perceel, 0.0005).geometry)
        , 0.0005
        , GEOM
      )
    FROM kad_perceel c
    WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(c.begrenzing_perceel,0.0005) = 'TRUE'
    )
  );
  
  
  
SELECT 
 SDO_GEOM.SDO_CONCAVEHULL ( 

  SDO_AGGR_UNION( 
    SDOAGGRTYPE(c.begrenzing_perceel, 0.0005)
  ) 
  
, 0.0005
)
FROM kad_perceel c
WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(c.begrenzing_perceel,0.0005) = 'TRUE' ;



SELECT * FROM v$version;



Het is mogelijk dat bovenstaande query te zwaar is, in dat geval kunnen stapsgewijs het omhullende, bevattende en verschil/gaten vlak worden uitgerekend. Deze zijn ook handig voor de visualisatie.

CREATE TABLE TESTRESULTAAT
  (
    DESCR VARCHAR2(255) NOT NULL ,
    GEOM SDO_GEOMETRY ,
    CONSTRAINT TESTRESULTAAT_PK PRIMARY KEY ( DESCR ) ENABLE
  );
  
INSERT
INTO USER_SDO_GEOM_METADATA VALUES
  (
    'TESTRESULTAAT',
    'GEOM',
    MDSYS.SDO_DIM_ARRAY( MDSYS.SDO_DIM_ELEMENT('X', 12000, 280000, .1), MDSYS.SDO_DIM_ELEMENT('Y', 304000, 620000, .1)),
    28992
  );

INSERT
INTO TESTRESULTAAT VALUES
  (
    'bevattende',
    (SELECT SDO_AGGR_UNION(SDOAGGRTYPE(c.begrenzing_perceel, 0.0005))
    FROM kad_perceel c
    WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(c.begrenzing_perceel,0.0005) = 'TRUE'
    )
  );

 
INSERT
INTO TESTRESULTAAT VALUES
  (
    'omhullende',
    (SELECT SDO_GEOM.SDO_CONCAVEHULL(c.GEOM),0.0005
    )
  FROM TESTRESULTAAT c
  WHERE c.DESCR = 'bevattende'
  )
);

of

INSERT
INTO TESTRESULTAAT VALUES
  (
    'omhullende',
    (SELECT SDO_CONCAVEHULL(SDO_AGGR_UNION(MDSYS.SDOAGGRTYPE(c.begrenzing_perceel, 0.0005)))
    FROM kad_perceel c
    WHERE SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(c.begrenzing_perceel,0.0005) = 'TRUE'
    )
  );

en vervolgens de verschil kaart

-- TODO
INSERT INTO 
    test.testresultaat(descr, geom) 
VALUES (
    'gaten',
    (SELECT ST_Difference(
       (SELECT geom FROM test.testresultaat WHERE descr='omhullende'),
       (SELECT geom FROM test.testresultaat WHERE descr='bevattende')
    ))
);
Clone this wiki locally