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
相关产品推荐
相关产品推荐

