Map Studio
完整项目文档见 PROJECT_DOCUMENTATION.md。
一个低成本的纯地图工作台,参考 ZZMap 的功能定位,覆盖:
- 无内置铁路线条的简洁底图、标准地图、卫星影像和 Esri 地形图
- DEM 动态等高线,以及可叠加在任意底图上的地形晕渲
- 铁路基础设施瓦片
- 国铁 / 地铁矢量线路(OpenFreeMap 全球铁路瓦片,Z3–Z16 本地分块缓存)
- 国铁线路和地铁线路各自拥有独立分类开关:主线、高速/客专、支线/专用线、站场、车辆段/停车场、侧线、渡线、联络线、试车线、环线、货运/工业和其他类型
- 北京范围内置国铁 / 地铁快照,在在线数据缺失时补充,也用于补全 OpenFreeMap 低缩放缺失的北京地铁线路
- 自动缩放或手动输入间距的经纬网格会跟随顶部坐标系统切换:经纬度网格标签统一使用带方向的度分秒,间距可切换为小数度或度分秒步长,Web 墨卡托使用 X/Y 米制坐标
- 当前视窗近似识别山顶、山谷,可分别开关并设置最小起伏阈值
- 水域覆盖层:湖泊、水库、河流和运河,按 Z3–Z16 本地分区加载并缓存
- 港口覆盖层:港口、码头、港池和渡轮终端
- 植被覆盖层:森林、草地、湿地、农田和林园绿地,支持 Z3–Z16
- 天地图矢量底图、地形底图、影像底图及对应注记;三种注记互斥显示,切换天地图底图时自动匹配对应注记
- 天地图手动瓦片下载后台;前台只读取本地已下载瓦片,绝不直接请求天地图
- 铁路与水域按固定像素区块渐进加载,每个区块完成后立即绘制
- 铁路/水域使用无损差分坐标编码和 gzip 传输,保留 7 位经纬度精度
- 顶部三横线按钮在桌面和窄屏下都能真正收起或展开左侧图层面板
- 顶部 “Map Studio” 右侧可切换 WGS84、GCJ02、Web 墨卡托、北京54、西安80、CGCS2000、BD09、NAD27 / NAD83、ETRS89 和 OSGB36 坐标显示
- 右下角实时坐标支持小数度与度分秒一键切换;选择会随浏览器工作区和
.mpstd工程文件保存 - 可折叠的经纬网格 / 等高线参数设置
- 多条路径独立折叠的高程剖面与节点坐标
- 每个绘制对象可单独显示/隐藏、修改颜色和不透明度,并自动保存这些设置
- 按内外半径、视线高度和距离颜色自定义的通视观察
- 绘制内容自动保存在浏览器本地,下次打开自动恢复
- 支持导入/导出完整
.mpstd工程文件,包含视图、全部设置和绘制内容 - 地图中心、缩放、底图、图层开关和各设置项自动保存并恢复
- 顶部固定显示“仅限内部使用”和地图合规提示;用户首次打开时必须确认规定,并提供本地《内部使用与地图合规规定》页面
- 屏幕和打印图例会按当前底图及铁路、地形、边界、环境、通视等开关动态更新;天地图图素按道路、铁路、水系、行政、居民地、植被、地形、设施、古迹等子项分别标注
- 国铁线路使用黑色底线叠加白色虚线段,形成黑白相间的铁路符号;地铁保持橙色
- 国铁、地铁和天地图图素铁路可统一切换“普通彩色线条/黑白相间铁路线”;国铁、地铁、环境图层、地形特征和天地图图素子项均可在“图例与颜色设置”中改色,屏幕及打印图例同步更新
- 浏览器 Service Worker 使用
map-studio-runtime-v5缓存底图、铁路、水域、坐标转换模块和前端资源;静态脚本失败会自动带缓存破坏参数重试 - A4 横向制图预览、图框裁剪、可编辑图名、右侧图例与整页 PDF 输出
- 快速城市定位、图层重置、浏览器定位
- 交互式地图 API 成本对比与月度费用估算
使用
项目使用多线程 Python 地图服务统一代理底图、DEM、铁路、水域和矢量瓦片数据,并为所有外部请求提供磁盘缓存。推荐使用:
python server.py
也可以直接双击 start-map-studio.bat。
然后访问:
http://127.0.0.1:8081/
服务首次请求某个瓦片或铁路视窗时会从互联网获取,并写入 cache/。下载线程与 HTTP 响应线程分离,首次请求会立即排队并在后台下载。页面右上角不提供缓存刷新入口,普通用户不能主动刷新当前视图或全部缓存。
工程文件导入导出
左侧“工程文件”区域可以把当前地图中心、缩放、全部底图与开关状态、网格/等高线/通视设置、制图参数,以及所有绘制对象导出为 *.mpstd。
导出内容包括绘制对象的名称、显示/隐藏、颜色、透明度、路径节点、高程剖面、通视结果和范围数据。导入时会先校验工程格式,成功后再替换当前工作区并重新加载页面。
天地图 KEY 与手动瓦片下载
天地图 KEY 只由 Python 后台读取,不会写入网页或返回浏览器。任选一种配置方式:
- 设置环境变量
TIANDITU_KEY。 - 在项目根目录创建
tianditu-key.txt,文件中只写 KEY。 - 启动时传入
python server.py --tianditu-key "你的KEY"。
下载后台还要求管理员密码,用户名固定为 admin。密码任选一种配置方式:
- 设置环境变量
MAP_STUDIO_ADMIN_PASSWORD。 - 在项目根目录创建
admin-password.txt,文件中只写密码。 - 启动时传入
python server.py --admin-password "你的密码"。
未配置管理员密码时,缓存管理、天地图下载后台、地图离线下载后台及对应管理接口默认拒绝访问。推荐使用至少 12 个字符的独立高强度密码;不足 12 个字符时服务端启动日志会给出警告。
配置后重启服务,打开:
http://127.0.0.1:8081/tianditu-admin.html
主页面左侧栏最底部也保留一个低优先级的“天地图瓦片下载后台”文字入口。
未登录时下载后台只显示密码框,地图、图层、下载设置和任务状态全部隐藏。登录成功后才会显示操作界面;退出时会清空服务器端全部管理员会话并删除多路径 Cookie。
后台先选择图层,然后在地图上拖拽框选下载范围;再设置起始和结束缩放级别,系统会分别换算每个级别的 X/Y 瓦片范围,也可以一键使用主地图当前视窗。框选地图支持简洁底图、标准地图、卫星影像和地形图切换。单次任务不设固定张数上限,但下载前必须通过地图框选范围。下载完成后,主地图才会显示对应天地图瓦片。任何前台瓦片请求都只会读取 cache/tiles/tdt-*,缺失时返回 TILE_NOT_DOWNLOADED,不会自动向天地图发起请求。已有瓦片默认跳过,不会重复下载。
开放与预览地图离线预下载
地图离线下载后台与天地图后台共用管理员密码,地址为:
http://127.0.0.1:8081/openmap-admin.html
主页面左侧栏最底部也提供“地图离线下载后台”入口。后台支持框选范围、同步显示地图缩放级别、使用主地图当前视窗、设置开始与结束缩放,并默认跳过服务器上已有的数据。可下载开放地图、OpenFreeMap 矢量以及 Esri 简洁底图、简洁底图注记、地形图和卫星影像。
可预下载的来源:
- OpenStreetMap 标准地图,栅格瓦片,Z1–Z19。
- OpenTopoMap 地形图,栅格瓦片,Z1–Z17。
- OpenRailwayMap 铁路基础设施,栅格瓦片,Z1–Z19。
- AWS Terrain Tiles 开放地形数据,Z3–Z15,供等高线、晕渲和视线分析使用。
- OpenFreeMap 全球矢量专题,Z3–Z14 原始 MVT,包含水域、植被、港口、铁路和行政边界。
- Esri 简洁底图与简洁底图注记,Z1–Z19;离线使用时应同时下载两者。
- Esri 地形图,Z1–Z13;Z14–Z19 在前台使用 Z13 瓦片放大显示。
- Esri 卫星影像,Z1–Z19。
下载结果写入现有 cache/tiles/ 或 cache/vector/。页面和浏览器只向本 Python 服务请求数据,不会直接访问这些开放地图站点。管理员可选择“覆盖已有瓦片”执行手动更新;OpenFreeMap 原始 MVT 缓存后,前台的铁路、水域、植被和边界处理会优先命中本地数据。
天地图和开源地图手动下载默认各使用 4 个并发瓦片线程,可在 server.py 顶部的 TIANDITU_DOWNLOAD_WORKERS 和 OPENMAP_DOWNLOAD_WORKERS 修改。管理员可在下载页中断任务,中断后不再派发新瓦片,已经完整写入的瓦片会保留。
所有缓存文件先写入 cache/.download-tmp/ 的 .part 文件;内容完整写入并同步到磁盘后,才以原子替换方式移入正式缓存目录。服务器在下载过程中重启时,正式缓存不会留下半截瓦片;超过 24 小时的遗留暂存文件会在启动时清理。
后台下载对每个上游地址最多等待 8 秒;单张 OpenFreeMap 或普通栅格瓦片总超时约 24 秒,OpenTopoMap 的多个备用地址合计最多约 40 秒;等待同一瓦片锁最多 110 秒。连续 150 秒没有任何新进度时,任务会以“部分完成”结束并把未完成项记为失败,不会永久停在“正在写入服务器缓存”。页面会显示当前正在请求的瓦片;刷新或重新登录后会自动接续显示仍在运行的任务。
Esri 底图不属于开放许可图层,下载和离线使用需遵守 Esri 服务条款。后台提供“选择离线底图套装”按钮,可一次选择简洁底图、简洁底图注记和卫星影像;Esri 地形图因原生最高 Z13,建议作为单独任务下载。
随机前缀反向代理
页面资源、瓦片和 API 均使用相对路径,可以部署在随机前缀后,例如:
http://127.0.0.1:8080/rUY4nlbUt3xbtGYo7sFkQ733oYgifvb6/
该地址可以由反向代理转发到:
http://127.0.0.1:8081/
代理可以向后端剥离随机前缀,也可以把完整路径直接转发给 Python 服务;服务会自动识别并剥离未知前缀。访问地址建议以 / 结尾;即使 WebVPN 去掉末尾斜杠,页面也会在加载 CSS/JS 前动态补全前缀。例如:
/rUY4nlbUt3xbtGYo7sFkQ733oYgifvb6/tiles/... → /tiles/...
/rUY4nlbUt3xbtGYo7sFkQ733oYgifvb6/api/... → /api/...
常用参数:
python server.py --host 127.0.0.1 --port 8081
python server.py --ttl-hours 24 --rail-ttl-hours 6 --refresh-hours 6
python server.py --tianditu-key "你的KEY"
python server.py --tianditu-key "你的KEY" --admin-password "你的管理员密码"
仅使用本地缓存、完全禁止服务器访问云端:
python server.py --cache-only
也可使用环境变量 MAP_STUDIO_CACHE_ONLY=1,或在“地图离线下载后台”中打开“仅使用缓存”。该设置保存在 cache/cache-only.setting。启动时可用 --allow-online 临时覆盖;管理员页面可随时关闭仅缓存模式。
仅缓存模式下,已有且已过期的瓦片仍会返回,但不会安排刷新。缺失栅格返回本地生成的占位 PNG;铁路、水域、行政边界等缺失矢量数据显示为空图层,不请求 OpenFreeMap 或 Overpass。天地图、开源地图和缓存刷新接口都会被拒绝。占位响应带有 X-Cache: PLACEHOLDER,Service Worker 不会缓存它们,因此恢复联网后不会继续显示旧占位图。
外网出口代理:
python server.py --upstream-proxy "http://127.0.0.1:7890"
python server.py --disable-upstream-proxy
也可设置环境变量 MAP_STUDIO_UPSTREAM_PROXY,或在管理员专用“地图离线下载后台”的“外网下载代理”中配置。页面支持“使用服务器默认(留空/不更改)”“临时设置(不写入配置)”“临时直连”“保存为服务器默认”和“恢复默认”。临时设置只在当前服务进程内生效,重启后回到配置文件/启动参数中的默认代理。代理支持 HTTP/HTTPS 正向代理,不支持标准库无法直接处理的 socks5://。配置保存在 cache/upstream-proxy.setting,并统一作用于瓦片、OpenFreeMap、DEM、天地图和 Overpass 请求。仅缓存模式仍优先禁止所有外网请求。公开状态接口不会显示代理信息。
服务器可能访问的外部域名:
server.arcgisonline.com、services.arcgisonline.comtile.openstreetmap.org、tile.openstreetmap.dea.tile.opentopomap.org、b.tile.opentopomap.org、c.tile.opentopomap.orgtiles.openrailwaymap.orgelevation-tiles-prod.s3.amazonaws.comt0.tianditu.gov.cntiles.openfreemap.orgoverpass-api.de、overpass.kumi.systems、overpass.private.coffee、overpass.monicz.dev
如果本地服务使用其他端口:
http://127.0.0.1:8082/
或使用查询参数:
file:///.../index.html?server=http://127.0.0.1:8082
文件
index.html:地图工作台styles.css:界面样式app.js:地图、网格、铁路图层与交互server.py:多线程本地地图代理、全球矢量瓦片解析、磁盘缓存和 Overpass 补充查询sw.js:浏览器端半年缓存、底图/矢量数据离线复用和手动刷新绕过;不缓存占位瓦片tianditu-admin.html:天地图瓦片手动选择、范围换算和后台下载进度openmap-admin.html:开放地图和 Esri 预览底图的框选、缩放范围选择、批量缓存和下载进度cache-admin.html:管理员缓存统计、覆盖范围查看、地图框选,以及按分类或按范围更新与删除regulations.html:内部使用、数据服务、地图公开和审核要求说明compliance-gate.js:首次打开时的内部使用与合规确认弹窗tools/build_local_vector_tiles.py:把 GDB、Shapefile 和全国省市县 GeoJSON 预处理成本地 Z/X/Y 矢量分块tools/import_map_archive.py:安全导入 ZIP、维护来源数据库并自动重建瓦片导入地图压缩包.bat:把 ZIP 拖到该文件即可导入,双击时会打开文件选择框补充1比25万地图数据.bat:补充导入 1:25 万分区 ZIP,并重建独立的 Z8–Z12 瓦片tianditu-key.example.txt:天地图 KEY 配置示例admin-password.example.txt:天地图和地图离线下载后台管理员密码配置示例tianditu-key.txt:可选的本地天地图 KEY 文件,已被.gitignore排除start-map-studio.bat:Windows 一键启动本地地图服务PROJECT_DOCUMENTATION.md:完整项目文档api-comparison.html:API 成本对比、计算器和落地建议vendor/leaflet/:本地 Leaflet 运行文件
当前数据源
- 标准地图:OpenStreetMap 德国节点
- 简洁底图:Esri Light Gray Canvas 底图与独立标注
- Esri 地形图:Esri World Topographic Map,经本地服务缓存;原生数据最高 Z13,Z14–Z19 自动放大使用 Z13 瓦片
- 等高线 / 地形晕渲:AWS Terrain Tiles,浏览器内动态生成,可独立叠加
- 卫星影像:Esri ArcGIS Online
- 铁路基础设施:OpenRailwayMap
- 国铁 / 地铁:OpenFreeMap / OpenMapTiles 全球矢量瓦片,服务端转换为 Z3–Z16 本地铁路瓦片;Z15–Z16 从 Z14 精细数据继续裁切
- Z9–Z13 的国铁与地铁会把对应范围内的 Z14 精细瓦片汇总成本地低缩放瓦片,非北京地区也可显示;汇总结果保存在
cache/rail-metro-tiles/。首次缺失聚合时 HTTP 请求立即返回现有低缩放数据,汇总在独立后台线程完成,页面稍后自动刷新;粗结果不会写成最终瓦片缓存。 - 水域:OpenFreeMap
water、waterway矢量层,本地分区支持 Z3–Z16;OpenFreeMap 原生最高 Z14,Z15–Z16 由 Z14 精细数据继续分区 - 港口:OpenFreeMap
poi港口/码头/渡轮终端及港口面状要素 - 植被:OpenFreeMap
landcover、landuse森林、草地、湿地和农田要素,本地分区支持 Z3–Z16;低缩放植被由 Z7 精细瓦片继续分区,避免中国区域低级别为空 - 天地图:
vec、cva、ter、cta、img、cia、ibo,全部只读本地手动缓存 - 天地图图素:本地 1:100 万支持 Z3–Z16,分区 1:25 万支持 Z8–Z18。本地矢量全部类别均从 Z3 显示;Z8 以上优先使用 1:25 万,没有覆盖或缺少的分组自动回退 1:100 万
- 外地铁路和水域:本地服务按当前视窗异步下载并缓存,不再依赖 Overpass 才能显示
- 本地铁路兜底:OpenStreetMap 数据快照(北京视窗,仅断网兜底)
- 经纬网格:浏览器本地生成,使用顶部当前选中的坐标系;经纬线按 Leaflet 投影逐点计算,避免 Web 墨卡托地图上的经纬线偏移
缓存
- 默认缓存目录:
cache/ - 底图、标注、DEM、OpenRailwayMap、OpenFreeMap 矢量瓦片和 Overpass 响应都会缓存。
- OpenFreeMap 原始矢量瓦片保存在
cache/vector/,环境分区响应保存在cache/water/,失败任务保存在cache/water-pending/。 - 默认缓存有效期:半年(180 天)。
- 默认每半年扫描并后台更新过期缓存,避免频繁向公共瓦片服务发起请求。
- 页面右上角不提供缓存刷新按钮;普通用户无法主动刷新当前视图或全部缓存。
/api/cache/refresh和/api/cache/refresh-all均必须通过管理员会话认证。前者只处理请求中指定的当前包围盒,后者分批更新全部过期缓存。- 管理员缓存管理页为
cache-admin.html,主页面左侧栏最底部提供入口。页面可按底图、OpenFreeMap、铁路响应、环境响应等分类统计;更新按钮只处理允许在线更新的类别,删除操作必须再次勾选确认。 - 缓存管理页提供“查看缓存覆盖范围”地图。范围总览显示各类缓存的空间边界;瓦片类别可切换 Z3–Z18 查看实际缓存块。铁路和环境查询响应进一步拆分为国铁线路、地铁/轻轨、水域、植被、港口和行政边界六个可单独开关的专题图层;索引会从响应要素重建其对应的 OpenFreeMap 来源瓦片,因此切换 Z 级别后也能显示每个来源瓦片及边框。查询响应只包含访问过的视窗,不是全球完整覆盖;全球专题数据以 OpenFreeMap 全球原始矢量瓦片为准。
- 缓存管理主列表也使用上述六个专题条目,每项显示来源瓦片、响应索引和视窗范围数量。每行提供“查看瓦片”和“下载这些瓦片”;前者在覆盖地图中只显示该专题,后者直接按索引记录的真实 Z/X/Y 坐标创建 OpenFreeMap 瓦片任务,并在开放地图后台显示逐瓦片进度。行政边界不是外部本地 API,而是本服务从 OpenFreeMap 行政边界 MVT 生成并缓存的查询索引。
- “显示级别”按当前所选类别统计,并分别标出瓦片与查询结果范围。瓦片覆盖层用 Canvas 逐瓦片填充并绘制 1 像素边框;当屏幕尺寸小于 2 像素时只做合并填充,放大后自动恢复独立边框。切换到具体级别时会先聚焦主要缓存区域,仍可用“定位到覆盖范围”查看全部空间范围。
- 覆盖地图支持矩形框选。框选后会在当前勾选分类中筛选与范围相交的实际缓存文件;可只更新允许在线更新的文件,或在勾选“确认删除范围内缓存”后只删除范围相交文件。范围外缓存不受影响。
- 覆盖范围首次扫描会读取缓存索引文件;当前大型缓存首次约需 30 秒,之后从
cache/.cache-admin-coverage.json快速复用。缓存更新或删除后可点击“重新扫描覆盖范围”刷新索引。 - 缓存管理页的“更新全部已有瓦片”会忽略半年有效期,把所选可更新类别送入后台分批队列;不勾选时只处理已过期瓦片。查询响应专题更新的是其对应 OpenFreeMap 来源瓦片,成功后相关响应索引会失效并在下次浏览时重建。单次最多安排
--refresh-batch指定的数量,默认 128。 - 天地图瓦片、行政边界响应、派生铁路瓦片、按需裁切瓦片、待重试任务和下载暂存残留只允许删除,不允许在缓存管理页直接更新;删除后会由相应下载后台或后续浏览按需重建。
- 删除严格限制在
cache/白名单目录。cache/local-vector/、cache/local-vector-25/、cache/cache-only.setting、data/map-library/和data/map-library-25/不会被缓存管理页删除。存在运行中的天地图或开源地图手动下载任务时,删除接口会拒绝执行。 - 浏览器还会通过 Service Worker 和 HTTP 缓存保存底图、铁路、水域及前端资源,正常浏览不会强制绕过仍有效的旧缓存。
- D3、Leaflet、样式和应用脚本均使用版本化 URL。普通刷新遇到短暂资源失败时会自动重试,不需要立即 Ctrl+F5。
- 铁路“重新加载当前视窗铁路”会强制刷新当前视窗的铁路数据。
- 外地铁路首次查询失败时会进入服务端后台重试队列。
- 查询成功后,页面会轮询任务状态并自动显示线路。
- 天地图瓦片不参与自动刷新、当前视窗刷新或季度批量刷新,只能从下载后台手动更新。
- 1:100 万矢量瓦片保存在
cache/local-vector/,1:25 万保存在cache/local-vector-25/,构建完成后不依赖 GDAL、GDB 或外网运行。
本地矢量瓦片可通过以下命令重新构建。pyogrio、pyarrow 只用于离线构建;shapely 还用于高缩放瓦片的按需裁切。服务会依次检查项目内的 _gisread 和项目同级的 ..\_gisread,也可以通过 MAP_STUDIO_GIS_DEPS 指定其他位置:
python tools\import_map_archive.py --rebuild-only `
--database data\map-library\index.json `
--output cache\local-vector `
--zooms 3,4,5,6,7,8,9,10
python tools\import_map_archive.py --scale 25m --rebuild-only `
--zooms 8,9,10,11,12
导入地图压缩包
直接把一个或多个 ZIP 拖到 导入地图压缩包.bat,或者双击后选择文件。程序会:
- 计算外层 ZIP 和内部区块 ZIP 的 SHA-256。只有内部区块出现新内容或
--force时才继续。 - 安全解压外层 ZIP 和嵌套 ZIP。
- 识别 GDB 图幅、省/市/县行政 GeoJSON。
- 把归档登记到
data/map-library/index.json。 - 内部区块逐个比较。例如外层下载包包含 5 个区块,其中 3 个和以前相同、2 个变化时,只把 2 个变化区块视为新版本。全部区块相同时不复制、不解压、不重建。
- 相同分幅/图层以最新导入版本为准。被完整替代的旧归档及解压目录会自动删除,部分替代时只清理失效区块、图层和解压内容。
- 使用磁盘临时数据库分桶,避免大数据量重建时占满内存。
- 存在实际数据变化时,自动重建
cache/local-vector的 Z3–Z10 矢量瓦片。
可随时执行 --cleanup-only 清理已被替代的旧归档和孤儿解压目录,此操作不重建瓦片。
补充 1:25 万 ZIP 请拖到 补充1比25万地图数据.bat。程序使用独立的来源库 data/map-library-25/index.json 和瓦片目录 cache/local-vector-25/,重建 Z8–Z12;Z13–Z18 在浏览时按需裁切并缓存。1:100 万的 Z11–Z16 同样按需生成。
同一来源库和瓦片目录不能由两个导入任务同时写入。程序会在对应的 data/map-library/ 或 data/map-library-25/ 下创建 import.lock 文件锁:第二个任务会显示“另一个导入正在运行”并等待第一个完成,默认最多等待 6 小时。命令行可使用 --no-wait-lock 让第二个任务立即退出。
命令行方式:
python tools\import_map_archive.py D:\map\新的地图包.zip
缓存目录不要直接作为公网静态目录暴露。
公共瓦片与 Overpass 只适合原型、低流量和内部使用。正式产品请按照 api-comparison.html 中的建议切换到 MapTiler、高德、天地图或自建矢量瓦片方案,并完成署名、缓存、限额和中国大陆合规核对。
安全
- 默认只监听
127.0.0.1:8081,不要直接绑定0.0.0.0暴露到公网。 - 服务端静态文件采用白名单,
admin-password.txt、tianditu-key.txt、cache/、源码、构建工具和日志均不可通过 URL 下载。 - 编码后的
..、斜杠路径穿越会先解析为真实路径,再执行白名单检查。 - 管理员会话 Cookie 使用
HttpOnly、SameSite=Strict,并在代理声明 HTTPS 时增加Secure;会话有效期 8 小时。 - 登录、基础认证、数据查询和缓存刷新均有频率限制;大范围缓存刷新会在生成坐标列表前被拒绝。
- 全量缓存刷新、天地图下载和开源地图预下载需要管理员登录;两个下载后台共用同一管理员密码。天地图 KEY 不会返回浏览器,错误日志中的 KEY 会被脱敏。
- 响应包含
nosniff、X-Frame-Options: SAMEORIGIN、Referrer-Policy: no-referrer和noindex等安全头。 - Windows 下已将
admin-password.txt、tianditu-key.txt限制为当前运行用户可读取。
完整安全边界、接口限制和运维检查见 PROJECT_DOCUMENTATION.md。