Satellite ground and real building footprints
- The ground is Esri World Imagery: ~1 m/pixel tiles around the city zone, the factory and 300 m either side of the drive between them, coarser tiles for the whole region. Tiles are hosted with the game (public/imagery, scripts/fetch-imagery.mjs), stream in near the camera, are cached by the service worker as visited, and replace the drawn roads and land areas - ~141,500 Microsoft building footprints (ODbL) join OSM's ~4,000 in a compact delta-encoded file (public/data/buildings.bin, built by scripts/build-buildings.mjs). Heights are estimated from footprint area and land use, with industrial halls outside the ring road. Buildings are built in 500 m blocks as the camera approaches - Caddy compresses the buildings file and caches map data for a week; the build targets ES2022 for top-level await - Tests for decoding, factory clearance, machine reachability and tile placement Imagery attribution: Esri, Maxar, Earthstar Geographics, and the GIS User Community. Commercial use requires a suitable Esri licence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@@ -2,7 +2,20 @@
|
|||||||
# or ":80" for plain HTTP behind another proxy or for a local test.
|
# or ":80" for plain HTTP behind another proxy or for a local test.
|
||||||
{$SITE_ADDRESS::80} {
|
{$SITE_ADDRESS::80} {
|
||||||
root * /srv
|
root * /srv
|
||||||
encode zstd gzip
|
# The defaults cover text and JSON; the binary buildings file compresses to about 60% too.
|
||||||
|
encode {
|
||||||
|
zstd
|
||||||
|
gzip
|
||||||
|
match {
|
||||||
|
# Repeated values for the same header are OR-ed.
|
||||||
|
header Content-Type text/*
|
||||||
|
header Content-Type application/json*
|
||||||
|
header Content-Type application/javascript*
|
||||||
|
header Content-Type application/manifest+json*
|
||||||
|
header Content-Type image/svg+xml*
|
||||||
|
header Content-Type application/octet-stream*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Hashed build files never change; the page, service worker and manifest must always be revalidated
|
# Hashed build files never change; the page, service worker and manifest must always be revalidated
|
||||||
# so installed copies pick up new versions.
|
# so installed copies pick up new versions.
|
||||||
@@ -10,6 +23,9 @@
|
|||||||
header @hashed Cache-Control "public, max-age=31536000, immutable"
|
header @hashed Cache-Control "public, max-age=31536000, immutable"
|
||||||
@fresh path / /index.html /sw.js /manifest.webmanifest
|
@fresh path / /index.html /sw.js /manifest.webmanifest
|
||||||
header @fresh Cache-Control "no-cache"
|
header @fresh Cache-Control "no-cache"
|
||||||
|
# Map data and satellite tiles only change with a new map build.
|
||||||
|
@mapdata path /imagery/* /data/*
|
||||||
|
header @mapdata Cache-Control "public, max-age=604800"
|
||||||
@manifest path /manifest.webmanifest
|
@manifest path /manifest.webmanifest
|
||||||
header @manifest Content-Type "application/manifest+json"
|
header @manifest Content-Type "application/manifest+json"
|
||||||
|
|
||||||
|
|||||||
@@ -159,6 +159,44 @@ node scripts/build-map-data.mjs --osm city.json zone-factory.json corridor.json
|
|||||||
|
|
||||||
چهار خروجی OSM (محدودهٔ شهر، محدودهٔ کارخانه، کریدور مسیر و خیابانهای اصلی) با هم ادغام میشوند و عنصرهای تکراری حذف میشوند. خیابانها هم در مرز منطقه بریده میشوند. برای افزودن محدودهٔ جدید، یک خروجی دیگر به `--osm` اضافه کنید و در صورت نیاز `REGION` را در اسکریپت بزرگتر کنید.
|
چهار خروجی OSM (محدودهٔ شهر، محدودهٔ کارخانه، کریدور مسیر و خیابانهای اصلی) با هم ادغام میشوند و عنصرهای تکراری حذف میشوند. خیابانها هم در مرز منطقه بریده میشوند. برای افزودن محدودهٔ جدید، یک خروجی دیگر به `--osm` اضافه کنید و در صورت نیاز `REGION` را در اسکریپت بزرگتر کنید.
|
||||||
|
|
||||||
|
### ساختمانها (Microsoft)
|
||||||
|
|
||||||
|
OSM فقط حدود ۴٬۰۰۰ ساختمان این منطقه را دارد. بقیه (حدود ۱۴۱٬۵۰۰ ساختمان) از مجموعهٔ ساختمانهای جهانی Microsoft (مجوز ODbL) میآیند و در `public/data/buildings.bin` ذخیره میشوند. این فایل ۳٫۵ مگابایت است و فشردهشده حدود ۲ مگابایت منتقل میشود.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
node scripts/build-buildings.mjs <فایل quadkey ایران، مثلاً 123012100 .csv.gz>
|
||||||
|
```
|
||||||
|
|
||||||
|
فایل از [فهرست Microsoft](https://minedbuildings.z5.web.core.windows.net/global-buildings/dataset-links.csv) گرفته میشود (ردیف `Iran,123012100`). دادههای Microsoft برای ایران ارتفاع ندارند، پس ارتفاع تخمین زده میشود:
|
||||||
|
|
||||||
|
| موقعیت و مساحت | ارتفاع |
|
||||||
|
|---|---|
|
||||||
|
| پارک | یک طبقه |
|
||||||
|
| صنعتی، یا بیرون از کمربندی پیامبر اعظم، بالای ۲۵۰ متر مربع | سوله، ۶ تا ۹ متر |
|
||||||
|
| بیرون از کمربندی، کوچکتر | ۱ تا ۲ طبقه |
|
||||||
|
| داخل شهر، زیر ۴۰ متر مربع | ۱ طبقه |
|
||||||
|
| داخل شهر، زیر ۱۲۰ متر مربع | ۲ تا ۳ طبقه |
|
||||||
|
| داخل شهر، زیر ۳۰۰ متر مربع | ۳ تا ۴ طبقه |
|
||||||
|
| داخل شهر، زیر ۸۰۰ متر مربع | ۴ تا ۶ طبقه |
|
||||||
|
| داخل شهر، بزرگتر | ۵ تا ۸ طبقه |
|
||||||
|
|
||||||
|
ساختمانهایی که OSM هم دارد، و ساختمانهای داخل محوطهٔ کارخانه (که بازی خودش میسازد) حذف میشوند. ساختمانها در بلوکهای ۵۰۰ متری و فقط وقتی بازیکن نزدیک میشود ساخته میشوند.
|
||||||
|
|
||||||
|
### تصویر ماهوارهای (Esri World Imagery)
|
||||||
|
|
||||||
|
زمین بازی تصویر ماهوارهای واقعی است و جادهها، لاینها، پارکها و حیاطها همانطور که در واقعیت هستند دیده میشوند. با وجود تصویر، جادهها و زمینهای رسمشده ساخته نمیشوند.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
node scripts/fetch-imagery.mjs
|
||||||
|
```
|
||||||
|
|
||||||
|
- **زوم ۱۷ (حدود ۱ متر در هر پیکسل):** محدودهٔ شهر، محدودهٔ کارخانه و ۳۰۰ متر دو طرف مسیر کارخانه تا بوستان ملت
|
||||||
|
- **زوم ۱۵:** کل منطقه، برای فاصلههای دور
|
||||||
|
|
||||||
|
کاشیها (حدود ۱۰۰۰ فایل، ۱۶ مگابایت) در `public/imagery` روی سرور خودمان هستند، پس در ایران و بهصورت آفلاین هم کار میکنند. Service Worker آنها را از قبل دانلود نمیکند و هر کاشی را وقتی بازیکن از کنارش رد شد نگه میدارد.
|
||||||
|
|
||||||
|
**مجوز:** استفادهٔ تجاری و میزبانی نسخهای از تصاویر Esri نیاز به مجوز مناسب از Esri دارد. شرایط را با Esri بررسی کنید. نام منبع در پایین صفحهٔ بازی نمایش داده میشود.
|
||||||
|
|
||||||
## ساختار
|
## ساختار
|
||||||
|
|
||||||
- `src/main.js`: صحنه، دوربین سومشخص، کنترلها، رابط کاربری (HUD)، نقشه، خرید و حلقهٔ بازی
|
- `src/main.js`: صحنه، دوربین سومشخص، کنترلها، رابط کاربری (HUD)، نقشه، خرید و حلقهٔ بازی
|
||||||
@@ -172,6 +210,8 @@ node scripts/build-map-data.mjs --osm city.json zone-factory.json corridor.json
|
|||||||
- `src/factory.js`: محوطهٔ کارخانه، شامل سالن تولید، خط مونتاژ، دفتر، حیاط و تابلوها
|
- `src/factory.js`: محوطهٔ کارخانه، شامل سالن تولید، خط مونتاژ، دفتر، حیاط و تابلوها
|
||||||
- `src/pwa.js` و `public/manifest.webmanifest`: نصب، کار آفلاین و پیام بهروزرسانی
|
- `src/pwa.js` و `public/manifest.webmanifest`: نصب، کار آفلاین و پیام بهروزرسانی
|
||||||
- `src/realworld.js`: GPS، قطبنما، نرمسازی و حالت پایدار موقعیت، و شعاع رسیدن
|
- `src/realworld.js`: GPS، قطبنما، نرمسازی و حالت پایدار موقعیت، و شعاع رسیدن
|
||||||
|
- `src/imagery.js`: زمین ماهوارهای که کاشیهایش با نزدیک شدن بارگذاری و با دور شدن آزاد میشوند
|
||||||
|
- `src/buildings-data.js`: خواندن فایل ساختمانهای Microsoft
|
||||||
- `src/ar.js`: نمای دوربین (AR)، شامل تصویر دوربین پشت گوشی، جهت گوشی و زاویهٔ دید
|
- `src/ar.js`: نمای دوربین (AR)، شامل تصویر دوربین پشت گوشی، جهت گوشی و زاویهٔ دید
|
||||||
- `src/vending.js`، `src/vehicle.js`، `src/traffic.js`: مدل دستگاه، فیزیک ماشین و ترافیک شهری
|
- `src/vending.js`، `src/vehicle.js`، `src/traffic.js`: مدل دستگاه، فیزیک ماشین و ترافیک شهری
|
||||||
- `src/geo.js`: تبدیل طول و عرض جغرافیایی به مختصات بازی
|
- `src/geo.js`: تبدیل طول و عرض جغرافیایی به مختصات بازی
|
||||||
@@ -182,4 +222,4 @@ node scripts/build-map-data.mjs --osm city.json zone-factory.json corridor.json
|
|||||||
- خیابانها یکطرفه و چراغ راهنمایی ندارند، و ترافیک فقط روی بلوارهای اصلی است.
|
- خیابانها یکطرفه و چراغ راهنمایی ندارند، و ترافیک فقط روی بلوارهای اصلی است.
|
||||||
- پیشنهادهای بعدی: امتیاز ایمنی (خط عابر و چراغ قرمز)، تاکسی و قطار شهری، چرخهٔ روز و شب، ذخیرهٔ پیشرفت، جدول امتیاز آنلاین، و محلهها و شهرهای دیگر.
|
- پیشنهادهای بعدی: امتیاز ایمنی (خط عابر و چراغ قرمز)، تاکسی و قطار شهری، چرخهٔ روز و شب، ذخیرهٔ پیشرفت، جدول امتیاز آنلاین، و محلهها و شهرهای دیگر.
|
||||||
|
|
||||||
نقشه: © مشارکتکنندگان OpenStreetMap (ODbL). مرز استانها: Natural Earth.
|
نقشه: © مشارکتکنندگان OpenStreetMap (ODbL). ساختمانها: © Microsoft (ODbL). تصویر ماهوارهای: Esri, Maxar, Earthstar Geographics, and the GIS User Community. مرز استانها: Natural Earth.
|
||||||
|
|||||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 7.9 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 9.5 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 9.5 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 7.9 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
|
After Width: | Height: | Size: 8.4 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 8.8 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 7.8 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 6.7 KiB |