fix(extract): Polygonlöcher im Chunk-Payload erhalten, split_by_chunk_all abdecken

Ruling 34 (Important, Fix-Runde 1 zu Aufgabe 6): _ring() verwarf jedes Loch
eines Polygons (nur poly.exterior wurde in Weltkoordinaten -> three.js
uebertragen). Vor dem Chunk-Zuschnitt war das meist harmlos, weil das
groesste Loch die Bucht selbst ist und beim Zuschneiden ohnehin herausfaellt
- danach blieb es aber ein echter Datenverlust: ein von Strassen umschlossener
Block wurde zu Asphalt, ein Innenhof zu Gebaeudemasse, ein Teich im Park zu
Wiese. Gemessen an echten Daten: 120 Strassen-Chunk-Stuecke (449.876 m2),
127 Stadtflaechen-Stuecke (208.657 m2 wobei 1 weiteres Park-Stueck), 30
Land-Stuecke (11.402 m2) und mindestens 75 Gebaeude-Stuecke trugen ein
verworfenes Loch.

_ring() wird _rings(): liefert [poly.exterior, *poly.interiors] in derselben
Transformation, Aussenring zuerst. Payload-Schema aendert sich entsprechend
fuer land/surfaces/roads/buildings von einem flachen Ring zu einer Liste von
Ringen; centerlines und palms sind unveraendert (keine Polygone). Task 7s
extrudePolygons() ruft ShapeUtils.triangulateShape(ring, []) bereits mit
einem (bisher leeren) Loecher-Array - die Aenderung passt jetzt durchgehend,
bevor Aufgabe 7 gebaut wird. write_debug_png() zeichnet weiterhin nur den
Aussenring (poly[0]), Loecher werden im Debug-Bild nicht dargestellt.

Neuer Test test_polygon_holes_survive_into_the_payload prueft das direkt an
einem Block mit Loch; die Koordinaten wurden vor dem Festschreiben gegen die
tatsaechliche chunk_payload()-Transformation nachgerechnet (uv run python,
nicht nur von Hand). test_coordinates_are_chunk_local_three_js musste auf
das neue [0]-Aussenring-Indexing angepasst werden.

Ruling 35 (Important): split_by_chunk_all() - die Variante, die run.py
tatsaechlich benutzt, nicht das getestete split_by_chunk() - hatte einen
MultiPolygon-Zweig ohne jede Testabdeckung. Neuer Test mit einer Klammerform
(Steg ausserhalb der Chunk-Zelle, zwei Zinken je einmal hineinreichend)
trifft genau diesen Zweig gezielt; er war schon vor der Aenderung gruen -
bestaetigt als Abdeckungsluecke, nicht als Bug.

uv run pytest -v: 36 passed (34 zuvor + 2 neu).

Pipeline (run.py) am gecachten Mosaik neu durchlaufen: weiterhin 144
Chunk-Dateien, public/data/vice-a/ jetzt 2,7 MB (zuvor 2,5 MB; +0,2 MB fuer
die erhaltenen Loecher). Insgesamt tragen jetzt 415 Chunk-Stuecke mindestens
ein Loch: Land 30/213, Stadtflaechen 127/1145 (+1 Park-Flaeche), Strassen
120/953, Gebaeude 137/2859 (80 global-eindeutige Gebaeude vor
Chunk-Duplizierung). Land/Strassen/Stadtflaechen treffen die oben genannten
Referenzwerte exakt; bei Gebaeuden weicht die Stueckzahl vom Review-Befund
(75) ab. Stichprobe der vier flaechenmaessig groessten Gebaeude-Loecher
(Debug-PNGs chunk_8_0, chunk_2_10, chunk_5_11 sowie ein viertes) zeigt
plausible echte Ring-Bauwerke (ein stadionartiger Rundbau, eine
Wendel-Parkrampe) statt offensichtlicher Fehlklassifikation - die
verbleibende Abweichung duerfte an der bereits im Task-6-Bericht
offengelegten Restunsicherheit der Gebaeude-Ueberlappungsrekonstruktion
liegen (263 vs. 258 spekulative Gebaeude), nicht an dieser Aenderung; im
Fix-Bericht dokumentiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Sonnet 5 committed 2026-09-12 17:23:31 +02:00
1 parent 062a9af2fd
commit 22ac8f530c
289 files changed
+194 -156

No files matched your search

+1 -1
View File
@@ -1 +1 @@
{"chunk":[10,2],"origin":[1500,-2000],"land":[[[178.0,90.5],[196.0,89.5],[203.0,87.5],[250.0,81.86],[250.0,250.0],[0.0,250.0],[0.0,142.5],[2.0,140.5],[5.0,141.5],[36.0,131.5],[72.0,122.5],[76.5,119.0],[74.5,110.0],[72.0,107.5],[67.0,107.5],[55.0,111.5],[48.0,111.5],[38.0,114.5],[30.0,115.5],[26.0,112.5],[23.0,112.5],[16.0,115.5],[7.0,116.5],[0.0,115.82],[0.0,0.0],[220.77,0.0],[221.5,11.0],[223.5,17.0],[224.5,38.0],[221.5,42.0],[219.5,51.0],[206.0,66.5],[192.0,73.5],[179.0,77.5],[177.0,79.5],[172.0,79.5],[134.0,93.5],[102.0,99.5],[99.5,102.0],[100.5,110.0],[103.0,112.5],[178.0,90.5]]],"surfaces":[{"poly":[[15.0,51.5],[1.5,46.0],[2.0,1.5],[56.5,2.0],[57.5,18.0],[60.5,23.0],[59.5,28.0],[61.5,29.0],[60.5,33.0],[64.5,48.0],[58.0,48.5],[57.0,50.5],[15.0,51.5]],"kind":"urban"},{"poly":[[84.5,44.0],[78.0,1.5],[105.5,2.0],[88.0,5.5],[87.5,9.0],[80.5,14.0],[83.5,28.0],[87.5,30.0],[89.0,35.5],[151.0,22.5],[155.0,18.5],[160.0,18.5],[157.5,2.0],[161.5,3.0],[163.5,21.0],[158.0,24.5],[133.0,34.5],[130.0,33.5],[125.0,36.5],[121.0,35.5],[120.0,37.5],[108.0,38.5],[103.0,41.5],[95.0,41.5],[90.0,44.5],[84.5,44.0]],"kind":"urban"},{"poly":[[230.5,244.0],[242.0,235.5],[134.5,230.0],[143.0,216.5],[164.0,229.5],[182.0,200.5],[223.0,227.5],[244.5,206.0],[194.0,176.5],[192.5,175.0],[197.5,168.0],[193.0,159.5],[183.0,153.5],[172.5,161.0],[171.5,126.0],[176.5,125.0],[176.0,112.5],[135.5,114.0],[135.5,125.0],[144.5,126.0],[144.5,179.0],[157.5,188.0],[144.0,211.5],[141.5,199.0],[136.0,192.5],[132.0,191.5],[131.0,194.5],[122.5,193.0],[103.5,131.0],[95.5,95.0],[93.5,94.0],[94.5,90.0],[87.5,58.0],[138.0,46.5],[167.0,35.5],[175.5,28.0],[176.5,24.0],[174.0,1.5],[211.5,2.0],[215.5,14.0],[215.5,38.0],[210.5,49.0],[199.0,61.5],[172.0,71.5],[170.0,74.5],[162.0,74.5],[141.0,81.5],[138.0,84.5],[135.0,83.5],[100.0,91.5],[97.5,98.0],[104.0,121.5],[175.0,99.5],[249.0,91.5],[250.0,91.15],[250.0,235.5],[245.0,235.5],[250.0,238.83],[250.0,244.5],[247.0,244.5],[243.5,248.0],[243.5,250.0],[229.41,250.0],[230.5,244.0]],"kind":"urban"},{"poly":[[5.5,195.0],[1.5,194.0],[1.5,151.0],[4.0,148.5],[18.0,146.5],[23.0,143.5],[75.0,130.5],[78.5,128.0],[78.5,124.0],[76.5,123.0],[73.5,102.0],[71.0,98.5],[28.0,106.5],[25.0,112.5],[22.0,112.5],[20.0,108.5],[18.0,111.5],[15.0,109.5],[14.0,114.5],[12.0,110.5],[5.0,110.5],[4.5,115.0],[2.0,115.5],[1.5,101.0],[13.5,101.0],[18.5,70.0],[5.0,67.5],[2.0,82.5],[1.5,62.0],[16.0,65.5],[40.0,65.5],[67.0,61.5],[69.5,81.0],[71.5,82.0],[70.5,86.0],[72.5,87.0],[72.5,95.0],[76.5,105.0],[75.5,109.0],[77.5,110.0],[76.5,113.0],[81.5,126.0],[80.5,129.0],[82.5,130.0],[82.5,136.0],[87.5,147.0],[86.5,150.0],[89.5,154.0],[88.5,157.0],[100.5,194.0],[95.0,194.5],[93.0,200.5],[87.0,194.5],[79.0,194.5],[72.0,201.5],[71.5,195.0],[64.0,193.5],[63.0,203.5],[57.5,203.0],[57.0,194.5],[50.0,194.5],[49.0,198.5],[44.0,194.5],[24.0,194.5],[20.0,201.5],[16.0,194.5],[8.0,194.5],[15.5,211.0],[15.0,221.5],[5.5,195.0]],"kind":"urban"},{"poly":[[138.5,211.0],[134.0,194.5],[138.5,199.0],[141.5,208.0],[140.5,218.0],[134.0,226.5],[138.5,211.0]],"kind":"urban"},{"poly":[[8.0,219.5],[4.0,213.5],[0.0,213.5],[0.0,198.87],[1.0,196.5],[4.5,199.0],[11.0,219.5],[8.0,219.5]],"kind":"urban"},{"poly":[[18.5,219.0],[18.5,211.0],[12.0,196.5],[15.5,198.0],[20.0,207.5],[25.5,197.0],[29.5,197.0],[22.5,210.0],[21.0,219.5],[18.5,219.0]],"kind":"urban"},{"poly":[[36.0,219.5],[31.5,216.0],[32.0,212.5],[37.0,216.5],[43.0,216.5],[44.5,214.0],[31.5,204.0],[32.5,200.0],[37.0,196.5],[42.0,196.5],[47.5,201.0],[47.0,203.5],[42.0,199.5],[35.5,201.0],[37.0,205.5],[47.5,211.0],[47.5,216.0],[43.0,219.5],[36.0,219.5]],"kind":"urban"},{"poly":[[65.5,219.0],[65.0,209.5],[56.0,209.5],[55.5,219.0],[51.5,219.0],[52.0,196.5],[55.5,198.0],[56.0,206.5],[65.0,206.5],[65.5,197.0],[69.5,197.0],[69.0,219.5],[65.5,219.0]],"kind":"urban"},{"poly":[[78.0,218.5],[73.5,212.0],[73.5,204.0],[80.0,196.5],[85.0,196.5],[91.5,202.0],[92.5,211.0],[86.0,219.5],[78.0,218.5]],"kind":"urban"},{"poly":[[107.5,217.0],[104.0,210.5],[99.5,213.0],[100.5,218.0],[96.5,219.0],[97.0,196.5],[105.0,196.5],[111.5,200.0],[112.5,205.0],[108.5,211.0],[112.0,219.5],[107.5,217.0]],"kind":"urban"},{"poly":[[116.5,219.0],[117.0,196.5],[131.5,198.0],[121.0,199.5],[120.5,206.0],[129.0,206.5],[129.5,209.0],[119.5,210.0],[121.0,216.5],[131.0,216.5],[131.0,219.5],[116.5,219.0]],"kind":"urban"},{"poly":[[24.5,221.0],[24.5,211.0],[29.0,203.5],[33.5,210.0],[28.5,211.0],[28.5,215.0],[33.0,221.5],[24.5,221.0]],"kind":"urban"},{"poly":[[45.0,223.5],[41.5,222.0],[49.0,218.5],[49.0,221.5],[57.0,221.5],[58.0,211.5],[63.5,212.0],[64.0,221.5],[71.0,222.5],[72.0,214.5],[78.0,221.5],[84.0,222.5],[93.0,216.5],[94.0,221.5],[102.0,221.5],[103.0,213.5],[110.5,223.0],[111.0,228.5],[45.0,223.5]],"kind":"urban"},{"poly":[[1.5,249.0],[17.3,250.0],[1.5,250.0],[1.5,249.0]],"kind":"urban"}],"roads":[{"poly":[[250.0,245.5],[250.0,250.0],[235.0,250.0],[234.5,249.0],[232.0,247.5],[229.5,250.0],[218.68,250.0],[220.5,246.0],[195.0,243.5],[175.0,243.5],[164.0,241.5],[140.0,241.Line truncated
{"chunk":[10,2],"origin":[1500,-2000],"land":[[[[178.0,90.5],[196.0,89.5],[203.0,87.5],[250.0,81.86],[250.0,250.0],[0.0,250.0],[0.0,142.5],[2.0,140.5],[5.0,141.5],[36.0,131.5],[72.0,122.5],[76.5,119.0],[74.5,110.0],[72.0,107.5],[67.0,107.5],[55.0,111.5],[48.0,111.5],[38.0,114.5],[30.0,115.5],[26.0,112.5],[23.0,112.5],[16.0,115.5],[7.0,116.5],[0.0,115.82],[0.0,0.0],[220.77,0.0],[221.5,11.0],[223.5,17.0],[224.5,38.0],[221.5,42.0],[219.5,51.0],[206.0,66.5],[192.0,73.5],[179.0,77.5],[177.0,79.5],[172.0,79.5],[134.0,93.5],[102.0,99.5],[99.5,102.0],[100.5,110.0],[103.0,112.5],[178.0,90.5]]]],"surfaces":[{"poly":[[[15.0,51.5],[1.5,46.0],[2.0,1.5],[56.5,2.0],[57.5,18.0],[60.5,23.0],[59.5,28.0],[61.5,29.0],[60.5,33.0],[64.5,48.0],[58.0,48.5],[57.0,50.5],[15.0,51.5]]],"kind":"urban"},{"poly":[[[84.5,44.0],[78.0,1.5],[105.5,2.0],[88.0,5.5],[87.5,9.0],[80.5,14.0],[83.5,28.0],[87.5,30.0],[89.0,35.5],[151.0,22.5],[155.0,18.5],[160.0,18.5],[157.5,2.0],[161.5,3.0],[163.5,21.0],[158.0,24.5],[133.0,34.5],[130.0,33.5],[125.0,36.5],[121.0,35.5],[120.0,37.5],[108.0,38.5],[103.0,41.5],[95.0,41.5],[90.0,44.5],[84.5,44.0]]],"kind":"urban"},{"poly":[[[230.5,244.0],[242.0,235.5],[134.5,230.0],[143.0,216.5],[164.0,229.5],[182.0,200.5],[223.0,227.5],[244.5,206.0],[194.0,176.5],[192.5,175.0],[197.5,168.0],[193.0,159.5],[183.0,153.5],[172.5,161.0],[171.5,126.0],[176.5,125.0],[176.0,112.5],[135.5,114.0],[135.5,125.0],[144.5,126.0],[144.5,179.0],[157.5,188.0],[144.0,211.5],[141.5,199.0],[136.0,192.5],[132.0,191.5],[131.0,194.5],[122.5,193.0],[103.5,131.0],[95.5,95.0],[93.5,94.0],[94.5,90.0],[87.5,58.0],[138.0,46.5],[167.0,35.5],[175.5,28.0],[176.5,24.0],[174.0,1.5],[211.5,2.0],[215.5,14.0],[215.5,38.0],[210.5,49.0],[199.0,61.5],[172.0,71.5],[170.0,74.5],[162.0,74.5],[141.0,81.5],[138.0,84.5],[135.0,83.5],[100.0,91.5],[97.5,98.0],[104.0,121.5],[175.0,99.5],[249.0,91.5],[250.0,91.15],[250.0,235.5],[245.0,235.5],[250.0,238.83],[250.0,244.5],[247.0,244.5],[243.5,248.0],[243.5,250.0],[229.41,250.0],[230.5,244.0]]],"kind":"urban"},{"poly":[[[5.5,195.0],[1.5,194.0],[1.5,151.0],[4.0,148.5],[18.0,146.5],[23.0,143.5],[75.0,130.5],[78.5,128.0],[78.5,124.0],[76.5,123.0],[73.5,102.0],[71.0,98.5],[28.0,106.5],[25.0,112.5],[22.0,112.5],[20.0,108.5],[18.0,111.5],[15.0,109.5],[14.0,114.5],[12.0,110.5],[5.0,110.5],[4.5,115.0],[2.0,115.5],[1.5,101.0],[13.5,101.0],[18.5,70.0],[5.0,67.5],[2.0,82.5],[1.5,62.0],[16.0,65.5],[40.0,65.5],[67.0,61.5],[69.5,81.0],[71.5,82.0],[70.5,86.0],[72.5,87.0],[72.5,95.0],[76.5,105.0],[75.5,109.0],[77.5,110.0],[76.5,113.0],[81.5,126.0],[80.5,129.0],[82.5,130.0],[82.5,136.0],[87.5,147.0],[86.5,150.0],[89.5,154.0],[88.5,157.0],[100.5,194.0],[95.0,194.5],[93.0,200.5],[87.0,194.5],[79.0,194.5],[72.0,201.5],[71.5,195.0],[64.0,193.5],[63.0,203.5],[57.5,203.0],[57.0,194.5],[50.0,194.5],[49.0,198.5],[44.0,194.5],[24.0,194.5],[20.0,201.5],[16.0,194.5],[8.0,194.5],[15.5,211.0],[15.0,221.5],[5.5,195.0]]],"kind":"urban"},{"poly":[[[138.5,211.0],[134.0,194.5],[138.5,199.0],[141.5,208.0],[140.5,218.0],[134.0,226.5],[138.5,211.0]]],"kind":"urban"},{"poly":[[[8.0,219.5],[4.0,213.5],[0.0,213.5],[0.0,198.87],[1.0,196.5],[4.5,199.0],[11.0,219.5],[8.0,219.5]]],"kind":"urban"},{"poly":[[[18.5,219.0],[18.5,211.0],[12.0,196.5],[15.5,198.0],[20.0,207.5],[25.5,197.0],[29.5,197.0],[22.5,210.0],[21.0,219.5],[18.5,219.0]]],"kind":"urban"},{"poly":[[[36.0,219.5],[31.5,216.0],[32.0,212.5],[37.0,216.5],[43.0,216.5],[44.5,214.0],[31.5,204.0],[32.5,200.0],[37.0,196.5],[42.0,196.5],[47.5,201.0],[47.0,203.5],[42.0,199.5],[35.5,201.0],[37.0,205.5],[47.5,211.0],[47.5,216.0],[43.0,219.5],[36.0,219.5]]],"kind":"urban"},{"poly":[[[65.5,219.0],[65.0,209.5],[56.0,209.5],[55.5,219.0],[51.5,219.0],[52.0,196.5],[55.5,198.0],[56.0,206.5],[65.0,206.5],[65.5,197.0],[69.5,197.0],[69.0,219.5],[65.5,219.0]]],"kind":"urban"},{"poly":[[[78.0,218.5],[73.5,212.0],[73.5,204.0],[80.0,196.5],[85.0,196.5],[91.5,202.0],[92.5,211.0],[86.0,219.5],[78.0,218.5]],[[88.5,212.0],[88.5,204.0],[86.0,200.5],[81.0,199.5],[77.5,203.0],[77.5,213.0],[81.0,216.5],[85.5,216.0],[88.5,212.0]]],"kind":"urban"},{"poly":[[[107.5,217.0],[104.0,210.5],[99.5,213.0],[100.5,218.0],[96.5,219.0],[97.0,196.5],[105.0,196.5],[111.5,200.0],[112.5,205.0],[108.5,211.0],[112.0,219.5],[107.5,217.0]]],"kind":"urban"},{"poly":[[[116.5,219.0],[117.0,196.5],[131.5,198.0],[121.0,199.5],[120.5,206.0],[129.0,206.5],[129.5,209.0],[119.5,210.0],[121.0,216.5],[131.0,216.5],[131.0,219.5],[116.5,219.0]]],"kind":"urban"},{"poly":[[[24.5,221.0],[24.5,211.0],[29.0,203.5],[33.5,210.0],[28.5,211.0],[28.5,215.0],[33.0,221.5],[24.5,221.0]]],"kind":"urban"},{"poly":[[[45.0,223.5],[41.5,222.0],[49.0,218.5],[49.0,221.5],[57.0,221.5],[58.0,211.5],[63.5,212.0],[64.0,221.5],[71.0,222.5],[72.0,214.5],[78.0,221.5],[84.0,222.5],[93.0,216.5],[94.0,221.5],[102.0,221.5],[103.0,213.5],[110.5,223.0],[111.0,228.5],[45.0,223.5]]],"kind":"urban"},{"poly":[[[1.5,249.0],[17.3,250.0],[1.5,250.0],[1.5,249.0]]],"kind":"urban"}],"roads":[{"poly":[[[250.0,245.5],Line truncated