Ich nehme eine aktuelle Anfrage zum Anlass, dieses Blog-Posting zu verfassen.
Es geht darum, noch mal deutlich zu formulieren, dass nur
valide Geometrien auch valide Ergebnisse beim Verarbeiten und Abfragen der Daten ergeben können. Dabei spielt eine wichtige Rolle,
- welche Genauigkeit die jeweiligen Stützpunktwerte haben
- welche Toleranz im SDO_GEOM.VALIDATE_GEOMETRY-Aufruf verwendet wird und
- welche Toleranz für die zu validierende Geometrie in den Metadaten gesetzt ist.
So ergibt die folgende Validierung den Wert TRUE, was bedeutet, dass die Geometrie valide im Sinne der
Simple Feature Spezifikation des OGC ist.
select sdo_geom.validate_geometry_with_context(MDSYS.SDO_GEOMETRY(
2007,
31466,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1,19,1003,1,27,1003,1,35,1003,1,43,
1003,1,51,1003,1,59,1003,1,69,1003,1,79,1003,1,103,1003,1,113,1003,1),
MDSYS.SDO_ORDINATE_ARRAY(2569987.15487036,5652633.72009691,
2569982.44144293,5652632.79777397,2570000.917,5652525.208,
2570011.003,5652526.994,2569992.29925865,5652634.72675023,
2569987.62584567,5652633.81225731,2570005.908,5652527.401,
2570005.408,5652527.315,2569987.15487036,5652633.72009691,
2570119.968,5652441.443,2570119.96012695,5652441.51339433,
2570119.96202326,5652440.77241008,2570119.968,5652441.443,
2570119.87330375,5652439.10112505,2570119.953,5652439.76,
2570119.9542805,5652439.90367167,2570119.87330375,5652439.10112505,
2570119.61351795,5652437.50659172,2570119.751,5652438.09,
2570119.77515959,5652438.28973524,2570119.61351795,5652437.50659172,
2570119.17817256,5652435.9275605,2570119.365,5652436.452,
2570119.42361135,5652436.70071863,2570119.17817256,5652435.9275605,
2570118.46189878,5652434.17330482,2570118.8,5652434.866,
2570118.91985803,5652435.20245104,2570118.46189878,5652434.17330482,
2570104.201,5652534.484,2570119.142,5652446.861,
2570119.781,5652443.115,2570119.147,5652446.865,
2570104.201,5652534.484,2570102.316,5652545.537,
2570099.75132948,5652560.58626676,2570102.315,5652545.536,
2570104.201,5652534.484,2570102.316,5652545.537,
2569941.5,5652617.953,2569941.727,5652616.789,
2569947.536,5652586.967,2569962.583,5652589.923,
2569955.28,5652627.483,2569952.23743088,5652626.88835588,
2569953.411,5652620.76,2569948.384,5652624.128,
2569947.99921027,5652626.06027191,2569944.8604423,5652625.4470043,
2569945.261,5652623.521,2569941.5,5652617.953,
2570018.291,5652639.81,2570017.805,5652639.715,
2570035.905,5652533.124,2570036.386,5652533.211,
2570018.291,5652639.81,2570048.49822353,5652645.72702356,
2570048.02308523,5652645.63384714,2570066.04,5652539.626,
2570066.508,5652539.706,2570048.49822353,5652645.72702356)),
0.0005) from dual
----
TRUE
Wird die Toleranz im konkreten Fall nur um eine Nachkommastelle verringert (gelockert), dann ist die Geometrie schon nicht mehr valide.
select sdo_geom.validate_geometry_with_context(MDSYS.SDO_GEOMETRY(
2007,
31466,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(
1,1003,1,
19,1003,1,
27,1003,1,
35,1003,1,
43,1003,1,
51,1003,1,
59,1003,1,
69,1003,1,
79,1003,1,
103,1003,1,
113,1003,1),
MDSYS.SDO_ORDINATE_ARRAY(2569987.15487036,5652633.72009691,
2569982.44144293,5652632.79777397,2570000.917,5652525.208,
2570011.003,5652526.994,2569992.29925865,5652634.72675023,
2569987.62584567,5652633.81225731,2570005.908,5652527.401,
2570005.408,5652527.315,2569987.15487036,5652633.72009691,
2570119.968,5652441.443,2570119.96012695,5652441.51339433,
2570119.96202326,5652440.77241008,2570119.968,5652441.443,
2570119.87330375,5652439.10112505,2570119.953,5652439.76,
2570119.9542805,5652439.90367167,2570119.87330375,5652439.10112505,
2570119.61351795,5652437.50659172,2570119.751,5652438.09,
2570119.77515959,5652438.28973524,2570119.61351795,5652437.50659172,
2570119.17817256,5652435.9275605,2570119.365,5652436.452,
2570119.42361135,5652436.70071863,2570119.17817256,5652435.9275605,
2570118.46189878,5652434.17330482,2570118.8,5652434.866,
2570118.91985803,5652435.20245104,2570118.46189878,5652434.17330482,
2570104.201,5652534.484,2570119.142,5652446.861,
2570119.781,5652443.115,2570119.147,5652446.865,
2570104.201,5652534.484,2570102.316,5652545.537,
2570099.75132948,5652560.58626676,2570102.315,5652545.536,
2570104.201,5652534.484,2570102.316,5652545.537,
2569941.5,5652617.953,2569941.727,5652616.789,
2569947.536,5652586.967,2569962.583,5652589.923,
2569955.28,5652627.483,2569952.23743088,5652626.88835588,
2569953.411,5652620.76,2569948.384,5652624.128,
2569947.99921027,5652626.06027191,2569944.8604423,5652625.4470043,
2569945.261,5652623.521,2569941.5,5652617.953,
2570018.291,5652639.81,2570017.805,5652639.715,
2570035.905,5652533.124,2570036.386,5652533.211,
2570018.291,5652639.81,2570048.49822353,5652645.72702356,
2570048.02308523,5652645.63384714,2570066.04,5652539.626,
2570066.508,5652539.706,2570048.49822353,5652645.72702356)),
0.005) from dual
----
13349 [Element <7>] [Ring <1>][Edge <4>][Edge <2>]
Die konkrete ORA-Fehlermeldung bedeutet, dass ein sich selbst schneidendes Polygon "entstanden" ist.
Zwei Kanten im 7. Element von Ring 1 überschneiden sich.
Zusätzliche Hinweise gibt es natürlich im Handbuch.