<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>GeoParquet 与 GeoJSON on File Format Blog</title>
    <link>https://blog.fileformat.com/zh/tag/geoparquet-%E4%B8%8E-geojson/</link>
    <description>Recent content in GeoParquet 与 GeoJSON on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh</language>
    <lastBuildDate>Wed, 04 Nov 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/zh/tag/geoparquet-%E4%B8%8E-geojson/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>GeoParquet 与 GeoJSON - 性能、文件大小与云原生 GIS 对比</title>
      <link>https://blog.fileformat.com/zh/gis/geoparquet-vs-geojson-which-gis-format-is-best-for-large-datasets/</link>
      <pubDate>Wed, 04 Nov 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/zh/gis/geoparquet-vs-geojson-which-gis-format-is-best-for-large-datasets/</guid>
      <description>在 GeoParquet 与 GeoJSON 之间犹豫不决？了解在管理海量 GIS 数据集时，文件大小、查询速度、列级编码以及云存储的比较情况。</description>
      <content:encoded><![CDATA[<p><strong>最后更新</strong>: 2026-11-04</p>
<figure class="align-center ">
    <img loading="lazy" src="images/geoparquet-vs-geojson-which-gis-format-is-best-for-large-datasets.png#center"
         alt="GeoParquet vs. GeoJSON: Which GIS Format Is Best for Large Datasets?"/> 
</figure>

<h2 id="geoparquet-与-geojson哪种-gis-格式更适合大型数据集">GeoParquet 与 GeoJSON：哪种 GIS 格式更适合大型数据集？</h2>
<p>如果你曾尝试在 QGIS 中打开一个 2 GB 的 GeoJSON 文件，或将一个包含数百万行多边形边界的文件加载到交互式地图中，你已经体会到屏幕冻结和内存不足崩溃的那种沉重感。</p>
<p>十多年来，<strong>GeoJSON</strong> 一直是网络制图的通用语言。它透明、易于阅读，并且几乎所有网络制图库和 REST API 都开箱即用地支持它。</p>
<p>然而，现代 GIS 工作流与 2008 年时截然不同。如今的地理空间从业者常规性地摄取数 GB（甚至 TB）级的物联网移动遥测数据、全国建筑轮廓、卫星衍生的分割掩膜以及高频率的气候网格。</p>
<p>在如此规模的数据集上使用时，GeoJSON 不仅仅是变慢——它会彻底成为数据架构的瓶颈。</p>
<p>引入 <strong>GeoParquet</strong>，它是一个开放、标准化的地理空间扩展，基于 Apache Parquet，并在开放地理空间联盟（OGC）内部孵化。</p>
<p>在本综合指南中，我们比较 GeoParquet 和 GeoJSON 在架构、存储效率、读写吞吐量、云就绪性和开发者体验方面，以回答一个关键问题：<strong>对于大型数据集，应该选择哪种格式？</strong></p>
<hr>
<h2 id="1-结构架构文本-vs-二进制列式">1. 结构架构：文本 vs. 二进制列式</h2>
<p>要了解为何这些格式在大规模下表现差异如此显著，必须深入查看它们各自如何表示坐标值和表格元数据。</p>
<pre tabindex="0"><code>+--------------------------------------------------------------+
| 评估指标 |
| **数据格式** |
| **几何表示** |
| **压缩比** |
| **列投影** |
+--------------------------------------------------------------+
                               VS
+--------------------------------------------------------------+
| **空间谓词下推** |
| **云对象存储 (S3/GCS)** |
| **人类可读性** |
| **网页浏览器支持** |
| **标准化组织** |
+--------------------------------------------------------------+
</code></pre><h3 id="geojson面向行的文本编码-json">GeoJSON：面向行的文本编码 JSON</h3>
<p>GeoJSON 将数据表示为 JSON 对象数组。每个特征都会显式重复属性键，并伴随一个字符串编码的浮点数数组：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;FeatureCollection&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;features&#34;</span>: [
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;Feature&#34;</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;properties&#34;</span>: { <span style="color:#f92672">&#34;county&#34;</span>: <span style="color:#e6db74">&#34;Travis&#34;</span>, <span style="color:#f92672">&#34;state&#34;</span>: <span style="color:#e6db74">&#34;TX&#34;</span>, <span style="color:#f92672">&#34;pop_density&#34;</span>: <span style="color:#ae81ff">1845.2</span> },
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#34;geometry&#34;</span>: {
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;type&#34;</span>: <span style="color:#e6db74">&#34;Point&#34;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#34;coordinates&#34;</span>: [<span style="color:#ae81ff">-97.74306</span>, <span style="color:#ae81ff">30.26715</span>]
</span></span><span style="display:flex;"><span>      }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  ]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>因为 GeoJSON 基于文本：</p>
<ul>
<li><strong>重复的模式：</strong> 像 <code>\&quot;properties\&quot;</code>、<code>\&quot;type\&quot;</code> 和 <code>\&quot;coordinates\&quot;</code> 这样的字段名会被重复数百万次，导致原始文件大小膨胀。</li>
<li><strong>昂贵的字符串转浮点转换：</strong> 在执行任何空间操作之前，CPU 必须将文本字符（<code>\&quot;-\&quot;, \&quot;9\&quot;, \&quot;7\&quot;, \&quot;.\&quot;, \&quot;7\&quot;...</code>）解析为 64 位 IEEE 双精度浮点数。</li>
<li><strong>单体读取需求：</strong> 标准 JSON 解析器必须将整个文件加载到内存中以构建文档对象模型（DOM）。读取单个属性需要解析每一个特征。</li>
</ul>
<h3 id="geoparquet面向列的二进制编码数据">GeoParquet：面向列的二进制编码数据</h3>
<p>GeoParquet 直接基于 <strong>Apache Parquet</strong> 构建，以列式而非行式方式存储空间表。</p>
<p>类似 <code>county</code> 的属性存储在连续块中，支持高级压缩技术，如行程长度编码（RLE）、位打包和字典压缩。几何数据采用 <strong>Well-Known Binary (WKB)</strong> 标准，并附带嵌入的 JSON 元数据，详细说明空间参考系统（CRS）、边界框和几何类型。</p>
<p>因为 GeoParquet 是二进制且列式的：</p>
<ul>
<li><strong>零坐标解析成本:</strong> 几何体直接以二进制形式存储，绕过昂贵的字符串转浮点转换。</li>
<li><strong>投影下推:</strong> 如果下游工作流仅需要 <code>county</code> 和 <code>pop_density</code> 列，读取器只会从磁盘或 S3 中获取 <em>仅</em> 那些字节偏移，完全跳过几何列。</li>
<li><strong>行组分区:</strong> Parquet 文件将记录拆分为自包含的 &ldquo;Row Groups&rdquo;（通常每组 100,000 到 1,000,000 行），并为每列提供最小/最大统计信息。</li>
</ul>
<hr>
<h2 id="2-正面对比核心指标">2. 正面对比：核心指标</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Evaluation Metric</th>
<th style="text-align:left">GeoJSON</th>
<th style="text-align:left">GeoParquet</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Data Format</strong></td>
<td style="text-align:left">Plain-text JSON (UTF-8)</td>
<td style="text-align:left">Binary columnar (Apache Parquet)</td>
</tr>
<tr>
<td style="text-align:left"><strong>Geometry Representation</strong></td>
<td style="text-align:left">Nested arrays of coordinate strings</td>
<td style="text-align:left">Standardized Well-Known Binary (WKB)</td>
</tr>
<tr>
<td style="text-align:left"><strong>Compression Ratio</strong></td>
<td style="text-align:left">Poor (requires gzip/bzip2 to reduce)</td>
<td style="text-align:left">Exceptional (native Zstd, Snappy, Gzip)</td>
</tr>
<tr>
<td style="text-align:left"><strong>Column Projection</strong></td>
<td style="text-align:left">❌ No (entire record must be parsed)</td>
<td style="text-align:left">✅ Yes (fetch only the columns you need)</td>
</tr>
<tr>
<td style="text-align:left"><strong>Spatial Predicate Pushdown</strong></td>
<td style="text-align:left">❌ No (requires full scan)</td>
<td style="text-align:left">✅ Yes (using bounding box metadata)</td>
</tr>
<tr>
<td style="text-align:left"><strong>Cloud Object Storage (S3/GCS)</strong></td>
<td style="text-align:left">❌ Poor (must download full file)</td>
<td style="text-align:left">✅ Cloud-native (supports HTTP range requests)</td>
</tr>
<tr>
<td style="text-align:left"><strong>Human Readability</strong></td>
<td style="text-align:left">✅ Direct viewing in text editors</td>
<td style="text-align:left">❌ Requires CLI, GIS app, or code</td>
</tr>
<tr>
<td style="text-align:left"><strong>Web Browser Support</strong></td>
<td style="text-align:left">Native JavaScript (<code>JSON.parse</code>)</td>
<td style="text-align:left">Requires WebAssembly (e.g., <code>duckdb-wasm</code>, <code>parquet-wasm</code>)</td>
</tr>
<tr>
<td style="text-align:left"><strong>Standardization Body</strong></td>
<td style="text-align:left">IETF (RFC 7946)</td>
<td style="text-align:left">OGC (Open Geospatial Consortium standard)</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="3-存储效率与文件大小基准">3. 存储效率与文件大小基准</h2>
<p>当规模从数千条记录扩展到数百万条记录时，存储差异会显著扩大。</p>
<p>在使用真实的开放空间记录（如 OpenStreetMap 建筑轮廓、美国人口普查 TIGER 边界和全球船舶 AIS 日志）的标准基准测试中，GeoParquet 相较于原始 GeoJSON 通常实现 <strong>70% 到 85% 的存储减少</strong>，并且比 <code>.geojson.gz</code> 额外提升 <strong>20% 到 40%</strong>。</p>
<h3 id="为什么-geoparquet-会小这么多">为什么 GeoParquet 会小这么多？</h3>
<ol>
<li><strong>字典编码:</strong> 重复的字符串属性（例如，州代码、土地使用分类）被索引为小整数指针，而不是反复存储为长字符串。</li>
<li><strong>紧凑二进制坐标:</strong> GeoJSON 中的二维点大约占用 30 到 45 字节的 ASCII 文本（<code>[-122.4194155, 37.7749295]</code>）。在 WKB 中，同一坐标对恰好需要 16 字节。</li>
<li><strong>现代压缩算法:</strong> Zstandard（<code>Zstd</code>）和 Snappy 对列式字节数组的压缩效果远优于标准 Gzip 对交错行文本的压缩。</li>
</ol>
<hr>
<h2 id="4-查询性能与云原生工作流">4. 查询性能与云原生工作流</h2>
<p>对于大型数据集来说，最大的区别不仅在于存储——而在于 <strong>查询延迟和内存利用率</strong>。</p>
<h3 id="1-通过列投影进行选择性读取">1. 通过列投影进行选择性读取</h3>
<p>想象一个包含 60 个属性（业主姓名、税号、契约历史、分区代码以及复杂的多多边形边界）的 15 GB 全国地块数据集。</p>
<ul>
<li><strong>In GeoJSON:</strong> 如果您想计算每个邮政编码的平均评估物业价值，您的分析引擎必须下载并解析全部 15 GB，包括数百万个复杂的边界顶点。</li>
<li><strong>In GeoParquet:</strong> 像 DuckDB、Apache Sedona、Polars 或 AWS Athena 这样的分析引擎仅读取 <code>zip_code</code> 和 <code>assessed_value</code> 列。无需传输 15 GB，您的引擎只下载并扫描不到 80 MB 的数据。</li>
</ul>
<h3 id="2-云存储上的-http-范围请求">2. 云存储上的 HTTP 范围请求</h3>
<p>GeoParquet 作为一种 <strong>云原生地理空间格式</strong>，可无缝运行。</p>
<p>由于 Parquet 文件在文件尾部存储内部偏移量和元数据，客户端库可以向 Amazon S3、Google Cloud Storage 或 Azure Blob Storage 等云对象存储发出 HTTP <code>GET Range: bytes=...</code> 请求。客户端无需下载整个多千兆字节的文件，而是读取文件尾部，确定相关记录所在的精确字节偏移，然后仅下载所需的子集。</p>
<pre tabindex="0"><code>Client (DuckDB / Python / QGIS)
       │
       ├── 1. Read footer metadata (HTTP Range Request) ───► Cloud Storage (S3 / GCS)
       │                                                              │
       ◄── 2. Returns column offsets &amp; row-group stats ───────────────┘
       │
       ├── 3. Read ONLY requested column chunks &amp; ranges ─────────────►
       │                                                              │
       ◄── 4. Fast binary stream (minimal I/O &amp; egress) ──────────────┘
</code></pre><hr>
<h2 id="5-软件生态系统与工具支持">5. 软件生态系统与工具支持</h2>
<p>从历史上看，GeoJSON 的主要优势是拥有通用的工具支持。虽然这在浏览器环境中仍然成立，但 GeoParquet 的生态系统已经快速成熟：</p>
<ul>
<li><strong>桌面 GIS：</strong> 在 <strong>QGIS 3.28+</strong>、ArcGIS Pro 和 GDAL/OGR 3.5+ 中提供原生读写支持。</li>
<li><strong>分析引擎与语言：</strong> 在 Python（<code>GeoPandas</code>、<code>pyarrow</code>）、R（<code>sf</code>）、DuckDB（通过空间扩展）、Apache Sedona 和 Snowflake 中提供快速向量化的读写能力。</li>
<li><strong>大数据管道：</strong> 在 Apache Spark、Trino、Presto 和 Databricks 之间实现原生集成。</li>
<li><strong>客户端网页地图：</strong> 轻量级 WebAssembly 库（如 <code>parquet-wasm</code> 和 <code>duckdb-wasm</code>）现在允许网页浏览器直接在客户端设备上查询 GeoParquet 文件，无需专用的 GIS 中间件服务器。</li>
</ul>
<hr>
<h2 id="6-实用决策矩阵何时使用哪种">6. 实用决策矩阵：何时使用哪种？</h2>
<pre tabindex="0"><code>                                Dataset Size &amp; Use Case
                                           │
             ┌─────────────────────────────┴─────────────────────────────┐
             ▼                                                           ▼
     Under 50–100 MB                                              Over 100 MB
(API payloads, simple maps)                                (Data warehousing, big data)
             │                                                           │
             ▼                                                           ▼
      Use **GeoJSON**                                            Use **GeoParquet**
• Direct Mapbox/Leaflet integration                        • High compression ratios
• Human-readable inspection                                • Sub-second analytical queries
• Standard REST API responses                              • Direct S3/GCS HTTP range reads
</code></pre><h3 id="如果选择-geojson">如果选择 GeoJSON：</h3>
<ul>
<li>您的数据集大小在 50 MB 到 100 MB 之间。</li>
<li>您正从 REST API 向前端客户端返回轻量级负载响应。</li>
<li>您正在使用 Leaflet、MapLibre 或 Mapbox GL JS 构建轻量级网页地图，无需中间转换层。</li>
<li>您需要在标准代码或文本编辑器中进行快速的手动编辑或检查。</li>
</ul>
<h3 id="如果选择-geoparquet">如果选择 GeoParquet：</h3>
<ul>
<li>您的数据集超过 100 MB，或包含数十万条复杂的空间要素。</li>
<li>您正在将矢量资产存储在云对象存储中（S3、GCS、MinIO、Azure Blob）。</li>
<li>您使用 Python、DuckDB、Spark 或 Databricks 运行空间 SQL 分析、特征工程或机器学习流水线。</li>
<li>您希望降低存储成本，避免网络出站费用，并消除内存崩溃。</li>
</ul>
<hr>
<h2 id="7-迁移示例将-geojson-转换为-geoparquet">7. 迁移示例：将 GeoJSON 转换为 GeoParquet</h2>
<p>将现有空间资产转换为 GeoParquet 只需几行代码。</p>
<h3 id="使用-pythongeopandas">使用 Python（GeoPandas）</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> geopandas <span style="color:#66d9ef">as</span> gpd
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 1. Read the legacy GeoJSON file</span>
</span></span><span style="display:flex;"><span>gdf <span style="color:#f92672">=</span> gpd<span style="color:#f92672">.</span>read_file(<span style="color:#e6db74">&#34;large_boundaries.geojson&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 2. Write directly to GeoParquet using modern Zstandard compression</span>
</span></span><span style="display:flex;"><span>gdf<span style="color:#f92672">.</span>to_parquet(<span style="color:#e6db74">&#34;large_boundaries.parquet&#34;</span>, compression<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;zstd&#34;</span>)
</span></span></code></pre></div><h3 id="使用-gdal--ogrcli">使用 GDAL / OGR（CLI）</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>ogr2ogr -f Parquet <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  -oo LCO:COMPRESSION<span style="color:#f92672">=</span>ZSTD <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  large_boundaries.parquet <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  large_boundaries.geojson
</span></span></code></pre></div><h3 id="使用-duckdb">使用 DuckDB</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span>INSTALL spatial;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">LOAD</span> spatial;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">-- Direct convert via SQL
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">COPY</span> (
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">SELECT</span> <span style="color:#f92672">*</span> <span style="color:#66d9ef">FROM</span> ST_Read(<span style="color:#e6db74">&#39;large_boundaries.geojson&#39;</span>)
</span></span><span style="display:flex;"><span>) <span style="color:#66d9ef">TO</span> <span style="color:#e6db74">&#39;large_boundaries.parquet&#39;</span> 
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">WITH</span> (FORMAT PARQUET, COMPRESSION <span style="color:#e6db74">&#39;ZSTD&#39;</span>);
</span></span></code></pre></div><hr>
<h2 id="8-总结大数据集的结论">8. 总结：大数据集的结论</h2>
<p>对于小型数据集和直接的 Web 端点，GeoJSON 仍然是可靠、免烦恼的实用格式。</p>
<p>然而，<strong>对于大型数据集，GeoParquet 在每个运营类别中客观上都更优</strong>。它提供更小的文件体积、显著降低的存储开销、近乎即时的空间读取，以及与现代云数据仓库的原生集成。</p>
<p>如果您的地理空间管道因超大 GeoJSON 文件的负担而喘不过气来，切换到 GeoParquet 是您可以进行的最有效的基础设施升级之一。</p>
<hr>
<h2 id="常见问题解答faq">常见问题解答（FAQ）</h2>
<p><strong>Q1. GeoParquet 是官方认可的 GIS 标准吗？</strong> 是的，GeoParquet 是在开放地理空间联盟（OGC）指导下维护的官方开放标准。</p>
<p><strong>Q2. 我可以在 Leaflet 或 Mapbox GL JS 等网络制图库中直接渲染 GeoParquet 文件吗？</strong> 虽然不像 GeoJSON 那样原生解析，但您可以使用 WebAssembly 包（如 <code>parquet-wasm</code>）在浏览器中渲染 GeoParquet，或在导入时将文件转换为矢量瓦片（PMTiles/MVT）。</p>
<p><strong>Q3. GeoParquet 支持多坐标参考系统（CRS）吗？</strong> 是的，与严格限制为 WGS 84 / EPSG:4326（RFC 7946）的 GeoJSON 不同，GeoParquet 允许在其嵌入的文件元数据中直接定义自定义 CRS。</p>
<p><strong>Q4. GeoParquet 与 FlatGeobuf 在大型空间数据集方面如何比较？</strong> FlatGeobuf 针对使用 R-Tree 空间索引直接流式传输空间要素到交互式网络地图进行了优化，而 GeoParquet 则旨在实现高性能列式分析、压缩以及大规模数据湖仓储。</p>
<p><strong>Q5. 我可以在桌面 GIS 软件如 QGIS 中打开 GeoParquet 文件吗？</strong> 是的，现代版本的 QGIS（3.28 及以上）支持拖拽、查看和样式化 GeoParquet 文件，无需第三方插件。</p>
<h2 id="另见">另见</h2>
<p><a href="https://blog.fileformat.com/gis/gis-file-formats-at-fileformat-com/"><strong>FileFormat.com 上的 GIS 文件格式</strong></a></p>
<p><a href="https://blog.fileformat.com/gis/gis-file-formats-at-fileformat-com/"><strong>Google Maps 的前 5 大 GIS 文件格式</strong></a></p>
<p><a href="https://news.fileformat.com/t/GIS"><strong>文件格式新闻</strong></a></p>
<p><a href="https://forum.fileformat.com/c/gis"><strong>文件格式论坛</strong></a></p>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
