把空间数据发布成“文件放在对象存储里”,并不等于把服务器删掉就完成了数据基础设施。若 GeoParquet 没有空间排序与统计,远程查询仍会扫描大量无关 row group;若 COG 没有可用 overview 或服务端不支持 range request,浏览器也无法高效读取;若 catalog 没有明确的来源、许可、文档和 agent 使用说明,用户从文件直连得到的只是更难诊断的失败。Portolan 的官方发布提出一种 serverless SDI 的质量底线:以对象存储中的云优化文件和 STAC catalog 为发布面,在既有标准上规定可验证的结构、托管和文档要求,并用 validator 输出 agent-friendly JSON。
这不是要宣称 API、数据库或 GeoServer 已经失去价值。Portolan 的官方 FAQ 明确说明,对于特定场景仍可以在文件之上增加 API、数据库或应用服务;它处理的是“公开、读多写少的数据是否必须先穿过专属 serving layer 才能被使用”的问题。团队应根据访问控制、事务编辑、查询成本与用户能力决定架构,并先证明发布的文件确实符合直接使用的条件。
可核查事实
-
Portolan 的官方文章发布于 2026 年 9 月 2 日,将其定义为用于发布 serverless spatial data infrastructure 的开源 specification 和 toolkit。
-
文章说明 Portolan 以 S3-compatible object storage 中的文件为 SDI 基础,不要求 servers、databases 或 custom APIs 作为每次数据访问的中间层。
-
Portolan 使用 GeoParquet 与 PMTiles 发布 vector data,使用 COG 发布 raster;文章称未来计划支持 Zarr 和 COPC。
-
Portolan 使用 STAC 组织数据,使 catalog 在十个文件到一千万个文件的规模下保持一致的组织、索引、搜索和导航方式。
-
官方文章要求 Portolan catalog 包含 README 与
AGENTS.md,以帮助人和 agent 理解访问模式、schema 与数据质量说明。 -
文章明确指出:没有 bbox structs 和 spatial ordering 的 GeoParquet 会让空间查询明显变慢;缺少 CORS 的托管数据不能直接用于 serverless web app。
-
Portolan 提供
rashidvalidator,用于检查 catalog 是否符合 specification,并输出 agent-friendly JSON 以定位不符合项。 -
官方 FAQ 说明 conformance 不只检查 metadata 声明,还会检查 GeoParquet spatial ordering、row-group statistics、COG embedded statistics,以及 HTTP range requests 与 CORS 等可验证条件。
-
FAQ 说明 access-controlled data 计划在 v1.0 支持,transactional editing 目前尚不支持;项目仍处于 early stage,规范和工具可能存在 breaking changes。
这些事实提供的是发布质量合同,而不是性能或成本保证。每个组织还必须在自己的对象存储、网络、数据量、权限模型和访问模式下测量实际结果。
核心机制
文件直连 SDI 的关键在于把服务端原本隐含的查询能力,转化为文件和 catalog 的明确属性。GeoParquet 的空间排序和 row-group statistics 使客户端能判断哪些数据块可以跳过;COG 的 overview、内部统计与 HTTP range request 让客户端获取当前视图所需的瓦片和分辨率;PMTiles 让交互地图直接读取发布物;STAC 则为这些 assets 提供集合、时空范围、版本和链接关系。
Portolan 的作用不是再定义一套 roads 或 parcels 的通用业务 schema,而是为包装、托管、文档和访问建立质量底线。因此 validation 应分为两层:结构层检查 catalog/STAC/schema 是否完整;数据层检查文件里的空间排序、统计、overview 等是否真的与声明一致。只通过 JSON schema 不能证明一个 GeoParquet 可高效过滤,也不能证明一个 COG 的 overview 和 range 请求能在浏览器里工作。
GIS 场景
设想一个省级开放数据团队要发布建筑、道路、洪水深度和风险图层。团队把矢量写成 GeoParquet、底图写成 COG、交互样式写成 PMTiles,并以 STAC catalog 组织 collection。发布前,validator 检查目录、文档和可验证文件属性;发布后,在 QGIS、DuckDB、浏览器和 Agent 上执行同一组 AOI/时间/字段查询。结果记录每个客户端读取的字节、响应时间、命中数和数据版本,避免只凭服务端下载成功就判断“云原生”。
面向 Agent 的 AGENTS.md 不应成为放宽访问的说明。它应写清 data quality notes、schema conventions、推荐查询、范围限制、许可、更新频率和不应使用的字段;实际授权仍由对象存储、签名 URL、网关或 API 层执行。对于涉及个人位置、关键基础设施或商业数据的 catalog,当前没有 access-controlled 发布能力就意味着不应把私有数据伪装成公开 files-first catalog。
技术路径
先为每个 collection 建立发布 manifest:数据集 owner、版本、许可、更新窗口、STAC collection/item 位置、assets、CRS、空间覆盖、格式、预期查询形状、CORS/range request 状态和保留策略。GeoParquet 检查 spatial ordering、bbox/row-group statistics、几何 encoding 与字段类型;COG 检查 overview、统计、nodata、HTTP range;PMTiles 检查 style、source URL 与缩放级别。manifest 不能只描述“准备这样发布”,必须保留 validator 输出和抽样读取证据。
然后运行客户端矩阵。DuckDB 与其他分析工具验证空间过滤、join 和实际字节读取;QGIS 验证 catalog 浏览、CRS 和样式;浏览器验证 CORS、range request、首次/热缓存体验;Agent 验证能否根据 AGENTS.md 构造受限查询并返回数据版本。任一客户端只能读取全文件、跨域失败、或以错误 CRS 呈现时,发布状态应是待修复,而不是因为另一个客户端可用就宣布合格。
最后区分发布层和服务层。公共、读多写少的数据可从文件直连获得可移植性;复杂鉴权、事务编辑、昂贵计算、聚合隐私保护或稳定 SLA 仍可增加数据库、API 或应用服务。服务应引用同一份 catalog/version,而不是产生无法回溯的第二份数据真相。
风险边界
Serverless 不是零成本:对象存储请求、egress、浏览器内存、冷缓存、客户端实现和大范围扫描都会影响体验与费用。STAC、GeoParquet、COG 与 PMTiles 的存在也不保证它们按照可部分读取的方式生成或托管。Portolan 当前仍是 early-stage 项目,access-controlled data 和 transactional editing 尚未支持,规范可能变化。对需要写入一致性、复杂权限、强 SLA 或敏感数据的系统,应保留适当服务层和组织级安全控制。
检查清单
-
为每个 catalog/collection 保存 owner、版本、许可、更新窗口、STAC 地址、asset、CRS 和访问策略。
-
验证 GeoParquet 的空间排序、bbox/row-group statistics、geometry encoding 与部分读取效果。
-
验证 COG overview、nodata、内部统计和 HTTP range;验证 PMTiles 样式、source 与缩放范围。
-
以浏览器、QGIS、DuckDB 和 Agent 运行同一组查询,记录命中、字节、耗时、版本和失败类别。
-
要求 README 与
AGENTS.md说明 schema、质量、推荐查询、许可、更新频率和访问边界。 -
将 validator 的结构/数据检查结果和抽样读取证据同 manifest 一起保存。
-
对私有、可编辑或高风险数据保留授权与服务层;当前不以 files-first 替代事务和访问控制。
结论
Portolan 把云优化文件、STAC 元数据和文档提升为 SDI 的发布合同。真正的收益不在于少部署一个服务,而在于让任何合格客户端都能从同一版本、同一份文件和同一份说明得到可追溯的数据。先验收格式、托管和文档质量,再决定哪些场景需要额外服务层,才能让文件直连成为可靠基础设施。
参考来源
-
Portolan《Introducing Portolan: A serverless spatial data infrastructure》:https://portolan-sdi.org/blog/introducing-portolan
-
Portolan FAQ:https://portolan-sdi.org/faq