BAG Panden: ongeldige/vreemde geometrien bij precision van 6: terugmelden?

Hoi BAGgers,

om panden te lokaliseren die op oude/historische foto’s staan, heb ik voor iemand een simpele webapplicatie gemaakt, die op basis van een ‘camera-hoek en standpunt’ uit de BAG die panden of adressen haalt die eventueel op die foto kunnen staan (of straten of …).

Zie verder https://blikveld.duif.net

MAAR nu dus mensen mijn api gaan gebruiken stuit ik op invalid pand geometrien (bij de geografische/topolische shapely akties die ik doe).
Bij verder testen bleek dat bij het (python shapely) geojson gebruik (standaard precision 6) die geometrien NIET GELDIG zijn, maar wanneer je de panden ophaalde als EPSG:28992 ze WEL GELDIG zijn.
Idem wanneer je ze als EPSG:4326 ophaalt met een precision van 9 (zoals in Kadaster webservices wordt getoond) of 15 (zoals in de WFS output): ze zijn dan WEL GELDIG…

ECHTER: kijkende naar de specifieke pand geometrien, lijken ze mij … foutig.
Als voorbeeld:

POLYGON ((4.645548 52.381981, 4.645606 52.381907, 4.645677 52.381913, 4.645683 52.381913, 4.645681 52.381913, 4.645669 52.381984, 4.645631 52.381971, 4.645605 52.382002, 4.645548 52.381981))

POLYGON ((4.644766 52.380693, 4.644754 52.3807, 4.644742 52.380693, 4.644662 52.380657, 4.644748 52.380557, 4.644789 52.380576, 4.644832 52.380539, 4.644862 52.380552, 4.644827 52.380591, 4.644849 52.380603, 4.644867 52.380588, 4.644915 52.380614, 4.644867 52.380589, 4.644845 52.380606, 4.644766 52.380693))

als je die als WKT laadt in QGIS en ‘Check Validity’ uitvoert zijn ze beide ongeldig:

image

Zoals je ziet, zitten er aan allebei de panden onnatuurlijke (in het echt waarschijnlijk niet aanwezige?) vreemde uitsteeksels…
VRAAG nu: zal/moet ik dit soort vreemde pand geometrien terugmelden?
Of moet ik het zo laten en in mijn applicatie de precision omhoogtrekken dan worden ze alsnog ‘geldig’…

FYI: het zijn trouwens:
http://bag.basisregistraties.overheid.nl/bag/id/pand/0392100000066813
en http://bag.basisregistraties.overheid.nl/bag/id/pand/0392100000064016

Hoi Richard,

De nauwkeurigheid van decimale graden met 6 decimalen is ongeveer 11cm (toch?) en de nauwkeurigheid van de BAG is 1mm (3 decimalen in RD). Bij kleine hoekjes en smalle strookjes worden de punten van je geometrie dus afgerond op 11cm en kunnen ze “gesnapt” worden op hetzelfde punt. Daardoor worden geometrieen soms ongeldig.

Ik denk dat je gewoon een service in RD moet gebruiken als dat mogelijk is. De BAG wordt ook opgebouwd in RD en ik hoop dat er ook ergens een validatieslag plaatsvindt. En jouw geografische/topologische acties doe je vast ook in een geprojecteerd CRS.

Maar kijk naar de plaatjes (en zo heb ik er nog 38) al die rare haakjes aan die polygonen… dat klopt toch niet?

image

image

image

Die hebben toch niks te maken met precisie of crs?
Dit is toch een data issue?

Het enige dat ik kan bedenken, is dat dit een lijn is die exact over zichzelf loopt, en dus in RD met x decimalen WEL geldig is…

Maar ik zou zeggen: dit is eigenlijk een prachtige manier om dit soort artefactjes uit de BAG te halen.

Toch?

image

Hoe lang zijn deze stukjes dan? Het is sowieso opvallend dat die lijnen ertussen precies horizontaal lopen. Ik denk echt dat het in de afronding zit.

In noord-zuidrichting is de resolutie van graden met 6 decimalen inderdaad 11 cm. In oost-westrichting is de resolutie van graden met 6 decimalen in Nederland 7 cm.

De ‘uitschieters’ zijn zijn tussen de 20cm en 2meter lang.

Voor de liefhebbers, hier zijn de 40 invalid pandjes (let op: dat komt dus doordat ik na het ophalen in shapely hebt geladen in EPSG:4326 (met de shapely default 6 decimalen)…
Met

geojson.geometry.Geometry.__init__.__defaults__ = (None, False, 15)

kun je dus shapely (intern) laten werken met 15 decimalen is zijn dit soort panden wel geldige geoms.

Persoonlijk vind ik dit ongeldige polygoontjes, helemaal als je de luchtfoto eronder legt, dan lijken dit meestal geen ‘muurtjes’ oid te zijn.

Met de QuickWKT plugin in QGIS in 1x te visualiseren.

POLYGON ((4.605221 52.359288, 4.605376 52.359268, 4.605389 52.359309, 4.605392 52.359317, 4.605395 52.359317, 4.605392 52.359317, 4.605379 52.359318, 4.605373 52.359316, 4.605321 52.359323, 4.605325 52.359334, 4.60522 52.359346, 4.605213 52.359322, 4.605231 52.359319, 4.605227 52.359308, 4.605221 52.359288))
POLYGON ((4.606852 52.35808, 4.606926 52.358054, 4.607003 52.35814, 4.607006 52.358142, 4.607003 52.35814, 4.606964 52.358153, 4.606942 52.35813, 4.606861 52.358158, 4.606804 52.358096, 4.606806 52.358095, 4.606781 52.358068, 4.606827 52.358053, 4.606852 52.35808))
POLYGON ((4.607432 52.358226, 4.607427 52.358222, 4.607523 52.358173, 4.607529 52.358177, 4.607566 52.358205, 4.607563 52.358217, 4.607607 52.35825, 4.607535 52.358286, 4.607548 52.358295, 4.607535 52.358286, 4.607483 52.358248, 4.60747 52.358254, 4.607432 52.358226))
POLYGON ((4.60773 52.329076, 4.607833 52.329033, 4.607852 52.329025, 4.607834 52.329032, 4.60786 52.329057, 4.607859 52.329057, 4.60789 52.329085, 4.607781 52.329131, 4.607774 52.329124, 4.607766 52.329125, 4.607753 52.329111, 4.607757 52.329104, 4.60773 52.329076))
POLYGON ((4.607736 52.32869, 4.607719 52.328675, 4.607788 52.328646, 4.60777 52.32863, 4.607788 52.328646, 4.607847 52.328699, 4.60787 52.328715, 4.607838 52.328733, 4.607832 52.328727, 4.607794 52.328743, 4.607736 52.32869))
POLYGON ((4.608175 52.360667, 4.608188 52.360663, 4.608305 52.360622, 4.608354 52.360676, 4.608332 52.360684, 4.608353 52.360707, 4.608281 52.360733, 4.608259 52.360709, 4.608225 52.36072, 4.608205 52.360699, 4.608217 52.360695, 4.608188 52.360663, 4.608175 52.360667))
POLYGON ((4.608774 52.36127, 4.608849 52.361244, 4.608858 52.361254, 4.608877 52.361276, 4.608905 52.361266, 4.608952 52.361318, 4.608824 52.361361, 4.608817 52.361363, 4.608824 52.361361, 4.608796 52.36133, 4.608783 52.361335, 4.608764 52.361315, 4.608802 52.361302, 4.608774 52.36127))
POLYGON ((4.609638 52.360059, 4.609797 52.360012, 4.609801 52.360011, 4.609797 52.360012, 4.609814 52.360034, 4.609829 52.360033, 4.609849 52.360058, 4.609675 52.360108, 4.609638 52.360059))
POLYGON ((4.610083 52.359919, 4.610088 52.359918, 4.610198 52.359886, 4.6102 52.359888, 4.610223 52.359883, 4.610238 52.359905, 4.610217 52.35991, 4.610237 52.359935, 4.610109 52.359973, 4.610091 52.359949, 4.610102 52.359936, 4.610088 52.359918, 4.610083 52.359919))
POLYGON ((4.610543 52.358221, 4.610542 52.358216, 4.610616 52.358215, 4.610616 52.358206, 4.610693 52.358204, 4.610695 52.358284, 4.610696 52.358294, 4.610695 52.358284, 4.610545 52.358286, 4.610544 52.358254, 4.610529 52.358248, 4.610528 52.358228, 4.610543 52.358221))
POLYGON ((4.610774 52.358498, 4.610779 52.358509, 4.610873 52.358494, 4.610888 52.358528, 4.610903 52.358526, 4.61092 52.358565, 4.610905 52.358568, 4.610917 52.358595, 4.610823 52.358611, 4.610779 52.358509, 4.610774 52.358498))
POLYGON ((4.612558 52.359343, 4.612606 52.359339, 4.612617 52.359344, 4.612646 52.359342, 4.612645 52.359337, 4.612646 52.359342, 4.61265 52.359357, 4.612665 52.359417, 4.612581 52.359425, 4.61256 52.359349, 4.612558 52.359343))
POLYGON ((4.612913 52.357831, 4.612963 52.357831, 4.612962 52.357852, 4.613003 52.357852, 4.613004 52.357793, 4.613023 52.357794, 4.613032 52.357788, 4.613072 52.357788, 4.613078 52.357793, 4.6131 52.357793, 4.613099 52.357834, 4.613125 52.357834, 4.613124 52.357877, 4.613138 52.357877, 4.613124 52.357877, 4.612993 52.357878, 4.612993 52.357881, 4.612913 52.357881, 4.612913 52.357831))
POLYGON ((4.616538 52.360292, 4.616539 52.360295, 4.616576 52.360382, 4.616519 52.360391, 4.616523 52.360399, 4.616479 52.360406, 4.616441 52.36031, 4.61648 52.360304, 4.616489 52.360294, 4.616514 52.36029, 4.616531 52.360296, 4.616539 52.360295, 4.616538 52.360292))
POLYGON ((4.619221 52.350943, 4.619337 52.350916, 4.619365 52.350961, 4.619372 52.350959, 4.619365 52.350961, 4.619249 52.350988, 4.619221 52.350943))
POLYGON ((4.619378 52.351192, 4.619416 52.351183, 4.619446 52.351233, 4.61948 52.351225, 4.61945 52.351176, 4.619451 52.351176, 4.61948 52.351225, 4.619524 52.351297, 4.619452 52.351313, 4.619408 52.351241, 4.619378 52.351192))
POLYGON ((4.62037 52.354476, 4.62037 52.354476, 4.620377 52.354477, 4.620405 52.354481, 4.620413 52.35446, 4.620385 52.354456, 4.620379 52.354455, 4.620392 52.354419, 4.620426 52.354423, 4.620615 52.354448, 4.620799 52.354471, 4.620807 52.354472, 4.620786 52.354531, 4.620595 52.354505, 4.62037 52.354476))
POLYGON ((4.620492 52.354041, 4.620603 52.353994, 4.620723 52.354049, 4.620723 52.354049, 4.620724 52.354049, 4.620723 52.354049, 4.620707 52.354112, 4.620636 52.354102, 4.620615 52.354166, 4.620384 52.354137, 4.620385 52.354132, 4.620533 52.354097, 4.620492 52.354041))
POLYGON ((4.622604 52.351539, 4.622675 52.351526, 4.622699 52.351577, 4.62271 52.351603, 4.622699 52.351577, 4.622654 52.351585, 4.622665 52.351611, 4.622671 52.351623, 4.622646 52.351627, 4.62264 52.351615, 4.622604 52.351539))
POLYGON ((4.62285 52.353866, 4.623018 52.353839, 4.623093 52.353827, 4.623018 52.353839, 4.623035 52.353878, 4.623117 52.353865, 4.623122 52.353877, 4.623076 52.353885, 4.62304 52.353891, 4.622879 52.353917, 4.622869 52.353894, 4.62286 52.353889, 4.62285 52.353866))
POLYGON ((4.62323 52.351254, 4.623347 52.351247, 4.623351 52.351274, 4.623426 52.351271, 4.623426 52.351268, 4.623471 52.351266, 4.623473 52.351275, 4.623475 52.351288, 4.623447 52.351289, 4.62338 52.351293, 4.62338 52.35129, 4.623354 52.351292, 4.623237 52.351298, 4.623234 52.351299, 4.623237 52.351298, 4.62323 52.351254))
POLYGON ((4.623303 52.35499, 4.623502 52.354961, 4.623522 52.355011, 4.623486 52.355015, 4.623337 52.355038, 4.623324 52.35504, 4.623337 52.355038, 4.623323 52.355005, 4.62331 52.355007, 4.623303 52.35499))
POLYGON ((4.623883 52.351253, 4.623897 52.351253, 4.623984 52.351248, 4.624079 52.351243, 4.624084 52.351279, 4.624055 52.35128, 4.624058 52.351302, 4.623983 52.351305, 4.623904 52.351309, 4.62389 52.35131, 4.623888 52.35129, 4.623902 52.351289, 4.623897 52.351253, 4.623883 52.351253))
POLYGON ((4.626072 52.384789, 4.626074 52.384792, 4.626156 52.384763, 4.626155 52.384762, 4.62616 52.38476, 4.626246 52.384853, 4.626264 52.384872, 4.626173 52.384904, 4.626156 52.384884, 4.626072 52.384789))
POLYGON ((4.627289 52.352058, 4.6273 52.352053, 4.627404 52.351999, 4.627465 52.352043, 4.62736 52.352097, 4.627349 52.352103, 4.627347 52.352101, 4.627322 52.352083, 4.627333 52.352077, 4.6273 52.352053, 4.627289 52.352058))
POLYGON ((4.628045 52.352071, 4.62815 52.352018, 4.62816 52.352014, 4.62815 52.352018, 4.628187 52.352046, 4.628197 52.352041, 4.628221 52.352059, 4.628211 52.352064, 4.628107 52.352117, 4.628045 52.352071))
POLYGON ((4.628275 52.354775, 4.628414 52.35476, 4.628432 52.35482, 4.628445 52.354819, 4.628432 52.35482, 4.628293 52.354836, 4.628275 52.354775))
POLYGON ((4.632561 52.379944, 4.632391 52.379961, 4.632376 52.379963, 4.632321 52.379968, 4.632319 52.379968, 4.632179 52.379982, 4.63218 52.379982, 4.632167 52.379947, 4.632164 52.379935, 4.632251 52.379924, 4.632253 52.379924, 4.632302 52.379919, 4.632371 52.379909, 4.632375 52.379908, 4.632428 52.379902, 4.632425 52.379893, 4.632484 52.379886, 4.632593 52.379873, 4.632561 52.379944))
POLYGON ((4.632887 52.368367, 4.632906 52.368364, 4.632907 52.368373, 4.632989 52.368353, 4.633001 52.368387, 4.632997 52.368387, 4.633004 52.368406, 4.633075 52.368397, 4.633194 52.368382, 4.633196 52.368386, 4.633192 52.368376, 4.633223 52.368372, 4.633242 52.368425, 4.633239 52.368417, 4.633245 52.368416, 4.633248 52.368425, 4.633273 52.368421, 4.633313 52.368538, 4.633289 52.368541, 4.633292 52.368549, 4.633285 52.36855, 4.633301 52.368596, 4.63327 52.368599, 4.633268 52.368593, 4.633149 52.368609, 4.633167 52.368662, 4.633073 52.368674, 4.632998 52.368684, 4.632981 52.368635, 4.632971 52.368606, 4.63297 52.368603, 4.63296 52.368575, 4.632956 52.368563, 4.632948 52.368565, 4.632936 52.368564, 4.632925 52.368558, 4.632919 52.36855, 4.632921 52.368541, 4.63293 52.368535, 4.63294 52.368532, 4.632949 52.368531, 4.632959 52.368534, 4.632961 52.368533, 4.63295 52.368502, 4.632941 52.368503, 4.632943 52.368506, 4.632936 52.368507, 4.63293 52.36849, 4.63292 52.368461, 4.632919 52.368458, 4.632909 52.36843, 4.632908 52.368426, 4.632898 52.368398, 4.632897 52.368395, 4.632887 52.368367))
POLYGON ((4.633129 52.36814, 4.633118 52.368112, 4.633117 52.368113, 4.633117 52.368113, 4.633115 52.368113, 4.633114 52.368113, 4.633113 52.368112, 4.633114 52.368111, 4.633114 52.368111, 4.633115 52.368111, 4.633089 52.368049, 4.633088 52.368049, 4.633087 52.368048, 4.633087 52.368048, 4.633087 52.368047, 4.633089 52.368046, 4.633091 52.368047, 4.633091 52.368047, 4.633226 52.368027, 4.633227 52.368025, 4.633229 52.368025, 4.633231 52.368026, 4.633231 52.368026, 4.63323 52.368027, 4.633229 52.368028, 4.633254 52.368089, 4.633256 52.368089, 4.633257 52.36809, 4.633257 52.368091, 4.633255 52.368092, 4.633253 52.368092, 4.633253 52.368091, 4.633264 52.368119, 4.633129 52.36814))
POLYGON ((4.633959 52.366077, 4.633959 52.366078, 4.634133 52.366072, 4.634136 52.366106, 4.634118 52.366107, 4.634121 52.36614, 4.634105 52.36614, 4.634108 52.366158, 4.634056 52.366161, 4.634058 52.366184, 4.63405 52.366185, 4.634051 52.366206, 4.633979 52.366209, 4.633978 52.3662, 4.633969 52.366201, 4.633968 52.366188, 4.633959 52.366077))
POLYGON ((4.634293 52.378631, 4.634378 52.378587, 4.634458 52.378646, 4.634456 52.378644, 4.634379 52.37869, 4.634293 52.378631))
POLYGON ((4.635722 52.381636, 4.635871 52.38163, 4.63587 52.38163, 4.635879 52.381708, 4.635879 52.38171, 4.635726 52.381706, 4.635718 52.381642, 4.635722 52.381642, 4.635722 52.381636))
POLYGON ((4.635855 52.377371, 4.635632 52.377406, 4.635615 52.377357, 4.635711 52.377343, 4.63571 52.37734, 4.635781 52.377332, 4.635781 52.377334, 4.635785 52.377344, 4.635832 52.377338, 4.635959 52.377323, 4.635958 52.377322, 4.635971 52.377355, 4.635855 52.377371))
POLYGON ((4.639003 52.386384, 4.63891 52.386393, 4.638889 52.386304, 4.638886 52.386288, 4.638937 52.386284, 4.638934 52.386274, 4.63893 52.386257, 4.63897 52.386253, 4.63897 52.386256, 4.638974 52.386271, 4.638981 52.386293, 4.638981 52.386295, 4.638981 52.386294, 4.639003 52.386384))
POLYGON ((4.639098 52.386376, 4.639003 52.386384, 4.638981 52.386294, 4.638981 52.386295, 4.638981 52.386293, 4.638974 52.386271, 4.63897 52.386256, 4.639028 52.386252, 4.639065 52.386249, 4.639073 52.386283, 4.639076 52.386295, 4.639098 52.386376))
POLYGON ((4.63969 52.383813, 4.639714 52.383763, 4.639717 52.383757, 4.639765 52.383767, 4.639789 52.38372, 4.639776 52.383716, 4.639811 52.383628, 4.639816 52.383616, 4.639911 52.383633, 4.639931 52.383639, 4.639999 52.383652, 4.64001 52.38363, 4.639999 52.383627, 4.640022 52.38358, 4.640028 52.383578, 4.640122 52.383597, 4.640458 52.383662, 4.640522 52.383624, 4.640539 52.383608, 4.640618 52.383615, 4.640615 52.383664, 4.640623 52.383663, 4.640614 52.383722, 4.640611 52.383722, 4.640607 52.383771, 4.640602 52.383771, 4.640602 52.383768, 4.640484 52.383745, 4.640465 52.38378, 4.64047 52.38378, 4.640471 52.383783, 4.640258 52.383796, 4.640132 52.383802, 4.640021 52.383805, 4.6399 52.383806, 4.639851 52.383806, 4.63969 52.383813), (4.639999 52.383652, 4.640005 52.383705, 4.640241 52.383695, 4.640263 52.383649, 4.640059 52.38361, 4.640016 52.383612, 4.640008 52.38361, 4.639999 52.383627, 4.640011 52.38363, 4.639999 52.383652))
POLYGON ((4.644766 52.380693, 4.644754 52.3807, 4.644742 52.380693, 4.644662 52.380657, 4.644748 52.380557, 4.644789 52.380576, 4.644832 52.380539, 4.644862 52.380552, 4.644827 52.380591, 4.644849 52.380603, 4.644867 52.380588, 4.644915 52.380614, 4.644867 52.380589, 4.644845 52.380606, 4.644766 52.380693))
POLYGON ((4.645548 52.381981, 4.645606 52.381907, 4.645677 52.381913, 4.645683 52.381913, 4.645681 52.381913, 4.645669 52.381984, 4.645631 52.381971, 4.645605 52.382002, 4.645548 52.381981))
POLYGON ((4.650075 52.407089, 4.650068 52.407073, 4.650048 52.407034, 4.650068 52.407073, 4.650101 52.407067, 4.650125 52.407062, 4.650133 52.407077, 4.650075 52.407089))
1 like

Heb jouw eerste polygoon geparsed in QGIS (blauw) en de BAG WFS (rood) erbij gepakt:

Je ziet dat de punten worden verplaats door de afronding naar decimale graden met maar 6 decimalen.

Aan de rechterkant gaan het mis. Daar liggen 2 punten maar 3cm uit elkaar en deze krijgen dezelfde coordinaat door de afronding. Hierdoor ontstaat een ongeldige polygoon.

Dat zou natuurlijk niet gebeurd zijn als het pand netjes was ingetekend.

Dus ik zou concluderen:

  1. BAG pand is niet correct ingetekend door de gemeente (Haarlem). Dat smalle randje tegen de grens met het aangrenzende pand hoort er niet bij.
  2. Door de afronding in shapely ontstaan de ongeldige geometrieen
1 like

Lijkt er op dat dit 1 van die panden is die gemaakt is door het hele bouwwerk in stukken te knippen met behulp van de perceelsgrenzen. Door de verschillen in inwinning, betrouwbaarheid, precisie enzovoorts ga je dan dit soort dingen krijgen. Gooi er dan die afronding tegenaan…

Overigens:

Dat de BAG panden met 3 decimalen worden geleverd, betekent niet dat ze ook daadwerkelijk een “nauwkeurigheid” hebben van 1 millimeter. Dat is zelfs fysiek onmogelijk (ik heb het al eerder gezegd: ga maar eens goed kijken naar de hoek van een pand… wat is nou exact op de millimeter de hoek? Helemaal bij bakstenen…). Dus IMHO is een beetje voorzichtigheid met dergelijke uitspraken wel aan te raden.

Dat gezegd hebbende: ik ben er vrij zeker van dat je gelijk hebt, dat die uitsteeksels komen door de afrondingen her en der. Ik heb nog zeer onlangs een vergelijkbare zaak bij de hand gehad, waar een cirkeltje door afronding op 0 decimalen veranderde in een heel net getekend kruis. Erg grappig om te zien, maar de gebruikers waren wel wat in de ar gebracht :wink:

1 like

Sorry, de nauwkeurigheid van het datamodel van de BAG…

1 like

Het aantal decimalen is de resolutie van vectordata. Meestal wordt die hoger gekozen dan de nauwkeurigheid. Anders kan de resolutie de nauwkeurigheid gaan beïnvloeden, en zoals je hier ziet ook de topologie.

2 likes

Goed (visueel) uitgelegd Raymond, dank! Mijn BAG-terugmelding heb ik intussen al terug als ‘spam!’ :slight_smile: Dus ik laat het maar even zo denk ik. Heeft me al genoeg tijd gekost.

1 like

Je hebt helemaal gelijk, alleen zorgt het wel vaak voor verwarring en/of verkeerde aannames…

1 like

Helaas is in de BAG dit niet goed beschreven (geometrie), in onze eigen gemeente is de geometrie vaak niet in te lezen in de BGT. De BGT heeft een strengere controle op overlap etc. We zijn bezig dit te verbeteren voor onze gemeente.