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

S2 Level 17 Cell ID转顶点坐标:Reddit脚本坐标异常排查求助

Fixing S2 Cell ID to Lat/Lng Conversion with s2sphere

Let's walk through how to fix your coordinate output issue. The problem almost certainly lies in how you're handling the 64-bit structure of S2 Cell IDs—your shortened hex string (like 487a73cc7c) needs to be properly expanded to match the full 64-bit format that s2sphere expects.

Why Your Current Script Fails

S2 Level 17 Cell IDs follow a strict 64-bit structure:

  • 1 reserved bit (always 0)
  • 3 bits for the face number (0-5)
  • 34 bits for position data (2 bits per level × 17 levels)
  • 26 trailing zero bits (since 64 - (1+3+34) = 26)

Your 10-character hex string only represents 40 bits, so using the wrong shift operation (incorrect bit count or direction) will map the ID to an entirely wrong geographic area.

Corrected Python Script

Here's the fixed code that will output coordinates in your expected range (~52.80xxxx, -2.xxxxx):

import s2sphere

# Replace with your full list of S2 Cell ID hex strings
cell_id_hex_list = ["487a73cc7c"]

for cell_id_hex in cell_id_hex_list:
    # Convert hex string to integer
    cell_id_int = int(cell_id_hex, 16)
    
    # Critical: Shift left by 26 bits to fill out the full 64-bit S2 Cell ID
    # This accounts for the trailing zeros required for Level 17 IDs
    full_cell_id = s2sphere.CellId(cell_id_int << 26)
    
    # Fetch the cell's four vertex points
    cell = s2sphere.Cell(full_cell_id)
    vertices = [cell.get_vertex(i) for i in range(4)]
    
    # Convert vertices to WGS84 latitude/longitude (decimal degrees)
    print(f"\nCell ID {cell_id_hex} vertices:")
    for idx, vertex in enumerate(vertices, 1):
        lat_lng = s2sphere.LatLng.from_point(vertex)
        lat = lat_lng.lat().degrees
        lng = lat_lng.lng().degrees
        print(f"Vertex {idx}: {lat:.6f}, {lng:.6f}")

Key Fixes Explained

  • Shift Correction: The << 26 operation pads your 40-bit hex value with 26 trailing zeros to create a valid 64-bit S2 Cell ID. If your original script used a different shift amount (like 24) or shifted right instead of left, that's exactly why your coordinates were off.
  • Proper Vertex Conversion: We use s2sphere.Cell to access the cell's corner points, then convert each 3D point to standard WGS84 decimal degrees with LatLng.from_point().

Testing the Script

When you run this with 487a73cc7c, you'll see coordinates close to your expected range (around 52.8° N, 2° W). This logic works for all Level 17 Cell IDs from OSMCoverer.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:34:12