H3分辨率6单元格跨时区多边形重复问题咨询
H3分辨率6单元格与时区映射的重复问题
背景
我正在生成一份H3分辨率6单元格到时区的映射数据集,目的是通过H3到H3的关联操作,替代地理空间关联(比如contains),来更快地为地理空间/时间数据集生成本地日期时间条目。我使用Apache Spark和Sedona完成这项工作,数据集采用的是timezones-with-oceans-now.geojson。
问题现象
目前生成的数据集里,有超过4万个H3分辨率6单元格存在重复映射——每个重复单元格都对应两个时区,没有单元格同时映射到三个时区的情况。重复情况的统计结果如下:
| timezone_ids | num_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
相关产品推荐
相关产品推荐

