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":[1,11],"origin":[-750,250],"land":[[[0.0,247.17],[0.0,0.0],[250.0,0.0],[250.0,247.34],[0.0,247.17]]],"surfaces":[{"poly":[[241.0,96.5],[237.0,93.5],[207.0,90.5],[204.0,88.5],[199.0,88.5],[190.0,85.5],[167.0,83.5],[157.0,80.5],[143.0,79.5],[130.0,75.5],[124.0,76.5],[114.0,72.5],[106.0,72.5],[99.0,69.5],[72.0,65.5],[65.0,62.5],[47.0,59.5],[37.0,59.5],[33.5,57.0],[38.0,55.5],[38.0,53.5],[30.0,53.5],[29.0,51.5],[0.0,46.82],[0.0,42.88],[2.0,43.5],[12.0,44.5],[15.0,46.5],[28.0,47.5],[33.0,50.5],[44.0,50.5],[48.0,53.5],[57.0,53.5],[70.0,57.5],[76.0,57.5],[79.0,59.5],[121.0,66.5],[128.0,69.5],[140.0,69.5],[184.0,78.5],[201.0,79.5],[207.0,82.5],[221.0,83.5],[224.0,85.5],[250.0,87.5],[250.0,91.3],[246.5,92.0],[248.0,94.5],[250.0,94.72],[250.0,97.5],[241.0,96.5]],"kind":"sand"},{"poly":[[0.0,247.5],[0.0,219.5],[8.0,221.5],[9.0,218.5],[14.0,219.5],[16.0,214.5],[20.0,214.5],[22.0,209.5],[31.0,210.5],[32.0,207.5],[36.0,207.5],[36.5,203.0],[41.5,199.0],[33.0,247.5],[0.0,247.5]],"kind":"urban"},{"poly":[[0.5,64.0],[0.0,62.5],[0.0,58.09],[2.0,61.5],[15.5,63.0],[28.5,54.0],[0.0,48.3],[0.0,46.3],[38.5,54.0],[33.0,57.5],[25.0,57.5],[27.0,61.5],[32.0,59.5],[47.0,59.5],[106.0,72.5],[114.0,72.5],[124.0,76.5],[130.0,75.5],[143.0,79.5],[190.0,85.5],[207.0,90.5],[237.0,93.5],[247.5,98.0],[246.0,99.5],[227.0,94.5],[122.0,77.5],[41.0,60.5],[31.0,61.5],[24.5,65.0],[62.0,71.5],[57.5,103.0],[74.0,105.5],[74.0,107.5],[8.0,97.5],[5.5,93.0],[9.5,84.0],[7.0,83.5],[6.0,86.5],[3.5,84.0],[3.5,71.0],[1.0,68.5],[0.0,69.5],[0.0,65.17],[0.5,64.0]],"kind":"urban"},{"poly":[[0.5,72.0],[1.5,92.0],[0.0,94.25],[0.0,71.75],[0.5,72.0]],"kind":"urban"},{"poly":[[1.5,96.0],[0.0,96.9],[0.0,95.25],[1.5,96.0]],"kind":"urban"},{"poly":[[76.5,126.0],[77.0,128.5],[53.5,126.0],[46.0,173.5],[40.0,172.5],[37.0,169.5],[27.0,168.5],[21.0,160.5],[13.0,158.5],[9.0,160.5],[0.0,158.86],[0.0,115.21],[76.5,126.0]],"kind":"urban"},{"poly":[[224.0,85.5],[201.0,79.5],[184.0,78.5],[140.0,69.5],[128.0,69.5],[0.0,41.87],[0.0,25.39],[3.28,0.0],[178.1,0.0],[166.0,69.5],[81.0,55.5],[75.5,56.0],[126.0,66.5],[247.0,85.5],[247.0,87.5],[224.0,85.5]],"kind":"urban"},{"poly":[[180.5,72.0],[193.5,0.0],[247.5,0.0],[247.5,29.0],[233.0,29.5],[229.0,28.5],[228.0,25.5],[198.0,23.5],[194.5,54.0],[208.0,56.5],[209.0,59.5],[247.0,61.5],[247.0,83.5],[180.5,72.0]],"kind":"urban"},{"poly":[[113.0,104.5],[85.5,105.0],[88.5,103.0],[93.0,76.5],[182.5,92.0],[181.0,95.5],[161.0,101.5],[140.0,106.5],[117.0,108.5],[116.0,111.5],[113.0,104.5]],"kind":"urban"},{"poly":[[215.0,128.5],[140.5,120.0],[179.0,108.5],[177.5,122.0],[193.0,124.5],[197.0,104.5],[235.0,99.5],[247.5,102.0],[247.0,133.5],[215.0,128.5]],"kind":"urban"},{"poly":[[170.5,247.0],[188.5,152.0],[175.0,147.5],[172.5,148.0],[155.0,245.5],[67.0,231.5],[82.5,134.0],[88.0,136.5],[90.0,134.5],[92.0,137.5],[94.5,133.0],[91.5,129.0],[97.5,123.0],[91.0,121.5],[91.5,124.0],[86.5,127.0],[86.5,130.0],[83.0,130.5],[83.5,127.0],[81.0,127.5],[80.5,125.0],[85.0,125.5],[87.5,123.0],[82.5,121.0],[84.0,117.5],[77.5,117.0],[83.0,114.5],[87.0,115.5],[91.0,120.5],[94.0,115.5],[100.0,117.5],[102.0,115.5],[116.0,115.5],[116.0,119.5],[113.0,117.5],[109.5,119.0],[110.5,123.0],[107.0,126.5],[102.5,125.0],[106.5,123.0],[108.5,118.0],[100.5,119.0],[101.5,123.0],[95.5,127.0],[95.5,135.0],[98.0,137.5],[107.0,133.5],[107.5,130.0],[111.0,128.5],[113.0,131.5],[120.0,131.5],[164.0,144.5],[246.0,158.5],[247.5,179.0],[244.5,179.0],[230.0,247.5],[170.5,247.0]],"kind":"urban"}],"roads":[{"poly":[[202.0,138.5],[192.0,136.5],[188.0,134.5],[185.0,130.5],[179.0,133.5],[170.5,135.0],[178.0,137.5],[182.0,142.5],[187.0,139.5],[193.0,138.5],[250.0,149.24],[250.0,158.83],[238.0,157.5],[193.0,148.5],[189.0,149.5],[187.5,152.0],[184.5,166.0],[180.5,194.0],[170.5,244.0],[174.0,249.5],[114.0,249.5],[111.0,247.5],[105.0,248.5],[98.0,245.5],[92.0,246.5],[73.0,243.5],[62.0,239.5],[57.5,233.0],[56.5,226.0],[59.5,219.0],[59.5,208.0],[61.5,203.0],[60.5,202.0],[64.5,185.0],[63.5,183.0],[65.5,178.0],[64.5,177.0],[71.5,141.0],[71.5,137.0],[67.5,134.0],[65.0,126.5],[57.5,170.0],[54.5,179.0],[55.5,182.0],[52.5,190.0],[53.5,194.0],[50.5,202.0],[51.5,206.0],[47.5,231.0],[43.0,249.5],[34.0,249.48],[38.5,220.0],[39.5,219.0],[39.5,213.0],[40.5,212.0],[39.5,209.0],[41.5,206.0],[41.5,203.0],[39.5,200.0],[41.5,199.0],[43.5,194.0],[41.5,188.0],[43.5,187.0],[45.5,182.0],[43.5,177.0],[45.5,176.0],[46.5,174.0],[45.5,173.0],[47.5,170.0],[51.5,141.0],[54.5,129.0],[53.0,123.5],[48.0,121.5],[34.0,120.5],[22.0,117.5],[14.0,117.5],[0.0,114.7],[0.0,94.5],[1.5,93.0],[2.5,86.0],[0.5,83.0],[0.5,71.0],[0.0,69.95],[0.0,66.62],[3.5,71.0],[3.5,76.0],[4.5,77.0],[3.5,81.0],[5.0,83.5],[8.5,85.0],[7.5,90.0],[5.5,93.0],[8.0,97.5],[15.0,99.5],[22.0,99.5],[29.0,101.5],[55.5,105.0],[57.5,104.0],[59.5,99.0],[59.5,94.0],[63.5,75.0],[62.0,71.5],[55.0,69.5],[32.0,66.5],[26.0,64.5],[19.0,65.5],[15.0,68.5],[15.5,66.0],[12.0,62.5],[3.0,61.5],[0.5,63.0],[0.0,64.5],[0.0,48.7],[2.0,49.5],[26.0,53.5],[28.0,56.5],[36.0,58.5],[39.0,61.5],[49.0Line truncated