@tileflow/maps 0.1.0-alpha.2 → 0.1.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (584) hide show
  1. package/README.md +302 -186
  2. package/REFERENCE.md +28 -0
  3. package/THIRD_PARTY_NOTICES.md +85 -110
  4. package/assets/README.md +52 -70
  5. package/assets/soundings/icons/soundings-boat-hoist.svg +10 -0
  6. package/assets/soundings/icons/soundings-boatyard.svg +6 -0
  7. package/assets/soundings/icons/soundings-buoy-cardinal.svg +1 -1
  8. package/assets/soundings/icons/soundings-buoy-pillar.svg +10 -0
  9. package/assets/soundings/icons/soundings-buoy-port.svg +1 -1
  10. package/assets/soundings/icons/soundings-buoy-starboard.svg +1 -1
  11. package/assets/soundings/icons/soundings-distance-mark.svg +9 -0
  12. package/assets/soundings/icons/soundings-facility.svg +6 -0
  13. package/assets/soundings/icons/soundings-fuel-station.svg +7 -0
  14. package/assets/soundings/icons/soundings-harbor.svg +1 -1
  15. package/assets/soundings/icons/soundings-light-flare.svg +1 -1
  16. package/assets/soundings/icons/soundings-lighthouse.svg +1 -1
  17. package/assets/soundings/icons/soundings-marina.svg +9 -0
  18. package/assets/soundings/icons/soundings-notice-information.svg +10 -0
  19. package/assets/soundings/icons/soundings-notice-prohibition.svg +9 -0
  20. package/assets/soundings/icons/soundings-notice-recommendation.svg +9 -0
  21. package/assets/soundings/icons/soundings-notice-regulation.svg +9 -0
  22. package/assets/soundings/icons/soundings-notice-restriction.svg +10 -0
  23. package/assets/soundings/icons/soundings-notice.svg +11 -0
  24. package/assets/soundings/icons/soundings-pump-out.svg +8 -0
  25. package/assets/soundings/icons/soundings-slipway.svg +6 -0
  26. package/assets/soundings/icons/soundings-visitor-berth.svg +10 -0
  27. package/assets/soundings/icons/soundings-water-tap.svg +10 -0
  28. package/assets/soundings/icons/soundings-wreck.svg +1 -1
  29. package/assets/soundings/icons/tileflow.icons.json +101 -0
  30. package/assets/streets/build-trees.mjs +447 -0
  31. package/assets/streets/climate/NOTICE.txt +9 -0
  32. package/assets/streets/climate/build.py +53 -0
  33. package/assets/streets/climate/koppen-geiger-1991-2020.tif +0 -0
  34. package/assets/streets/climate/recipe.json +16 -0
  35. package/assets/streets/fonts/DINish-Bold.ttf +0 -0
  36. package/assets/streets/fonts/DINish-Medium.ttf +0 -0
  37. package/assets/{cyberpunk/fonts/LICENSE.txt → streets/fonts/LICENSE-DINish.txt} +2 -2
  38. package/assets/{matrix/fonts/LICENSE.txt → streets/fonts/LICENSE-NotoSans.txt} +27 -26
  39. package/assets/streets/fonts/LICENSE.txt +193 -0
  40. package/assets/streets/fonts/NotoSans-Bold.ttf +0 -0
  41. package/assets/streets/fonts/NotoSans-Italic.ttf +0 -0
  42. package/assets/streets/fonts/NotoSans-Regular.ttf +0 -0
  43. package/assets/streets/fonts/README.md +18 -0
  44. package/assets/streets/icons/LICENSE-CC-BY-SA-3.0.txt +359 -0
  45. package/assets/streets/icons/LICENSE-CC-BY-SA-4.0.txt +428 -0
  46. package/assets/streets/icons/aerialway-dark.svg +11 -0
  47. package/assets/streets/icons/aerialway-monochrome-dark.svg +11 -0
  48. package/assets/streets/icons/aerialway-monochrome.svg +11 -0
  49. package/assets/streets/icons/aerialway.svg +11 -0
  50. package/assets/streets/icons/airport-dark.svg +11 -0
  51. package/assets/streets/icons/airport-monochrome-dark.svg +11 -0
  52. package/assets/streets/icons/airport-monochrome.svg +11 -0
  53. package/assets/streets/icons/airport.svg +11 -0
  54. package/assets/streets/icons/amusement-park-dark.svg +11 -0
  55. package/assets/streets/icons/amusement-park-monochrome-dark.svg +11 -0
  56. package/assets/streets/icons/amusement-park-monochrome.svg +11 -0
  57. package/assets/streets/icons/amusement-park.svg +11 -0
  58. package/assets/streets/icons/aquarium-dark.svg +11 -0
  59. package/assets/streets/icons/aquarium-monochrome-dark.svg +11 -0
  60. package/assets/streets/icons/aquarium-monochrome.svg +11 -0
  61. package/assets/streets/icons/aquarium.svg +11 -0
  62. package/assets/streets/icons/art-gallery-dark.svg +11 -0
  63. package/assets/streets/icons/art-gallery-monochrome-dark.svg +11 -0
  64. package/assets/streets/icons/art-gallery-monochrome.svg +11 -0
  65. package/assets/streets/icons/art-gallery.svg +11 -0
  66. package/assets/streets/icons/bank-dark.svg +11 -0
  67. package/assets/streets/icons/bank-monochrome-dark.svg +11 -0
  68. package/assets/streets/icons/bank-monochrome.svg +11 -0
  69. package/assets/streets/icons/bank.svg +11 -0
  70. package/assets/streets/icons/bar-dark.svg +11 -0
  71. package/assets/streets/icons/bar-monochrome-dark.svg +11 -0
  72. package/assets/streets/icons/bar-monochrome.svg +11 -0
  73. package/assets/streets/icons/bar.svg +11 -0
  74. package/assets/streets/icons/beach-dark.svg +11 -0
  75. package/assets/streets/icons/beach-monochrome-dark.svg +11 -0
  76. package/assets/streets/icons/beach-monochrome.svg +11 -0
  77. package/assets/streets/icons/beach.svg +11 -0
  78. package/assets/streets/icons/beauty-dark.svg +11 -0
  79. package/assets/streets/icons/beauty-monochrome-dark.svg +11 -0
  80. package/assets/streets/icons/beauty-monochrome.svg +11 -0
  81. package/assets/streets/icons/beauty.svg +11 -0
  82. package/assets/streets/icons/bookstore-dark.svg +11 -0
  83. package/assets/streets/icons/bookstore-monochrome-dark.svg +11 -0
  84. package/assets/streets/icons/bookstore-monochrome.svg +11 -0
  85. package/assets/streets/icons/bookstore.svg +11 -0
  86. package/assets/streets/icons/buddhist-dark.svg +11 -0
  87. package/assets/streets/icons/buddhist-monochrome-dark.svg +11 -0
  88. package/assets/streets/icons/buddhist-monochrome.svg +11 -0
  89. package/assets/streets/icons/buddhist.svg +11 -0
  90. package/assets/streets/icons/bus-dark.svg +11 -0
  91. package/assets/streets/icons/bus-monochrome-dark.svg +11 -0
  92. package/assets/streets/icons/bus-monochrome.svg +11 -0
  93. package/assets/streets/icons/bus.svg +11 -0
  94. package/assets/streets/icons/campsite-dark.svg +11 -0
  95. package/assets/streets/icons/campsite-monochrome-dark.svg +11 -0
  96. package/assets/streets/icons/campsite-monochrome.svg +11 -0
  97. package/assets/streets/icons/campsite.svg +11 -0
  98. package/assets/streets/icons/car-dark.svg +11 -0
  99. package/assets/streets/icons/car-monochrome-dark.svg +11 -0
  100. package/assets/streets/icons/car-monochrome.svg +11 -0
  101. package/assets/streets/icons/car-repair-dark.svg +11 -0
  102. package/assets/streets/icons/car-repair-monochrome-dark.svg +11 -0
  103. package/assets/streets/icons/car-repair-monochrome.svg +11 -0
  104. package/assets/streets/icons/car-repair.svg +11 -0
  105. package/assets/streets/icons/car.svg +11 -0
  106. package/assets/streets/icons/casino-dark.svg +11 -0
  107. package/assets/streets/icons/casino-monochrome-dark.svg +11 -0
  108. package/assets/streets/icons/casino-monochrome.svg +11 -0
  109. package/assets/streets/icons/casino.svg +11 -0
  110. package/assets/streets/icons/castle-dark.svg +11 -0
  111. package/assets/streets/icons/castle-monochrome-dark.svg +11 -0
  112. package/assets/streets/icons/castle-monochrome.svg +11 -0
  113. package/assets/streets/icons/castle.svg +11 -0
  114. package/assets/streets/icons/cemetery-dark.svg +11 -0
  115. package/assets/streets/icons/cemetery-monochrome-dark.svg +11 -0
  116. package/assets/streets/icons/cemetery-monochrome.svg +11 -0
  117. package/assets/streets/icons/cemetery.svg +11 -0
  118. package/assets/streets/icons/charging-station-dark.svg +11 -0
  119. package/assets/streets/icons/charging-station-monochrome-dark.svg +11 -0
  120. package/assets/streets/icons/charging-station-monochrome.svg +11 -0
  121. package/assets/streets/icons/charging-station.svg +11 -0
  122. package/assets/streets/icons/christian-dark.svg +11 -0
  123. package/assets/streets/icons/christian-monochrome-dark.svg +11 -0
  124. package/assets/streets/icons/christian-monochrome.svg +11 -0
  125. package/assets/streets/icons/christian.svg +11 -0
  126. package/assets/streets/icons/cinema-dark.svg +11 -0
  127. package/assets/streets/icons/cinema-monochrome-dark.svg +11 -0
  128. package/assets/streets/icons/cinema-monochrome.svg +11 -0
  129. package/assets/streets/icons/cinema.svg +11 -0
  130. package/assets/streets/icons/clothing-dark.svg +11 -0
  131. package/assets/streets/icons/clothing-monochrome-dark.svg +11 -0
  132. package/assets/streets/icons/clothing-monochrome.svg +11 -0
  133. package/assets/streets/icons/clothing.svg +11 -0
  134. package/assets/streets/icons/coffee-dark.svg +11 -0
  135. package/assets/streets/icons/coffee-monochrome-dark.svg +11 -0
  136. package/assets/streets/icons/coffee-monochrome.svg +11 -0
  137. package/assets/streets/icons/coffee.svg +4 -5
  138. package/assets/streets/icons/college-dark.svg +11 -0
  139. package/assets/streets/icons/college-monochrome-dark.svg +11 -0
  140. package/assets/streets/icons/college-monochrome.svg +11 -0
  141. package/assets/streets/icons/college.svg +11 -0
  142. package/assets/streets/icons/community-dark.svg +11 -0
  143. package/assets/streets/icons/community-monochrome-dark.svg +11 -0
  144. package/assets/streets/icons/community-monochrome.svg +11 -0
  145. package/assets/streets/icons/community.svg +11 -0
  146. package/assets/streets/icons/convenience-dark.svg +11 -0
  147. package/assets/streets/icons/convenience-monochrome-dark.svg +11 -0
  148. package/assets/streets/icons/convenience-monochrome.svg +11 -0
  149. package/assets/streets/icons/convenience.svg +11 -0
  150. package/assets/streets/icons/culture-dark.svg +11 -0
  151. package/assets/streets/icons/culture-monochrome-dark.svg +11 -0
  152. package/assets/streets/icons/culture-monochrome.svg +11 -0
  153. package/assets/streets/icons/culture.svg +4 -5
  154. package/assets/streets/icons/dentist-dark.svg +11 -0
  155. package/assets/streets/icons/dentist-monochrome-dark.svg +11 -0
  156. package/assets/streets/icons/dentist-monochrome.svg +11 -0
  157. package/assets/streets/icons/dentist.svg +11 -0
  158. package/assets/streets/icons/doctor-dark.svg +11 -0
  159. package/assets/streets/icons/doctor-monochrome-dark.svg +11 -0
  160. package/assets/streets/icons/doctor-monochrome.svg +11 -0
  161. package/assets/streets/icons/doctor.svg +11 -0
  162. package/assets/streets/icons/dog-park-dark.svg +11 -0
  163. package/assets/streets/icons/dog-park-monochrome-dark.svg +11 -0
  164. package/assets/streets/icons/dog-park-monochrome.svg +11 -0
  165. package/assets/streets/icons/dog-park.svg +11 -0
  166. package/assets/streets/icons/drinking-water-dark.svg +11 -0
  167. package/assets/streets/icons/drinking-water-monochrome-dark.svg +11 -0
  168. package/assets/streets/icons/drinking-water-monochrome.svg +11 -0
  169. package/assets/streets/icons/drinking-water.svg +11 -0
  170. package/assets/streets/icons/education-dark.svg +11 -0
  171. package/assets/streets/icons/education-monochrome-dark.svg +11 -0
  172. package/assets/streets/icons/education-monochrome.svg +11 -0
  173. package/assets/streets/icons/education.svg +5 -6
  174. package/assets/streets/icons/electronics-dark.svg +11 -0
  175. package/assets/streets/icons/electronics-monochrome-dark.svg +11 -0
  176. package/assets/streets/icons/electronics-monochrome.svg +11 -0
  177. package/assets/streets/icons/electronics.svg +11 -0
  178. package/assets/streets/icons/embassy-dark.svg +11 -0
  179. package/assets/streets/icons/embassy-monochrome-dark.svg +11 -0
  180. package/assets/streets/icons/embassy-monochrome.svg +11 -0
  181. package/assets/streets/icons/embassy.svg +11 -0
  182. package/assets/streets/icons/entertainment-dark.svg +11 -0
  183. package/assets/streets/icons/entertainment-monochrome-dark.svg +11 -0
  184. package/assets/streets/icons/entertainment-monochrome.svg +11 -0
  185. package/assets/streets/icons/entertainment.svg +11 -0
  186. package/assets/streets/icons/fast-food-dark.svg +11 -0
  187. package/assets/streets/icons/fast-food-monochrome-dark.svg +11 -0
  188. package/assets/streets/icons/fast-food-monochrome.svg +11 -0
  189. package/assets/streets/icons/fast-food.svg +11 -0
  190. package/assets/streets/icons/ferry-dark.svg +11 -0
  191. package/assets/streets/icons/ferry-monochrome-dark.svg +11 -0
  192. package/assets/streets/icons/ferry-monochrome.svg +11 -0
  193. package/assets/streets/icons/ferry.svg +11 -0
  194. package/assets/streets/icons/fire-station-dark.svg +11 -0
  195. package/assets/streets/icons/fire-station-monochrome-dark.svg +11 -0
  196. package/assets/streets/icons/fire-station-monochrome.svg +11 -0
  197. package/assets/streets/icons/fire-station.svg +11 -0
  198. package/assets/streets/icons/fitness-dark.svg +11 -0
  199. package/assets/streets/icons/fitness-monochrome-dark.svg +11 -0
  200. package/assets/streets/icons/fitness-monochrome.svg +11 -0
  201. package/assets/streets/icons/fitness.svg +11 -0
  202. package/assets/streets/icons/florist-dark.svg +11 -0
  203. package/assets/streets/icons/florist-monochrome-dark.svg +11 -0
  204. package/assets/streets/icons/florist-monochrome.svg +11 -0
  205. package/assets/streets/icons/florist.svg +11 -0
  206. package/assets/streets/icons/food-dark.svg +11 -0
  207. package/assets/streets/icons/food-monochrome-dark.svg +11 -0
  208. package/assets/streets/icons/food-monochrome.svg +11 -0
  209. package/assets/streets/icons/food.svg +4 -5
  210. package/assets/streets/icons/fuel-dark.svg +11 -0
  211. package/assets/streets/icons/fuel-monochrome-dark.svg +11 -0
  212. package/assets/streets/icons/fuel-monochrome.svg +11 -0
  213. package/assets/streets/icons/fuel.svg +11 -0
  214. package/assets/streets/icons/garden-dark.svg +11 -0
  215. package/assets/streets/icons/garden-monochrome-dark.svg +11 -0
  216. package/assets/streets/icons/garden-monochrome.svg +11 -0
  217. package/assets/streets/icons/garden.svg +11 -0
  218. package/assets/streets/icons/golf-dark.svg +11 -0
  219. package/assets/streets/icons/golf-monochrome-dark.svg +11 -0
  220. package/assets/streets/icons/golf-monochrome.svg +11 -0
  221. package/assets/streets/icons/golf.svg +11 -0
  222. package/assets/streets/icons/grocery-dark.svg +11 -0
  223. package/assets/streets/icons/grocery-monochrome-dark.svg +11 -0
  224. package/assets/streets/icons/grocery-monochrome.svg +11 -0
  225. package/assets/streets/icons/grocery.svg +11 -0
  226. package/assets/streets/icons/harbor-dark.svg +11 -0
  227. package/assets/streets/icons/harbor-monochrome-dark.svg +11 -0
  228. package/assets/streets/icons/harbor-monochrome.svg +11 -0
  229. package/assets/streets/icons/harbor.svg +11 -0
  230. package/assets/streets/icons/hardware-dark.svg +11 -0
  231. package/assets/streets/icons/hardware-monochrome-dark.svg +11 -0
  232. package/assets/streets/icons/hardware-monochrome.svg +11 -0
  233. package/assets/streets/icons/hardware.svg +11 -0
  234. package/assets/streets/icons/health-dark.svg +11 -0
  235. package/assets/streets/icons/health-monochrome-dark.svg +11 -0
  236. package/assets/streets/icons/health-monochrome.svg +11 -0
  237. package/assets/streets/icons/health.svg +4 -5
  238. package/assets/streets/icons/historic-dark.svg +11 -0
  239. package/assets/streets/icons/historic-monochrome-dark.svg +11 -0
  240. package/assets/streets/icons/historic-monochrome.svg +11 -0
  241. package/assets/streets/icons/historic.svg +11 -0
  242. package/assets/streets/icons/jewish-dark.svg +11 -0
  243. package/assets/streets/icons/jewish-monochrome-dark.svg +11 -0
  244. package/assets/streets/icons/jewish-monochrome.svg +11 -0
  245. package/assets/streets/icons/jewish.svg +11 -0
  246. package/assets/streets/icons/landmark-dark.svg +11 -0
  247. package/assets/streets/icons/landmark-monochrome-dark.svg +11 -0
  248. package/assets/streets/icons/landmark-monochrome.svg +11 -0
  249. package/assets/streets/icons/landmark.svg +11 -0
  250. package/assets/streets/icons/laundry-dark.svg +11 -0
  251. package/assets/streets/icons/laundry-monochrome-dark.svg +11 -0
  252. package/assets/streets/icons/laundry-monochrome.svg +11 -0
  253. package/assets/streets/icons/laundry.svg +11 -0
  254. package/assets/streets/icons/library-dark.svg +11 -0
  255. package/assets/streets/icons/library-monochrome-dark.svg +11 -0
  256. package/assets/streets/icons/library-monochrome.svg +11 -0
  257. package/assets/streets/icons/library.svg +11 -0
  258. package/assets/streets/icons/lodging-dark.svg +11 -0
  259. package/assets/streets/icons/lodging-monochrome-dark.svg +11 -0
  260. package/assets/streets/icons/lodging-monochrome.svg +11 -0
  261. package/assets/streets/icons/lodging.svg +3 -4
  262. package/assets/streets/icons/major-transit-dark.svg +11 -0
  263. package/assets/streets/icons/major-transit-monochrome-dark.svg +11 -0
  264. package/assets/streets/icons/major-transit-monochrome.svg +11 -0
  265. package/assets/streets/icons/major-transit.svg +4 -5
  266. package/assets/streets/icons/monument-dark.svg +11 -0
  267. package/assets/streets/icons/monument-monochrome-dark.svg +11 -0
  268. package/assets/streets/icons/monument-monochrome.svg +11 -0
  269. package/assets/streets/icons/monument.svg +11 -0
  270. package/assets/streets/icons/mountain-dark.svg +11 -0
  271. package/assets/streets/icons/mountain-monochrome-dark.svg +11 -0
  272. package/assets/streets/icons/mountain-monochrome.svg +11 -0
  273. package/assets/streets/icons/mountain.svg +11 -0
  274. package/assets/streets/icons/music-dark.svg +11 -0
  275. package/assets/streets/icons/music-monochrome-dark.svg +11 -0
  276. package/assets/streets/icons/music-monochrome.svg +11 -0
  277. package/assets/streets/icons/music.svg +11 -0
  278. package/assets/streets/icons/muslim-dark.svg +11 -0
  279. package/assets/streets/icons/muslim-monochrome-dark.svg +11 -0
  280. package/assets/streets/icons/muslim-monochrome.svg +11 -0
  281. package/assets/streets/icons/muslim.svg +11 -0
  282. package/assets/streets/icons/natural-dark.svg +11 -0
  283. package/assets/streets/icons/natural-monochrome-dark.svg +11 -0
  284. package/assets/streets/icons/natural-monochrome.svg +11 -0
  285. package/assets/streets/icons/natural.svg +11 -0
  286. package/assets/streets/icons/nature-dark.svg +11 -0
  287. package/assets/streets/icons/nature-monochrome-dark.svg +11 -0
  288. package/assets/streets/icons/nature-monochrome.svg +11 -0
  289. package/assets/streets/icons/nature.svg +11 -0
  290. package/assets/streets/icons/nightclub-dark.svg +11 -0
  291. package/assets/streets/icons/nightclub-monochrome-dark.svg +11 -0
  292. package/assets/streets/icons/nightclub-monochrome.svg +11 -0
  293. package/assets/streets/icons/nightclub.svg +11 -0
  294. package/assets/streets/icons/oneway.svg +1 -8
  295. package/assets/streets/icons/parking-dark.svg +11 -0
  296. package/assets/streets/icons/parking-garage-dark.svg +11 -0
  297. package/assets/streets/icons/parking-garage-monochrome-dark.svg +11 -0
  298. package/assets/streets/icons/parking-garage-monochrome.svg +11 -0
  299. package/assets/streets/icons/parking-garage.svg +11 -0
  300. package/assets/streets/icons/parking-monochrome-dark.svg +11 -0
  301. package/assets/streets/icons/parking-monochrome.svg +11 -0
  302. package/assets/streets/icons/parking.svg +3 -4
  303. package/assets/streets/icons/pharmacy-dark.svg +11 -0
  304. package/assets/streets/icons/pharmacy-monochrome-dark.svg +11 -0
  305. package/assets/streets/icons/pharmacy-monochrome.svg +11 -0
  306. package/assets/streets/icons/pharmacy.svg +11 -0
  307. package/assets/streets/icons/playground-dark.svg +11 -0
  308. package/assets/streets/icons/playground-monochrome-dark.svg +11 -0
  309. package/assets/streets/icons/playground-monochrome.svg +11 -0
  310. package/assets/streets/icons/playground.svg +11 -0
  311. package/assets/streets/icons/plaza-dark.svg +11 -0
  312. package/assets/streets/icons/plaza-monochrome-dark.svg +11 -0
  313. package/assets/streets/icons/plaza-monochrome.svg +11 -0
  314. package/assets/streets/icons/plaza.svg +11 -0
  315. package/assets/streets/icons/police-dark.svg +11 -0
  316. package/assets/streets/icons/police-monochrome-dark.svg +11 -0
  317. package/assets/streets/icons/police-monochrome.svg +11 -0
  318. package/assets/streets/icons/police.svg +11 -0
  319. package/assets/streets/icons/post-dark.svg +11 -0
  320. package/assets/streets/icons/post-monochrome-dark.svg +11 -0
  321. package/assets/streets/icons/post-monochrome.svg +11 -0
  322. package/assets/streets/icons/post.svg +11 -0
  323. package/assets/streets/icons/prison-dark.svg +11 -0
  324. package/assets/streets/icons/prison-monochrome-dark.svg +11 -0
  325. package/assets/streets/icons/prison-monochrome.svg +11 -0
  326. package/assets/streets/icons/prison.svg +11 -0
  327. package/assets/streets/icons/rail-dark.svg +11 -0
  328. package/assets/streets/icons/rail-light-dark.svg +11 -0
  329. package/assets/streets/icons/rail-light-monochrome-dark.svg +11 -0
  330. package/assets/streets/icons/rail-light-monochrome.svg +11 -0
  331. package/assets/streets/icons/rail-light.svg +11 -0
  332. package/assets/streets/icons/rail-monochrome-dark.svg +11 -0
  333. package/assets/streets/icons/rail-monochrome.svg +11 -0
  334. package/assets/streets/icons/rail.svg +11 -0
  335. package/assets/streets/icons/services-dark.svg +11 -0
  336. package/assets/streets/icons/services-monochrome-dark.svg +11 -0
  337. package/assets/streets/icons/services-monochrome.svg +11 -0
  338. package/assets/streets/icons/services.svg +4 -5
  339. package/assets/streets/icons/shopping-dark.svg +11 -0
  340. package/assets/streets/icons/shopping-monochrome-dark.svg +11 -0
  341. package/assets/streets/icons/shopping-monochrome.svg +11 -0
  342. package/assets/streets/icons/shopping.svg +4 -5
  343. package/assets/streets/icons/sidewalk-dot-dark.svg +1 -1
  344. package/assets/streets/icons/sidewalk-dot.svg +1 -1
  345. package/assets/streets/icons/sport-dark.svg +11 -0
  346. package/assets/streets/icons/sport-monochrome-dark.svg +11 -0
  347. package/assets/streets/icons/sport-monochrome.svg +11 -0
  348. package/assets/streets/icons/sport.svg +11 -0
  349. package/assets/streets/icons/stadium-dark.svg +11 -0
  350. package/assets/streets/icons/stadium-monochrome-dark.svg +11 -0
  351. package/assets/streets/icons/stadium-monochrome.svg +11 -0
  352. package/assets/streets/icons/stadium.svg +11 -0
  353. package/assets/streets/icons/street-art-dark.svg +11 -0
  354. package/assets/streets/icons/street-art-monochrome-dark.svg +11 -0
  355. package/assets/streets/icons/street-art-monochrome.svg +11 -0
  356. package/assets/streets/icons/street-art.svg +11 -0
  357. package/assets/streets/icons/streets-tree-columnar-dark.pattern.svg +203 -0
  358. package/assets/streets/icons/streets-tree-columnar.pattern.svg +203 -0
  359. package/assets/streets/icons/streets-tree-conifer-dark.pattern.svg +263 -0
  360. package/assets/streets/icons/streets-tree-conifer.pattern.svg +263 -0
  361. package/assets/streets/icons/streets-tree-open-dark.pattern.svg +173 -0
  362. package/assets/streets/icons/streets-tree-open.pattern.svg +173 -0
  363. package/assets/streets/icons/streets-tree-palm-fan-dark.pattern.svg +108 -0
  364. package/assets/streets/icons/streets-tree-palm-fan.pattern.svg +108 -0
  365. package/assets/streets/icons/streets-tree-palm-feather-dark.pattern.svg +305 -0
  366. package/assets/streets/icons/streets-tree-palm-feather.pattern.svg +305 -0
  367. package/assets/streets/icons/streets-tree-round-dark.pattern.svg +163 -0
  368. package/assets/streets/icons/streets-tree-round.pattern.svg +163 -0
  369. package/assets/streets/icons/streets-tree-tall-dark.pattern.svg +169 -0
  370. package/assets/streets/icons/streets-tree-tall.pattern.svg +169 -0
  371. package/assets/streets/icons/swimming-dark.svg +11 -0
  372. package/assets/streets/icons/swimming-monochrome-dark.svg +11 -0
  373. package/assets/streets/icons/swimming-monochrome.svg +11 -0
  374. package/assets/streets/icons/swimming.svg +11 -0
  375. package/assets/streets/icons/theatre-dark.svg +11 -0
  376. package/assets/streets/icons/theatre-monochrome-dark.svg +11 -0
  377. package/assets/streets/icons/theatre-monochrome.svg +11 -0
  378. package/assets/streets/icons/theatre.svg +11 -0
  379. package/assets/streets/icons/tileflow.icons.json +27 -0
  380. package/assets/streets/icons/toilet-dark.svg +11 -0
  381. package/assets/streets/icons/toilet-monochrome-dark.svg +11 -0
  382. package/assets/streets/icons/toilet-monochrome.svg +11 -0
  383. package/assets/streets/icons/toilet.svg +11 -0
  384. package/assets/streets/icons/town-hall-dark.svg +11 -0
  385. package/assets/streets/icons/town-hall-monochrome-dark.svg +11 -0
  386. package/assets/streets/icons/town-hall-monochrome.svg +11 -0
  387. package/assets/streets/icons/town-hall.svg +11 -0
  388. package/assets/streets/icons/transit-madrid-cercanias.svg +8 -0
  389. package/assets/streets/icons/transit-madrid-emt.svg +16 -0
  390. package/assets/streets/icons/transit-madrid-metro.svg +11 -0
  391. package/assets/streets/icons/unified-day-aerialway.svg +11 -0
  392. package/assets/streets/icons/unified-day-airport.svg +11 -0
  393. package/assets/streets/icons/unified-day-bank.svg +11 -0
  394. package/assets/streets/icons/unified-day-bar.svg +11 -0
  395. package/assets/streets/icons/unified-day-beach.svg +11 -0
  396. package/assets/streets/icons/unified-day-beauty.svg +11 -0
  397. package/assets/streets/icons/unified-day-bookstore.svg +11 -0
  398. package/assets/streets/icons/unified-day-buddhist.svg +11 -0
  399. package/assets/streets/icons/unified-day-bus.svg +11 -0
  400. package/assets/streets/icons/unified-day-campsite.svg +11 -0
  401. package/assets/streets/icons/unified-day-car-repair.svg +11 -0
  402. package/assets/streets/icons/unified-day-car.svg +11 -0
  403. package/assets/streets/icons/unified-day-charging-station.svg +11 -0
  404. package/assets/streets/icons/unified-day-christian.svg +11 -0
  405. package/assets/streets/icons/unified-day-clothing.svg +11 -0
  406. package/assets/streets/icons/unified-day-coffee.svg +11 -0
  407. package/assets/streets/icons/unified-day-college.svg +11 -0
  408. package/assets/streets/icons/unified-day-community.svg +11 -0
  409. package/assets/streets/icons/unified-day-convenience.svg +11 -0
  410. package/assets/streets/icons/unified-day-dentist.svg +11 -0
  411. package/assets/streets/icons/unified-day-doctor.svg +11 -0
  412. package/assets/streets/icons/unified-day-dog-park.svg +11 -0
  413. package/assets/streets/icons/unified-day-drinking-water.svg +11 -0
  414. package/assets/streets/icons/unified-day-education.svg +11 -0
  415. package/assets/streets/icons/unified-day-electronics.svg +11 -0
  416. package/assets/streets/icons/unified-day-embassy.svg +11 -0
  417. package/assets/streets/icons/unified-day-fast-food.svg +11 -0
  418. package/assets/streets/icons/unified-day-ferry.svg +11 -0
  419. package/assets/streets/icons/unified-day-fire-station.svg +11 -0
  420. package/assets/streets/icons/unified-day-fitness.svg +11 -0
  421. package/assets/streets/icons/unified-day-florist.svg +11 -0
  422. package/assets/streets/icons/unified-day-food.svg +11 -0
  423. package/assets/streets/icons/unified-day-fuel.svg +11 -0
  424. package/assets/streets/icons/unified-day-garden.svg +11 -0
  425. package/assets/streets/icons/unified-day-golf.svg +11 -0
  426. package/assets/streets/icons/unified-day-grocery.svg +11 -0
  427. package/assets/streets/icons/unified-day-harbor.svg +11 -0
  428. package/assets/streets/icons/unified-day-hardware.svg +11 -0
  429. package/assets/streets/icons/unified-day-health.svg +11 -0
  430. package/assets/streets/icons/unified-day-jewish.svg +11 -0
  431. package/assets/streets/icons/unified-day-laundry.svg +11 -0
  432. package/assets/streets/icons/unified-day-library.svg +11 -0
  433. package/assets/streets/icons/unified-day-lodging.svg +11 -0
  434. package/assets/streets/icons/unified-day-major-transit.svg +11 -0
  435. package/assets/streets/icons/unified-day-mountain.svg +11 -0
  436. package/assets/streets/icons/unified-day-muslim.svg +11 -0
  437. package/assets/streets/icons/unified-day-natural.svg +11 -0
  438. package/assets/streets/icons/unified-day-nature.svg +11 -0
  439. package/assets/streets/icons/unified-day-parking-garage.svg +11 -0
  440. package/assets/streets/icons/unified-day-parking.svg +11 -0
  441. package/assets/streets/icons/unified-day-pharmacy.svg +11 -0
  442. package/assets/streets/icons/unified-day-playground.svg +11 -0
  443. package/assets/streets/icons/unified-day-plaza.svg +11 -0
  444. package/assets/streets/icons/unified-day-police.svg +11 -0
  445. package/assets/streets/icons/unified-day-post.svg +11 -0
  446. package/assets/streets/icons/unified-day-prison.svg +11 -0
  447. package/assets/streets/icons/unified-day-rail-light.svg +11 -0
  448. package/assets/streets/icons/unified-day-rail.svg +11 -0
  449. package/assets/streets/icons/unified-day-services.svg +11 -0
  450. package/assets/streets/icons/unified-day-shopping.svg +11 -0
  451. package/assets/streets/icons/unified-day-sport.svg +11 -0
  452. package/assets/streets/icons/unified-day-stadium.svg +11 -0
  453. package/assets/streets/icons/unified-day-swimming.svg +11 -0
  454. package/assets/streets/icons/unified-day-toilet.svg +11 -0
  455. package/assets/streets/icons/unified-day-town-hall.svg +11 -0
  456. package/assets/streets/icons/unified-day-waterfall.svg +11 -0
  457. package/assets/streets/icons/unified-day-worship.svg +11 -0
  458. package/assets/streets/icons/viewpoint-dark.svg +11 -0
  459. package/assets/streets/icons/viewpoint-monochrome-dark.svg +11 -0
  460. package/assets/streets/icons/viewpoint-monochrome.svg +11 -0
  461. package/assets/streets/icons/viewpoint.svg +11 -0
  462. package/assets/streets/icons/waterfall-dark.svg +11 -0
  463. package/assets/streets/icons/waterfall-monochrome-dark.svg +11 -0
  464. package/assets/streets/icons/waterfall-monochrome.svg +11 -0
  465. package/assets/streets/icons/waterfall.svg +11 -0
  466. package/assets/streets/icons/worship-dark.svg +11 -0
  467. package/assets/streets/icons/worship-monochrome-dark.svg +11 -0
  468. package/assets/streets/icons/worship-monochrome.svg +11 -0
  469. package/assets/streets/icons/worship.svg +11 -0
  470. package/assets/streets/icons/zoo-dark.svg +11 -0
  471. package/assets/streets/icons/zoo-monochrome-dark.svg +11 -0
  472. package/assets/streets/icons/zoo-monochrome.svg +11 -0
  473. package/assets/streets/icons/zoo.svg +11 -0
  474. package/assets/streets/models/streets-tree-columnar.far.glb +0 -0
  475. package/assets/streets/models/streets-tree-columnar.glb +0 -0
  476. package/assets/streets/models/streets-tree-conifer.far.glb +0 -0
  477. package/assets/streets/models/streets-tree-conifer.glb +0 -0
  478. package/assets/streets/models/streets-tree-open.far.glb +0 -0
  479. package/assets/streets/models/streets-tree-open.glb +0 -0
  480. package/assets/streets/models/streets-tree-palm-fan.far.glb +0 -0
  481. package/assets/streets/models/streets-tree-palm-fan.glb +0 -0
  482. package/assets/streets/models/streets-tree-palm-feather.far.glb +0 -0
  483. package/assets/streets/models/streets-tree-palm-feather.glb +0 -0
  484. package/assets/streets/models/streets-tree-round.far.glb +0 -0
  485. package/assets/streets/models/streets-tree-round.glb +0 -0
  486. package/assets/streets/models/streets-tree-tall.far.glb +0 -0
  487. package/assets/streets/models/streets-tree-tall.glb +0 -0
  488. package/assets/terrain/icons/terrain-peak-dark.svg +5 -0
  489. package/assets/terrain/icons/terrain-peak.svg +5 -0
  490. package/dist/index.d.ts +840 -814
  491. package/dist/index.js +8160 -15808
  492. package/package.json +8 -15
  493. package/assets/baedeker/README.md +0 -31
  494. package/assets/baedeker/fonts/CormorantGaramond-Italic.ttf +0 -0
  495. package/assets/baedeker/fonts/CormorantGaramond-Regular.ttf +0 -0
  496. package/assets/baedeker/fonts/CormorantGaramond-SemiBold.ttf +0 -0
  497. package/assets/baedeker/fonts/LICENSE.txt +0 -93
  498. package/assets/baedeker/icons/baedeker-hachures.pattern.svg +0 -14
  499. package/assets/baedeker/icons/baedeker-orchard.pattern.svg +0 -36
  500. package/assets/baedeker/icons/baedeker-paper-grain.pattern.svg +0 -20
  501. package/assets/baedeker/icons/baedeker-park-stipple.pattern.svg +0 -36
  502. package/assets/baedeker/icons/baedeker-residential.pattern.svg +0 -5
  503. package/assets/baedeker/icons/baedeker-sand.pattern.svg +0 -21
  504. package/assets/baedeker/icons/baedeker-water-lines.pattern.svg +0 -9
  505. package/assets/baedeker/icons/baedeker-wetland.pattern.svg +0 -8
  506. package/assets/cyberpunk/fonts/Oxanium-Medium.ttf +0 -0
  507. package/assets/cyberpunk/fonts/Oxanium-SemiBold.ttf +0 -0
  508. package/assets/cyberpunk/fonts/README.md +0 -22
  509. package/assets/cyberpunk/icons/cyber-circuit.pattern.svg +0 -10
  510. package/assets/cyberpunk/icons/cyber-data-grid.pattern.svg +0 -11
  511. package/assets/cyberpunk/icons/cyber-target-brackets.svg +0 -15
  512. package/assets/ferraris/icons/ferraris-crop-hatch.pattern.svg +0 -10
  513. package/assets/ferraris/icons/ferraris-heath.pattern.svg +0 -10
  514. package/assets/ferraris/icons/ferraris-orchard.pattern.svg +0 -20
  515. package/assets/ferraris/icons/ferraris-paper-grain.pattern.svg +0 -20
  516. package/assets/ferraris/icons/ferraris-residential.pattern.svg +0 -13
  517. package/assets/ferraris/icons/ferraris-sand.pattern.svg +0 -15
  518. package/assets/ferraris/icons/ferraris-water-ripples.pattern.svg +0 -12
  519. package/assets/ferraris/icons/ferraris-wetland.pattern.svg +0 -9
  520. package/assets/ferraris/icons/ferraris-woodland.pattern.svg +0 -21
  521. package/assets/harad/README.md +0 -31
  522. package/assets/harad/icons/harad-arable.pattern.svg +0 -10
  523. package/assets/harad/icons/harad-conifer.pattern.svg +0 -22
  524. package/assets/harad/icons/harad-deciduous.pattern.svg +0 -16
  525. package/assets/harad/icons/harad-orchard.pattern.svg +0 -17
  526. package/assets/harad/icons/harad-paper-grain.pattern.svg +0 -20
  527. package/assets/harad/icons/harad-sand.pattern.svg +0 -21
  528. package/assets/harad/icons/harad-settlement.pattern.svg +0 -12
  529. package/assets/harad/icons/harad-water-lines.pattern.svg +0 -7
  530. package/assets/harad/icons/harad-wetland.pattern.svg +0 -14
  531. package/assets/matrix/fonts/Oxanium-Medium.ttf +0 -0
  532. package/assets/matrix/fonts/Oxanium-SemiBold.ttf +0 -0
  533. package/assets/matrix/fonts/README.md +0 -22
  534. package/assets/matrix/icons/matrix-crt-scanlines.pattern.svg +0 -13
  535. package/assets/matrix/icons/matrix-data-grid.pattern.svg +0 -11
  536. package/assets/matrix/icons/matrix-poi-node.svg +0 -10
  537. package/assets/san-francisto/icons/san-francisto-blueprint-grid.pattern.svg +0 -6
  538. package/assets/san-francisto/icons/san-francisto-building-hatch.pattern.svg +0 -4
  539. package/assets/san-francisto/icons/san-francisto-landscape-hatch.pattern.svg +0 -4
  540. package/assets/san-francisto/icons/san-francisto-poi-node.svg +0 -8
  541. package/assets/san-francisto/icons/san-francisto-water-hatch.pattern.svg +0 -4
  542. package/assets/siegfried/README.md +0 -38
  543. package/assets/siegfried/fonts/CormorantGaramond-Italic.ttf +0 -0
  544. package/assets/siegfried/fonts/CormorantGaramond-Regular.ttf +0 -0
  545. package/assets/siegfried/fonts/CormorantGaramond-SemiBold.ttf +0 -0
  546. package/assets/siegfried/fonts/LICENSE.txt +0 -93
  547. package/assets/siegfried/icons/siegfried-dark-forest.pattern.svg +0 -63
  548. package/assets/siegfried/icons/siegfried-dark-glacier.pattern.svg +0 -24
  549. package/assets/siegfried/icons/siegfried-dark-gravel.pattern.svg +0 -45
  550. package/assets/siegfried/icons/siegfried-dark-orchard.pattern.svg +0 -49
  551. package/assets/siegfried/icons/siegfried-dark-paper-grain.pattern.svg +0 -15
  552. package/assets/siegfried/icons/siegfried-dark-rock.pattern.svg +0 -19
  553. package/assets/siegfried/icons/siegfried-dark-scree.pattern.svg +0 -31
  554. package/assets/siegfried/icons/siegfried-dark-water-lines.pattern.svg +0 -10
  555. package/assets/siegfried/icons/siegfried-dark-wetland.pattern.svg +0 -24
  556. package/assets/siegfried/icons/siegfried-forest.pattern.svg +0 -63
  557. package/assets/siegfried/icons/siegfried-glacier.pattern.svg +0 -24
  558. package/assets/siegfried/icons/siegfried-gravel.pattern.svg +0 -45
  559. package/assets/siegfried/icons/siegfried-orchard.pattern.svg +0 -49
  560. package/assets/siegfried/icons/siegfried-paper-grain.pattern.svg +0 -15
  561. package/assets/siegfried/icons/siegfried-rock.pattern.svg +0 -19
  562. package/assets/siegfried/icons/siegfried-scree.pattern.svg +0 -31
  563. package/assets/siegfried/icons/siegfried-water-lines.pattern.svg +0 -10
  564. package/assets/siegfried/icons/siegfried-wetland.pattern.svg +0 -24
  565. package/assets/verdant/icons/coffee.svg +0 -9
  566. package/assets/verdant/icons/crosswalk.svg +0 -10
  567. package/assets/verdant/icons/culture.svg +0 -7
  568. package/assets/verdant/icons/education.svg +0 -6
  569. package/assets/verdant/icons/food.svg +0 -6
  570. package/assets/verdant/icons/health.svg +0 -6
  571. package/assets/verdant/icons/lodging.svg +0 -6
  572. package/assets/verdant/icons/major-transit.svg +0 -7
  573. package/assets/verdant/icons/services.svg +0 -6
  574. package/assets/verdant/icons/shopping.svg +0 -6
  575. package/assets/verdant/icons/verdant-field-hatch.pattern.svg +0 -13
  576. package/assets/verdant/icons/verdant-forest-canopy.pattern.svg +0 -14
  577. package/assets/verdant/icons/verdant-heath-tufts.pattern.svg +0 -9
  578. package/assets/verdant/icons/verdant-meadow-tufts.pattern.svg +0 -8
  579. package/assets/verdant/icons/verdant-orchard.pattern.svg +0 -11
  580. package/assets/verdant/icons/verdant-paper-fiber.pattern.svg +0 -11
  581. package/assets/verdant/icons/verdant-residential-hatch.pattern.svg +0 -8
  582. package/assets/verdant/icons/verdant-scree.pattern.svg +0 -10
  583. package/assets/verdant/icons/verdant-water-lines.pattern.svg +0 -7
  584. package/assets/verdant/icons/verdant-wetland-reeds.pattern.svg +0 -8
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
+ <title>Slipway</title>
3
+ <desc>Original Tileflow slipway pictogram: a ramp running into the water.</desc>
4
+ <path d="M3.6 21.6 26.4 7.2v14.4H3.6Z" fill="#000000"/>
5
+ <path fill="none" stroke="#000000" stroke-linecap="round" stroke-width="2" d="M3 26.6c2.2-1.2 4.4-1.2 6.6 0s4.4 1.2 6.6 0 4.4-1.2 6.6 0 4.4 1.2 6.2.1"/>
6
+ </svg>
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
+ <title>Visitor berth</title>
3
+ <desc>Original Tileflow mooring bollard pictogram for visitor berths and moorings.</desc>
4
+ <g fill="#000000">
5
+ <rect x="7.6" y="5" width="16.8" height="5" rx="2.5"/>
6
+ <rect x="12.4" y="9.4" width="7.2" height="6"/>
7
+ <path d="M10.2 15h11.6l2 11.4H8.2L10.2 15Z"/>
8
+ <rect x="5" y="25.6" width="22" height="2.6" rx="1.3"/>
9
+ </g>
10
+ </svg>
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
+ <title>Water tap</title>
3
+ <desc>Original Tileflow drinking water tap pictogram.</desc>
4
+ <g fill="#000000">
5
+ <rect x="10.4" y="3.6" width="11.2" height="2.6" rx="1.3"/>
6
+ <rect x="14.8" y="5.6" width="2.4" height="4.4"/>
7
+ <path d="M4.8 9.4h14.6a6.4 6.4 0 0 1 6.4 6.4v2.4h-5v-2.2a1.2 1.2 0 0 0-1.2-1.2H4.8V9.4Z"/>
8
+ <path d="M23.3 20.6c1.7 2.5 2.6 4.1 2.6 5.2a2.6 2.6 0 0 1-5.2 0c0-1.1.9-2.7 2.6-5.2Z"/>
9
+ </g>
10
+ </svg>
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="-16 -16 64 64">
2
2
  <title>Wreck</title>
3
3
  <desc>Original Tileflow broken-hull wreck pictogram.</desc>
4
4
  <path d="M6.2 18.2h7.3l2.5 3.2 2.5-3.2h7.3l-3.4 8.3H9.6l-3.4-8.3Z" fill="#000000"/>
@@ -0,0 +1,101 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "icons": {
4
+ "soundings-boat-hoist": {
5
+ "representation": "sdf",
6
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
7
+ },
8
+ "soundings-boatyard": {
9
+ "representation": "sdf",
10
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
11
+ },
12
+ "soundings-buoy-cardinal": {
13
+ "representation": "sdf",
14
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
15
+ },
16
+ "soundings-buoy-pillar": {
17
+ "representation": "sdf",
18
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
19
+ },
20
+ "soundings-buoy-port": {
21
+ "representation": "sdf",
22
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
23
+ },
24
+ "soundings-buoy-starboard": {
25
+ "representation": "sdf",
26
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
27
+ },
28
+ "soundings-distance-mark": {
29
+ "representation": "sdf",
30
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
31
+ },
32
+ "soundings-facility": {
33
+ "representation": "sdf",
34
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
35
+ },
36
+ "soundings-fuel-station": {
37
+ "representation": "sdf",
38
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
39
+ },
40
+ "soundings-harbor": {
41
+ "representation": "sdf",
42
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
43
+ },
44
+ "soundings-light-flare": {
45
+ "representation": "sdf",
46
+ "defaults": {"color": "#B12A73", "haloColor": "#F7FBF8", "haloWidth": 0.5, "haloBlur": 0}
47
+ },
48
+ "soundings-lighthouse": {
49
+ "representation": "sdf",
50
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
51
+ },
52
+ "soundings-marina": {
53
+ "representation": "sdf",
54
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
55
+ },
56
+ "soundings-notice": {
57
+ "representation": "sdf",
58
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
59
+ },
60
+ "soundings-notice-information": {
61
+ "representation": "sdf",
62
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
63
+ },
64
+ "soundings-notice-prohibition": {
65
+ "representation": "sdf",
66
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
67
+ },
68
+ "soundings-notice-recommendation": {
69
+ "representation": "sdf",
70
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
71
+ },
72
+ "soundings-notice-regulation": {
73
+ "representation": "sdf",
74
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
75
+ },
76
+ "soundings-notice-restriction": {
77
+ "representation": "sdf",
78
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
79
+ },
80
+ "soundings-pump-out": {
81
+ "representation": "sdf",
82
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
83
+ },
84
+ "soundings-slipway": {
85
+ "representation": "sdf",
86
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
87
+ },
88
+ "soundings-visitor-berth": {
89
+ "representation": "sdf",
90
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
91
+ },
92
+ "soundings-water-tap": {
93
+ "representation": "sdf",
94
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
95
+ },
96
+ "soundings-wreck": {
97
+ "representation": "sdf",
98
+ "defaults": {"color": "#263D3F", "haloColor": "#F7FBF8", "haloWidth": 1, "haloBlur": 0}
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,447 @@
1
+ // Original Streets tree artwork. Near/far glTF meshes and their top-down SVG crowns share
2
+ // one geometry description. Run `node packages/maps/assets/streets/build-trees.mjs [--check]`.
3
+ import {mkdir, readFile, writeFile} from 'node:fs/promises';
4
+ import {dirname, join} from 'node:path';
5
+ import {fileURLToPath} from 'node:url';
6
+
7
+ const here = dirname(fileURLToPath(import.meta.url));
8
+ const tau = Math.PI * 2;
9
+ const golden = Math.PI * (3 - Math.sqrt(5));
10
+ const add = (a, b) => a.map((n, i) => n + b[i]);
11
+ const mul = (v, n) => v.map((x) => x * n);
12
+ const sub = (a, b) => a.map((n, i) => n - b[i]);
13
+ const cross = (a, b) => [
14
+ a[1] * b[2] - a[2] * b[1],
15
+ a[2] * b[0] - a[0] * b[2],
16
+ a[0] * b[1] - a[1] * b[0],
17
+ ];
18
+ const unit = (v) => mul(v, 1 / (Math.hypot(...v) || 1));
19
+ const dot = (a, b) => a.reduce((n, v, i) => n + v * b[i], 0);
20
+ const mesh = (material) => ({material, positions: [], normals: [], shades: [], indices: []});
21
+ function vertex(m, p, n, shade = 1) {
22
+ m.positions.push(...p);
23
+ m.normals.push(...unit(n));
24
+ m.shades.push(shade);
25
+ return m.shades.length - 1;
26
+ }
27
+ function face(m, a, b, c, outward) {
28
+ const point = (i) => m.positions.slice(i * 3, i * 3 + 3);
29
+ const normal = cross(sub(point(b), point(a)), sub(point(c), point(a)));
30
+ if (dot(normal, outward) < 0) m.indices.push(a, c, b);
31
+ else m.indices.push(a, b, c);
32
+ }
33
+
34
+ // Small irregular lobes, with a continuous normal field and a faceted silhouette. The
35
+ // variation is in the authored mesh, so it never shimmers or changes while the camera moves.
36
+ function branch(m, from, to, base, tip, sides) {
37
+ const axis = unit(sub(to, from));
38
+ const u = unit(cross(axis, Math.abs(axis[1]) > 0.9 ? [1, 0, 0] : [0, 1, 0]));
39
+ const v = cross(axis, u);
40
+ const rows = [from, to].map((p, r) =>
41
+ Array.from({length: sides}, (_, s) => {
42
+ const n = add(mul(u, Math.cos((s * tau) / sides)), mul(v, Math.sin((s * tau) / sides)));
43
+ return vertex(
44
+ m,
45
+ add(p, mul(n, r ? tip : base)),
46
+ n,
47
+ 0.94 + 0.06 * Math.cos((s * tau) / sides),
48
+ );
49
+ }),
50
+ );
51
+ for (let s = 0; s < sides; s++) {
52
+ const n = (s + 1) % sides;
53
+ const outward = sub(m.positions.slice(rows[0][s] * 3, rows[0][s] * 3 + 3), from);
54
+ face(m, rows[0][s], rows[1][s], rows[1][n], outward);
55
+ face(m, rows[0][s], rows[1][n], rows[0][n], outward);
56
+ }
57
+ }
58
+
59
+ // Compact, upright and open trees have different branching architectures, not the
60
+ // same set of spheres stretched along an axis. Lobes carry a stable material shade.
61
+ function palm(form, far) {
62
+ const fan = form === 'palm-fan';
63
+ const stem = mesh('stem');
64
+ const leaves = mesh('leaves');
65
+ const fronds = mesh('fronds');
66
+ const height = fan ? 8.2 : 12;
67
+ const sections = far ? 2 : 6;
68
+ const centre = (t) => [0.36 * t * t, height * t, 0.14 * t * t];
69
+ for (let r = 0; r < sections; r++)
70
+ branch(
71
+ stem,
72
+ centre(r / sections),
73
+ centre((r + 1) / sections),
74
+ 0.24 - (r / sections) * 0.06,
75
+ 0.24 - ((r + 1) / sections) * 0.06,
76
+ far ? 4 : 7,
77
+ );
78
+ const top = centre(1);
79
+ if (!fan) branch(leaves, top, add(top, [0, 1.05, 0]), 0.21, 0.1, far ? 4 : 7);
80
+ const origin = add(top, [0, fan ? 0 : 1.05, 0]);
81
+ const count = far ? 6 : fan ? 15 : 12;
82
+ for (let f = 0; f < count; f++) {
83
+ const a = f * golden;
84
+ const age = f / (count - 1);
85
+ const direction = [Math.cos(a), 0, Math.sin(a)];
86
+ const side = [-Math.sin(a), 0, Math.cos(a)];
87
+ const shade = 1.04 - age * 0.16;
88
+ if (fan) {
89
+ const end = add(origin, add(mul(direction, 1 + age * 0.8), [0, 1.15 - age * 1.8, 0]));
90
+ branch(leaves, origin, end, 0.035, 0.015, 3);
91
+ const mid = vertex(fronds, end, [0, 1, 0], shade);
92
+ const folds = far ? 3 : 5;
93
+ const rim = Array.from({length: folds + 1}, (_, i) => {
94
+ const t = -1.35 + (i * 2.7) / folds;
95
+ const p = add(end, add(mul(direction, Math.cos(t) * 1.05), mul(side, Math.sin(t) * 1.2)));
96
+ p[1] += (i % 2 ? 0.12 : -0.12) - age * 0.4;
97
+ return vertex(
98
+ fronds,
99
+ p,
100
+ add([0, 1, 0], mul(side, i % 2 ? 0.3 : -0.3)),
101
+ shade * (i % 2 ? 1.03 : 0.95),
102
+ );
103
+ });
104
+ for (let i = 0; i < folds; i++) face(fronds, mid, rim[i], rim[i + 1], [0, 1, 0]);
105
+ } else {
106
+ const segments = far ? 2 : 6;
107
+ const rows = [];
108
+ for (let s = 0; s <= segments; s++) {
109
+ const t = s / segments;
110
+ const width = s === segments ? 0.015 : 0.52 * Math.sin(Math.PI * (0.13 + t * 0.82));
111
+ const p = add(
112
+ origin,
113
+ add(mul(direction, t * (3.4 + 0.3 * Math.sin(f))), [
114
+ 0,
115
+ Math.sin(t * Math.PI * 0.8) * (1.7 - age) - t * t * (0.7 + age * 1.4),
116
+ 0,
117
+ ]),
118
+ );
119
+ rows.push(
120
+ [-1, 0, 1].map((flank) =>
121
+ vertex(
122
+ fronds,
123
+ add(p, add(mul(side, width * flank), [0, -Math.abs(flank) * width * 0.55, 0])),
124
+ add([0, 1, 0], mul(side, flank * 0.4)),
125
+ shade * (flank ? 0.95 : 1.04),
126
+ ),
127
+ ),
128
+ );
129
+ }
130
+ for (let s = 0; s < segments; s++)
131
+ for (let side = 0; side < 2; side++) {
132
+ face(fronds, rows[s][side], rows[s + 1][side], rows[s + 1][side + 1], [0, 1, 0]);
133
+ face(fronds, rows[s][side], rows[s + 1][side + 1], rows[s][side + 1], [0, 1, 0]);
134
+ }
135
+ }
136
+ }
137
+ return [stem, leaves, fronds].filter((m) => m.indices.length);
138
+ }
139
+
140
+ function glb(parts, name) {
141
+ const blocks = [],
142
+ views = [],
143
+ accessors = [];
144
+ let offset = 0;
145
+ const accessor = (array, type, componentType, target, bounds) => {
146
+ const bytes = new Uint8Array(array.buffer);
147
+ const block = new Uint8Array(Math.ceil(bytes.length / 4) * 4);
148
+ block.set(bytes);
149
+ blocks.push(block);
150
+ views.push({buffer: 0, byteOffset: offset, byteLength: bytes.length, target});
151
+ offset += block.length;
152
+ accessors.push({
153
+ bufferView: views.length - 1,
154
+ componentType,
155
+ count: array.length / (type === 'VEC3' ? 3 : 1),
156
+ type,
157
+ ...bounds,
158
+ });
159
+ return accessors.length - 1;
160
+ };
161
+ const primitives = parts.map((m, material) => ({
162
+ attributes: {
163
+ POSITION: accessor(new Float32Array(m.positions), 'VEC3', 5126, 34962, {
164
+ min: [0, 1, 2].map((axis) => Math.min(...m.positions.filter((_, i) => i % 3 === axis))),
165
+ max: [0, 1, 2].map((axis) => Math.max(...m.positions.filter((_, i) => i % 3 === axis))),
166
+ }),
167
+ NORMAL: accessor(new Float32Array(m.normals), 'VEC3', 5126, 34962),
168
+ COLOR_0: accessor(
169
+ new Float32Array(m.shades.flatMap((s) => [s * 0.8, s * 0.8, s * 0.8])),
170
+ 'VEC3',
171
+ 5126,
172
+ 34962,
173
+ ),
174
+ },
175
+ indices: accessor(new Uint16Array(m.indices), 'SCALAR', 5123, 34963),
176
+ material,
177
+ }));
178
+ const json = {
179
+ asset: {version: '2.0', generator: 'Tileflow Streets tree artwork'},
180
+ scene: 0,
181
+ scenes: [{nodes: [0]}],
182
+ nodes: [{mesh: 0}],
183
+ meshes: [{name, primitives}],
184
+ materials: parts.map((m) => ({
185
+ name: m.material,
186
+ doubleSided: m.material === 'fronds',
187
+ pbrMetallicRoughness: {baseColorFactor: [1, 1, 1, 1], metallicFactor: 0, roughnessFactor: 1},
188
+ })),
189
+ accessors,
190
+ bufferViews: views,
191
+ buffers: [{byteLength: offset}],
192
+ };
193
+ const text = Buffer.from(JSON.stringify(json));
194
+ const padded = Buffer.alloc(Math.ceil(text.length / 4) * 4, 32);
195
+ text.copy(padded);
196
+ const header = Buffer.alloc(20);
197
+ header.writeUInt32LE(0x46546c67, 0);
198
+ header.writeUInt32LE(2, 4);
199
+ header.writeUInt32LE(28 + padded.length + offset, 8);
200
+ header.writeUInt32LE(padded.length, 12);
201
+ header.writeUInt32LE(0x4e4f534a, 16);
202
+ const bin = Buffer.alloc(8);
203
+ bin.writeUInt32LE(offset, 0);
204
+ bin.writeUInt32LE(0x004e4942, 4);
205
+ return Buffer.concat([header, padded, bin, ...blocks]);
206
+ }
207
+
208
+ function topView(parts, dark) {
209
+ const foliage = parts.filter((m) => m.material === 'leaves' || m.material === 'fronds');
210
+ const reach = Math.max(
211
+ ...foliage.flatMap((m) => m.positions.filter((_, i) => i % 3 !== 1).map(Math.abs)),
212
+ );
213
+ const scale = 26 / reach;
214
+ const light = unit([-0.6, 1, -0.7]);
215
+ const base = dark ? [67, 91, 77] : [146, 186, 136];
216
+ const triangles = [];
217
+ for (const m of foliage)
218
+ for (let i = 0; i < m.indices.length; i += 3) {
219
+ const ids = m.indices.slice(i, i + 3);
220
+ const points = ids.map((id) => m.positions.slice(id * 3, id * 3 + 3));
221
+ const normal = unit(cross(sub(points[1], points[0]), sub(points[2], points[0])));
222
+ if (normal[1] < 0.01) continue;
223
+ const luminance = 0.87 + 0.22 * Math.max(0, dot(normal, light));
224
+ const fill =
225
+ '#' +
226
+ base
227
+ .map((v) =>
228
+ Math.round(Math.min(255, v * luminance))
229
+ .toString(16)
230
+ .padStart(2, '0'),
231
+ )
232
+ .join('');
233
+ triangles.push({
234
+ height: points.reduce((n, p) => n + p[1], 0) / 3,
235
+ path: `<path d="M${points.map((p) => `${(32 + p[0] * scale).toFixed(2)},${(32 + p[2] * scale).toFixed(2)}`).join('L')}Z" fill="${fill}" stroke="${fill}" stroke-width="0.35"/>`,
236
+ });
237
+ }
238
+ triangles.sort((a, b) => a.height - b.height);
239
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">\n<!-- Generated by build-trees.mjs. Original Tileflow crown artwork. -->\n${triangles.map((t) => t.path).join('\n')}\n</svg>\n`;
240
+ }
241
+
242
+ const profiles = {
243
+ round: {
244
+ r: [3.5, 3.55, 3.2],
245
+ y: 6.55,
246
+ power: 0.83,
247
+ lobes: 0.1,
248
+ taper: 0.08,
249
+ lean: 0.16,
250
+ phase: 0.4,
251
+ },
252
+ open: {
253
+ r: [4.2, 2.65, 3.65],
254
+ y: 6.35,
255
+ power: 0.78,
256
+ lobes: 0.13,
257
+ taper: 0.09,
258
+ lean: -0.18,
259
+ phase: 1.2,
260
+ },
261
+ tall: {
262
+ r: [2.6, 4.4, 2.35],
263
+ y: 7.2,
264
+ power: 0.94,
265
+ lobes: 0.075,
266
+ taper: 0.16,
267
+ lean: 0.28,
268
+ phase: 2.3,
269
+ },
270
+ conifer: {
271
+ r: [3.0, 4.75, 2.8],
272
+ y: 6.35,
273
+ power: 0.74,
274
+ lobes: 0.035,
275
+ taper: 0.6,
276
+ lean: -0.1,
277
+ phase: 0.8,
278
+ },
279
+ columnar: {
280
+ r: [1.35, 5.5, 1.2],
281
+ y: 6.2,
282
+ power: 1.04,
283
+ lobes: 0.035,
284
+ taper: 0.22,
285
+ lean: 0.13,
286
+ phase: 1.6,
287
+ },
288
+ };
289
+ const crownVolumes = {
290
+ round: [
291
+ {c: [-1.3, -0.25, 0.15], r: [2.3, 2.5, 2.2]},
292
+ {c: [1.4, -0.4, 0], r: [2.2, 2.35, 2.1]},
293
+ {c: [0.1, 1.5, -0.3], r: [2.4, 2.7, 2.3]},
294
+ ],
295
+ open: [
296
+ {c: [-1.75, -0.25, 0.2], r: [2.65, 2.1, 2.45]},
297
+ {c: [1.65, -0.2, 0.1], r: [2.6, 2.3, 2.4]},
298
+ {c: [-0.1, 0.7, -0.45], r: [2.9, 2.5, 2.6]},
299
+ ],
300
+ tall: [
301
+ {c: [-0.15, 1.25, -0.15], r: [2.25, 3.35, 2.05]},
302
+ {c: [-1.0, -1.4, 0.2], r: [1.8, 2.1, 1.7]},
303
+ {c: [1.1, -0.85, 0.1], r: [1.8, 2.35, 1.75]},
304
+ ],
305
+ };
306
+ // Restore depth to the compact crowns; their original lobes were laid out
307
+ // mainly side to side, leaving a flat, elongated footprint from above.
308
+ const crownDepth = {round: 1.45, open: 1.52, tall: 1.3};
309
+ function blendedRadius(direction, volumes) {
310
+ const hits = volumes.map(({c, r}) => {
311
+ let a = 0,
312
+ b = 0,
313
+ d = -1;
314
+ for (let i = 0; i < 3; i++) {
315
+ a += (direction[i] / r[i]) ** 2;
316
+ b -= (2 * direction[i] * c[i]) / r[i] ** 2;
317
+ d += (c[i] / r[i]) ** 2;
318
+ }
319
+ return (-b + Math.sqrt(Math.max(0, b * b - 4 * a * d))) / (2 * a);
320
+ });
321
+ // A smooth union keeps the lobes readable in one continuous canopy skin.
322
+ return hits.reduce((a, b) => Math.max(a, b) + 0.2 * Math.log1p(Math.exp(-Math.abs(a - b) / 0.2)));
323
+ }
324
+
325
+ function compactCrown(m, p, form, far) {
326
+ const sides = far ? 12 : 20,
327
+ rings = far ? 5 : 10;
328
+ const point = (latitude, angle) => {
329
+ const up = Math.cos(latitude),
330
+ reach = Math.max(0, Math.sin(latitude));
331
+ if (crownVolumes[form]) {
332
+ const direction = [reach * Math.cos(angle), up, reach * Math.sin(angle)];
333
+ const radius = blendedRadius(direction, crownVolumes[form]);
334
+ return [
335
+ direction[0] * radius,
336
+ p.y + direction[1] * radius,
337
+ direction[2] * radius * crownDepth[form],
338
+ ];
339
+ }
340
+ const lobes =
341
+ 1 +
342
+ p.lobes * Math.cos(3 * angle + p.phase) * reach * reach +
343
+ 0.025 * Math.sin(2 * angle + p.phase) * reach;
344
+ const tier = form === 'conifer' ? 0.88 * (1 + 0.055 * Math.cos(latitude * 6)) : 1;
345
+ const radius = Math.pow(reach, p.power) * (1 - p.taper * up) * lobes * tier;
346
+ return [
347
+ p.r[0] * radius * Math.cos(angle) + p.lean * up,
348
+ p.y + p.r[1] * up,
349
+ p.r[2] * radius * Math.sin(angle) + 0.08 * up,
350
+ ];
351
+ };
352
+ const normal = (latitude, angle) => {
353
+ const e = 0.0001;
354
+ const around = sub(point(latitude, angle + e), point(latitude, angle - e));
355
+ const down = sub(point(latitude + e, angle), point(latitude - e, angle));
356
+ return unit(cross(around, down));
357
+ };
358
+ const top = vertex(m, point(0, 0), [0, 1, 0], 1.015);
359
+ const bottom = vertex(m, point(Math.PI, 0), [0, -1, 0], 0.985);
360
+ const rows = [];
361
+ for (let row = 1; row < rings; row++) {
362
+ const latitude = (row / rings) * Math.PI;
363
+ rows.push(
364
+ Array.from({length: sides}, (_, side) => {
365
+ const angle = (side / sides) * tau;
366
+ return vertex(
367
+ m,
368
+ point(latitude, angle),
369
+ normal(latitude, angle),
370
+ 1 + 0.015 * Math.cos(latitude),
371
+ );
372
+ }),
373
+ );
374
+ }
375
+ for (let side = 0; side < sides; side++) {
376
+ const next = (side + 1) % sides;
377
+ face(m, top, rows[0][side], rows[0][next], [0, 1, 0]);
378
+ for (let row = 0; row < rows.length - 1; row++) {
379
+ const outward = normal(((row + 1.5) / rings) * Math.PI, ((side + 0.5) / sides) * tau);
380
+ face(m, rows[row][side], rows[row + 1][side], rows[row + 1][next], outward);
381
+ face(m, rows[row][side], rows[row + 1][next], rows[row][next], outward);
382
+ }
383
+ face(m, bottom, rows.at(-1)[next], rows.at(-1)[side], [0, -1, 0]);
384
+ }
385
+ }
386
+
387
+ function compactTree(form, far) {
388
+ const p = profiles[form],
389
+ bark = mesh('bark'),
390
+ leaves = mesh('leaves');
391
+ const slim = form === 'columnar' || form === 'conifer';
392
+ const crownBottom = p.y - p.r[1],
393
+ fork = Math.max(1.5, crownBottom + (slim ? 0.35 : -0.65));
394
+ const sides = far ? 3 : 8;
395
+ branch(bark, [0, 0, 0], [0, fork, 0], slim ? 0.28 : 0.48, slim ? 0.16 : 0.3, sides);
396
+ if (slim) branch(bark, [0, fork, 0], [0, p.y, 0], 0.16, 0.06, sides);
397
+ else
398
+ for (const [sign, z] of [
399
+ [-1, -0.18],
400
+ [1, 0.15],
401
+ ]) {
402
+ branch(bark, [0, fork, 0], [sign * p.r[0] * 0.46, crownBottom + 1.25, z], 0.24, 0.1, sides);
403
+ }
404
+ compactCrown(leaves, p, form, far);
405
+ return [bark, leaves];
406
+ }
407
+
408
+ export function buildStreetsTrees() {
409
+ const files = new Map();
410
+ const catalogue = [];
411
+ for (const form of ['round', 'open', 'tall', 'conifer', 'columnar', 'palm-feather', 'palm-fan']) {
412
+ const build = (far) => (form.startsWith('palm') ? palm(form, far) : compactTree(form, far));
413
+ const near = build(false),
414
+ far = build(true);
415
+ const id = `streets-tree-${form}`;
416
+ for (const [level, parts] of [
417
+ ['near', near],
418
+ ['far', far],
419
+ ]) {
420
+ const triangles = parts.reduce((n, m) => n + m.indices.length / 3, 0);
421
+ if (triangles > (level === 'near' ? 700 : 120))
422
+ throw new Error(`${id} ${level}: ${triangles} triangles exceeds the Streets budget`);
423
+ files.set(`models/${id}${level === 'far' ? '.far' : ''}.glb`, glb(parts, id));
424
+ catalogue.push({id, level, triangles});
425
+ }
426
+ files.set(`icons/${id}.pattern.svg`, topView(near, false));
427
+ files.set(`icons/${id}-dark.pattern.svg`, topView(near, true));
428
+ }
429
+ return {files, catalogue};
430
+ }
431
+
432
+ if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
433
+ const {files, catalogue} = buildStreetsTrees();
434
+ const check = process.argv.includes('--check');
435
+ for (const [path, content] of files) {
436
+ const expected = Buffer.from(content);
437
+ const target = join(here, path);
438
+ if (check) {
439
+ const actual = await readFile(target).catch(() => undefined);
440
+ if (!actual?.equals(expected)) throw new Error(`Regenerate Streets tree artwork: ${path}`);
441
+ } else {
442
+ await mkdir(dirname(target), {recursive: true});
443
+ await writeFile(target, expected);
444
+ }
445
+ }
446
+ console.log(JSON.stringify({files: files.size, catalogue}, null, 2));
447
+ }
@@ -0,0 +1,9 @@
1
+ Historical Köppen–Geiger climate classification, 1991–2020.
2
+ Beck et al. (2023), https://doi.org/10.1038/s41597-023-02549-6
3
+ Source: https://www.gloh2o.org/koppen/
4
+ Archive: https://ndownloader.figshare.com/files/61012822
5
+ Archive MD5: 7fc2f5a15d4f5fe0ce59c9a9b502aa09
6
+ License: Creative Commons Attribution 4.0 International.
7
+ https://creativecommons.org/licenses/by/4.0/
8
+ Adaptation: historical classes mapped to a crop-colour proxy, spatially smoothed,
9
+ reprojected to Web Mercator and tiled. No real-time vegetation is inferred.
@@ -0,0 +1,53 @@
1
+ """Rebuild the shared climate colour image, streets-climate-v1.png (requires Pillow and NumPy).
2
+
3
+ Tileflow serves the PNG unchanged at an immutable URL named by its SHA-256; recipe.json records
4
+ that digest, and Streets reads the URL from src/official/streets-climate.ts.
5
+ """
6
+ from pathlib import Path
7
+ from PIL import Image, ImageFilter
8
+ import hashlib, json, io
9
+ import numpy as np
10
+ ROOT = Path(__file__).resolve().parent
11
+ SOURCE = ROOT / 'koppen-geiger-1991-2020.tif'
12
+ DRY = np.array([239, 241, 230], dtype=float) # Existing global crop colour.
13
+ WET = np.array([202, 235, 215], dtype=float)
14
+ # 0=no-data; 1..30 are the published Beck et al. climate classes.
15
+ # Summer-dry and arid climates retain the current neutral crop palette.
16
+ WEIGHTS = [0, 1, 1, .45, 0, 0, 0, 0, 0, .06, .15,
17
+ .65, .7, .5, 1, 1, .9, .1, .15, .2, .15,
18
+ .65, .85, .65, .35, 1, 1, .8, .5, .15, 0]
19
+ recipe = dict(sourceSha256=hashlib.sha256(SOURCE.read_bytes()).hexdigest(),
20
+ dry=DRY.tolist(), wet=WET.tolist(), weights=WEIGHTS,
21
+ blurDegrees=.25, maxzoom=4, tileSize=256, period='1991–2020')
22
+ digest = hashlib.sha256(json.dumps(recipe, sort_keys=True).encode()).hexdigest()[:24]
23
+ classes = np.asarray(Image.open(SOURCE))
24
+ assert classes.shape == (1800, 3600) and classes.max() <= 30
25
+ valid = classes > 0
26
+ signal = np.take(WEIGHTS, classes)
27
+ # Normalize the blur by valid land so coastlines do not artificially dry out.
28
+ blur = lambda a: np.asarray(Image.fromarray(np.uint8(np.round(a * 255))).filter(
29
+ ImageFilter.GaussianBlur(2.5)), dtype=float) / 255
30
+ smoothed = np.divide(blur(signal), blur(valid), out=np.zeros_like(signal),
31
+ where=blur(valid) > .01).clip(0, 1)
32
+ colour = np.uint8(np.round(DRY + smoothed[..., None] * (WET - DRY)))
33
+ # Project the global 0.1 degree grid to Web Mercator before making XYZ tiles.
34
+ size = 4096
35
+ latitude = np.degrees(np.arctan(np.sinh(np.pi * (1 - 2 * (np.arange(size) + .5) / size))))
36
+ row = (90 - latitude) * 10 - .5
37
+ low = np.floor(row).astype(int).clip(0, 1798)
38
+ fraction = (row - low).clip(0, 1)
39
+ projected = np.uint8(np.round(colour[low] * (1 - fraction[:, None, None]) +
40
+ colour[low + 1] * fraction[:, None, None]))
41
+ world = Image.fromarray(projected).resize((size, size), Image.Resampling.BILINEAR)
42
+ buffer = io.BytesIO()
43
+ world.save(buffer, format='PNG', optimize=True)
44
+ image = buffer.getvalue()
45
+ (ROOT / 'streets-climate-v1.png').write_bytes(image)
46
+ recipe.update(image='streets-climate-v1.png', imageBytes=len(image),
47
+ imageSha256=hashlib.sha256(image).hexdigest())
48
+ (ROOT / 'recipe.json').write_text(json.dumps(recipe, indent=2)+'\n')
49
+ # Keep generated sources reproducible under the package formatter.
50
+ import subprocess
51
+ subprocess.run(['pnpm', 'exec', 'prettier', '--write', str(ROOT / 'recipe.json')], cwd=ROOT.parents[4], check=True)
52
+ print(json.dumps({'imageBytes': len(image), 'imageSha256': recipe['imageSha256'],
53
+ 'sourceSha256': recipe['sourceSha256']}))
@@ -0,0 +1,16 @@
1
+ {
2
+ "sourceSha256": "59b749fe6711e72c720ff903044eb0efb4373524ee434740ed7384a0284c155b",
3
+ "dry": [239.0, 241.0, 230.0],
4
+ "wet": [202.0, 235.0, 215.0],
5
+ "weights": [
6
+ 0, 1, 1, 0.45, 0, 0, 0, 0, 0, 0.06, 0.15, 0.65, 0.7, 0.5, 1, 1, 0.9, 0.1, 0.15, 0.2, 0.15, 0.65,
7
+ 0.85, 0.65, 0.35, 1, 1, 0.8, 0.5, 0.15, 0
8
+ ],
9
+ "blurDegrees": 0.25,
10
+ "maxzoom": 4,
11
+ "tileSize": 256,
12
+ "period": "1991\u20132020",
13
+ "image": "streets-climate-v1.png",
14
+ "imageBytes": 820873,
15
+ "imageSha256": "bede2213b0ba74d77111fe182458ee30d219b989a9c11fe5ce121de1c549dfc4"
16
+ }