本节摘要:海量轨迹、遥感、传感器数据超出传统 GIS 处理能力。本节讲 Spark、GeoMesa 等空间大数据技术——处理 TB 级空间数据。
阅读完本节,你应当能够:
传统 GIS 处理 GB 级,大数据是 TB/PB 级:
传统单机 GIS 跑不动,要分布式。

| 技术 | 特点 | 适合 |
|---|---|---|
| Spark + Sedona | 分布式空间计算 | 大规模分析 |
| GeoMesa | 时空索引 | 时空查询 |
| PostGIS + Citus | 分布式 PostgreSQL | 中等规模 |
Sedona 在 Spark 上加空间能力:
from sedona.register import SedonaRegistrator from sedona.core.SpatialRDD import PolygonRDD SedonaRegistrator.registerAll(spark) df = spark.read.parquet("trajectories") df.createOrReplaceTempView("traj") result = spark.sql(""" SELECT id, count(*) FROM traj WHERE ST_Contains(ST_PolygonFromText('...'), geom) GROUP BY id """)
Sedona 提供空间 RDD、空间 SQL、空间索引(R-树),在 Spark 集群并行算空间。
GeoMesa 在 NoSQL(Accumulo/HBase/Kafka)上加时空索引:
适合轨迹数据、物联网传感器数据。
遥感影像用 Spark + 阿里开源的 GeoPySpark 或 Google Earth Engine:
大数据空间索引要分布式:
物联网/轨迹是流式数据,用 Flink + 空间窗口:
⚠️ 常见坑:用单机 PostGIS 处理 TB 级——跑不动。大数据用 Spark+Sedona 或 GeoMesa 分布式处理。
💡 关键直觉:空间大数据用分布式:Spark+Sedona 做大规模分析,GeoMesa 做时空查询,PostGIS+Citus 中等规模。核心是分布式存储+空间索引+并行计算。
分布式系统把数据切分到多台机器,切分方式直接决定空间查询效率:
Sedona 默认对空间 RDD 做网格分区,并能为 join 建立空间索引;GeoMesa 用 Z-order 曲线存储,查询时空范围时只读相关文件块。
空间 join(如"每个网格内的轨迹点数量")在 Spark 里用 Sedona 的 SQL 很方便:
from sedona.register import SedonaRegistrator from sedona.utils import SedonaKryoRegistrator, KryoSerializer from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("spark.serializer", KryoSerializer.getName) \ .config("spark.kryo.registrator", SedonaKryoRegistrator.getName) \ .getOrCreate() SedonaRegistrator.registerAll(spark) grids = spark.read.parquet("grids.parquet") points = spark.read.parquet("traj_points.parquet") grids.createOrReplaceTempView("grids") points.createOrReplaceTempView("points") result = spark.sql(""" SELECT g.gid, count(*) AS cnt FROM grids g, points p WHERE ST_Contains(g.geom, p.geom) GROUP BY g.gid """) result.show()
要点:Spark 任务前必须注册 Sedona 的 Kryo 序列化器和 UDT,否则空间类型无法跨节点传输;join 会先做网格分区和空间索引,再广播小表,这部分由框架自动完成,但理解原理有助于调参。
GeoHash 把经纬度编码成字符串,长度越长精度越高。理解它的性质对做数据分片很有帮助:
# Python 示例:GeoHash 编码 import geohash2 code = geohash2.encode(39.9, 116.4, precision=6) print(code) # 6 位精度约 1.2km # 前缀相同的点空间上相邻,适合做分组聚合
用途很多:相同前缀归组做热力图、按前缀建分区表、轨迹压缩等。注意它适合"邻近搜索、聚合"这类场景,不适合精确距离计算,精度不够时要用更长的编码或回到精确几何。
某共享单车公司要分析"每个运营网格内早高峰的骑行量"。原始数据是每天上亿条 GPS 轨迹点,流程是:
这个流程的关键教训:不要用数据库做海量点级别的空间 join,它属于分析型负载,交给 Spark 批处理;汇总后的结果才是数据库该管的。分层处理(明细层、汇总层、应用层)是大数据 GIS 的标准结构。
下一节讲 AI 和 GIS 融合。