TerriaMap 开发实战01:从零搭建一个可定制的三维地理信息平台

发布时间:2026/11/5 6:53:03

TerriaMap 开发实战01:从零搭建一个可定制的三维地理信息平台 文章目录一、写在前面为什么是 TerriaJS二、Terria系列体系里的五个角色三、TerriaMap介绍四、TerriaMap Start教程五、TerriaMap 目录结构六、总结一、写在前面为什么是 TerriaJS如果你做过三维 GIS 项目大概率经历过这样的过程先用 Cesium 把地球转起来然后自己写图层管理、目录树、图例、时间轴、底图切换再补上 GeoJSON、WMS、WMTS、3D Tiles、地形、影像……最后发现 60% 的代码都在重复造轮子而且每个项目都要再造一遍。那么有没有一个成熟的开源目录树框架可以直接开箱即用呢TerriaJS 解决的正是这个问题。TerriaJS 是一个开源的地理信息系统GIS平台提供了丰富的 API 和组件主要用于创建基于 Web的交互式地图和可视化地理数据应用程序。它是在 Cesium 之上构建的一套地理数据目录 地图应用框架支持地图渲染、场景管理、数据可视化等功能集成了 Cesium用于 3D WebGL 渲染和 Leaflet用于 2D 地图可以处理广泛的地理空间数据格式如 GeoJSON、KML 和 WMS等。底层渲染Cesium3D/ Leaflet2D上层能力数据目录Catalog、Workbench 图层管理、时间轴、图例、分享、搜索、量测、绘图等扩展方式JSON 配置 React 插件 自定义 CatalogItem 模型应用形态TerriaMap 是官方提供的应用壳terriajs是核心库。一句话概括Cesium 负责把地球画出来TerriaJS 负责把数据管起来、把交互做完整。本专栏按照我自己使用TerriaMap的项目经历出发把我在实际项目过程中遇到的二次开发的问题和踩过的坑给大家进行总结按真实项目的落地方案把TerriaMap的配置体系、数据接入、插件开发、模型定制和部署上线串成一条完整的工程链路。给大家分享学习。仓库地址https://github.com/TerriaJS/terriajs二、Terria系列体系里的五个角色打开官网你会发现 “Terria”“TerriaJS”“TerriaMap”“terriajs-server” 混着出现很容易懵。官方在 TerriaJS README 的 Components and naming 里给过定义我把它翻译成一张表开始使用 TerriaJS 的最简单方法是使用TerriaMap。TerriaMap是基于TerriaJS的具体实现它利用TerriaJS的功能和API提供用户友好的地图界面。TerriaMap 提供了一个完整的用户界面和功能集可以作为一个独立的应用程序使用也可以作为定制 TerriaJS 应用程序的起点简单来说TerriaJS 是构建 TerriaMap 的基础框架而 TerriaMap 是基于 TerriaJS 构建的一个具体的应用程序。而TerriaJS Server是一个用于托管TerriaJS应用的后端服务。它可以提供数据访问、处理和安全控制等功能以支持TerriaJS应用的运行。三、TerriaMap介绍官方 Getting Started 第一句“The easiest way to get started with TerriaJS is to useTerriaMap. TerriaMap is a full-featured application built on TerriaJS, ready to be customized with your own branding and catalog.”翻译过来TerriaMap它不是地图引擎也不是低代码平台而是一个数据目录驱动的 GIS 站点成品骨架——你换掉品牌、换掉目录、换掉底图它就是一个新的行业平台。TerriaMap天生自带的能力官方 README 归纳不是 GIS 服务端不做数据发布、不做切片、不做空间分析。WMS/瓦片/地形都要你另外准备GeoServer、自建切片、ArcGIS Server、对象存储。不是可视化大屏它的 UI 是资源管理器风格不是炫酷驾驶舱。要大屏得自己写面板。不是开箱即用的业务系统登录、权限、前后端交互等二次开发功能都要自己加。不保证国内底图/坐标系开箱可用天地图、内网瓦片都要手工配置。支持插件和个性化设置自定义数据结构、自定义符号化需要开发者按照需求自定义扩展、开发插件等。四、TerriaMap Start教程安装教程下载源码git clone [https://github.com/TerriaJS/TerriaMap.git](https://github.com/TerriaJS/TerriaMap.git)clone 下来之后第一眼该看的 5 个文件安装构建cd TerriaMap export NODE_OPTIONS--max_old_space_size4096 # Windows PowerShell 设置Linux/macOS 用 export npm install -g yarn yarn install yarn gulp yarn start注意官方文档写的是yarn install yarn gulp yarn start但第一次构建内存不够是最高频的失败点务必先设NODE_OPTIONS。打开http://localhost:3001主页面如下通过自带的目录数结构可以管理不同格式的数据实现数据的浏览、加载、符号化显示还有自带的数据对比功能可以直观对比不同时序下特征要素的差异五、TerriaMap 目录结构项目成功构建后目录结构如下TerriaMap/ ├─ entry.js # webpack 入口 ├─ index.js # 应用主入口new Terria → ViewState → start → render ├─ plugins.ts # 插件清单loadPlugins 按这里加载 ├─ gulpfile.js # 构建任务定义lint / copy-assets / render-index / write-version / webpack ├─ package.json # 依赖与 npm scriptsstart / gulp / hot / docker-build-* ├─ tsconfig.json # TypeScript 配置 ├─ serverconfig.json # terriajs-server 配置端口、代理白名单、CORS ├─ Dockerfile # 仓库自带的多阶段镜像build: node:16 → deploy: node:16-slim ├─ version.js # gulp write-version 生成供模板注入 ├─ terria-logo.png # 默认 Logo ├─ yarn.lock / .yarnrc # 依赖锁定与 yarn 配置 ├─ .eslintrc / .prettierrc / .editorconfig / .husky # 代码规范与 git hooks ├─ .devcontainer/ # VS Code 容器化开发环境 │ ├─ lib/ # 【应用层代码】TerriaMap 自己的 React 代码 │ ├─ Core/loadPlugins.ts # 插件加载逻辑读 plugins.ts逐个注册 │ ├─ ViewModels/PreviewLinkViewModel.js │ ├─ Views/ # 应用级视图UserInterface、render、About 按钮、免责声明 │ │ ├─ UserInterface.jsx # 页面骨架菜单、侧栏、地图容器 │ │ ├─ render.jsx # ReactDOM 挂载 │ │ ├─ AboutButton.jsx │ │ └─ global.scss │ └─ Styles/ # 全局样式变量与加载动画 │ ├─ wwwroot/ # 【静态资源 运行时配置 构建产物】 │ ├─ index.ejs # HTML 模板gulp render-index 编译成 index.html │ ├─ index.html # 生成物不要手改 │ ├─ config.json # 主配置品牌名、初始视角、底图、地形、工作台… │ ├─ version.json # 生成物版本 / commit线上排查用 │ ├─ init/ # 目录初始化文件Catalog 树、图层清单 │ │ └─ simple.json │ ├─ build/ # webpack 产物TerriaMap.js、TerriaJS/gulp copy 而来 │ ├─ data/ # 演示数据、图标、样式 JSON │ ├─ images/ favicons/ # 图片与站点图标 │ ├─ languages/ # 多语言文案包 │ ├─ help/ # 帮助文档页面 │ ├─ public/ # 额外静态站点内容 │ ├─ test/ # 前端测试页 │ └─ 404.html / 500.html / about.html / privacy.html │ ├─ packages/ # 【插件工作区】每个 plugin-* 都是独立包只有 src/ │ ├─ plugin-sample/ # 官方示例模板写新插件从这 copy │ └─ store/ # 插件间共享状态 │ ├─ buildprocess/ # 【构建配置】 │ ├─ webpack.config.js # 主构建配置含 terriajs 路径解析、插件别名 │ ├─ webpack.config.hot.js # 热更新开发配置 │ └─ configureWebpackForPlugins.js │ ├─ patches/ # patch-package 补丁如 protomaps1.19.0.patch ├─ deploy/ # 部署资产 │ ├─ docker/ # create-docker-context.js 官方 10 行 Dockerfile │ ├─ helm/ # Helm chart │ ├─ kubernetes/ # RBAC 配置 │ └─ varnish/ # 缓存层配置 ├─ doc/deploying/ # 部署文档 └─ architecture/ # 架构决策记录ADR1.wwwroot/配置项应该改config.json、init/*.json、index.ejs、images/、languages/、help/不该改index.html、version.json、build/——这三个都是 gulp 生成的改了下次构建就没了。2.lib/TerriaMap 自己的代码只有 8 个文件左右是“应用壳”级别的 UI页面骨架、About 按钮、免责声明、预览链接、全局样式。它和node_modules/terriajs/lib是两个完全不同的东西3.packages/插件工作区每个插件只有src/通过plugins.ts注册。写新插件最省事的做法是复制plugin-sample再改名。store/是插件之间共享的状态模块。4.buildprocess/构建配置webpack.config.js里最关键的一句是通过require.resolve(terriajs/package.json)找到node_modules/terriajs并把它加进resolve.alias5.deploy/、doc/、architecture/、patches/deploy/docker/官方 Docker 方案create-docker-context.js重新生成一个精简的构建上下文deploy/helm、kubernetes、varnish集群部署与缓存patches/patch-package补丁yarn install的 postinstall 会自动打上architecture/ADR记录“为什么这么选”。六、总结本篇文章介绍了什么是TerriaMap以及如何快速clone一个可执行的项目。下一篇技术文章将介绍如何基于官方提供的Demo在不修改核心底层源码的前提下仅通过调整配置项的方式完成自定义数据集的接入、适配与项目改造构建符合自身业务需求的专属项目。
延伸阅读

更多相关文章

2026/11/5 6:53:03

向量库的存储别绑死一块盘:用 RustFS 给 Milvus 当 S3 对象底座

Milvus 跑起来,向量、索引和一堆相关对象默认写在它自己的本地卷里。单机验证很顺,可一旦向量量上来,本地盘的容量、IO 和单点就成了绕不开的墙。更麻烦的是,向量库的数据量和查询负载往往不是线性增长,一次模型切换就…

2026/11/5 6:48:03

下单不付款库存被占?Flask定时任务自动取消超时订单+回滚库存

⚠️ 免责声明:本文项目仅供技术学习参考,严禁直接作为毕业设计或课程作业提交。请结合自身需求进行二次开发与创新,学术诚信从我做起 🙂这事服务端不干,库存就锁死了 先还原一个事故现场。 你的商城里有一件爆款卫衣&…

2026/11/5 8:33:16

智能驾驶中的鸟瞰视角(BEV)技术解析与应用实践

1. 鸟瞰视角在智能驾驶中的核心价值在智能驾驶系统中,鸟瞰视角(BEV,Birds Eye View)技术正逐渐成为环境感知的关键组成部分。与传统的前视或环视摄像头相比,鸟瞰视角通过将多个摄像头的图像拼接并投影到俯视平面&#…

2026/11/5 8:33:16

vLLM分布式数据并行原理与调优实践

1. 项目背景与核心概念 在大模型推理领域,分布式并行技术是突破单卡显存限制的关键手段。最近在调试一个基于vLLM框架的分布式数据并行(DP)实现时,遇到了几个典型问题。这里记录下vLLM中DP并行的实现原理、常见问题及解决方案。 vLLM作为当前最流行的高…

2026/11/5 8:33:16

MySQL内置函数实战技巧与性能优化指南

1. MySQL内置函数全面解析作为一名长期与MySQL打交道的开发者,我发现很多刚入门的同行对内置函数的理解仅限于表面用法。今天我将结合多年实战经验,深度剖析MySQL最常用的四类内置函数,带你掌握那些官方文档里没写的实用技巧。2. 日期函数实战…

2026/11/5 8:33:16

0-1 BFS算法在水质检测最短路径问题中的应用

1. 问题背景与算法选型蓝桥杯竞赛中的"水质检测"问题是一个典型的图论最短路径问题。题目通常描述为:给定一个NM的网格地图,其中某些网格是污染源(障碍物),检测员需要从起点出发,找到到达目标点的…

2026/11/5 8:33:16

Docker Compose 下载与更新全攻略:镜像加速、离线安装与版本升级

1. 为什么一个“下载并更新”的动作值得单独写一篇docker-compose这个工具,但凡做过容器化部署的人都不陌生。它把一堆docker run命令收进一个 YAML 文件里,一条docker-compose up -d就能把整套服务拉起来。但真正让人卡住的,往往不是写 comp…

2026/11/5 8:28:15

OpenMV与STM32F103C8T6串口通信实现物料搬运机器人视觉控制

简介:这份资源面向参加工程训练类比赛的学生与嵌入式初学者,提供一套基于OpenMV视觉模块与STM32F103C8T6微控制器的物料搬运机器人完整代码方案,用C语言实现图像识别、目标定位与运动控制的协同,解决机器人自主识别物料并完成抓取…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑