尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Full-screen web map for land buyers in the Bangkok Metropolitan Region.
Scope, screens, layers and milestones: docs/BRIEF.md.
Working rules for Claude Code: CLAUDE.md.
If Playwright cannot download a browser, point it at a local Chromium with
PLAYWRIGHT_CHROMIUM_PATH=/path/to/chrome npm run test:e2e.查看完整 README ↗Full-screen web map for land buyers in the Bangkok Metropolitan Region. Scope, screens, layers and milestones: docs/BRIEF.md. Working rules for Claude Code: CLAUDE.md.
nvm use # Node 22
npm install
cp .env.example .env.local # fill GISTDA_API_KEY before M3
npm run dev
| Command | What it does |
|---|---|
npm run dev | Start the dev server |
npm run lint | ESLint (no any) |
npm run typecheck | tsc --noEmit, strict mode |
npm test | Unit tests (Vitest, tests/unit) |
npm run test:e2e | End-to-end tests (Playwright, 360×640 and 1440×900) against a production build; run npm run build first |
npm run check:layers | Validate the layer registry and licences (placeholder until M2/M4; runs before every build) |
npm run build | Production build |
If Playwright cannot download a browser, point it at a local Chromium with
PLAYWRIGHT_CHROMIUM_PATH=/path/to/chrome npm run test:e2e.
src/lib/basemap.ts adds a font-faces entry for the
Thai block pointing at self-hosted Noto Sans Thai (public/fonts, SIL OFL), so
MapLibre renders each grapheme cluster with the browser's text engine.postinstall/predev/prebuild copy the standalone worker
to public/vendor/maplibre/ (git-ignored); bundling breaks its default URL./api/geocode (server-side Nominatim, cached 24h,
submit-only as the public Nominatim policy requires).tests/e2e/fixtures/test-style.json, so they
run offline and never hit the tile provider.src/layers/registry.ts; its Thai name, summary and
legend labels live in src/i18n/th.ts. No component knows about a layer id.npm run check:layers (runs before every build) fails on an invalid registry,
including any status: "live" layer whose commercialUse is not "yes".node scripts/make-samples.mjs into
public/data/*.sample.geojson.?l=id1,id2 (missing = defaults, empty = none).src/lib/geo.ts);
each layer's sentence comes from its inspect.describe in src/layers/describe/."api" layers go through GET /api/inspect?layer=&lat=&lng=, which calls the
provider server-side (src/lib/server/inspectors.ts) so keys never reach the browser.npm run check:secrets (after build, also in CI) fails if GISTDA_API_KEY appears in
.next/static.Sources, licences and status: docs/DATA_SOURCES.md.
| Script | Output |
|---|---|
node scripts/ingest/record-gistda-fixture.mjs | One real GISTDA response in tests/fixtures/ (key redacted) |
node scripts/ingest/osm-rail.mjs | public/data/rail-transit.geojson from OpenStreetMap |
node scripts/ingest/arcgis-rest.mjs <layer-url> <out> | GeoJSON (EPSG:4326) from an ArcGIS REST layer, paged; only after licence confirmation |
node scripts/ingest/to-pmtiles.mjs <in> <out> <layer> | PMTiles via tippecanoe, for files over 2 MB |
src/lib/analytics.ts records layer_toggled, point_inspected and search_used
through one track() function; the default sink logs to the console. Swap it with
setAnalyticsSink().
Kanesuan/KNS.MAP.GISTDA_API_KEY: the GISTDA key (server-side only, never NEXT_PUBLIC_).NEXT_PUBLIC_BASEMAP_STYLE_URL: optional, defaults to OpenFreeMap Liberty.The project is non-commercial (src/layers/project.ts), which fits the Hobby plan. A commercial launch would need Vercel Pro or another
Next.js host (docs/BRIEF.md section 9).
npm run audit:lighthouse -- https://<your-domain> runs Lighthouse three times on the
mobile profile and checks the brief's targets (Performance ≥ 80, Accessibility ≥ 90).