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":[5,9],"origin":[250,-250],"land":[[[248.0,132.5],[238.0,131.5],[235.0,129.5],[226.0,128.5],[219.0,125.5],[196.0,121.5],[154.0,101.5],[151.0,101.5],[124.0,86.5],[114.0,81.5],[111.0,81.5],[106.0,77.5],[97.0,74.5],[92.0,70.5],[85.0,68.5],[45.0,47.5],[38.0,45.5],[0.0,26.89],[0.0,0.0],[249.5,0.0],[249.5,5.0],[250.0,6.17],[250.0,133.0],[248.0,132.5]]],"surfaces":[{"poly":[[193.0,79.5],[178.5,61.0],[177.5,45.0],[186.12,0.0],[204.07,0.0],[201.5,2.0],[202.5,18.0],[200.5,22.0],[203.5,27.0],[201.5,28.0],[202.5,34.0],[241.5,30.0],[237.1,0.0],[249.5,0.0],[250.0,3.0],[250.0,6.5],[246.5,10.0],[248.5,14.0],[247.0,95.5],[193.0,79.5]],"kind":"urban"},{"poly":[[219.0,1.5],[217.5,0.0],[218.92,0.0],[219.0,1.5]],"kind":"urban"},{"poly":[[211.0,0.5],[209.75,0.0],[212.25,0.0],[211.0,0.5]],"kind":"urban"},{"poly":[[108.0,73.5],[96.0,67.5],[93.0,71.5],[91.0,70.5],[90.5,65.0],[88.0,63.5],[84.0,66.5],[84.0,61.5],[80.0,65.5],[79.0,59.5],[71.0,55.5],[68.0,58.5],[67.0,53.5],[53.0,46.5],[51.0,48.5],[49.0,44.5],[45.0,47.5],[44.5,43.0],[38.0,39.5],[35.0,42.5],[26.0,39.5],[25.5,34.0],[19.0,32.5],[17.0,29.5],[15.0,31.5],[10.0,26.5],[5.0,29.5],[1.5,27.0],[1.5,23.0],[0.0,22.19],[0.0,0.0],[58.69,0.0],[69.5,11.0],[79.5,32.0],[95.5,53.0],[96.5,66.0],[110.0,66.5],[117.5,73.0],[109.0,76.5],[108.0,73.5]],"kind":"urban"},{"poly":[[225.0,122.5],[222.0,124.5],[220.0,121.5],[217.0,125.5],[216.0,120.5],[213.0,121.5],[211.0,119.5],[208.0,123.5],[207.0,118.5],[204.0,123.5],[203.0,117.5],[198.0,116.5],[196.0,118.5],[195.0,115.5],[189.0,114.5],[182.0,109.5],[178.0,112.5],[175.0,105.5],[172.0,107.5],[169.0,103.5],[165.0,107.5],[161.5,105.0],[161.0,100.5],[151.0,95.5],[148.0,99.5],[146.0,93.5],[142.0,96.5],[141.5,91.0],[139.0,89.5],[135.0,93.5],[134.0,86.5],[130.0,90.5],[127.5,89.0],[128.0,83.5],[122.5,85.0],[124.5,79.0],[140.0,87.5],[186.0,105.5],[235.0,119.5],[227.0,128.5],[225.0,122.5]],"kind":"urban"}],"roads":[{"poly":[[248.0,122.5],[238.0,120.5],[235.0,118.5],[228.0,117.5],[207.0,110.5],[193.0,107.5],[173.0,98.5],[141.0,87.5],[122.0,76.5],[110.0,66.5],[93.5,50.0],[79.5,31.0],[69.5,10.0],[59.5,0.0],[79.07,0.0],[80.5,4.0],[91.5,25.0],[96.0,29.5],[100.5,30.0],[107.0,27.5],[112.0,23.5],[114.0,24.5],[118.0,22.5],[122.0,23.5],[125.5,20.0],[125.5,16.0],[120.38,0.0],[133.21,0.0],[138.5,15.0],[146.0,17.5],[156.0,15.5],[157.5,13.0],[157.5,7.0],[155.5,2.0],[153.5,0.0],[165.72,0.0],[167.5,4.0],[170.5,5.0],[173.5,2.0],[173.72,0.0],[185.58,0.0],[185.5,5.0],[176.5,50.0],[177.5,51.0],[177.5,59.0],[180.5,66.0],[191.0,78.5],[201.0,83.5],[233.0,91.5],[247.0,96.5],[250.0,96.5],[250.0,107.12],[197.0,92.5],[185.0,86.5],[178.5,80.0],[170.0,67.5],[164.5,70.0],[165.5,74.0],[162.0,84.5],[182.0,91.5],[194.0,97.5],[250.0,113.34],[250.0,123.83],[248.0,122.5]],"bridge":false},{"poly":[[194.0,97.5],[182.0,91.5],[162.0,84.5],[165.5,74.0],[164.5,70.0],[170.0,67.5],[178.5,80.0],[185.0,86.5],[197.0,92.5],[250.0,107.12],[250.0,113.34],[194.0,97.5]],"bridge":false},{"poly":[[247.5,17.0],[248.5,14.0],[247.5,11.0],[250.0,8.5],[250.0,22.5],[247.5,17.0]],"bridge":false},{"poly":[[107.5,79.0],[110.0,75.5],[113.5,77.0],[113.0,81.5],[111.0,81.5],[107.5,79.0]],"bridge":false}],"centerlines":[[[179.0,-15.0],[179.0,6.0],[172.0,15.0]],[[100.0,39.0],[93.0,36.0],[86.0,29.0],[69.0,-6.0]],[[167.0,71.0],[171.0,67.0],[171.0,42.0],[174.0,30.0],[174.0,17.0],[172.0,15.0]],[[134.0,25.0],[120.0,-29.0]],[[101.0,39.0],[117.0,30.0],[128.0,29.0],[133.0,26.0]],[[135.0,25.0],[137.0,23.0],[155.0,22.0],[166.0,15.0]],[[101.0,40.0],[103.0,48.0],[109.0,56.0],[130.0,74.0],[149.0,83.0],[163.0,84.0],[167.0,80.0]],[[135.0,26.0],[138.0,31.0],[138.0,37.0],[150.0,59.0],[166.0,71.0]],[[166.0,14.0],[162.0,9.0],[157.0,-11.0]],[[169.0,80.0],[177.0,86.0],[203.0,97.0],[367.0,144.0],[402.0,151.0]]],"buildings":[{"poly":[[211.0,34.5],[202.5,34.0],[202.5,30.0],[203.5,29.0],[203.0,28.5],[202.0,29.5],[201.5,28.0],[203.5,27.0],[201.5,26.0],[202.5,24.0],[200.5,22.0],[200.5,19.0],[202.5,18.0],[202.5,16.0],[201.5,15.0],[201.5,11.0],[203.5,9.0],[201.5,9.0],[201.5,2.0],[203.0,1.5],[204.0,-0.5],[205.0,0.5],[206.0,-1.5],[210.0,-1.5],[211.0,1.5],[212.0,-0.5],[216.0,-1.5],[219.0,2.5],[219.5,-4.0],[221.5,-5.0],[220.0,-5.5],[219.0,-4.5],[218.5,-8.0],[220.0,-8.5],[221.0,-7.5],[221.0,-9.5],[225.0,-9.5],[226.5,-7.0],[225.5,-6.0],[226.0,-4.5],[227.0,-6.5],[228.0,-5.5],[230.0,-7.5],[236.0,-7.5],[236.5,-2.0],[237.5,-1.0],[237.5,5.0],[238.5,6.0],[238.5,10.0],[239.5,11.0],[239.5,15.0],[238.5,17.0],[240.5,18.0],[239.5,22.0],[241.5,23.0],[241.5,27.0],[240.5,28.0],[241.5,30.0],[239.0,30.5],[238.0,29.5],[237.0,31.5],[233.0,31.5],[231.0,30.5],[230.0,32.5],[226.0,32.5],[225.0,31.5],[224.0,33.5],[222.0,33.5],[221.0,32.5],[220.0,33.5],[213.0,33.5],[212.0,32.5],[211.0,34.5]],"height":12.7,"source":"district","speculative":false},{"poly":[[251.0,96.5],[246.5,96.0],[247.5,95.0],[248.0,17.5],[248.5,21.0],[250.0,22.5],[253.5,23.0],[254.5,31.0],[257.0,33.5],[261.5,36.0],[254.0,36.5],[251.5,38.0],[251.5,40.0],[254.0,40.5],[256.0,43.5],[256.5,41.0],[258.0,39.5],[263.Line truncated