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

PHP解码SQLite中Geometry Blob二进制坐标数据问题求助

PHP解析SQLite Geometry Blob提取坐标

核心解析逻辑

根据你描述的二进制格式(开头32位无符号整数记录坐标对数量,后续为连续的32位单精度浮点数坐标对),结合你参考的C++实现逻辑,PHP可以通过unpack函数完成二进制数据解析,关键是匹配字节序(通常x86架构下为小端序)。

完整实现代码

<?php
// 假设从SQLite获取的Blob二进制数据
$blobData = file_get_contents('your_geometry_blob.dat'); // 或从PDO查询结果直接获取

// 1. 解析开头的32位无符号整数(坐标对数量)
$header = unpack('VcoordCount', $blobData);
$coordCount = $header['coordCount'];

$coordinates = [];
$offset = 4; // 跳过开头4字节的计数

// 2. 循环解析每一对坐标(每个坐标是32位单精度浮点数,占4字节)
for ($i = 0; $i < $coordCount; $i++) {
    // 解析第一个坐标(示例中为纬度)
    $lat = unpack('f', substr($blobData, $offset, 4))[1];
    $offset += 4;
    // 解析第二个坐标(示例中为经度)
    $lng = unpack('f', substr($blobData, $offset, 4))[1];
    $offset += 4;
    
    // 保留指定小数位数(与示例格式一致)
    $coordinates[] = [
        round($lat, 5),
        round($lng, 5)
    ];
}

// 3. 输出目标JSON格式
echo json_encode($coordinates, JSON_PRETTY_PRINT);
?>

关键细节说明

  • 字节序匹配:unpack的V表示小端序32位无符号整数,f表示小端序32位单精度浮点数,这和x86架构下C++默认的字节序一致,完全对应你参考的binarygeometry实现的内存布局。若你的数据是大端序,需替换为N(大端无符号整数)和F(大端单精度浮点数)。
  • 偏移计算:每解析一个浮点数,偏移量增加4字节(32位=4字节),确保每次读取正确的字节段。
  • 精度处理:用round函数保留5位小数,和你期望的输出格式完全匹配。

适配SQLite查询场景

如果是从PDO查询获取Blob,代码可调整为:

<?php
$pdo = new PDO('sqlite:your_database.db');
$stmt = $pdo->prepare("SELECT geometry_blob FROM your_table WHERE id = ?");
$stmt->execute([1]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$blobData = $row['geometry_blob'];

// 后续解析逻辑同上
?>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:42:48