You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

H3分辨率6单元格跨时区多边形重复问题咨询

H3分辨率6单元格与时区映射的重复问题

背景

我正在生成一份H3分辨率6单元格到时区的映射数据集,目的是通过H3到H3的关联操作,替代地理空间关联(比如contains),来更快地为地理空间/时间数据集生成本地日期时间条目。我使用Apache Spark和Sedona完成这项工作,数据集采用的是timezones-with-oceans-now.geojson。

问题现象

目前生成的数据集里,有超过4万个H3分辨率6单元格存在重复映射——每个重复单元格都对应两个时区,没有单元格同时映射到三个时区的情况。重复情况的统计结果如下:

timezone_idsnum_h3_res6
[Asia/Manila, Asia/Dhaka]40001
[Europe/Moscow, Asia/Dubai]352
[Asia/Gaza, Asia/Jerusalem]116
[America/Los_Angeles, America/Anchorage]67
[America/New_York, America/Halifax]14
[Asia/Kolkata, Asia/Kathmandu]14
[Asia/Dhaka, Asia/Karachi]9
[Asia/Manila, Asia/Tokyo]8
[Africa/Lagos, Europe/Paris]5
[America/Anchorage, America/Phoenix]4
[Asia/Jakarta, Asia/Yangon]4
[Europe/Moscow, Asia/Karachi]3
[Asia/Kolkata, Asia/Dhaka]2
[Africa/Casablanca, Europe/Paris]2
[Africa/Johannesburg, Europe/Moscow]2
[Asia/Jakarta, Asia/Manila]1
[Asia/Tokyo, Australia/Brisbane]1
[America/Los_Angeles, Pacific/Gambier]1
[Europe/Athens, Africa/Johannesburg]1
[America/Denver, America/Phoenix]1
[Pacific/Honolulu, Pacific/Pago_Pago]1

实现代码

我的Spark处理代码如下:

import pyspark.sql.functions as sql_functions
from sedona.spark.sql import st_functions as stf

timezones = (
    sedona.read.format("geojson")
    .load("s3a://my_bucket/timezones/*.json")
    .option("multiline", "true")
    .selectExpr("explode(features) as features")
    .select("features.*")
    .withColumn("timezone_id", sql_functions.expr("properties['tzid']"))
    .drop("properties", "type")
    .repartition(200)
    .select(
        "timezone_id",
        sql_functions.explode(stf.ST_H3CellIDs("geometry", 6, False)).alias("h3_res6")
    )
)

查看重复的查询代码:

(
    timezones
    .groupBy("h3_res6")
    .agg(
        sql_functions.collect_set("timezone_id").alias("timezone_ids"), 
        sql_functions.count("*").alias("count")
    )
    .filter(sql_functions.col("count") > 1)
    .groupBy("timezone_ids")
    .agg(
        sql_functions.array_size(
            sql_functions.collect_set("h3_res6")
        ).alias("num_h3_res6")
    )
    .orderBy(sql_functions.col("num_h3_res6").desc())
    .show(25, truncate=False)
)

疑问与求助

我原本以为设置fullCover=False时,会用H3单元格的质心来判断其所属的时区多边形。如果这个理解是对的,那意味着有超过4万个H3分辨率6单元格的质心恰好落在两个时区的边界线上——这看起来不太合理。我也猜测过是不是有些时区存在重叠的多边形,但觉得这种可能性不大。

想问:有没有人遇到过这种情况?这是常见/已知的问题吗?如果是,最佳的处理方式是什么?我目前想到可以为每个H3单元格取最小的timezone_id来确定性去重,但这种方式感觉很随意。


内容的提问来源于stack exchange,提问作者CopyOfA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 14:42:32