feat(extract): Chunk-Ausgabe, Manifest und Ablaufsteuerung

Task 6: leonida/emit.py (chunk_box, split_by_chunk, chunk_payload und die
Chunk-lokalen three.js-Koordinaten, write_chunks, write_debug_png) sowie
run.py als Ablaufsteuerung, die alles aus den Tasks 3-5 zu 144 Chunk-Dateien
und einem Manifest unter public/data/vice-a/ zusammenfuehrt.

Zwei Abweichungen vom Referenzcode der Aufgabe, beide durch Gegenrechnen
gegen die dort genannten Realwerte gefunden:

- test_emit.py::test_coordinates_are_chunk_local_three_js gab im Original
  das ungeschnittene BIG (spannt vier Chunks) direkt an chunk_payload();
  chunk_payload() clippt selbst nicht (das tut in run.py split_by_chunk_all
  vorher), darum lag der Rand bei x=300 statt <=250 und der Test schlug mit
  dem gegebenen Code fehl. Fix: BIG vor dem Aufruf mit split_by_chunk auf
  Chunk (0,0) zuschneiden, wie es run.py fuer "land" ohnehin tut.

- run.pys Filter "Gebaeude, die zu >50% in einem Strassenpolygon liegen,
  gelten als Strasse" pruefte im Original ALLE rohen Gebaeude gegen
  road_polygons(labels) direkt. road_polygons() zaehlt "spekulativ" selbst
  zu den Strassenklassen (ROAD_CLASSES) und schliesst zusaetzlich mit
  disk(3) gegen Strassennamen; ein isoliertes "spekulativ"-Gebaeude
  ueberlappt sich darueber praktisch mit sich selbst. Ergebnis am realen
  Mosaik: von 267 rohen spekulativen Gebaeuden ueberlebten nur 3 (statt der
  in der Aufgabe genannten Groessenordnung von 258), und die Schliessung
  riss zusaetzlich 211 gewoehnliche graue Gebaeude mit heraus, die die
  Notiz aus Task 5 ausdruecklich nicht meinte ("die ROTEN Flaechen ...
  werden abgezogen"). Fix: eigenes, unzweideutiges Strassenmass nur aus
  "strasse"/"weg" (ohne "spekulativ", ohne Namens-Schliessung), Pruefung
  nur auf spekulative Kandidaten begrenzt. Ergebnis: 2.348 Gebaeude, davon
  263 spekulativ (Aufgabe: 2.352 bzw. 258) - Wahrzeichenhoehen (68 Stueck,
  31-248 m) und Palmenzahl (2.133) treffen die genannten Referenzwerte exakt.

Pipeline-Lauf am gecachten Mosaik: 144 Chunk-Dateien + Manifest, 2,5 MB
gesamt (Budget 10 MB), groesste Datei chunk_9_1.json/chunk_10_1.json mit
je 40 KB. Alle drei Toleranzgrenzen (wasser/strasse/gebaeude) eingehalten.
Debug-PNGs stichprobenartig gesichtet: Kuestenlinie, Strassennetz
(inklusive Kreuzungen und einer Auffahrt-Rampe) und ein Strand mit
Palmenreihe liegen deckungsgleich auf dem Mosaik; der wasserreine Chunk
(4,10) zeigt korrekt keine Vektoren.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Sonnet 5 committed 2026-09-12 16:53:18 +02:00
1 parent 2c355aa3d8
commit ce90ea1d5f
292 files changed
+953

No files matched your search

+1
View File
@@ -0,0 +1 @@
{"chunk":[8,5],"origin":[1000,-1250],"land":[[[160.5,243.0],[167.5,219.0],[183.5,192.0],[222.5,144.0],[241.0,127.5],[250.0,121.5],[250.0,250.0],[159.39,250.0],[160.5,243.0]]],"surfaces":[{"poly":[[238.0,191.5],[228.0,189.5],[216.0,191.5],[214.5,197.0],[216.5,243.0],[231.0,242.5],[233.5,247.0],[209.0,247.5],[202.0,237.5],[190.0,247.5],[160.5,247.0],[165.5,246.0],[161.5,240.0],[163.5,234.0],[168.0,233.5],[166.5,231.0],[169.5,230.0],[165.5,227.0],[166.5,223.0],[172.5,222.0],[177.5,211.0],[174.5,206.0],[180.5,206.0],[181.5,203.0],[178.5,200.0],[184.0,199.5],[187.5,195.0],[184.5,191.0],[191.0,190.5],[195.5,185.0],[192.5,181.0],[198.0,181.5],[205.5,173.0],[204.5,171.0],[213.5,163.0],[213.5,160.0],[217.5,158.0],[214.5,154.0],[221.0,153.5],[223.5,151.0],[220.5,147.0],[223.0,145.5],[226.0,148.5],[226.5,141.0],[231.0,136.5],[236.0,138.5],[239.5,135.0],[238.5,130.0],[243.0,132.5],[246.5,130.0],[246.0,125.5],[249.0,128.5],[249.0,123.5],[250.0,124.5],[250.0,190.98],[238.0,191.5]],"kind":"urban"}],"roads":[],"centerlines":[],"buildings":[{"poly":[[252.0,126.5],[248.5,123.0],[250.0,121.5],[255.0,119.5],[256.5,122.0],[256.5,124.0],[256.0,124.5],[255.0,123.5],[254.0,125.5],[253.0,124.5],[252.0,126.5]],"height":12.6,"source":"district","speculative":false},{"poly":[[246.5,130.0],[242.0,132.5],[239.5,130.0],[239.5,129.0],[244.0,125.5],[245.0,125.5],[246.5,128.0],[246.5,130.0]],"height":10.2,"source":"district","speculative":false},{"poly":[[231.5,136.0],[238.0,130.5],[241.11,134.18],[234.61,139.68],[231.5,136.0]],"height":8.0,"source":"district","speculative":false},{"poly":[[226.0,148.5],[222.5,145.0],[222.5,144.0],[225.0,141.5],[226.0,141.5],[227.5,144.0],[227.5,146.0],[226.0,148.5]],"height":14.5,"source":"district","speculative":false},{"poly":[[220.5,147.0],[224.0,150.5],[219.5,155.0],[216.0,151.5],[220.5,147.0]],"height":15.5,"source":"district","speculative":false},{"poly":[[198.0,181.5],[194.0,180.5],[193.5,180.0],[194.5,178.0],[204.5,167.0],[205.5,164.0],[215.0,154.5],[217.5,157.0],[217.5,158.0],[216.0,159.5],[214.0,159.5],[213.0,158.5],[212.5,159.0],[213.5,160.0],[213.5,163.0],[207.0,170.5],[205.0,170.5],[204.0,169.5],[203.5,170.0],[205.5,172.0],[205.5,173.0],[198.0,181.5]],"height":15.1,"source":"district","speculative":false},{"poly":[[191.0,190.5],[189.0,190.5],[186.5,189.0],[187.5,188.0],[187.5,186.0],[189.0,184.5],[190.0,184.5],[192.0,181.5],[193.0,181.5],[195.5,184.0],[195.5,185.0],[191.5,189.0],[191.0,190.5]],"height":11.2,"source":"district","speculative":false},{"poly":[[307.0,510.5],[304.0,509.5],[301.5,506.0],[301.5,500.0],[302.5,498.0],[300.5,497.0],[300.5,492.0],[301.5,490.0],[299.5,488.0],[299.5,483.0],[300.5,481.0],[298.5,479.0],[298.5,474.0],[299.5,472.0],[297.5,470.0],[297.5,462.0],[296.5,461.0],[296.5,456.0],[297.5,455.0],[297.5,453.0],[295.5,452.0],[295.5,444.0],[294.5,443.0],[294.0,439.5],[292.0,439.5],[289.0,441.5],[284.0,442.5],[281.0,444.5],[279.0,443.5],[278.0,445.5],[276.0,444.5],[275.5,446.0],[273.0,447.5],[271.0,447.5],[270.0,448.5],[268.0,448.5],[264.0,450.5],[263.0,449.5],[262.0,451.5],[260.0,451.5],[257.0,453.5],[252.0,454.5],[249.0,456.5],[247.0,455.5],[246.0,457.5],[244.0,457.5],[241.0,459.5],[239.0,459.5],[238.5,458.0],[239.5,457.0],[237.5,456.0],[238.5,454.0],[236.5,453.0],[235.5,449.0],[234.5,448.0],[234.5,446.0],[235.5,445.0],[233.5,444.0],[234.5,442.0],[232.5,441.0],[231.5,438.0],[233.0,436.5],[235.0,437.5],[236.0,435.5],[240.0,433.5],[242.0,433.5],[245.0,431.5],[247.0,431.5],[251.0,429.5],[253.0,430.5],[253.5,430.0],[252.5,429.0],[255.0,428.5],[257.0,426.5],[262.0,425.5],[265.0,423.5],[267.0,424.5],[268.0,422.5],[272.0,421.5],[275.0,419.5],[277.0,419.5],[287.0,414.5],[289.0,414.5],[290.0,413.5],[292.0,414.5],[293.0,412.5],[294.0,412.5],[297.0,409.5],[298.5,409.0],[299.5,406.0],[301.5,404.0],[301.5,403.0],[303.5,401.0],[307.5,394.0],[309.5,394.0],[308.5,392.0],[311.5,389.0],[312.5,386.0],[317.5,382.0],[316.5,381.0],[317.5,379.0],[319.5,377.0],[320.5,374.0],[324.5,369.0],[327.5,363.0],[330.5,360.0],[332.5,356.0],[336.5,353.0],[335.5,351.0],[336.0,350.5],[337.0,351.5],[338.5,350.0],[337.5,349.0],[339.5,348.0],[338.5,347.0],[341.5,345.0],[340.0,344.5],[337.5,341.0],[336.5,339.0],[337.5,338.0],[334.5,336.0],[331.5,330.0],[332.5,329.0],[330.5,328.0],[325.5,318.0],[326.5,317.0],[324.5,316.0],[325.5,315.0],[325.0,314.5],[323.0,316.5],[321.0,316.5],[320.0,315.5],[318.0,317.5],[315.0,317.5],[314.0,318.5],[311.0,318.5],[310.0,319.5],[308.0,319.5],[307.0,318.5],[306.0,320.5],[303.0,320.5],[302.0,321.5],[299.0,321.5],[298.0,322.5],[296.0,322.5],[295.0,321.5],[294.0,323.5],[291.0,323.5],[290.0,324.5],[288.0,324.5],[287.0,323.5],[285.0,325.5],[283.0,325.5],[282.0,326.5],[280.0,326.5],[279.0,325.5],[277.0,327.5],[274.0,326.5],[273.0,328.5],[270.0,328.5],[269.0,329.5],[266.0,329.5],[265.0,330.5],[263.0,329.5],[261.0,331.5],[258.0,331.5],[257.0,332.5],[253.0,332.5],[252.0,333.5],[250.0,332.5],[249.0,334.5],[248.0,333.5],[247.5,334.0],[248.5,335.0],[247.5,337.0],[243.5,340.0],[244.5,341.0],[243.5Line truncated